题解 | #输入序列不连续的序列检测#

输入序列不连续的序列检测

http://www.nowcoder.com/practice/f96d0e94ec604592b502b0f1800ed8aa

本质上和输入序列连续的序列检测,当data_valid信号有效时,移位寄存器data_r再进行移位即可。
alt 本题的题目要求和Testbench有不相符的地方。题目中要求match在序列匹配的下一个周期拉高,如上图。而Testbench则是在序列匹配的同周期拉高。下面的代码中,被注释掉的部分是符合题目要求的match,没有注释的是符合Testbench的match

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	input data_valid,
	output reg match
	);
    reg [3:0] data_r;
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            data_r <= 4'b0;
        else
            data_r <= data_valid? {data_r[2:0], data}: data_r;
    end
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            match <= 0;
        else
            match <= data_r[2:0]==3'b011 && data==1'b0 && data_valid;
    end
  
//  always@(posedge clk or negedge rst_n) begin
//     if(~rst_n)
//         match <= 0;
//     else
//         match <= data_r==4'b0110;
//  end
    
endmodule

Verilog篇题解 文章被收录于专栏

本人对牛客网verilog篇题目一些理解

全部评论
match的条件判断应该再加一个&data_valid吧
1 回复 分享
发布于 2022-09-08 01:43 广东
data_r <= data_valid? {data_r[2:0], data}: data_r; 這句寫的有問題,如果已經緩存了兩位,data_valid=0了,那麼data_r裡面就已經存了0001,待data_valid 重新=1時,遇到data=10,就直接match=1了,我認為在data_valid=0時要清空data_r; 並且如果輸入是0110110這種情況,應該會match輸出兩次了.
1 回复 分享
发布于 2023-08-23 15:54 广东
请问为什么按照题目要求的(被注释掉的部分)无法通过
点赞 回复 分享
发布于 2022-05-26 18:26
不對,題目給的圖是要求晚半個周期,因為合理的data變化其實會是發生在edge跟edge之間,你注釋掉的部分晚了一個半周期,半個周期由data DFF貢獻,再一個周期由match DFF貢獻,如此自然不會通過
点赞 回复 分享
发布于 2023-03-28 08:21 台湾
请问阁下又如何应对序列是110的情况。你初始化的时候把data_r全置0。第一个0可能是原来遗留的。
点赞 回复 分享
发布于 2023-07-19 12:41 台湾
match <= data_r[2:0]==3'b011 && data==1'b0 && data_valid; 这句会不会出现混乱呢,同一时刻下data_r是滞后于data的吗?
点赞 回复 分享
发布于 2023-08-05 19:01 广东
题目不是要求状态机吗,这写啥。
点赞 回复 分享
发布于 2023-08-09 21:09 上海
data_r在没有data_valid信号时需要复位为1吧
点赞 回复 分享
发布于 06-28 20:37 江苏

相关推荐

害怕一个人的小黄鸭胖乎乎:笑死了,没有技术大牛,招一堆应届生,不到半年,代码就成屎山了
点赞 评论 收藏
分享
23 4 评论
分享
牛客网
牛客企业服务