题解 | #输入序列不连续的序列检测#
输入序列不连续的序列检测
https://www.nowcoder.com/practice/f96d0e94ec604592b502b0f1800ed8aa
思路
有两种方法解决此题,状态机法和序列检测法。序列检测法可以看我的另一篇题解:https://blog.nowcoder.net/n/69640281aafb4dc6bc5c4575c0b4b0d2
这里介绍状态机法。
注意仔细看波形图,要求data_valid为1才能检测0110序列,为0则不检测。
所以data_valid为1时就正常按照状态机来走,为0的话直接把下一个状态设成最开始的状态。
代码
`timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input data, input data_valid, output reg match ); localparam IDLE=3'd0, s1=3'd1, s2=3'd2, s3=3'd3, s4=3'd4; reg [2:0]state; reg [2:0]next_state; //三段式写法 //第一段 always @(posedge clk or negedge rst_n) begin if(!rst_n)state<=IDLE; else state<=next_state; end //第二段 always @(*)begin if (!rst_n)next_state<=IDLE; else begin if (data_valid)begin case (state) IDLE:next_state<=data?IDLE:s1; s1:next_state<=data?s2:s1; s2:next_state<=data?s3:s1; s3:next_state<=data?IDLE:s4; s4:next_state<=data?s2:s1; default:next_state<=IDLE; endcase end else next_state<=IDLE; end end //第三段 always @(posedge clk or negedge rst_n)begin if (!rst_n)match<=1'b0; else begin if (next_state==s3&&data==0)match<=1'b1; else match<=1'b0; end end endmodule
注意事项
- 代码第44行为什么是next_state==s3&&data==0而不是next_state==s4或者state==s4?
这是题目描述的问题,只有这样写才能保证检测0110的最后一个数时match就为1.