题解 | #状态机-重叠序列检测#

状态机-重叠序列检测

http://www.nowcoder.com/practice/10be91c03f5a412cb26f67dbd24020a9

重复检测是一般FSM应该具备的能力,根据画好的状态转换图,coding case部分。 需要注意题目检测输出是在下一个时钟周期,而非当前时钟周期。

完整代码:

`timescale 1ns/1ns

module sequence_test2(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);
//*************code***********//
    parameter IDLE=0, A=1, B=2, C=3, D=4;
    reg [2:0]CS,NS;
    always@(negedge rst or posedge clk)begin
        if(~rst)
            CS <= 0;
        else
            CS <= NS;
    end
    always@(negedge rst or posedge clk)begin
        if(~rst)
            flag <= 0;
        else if(CS == D)
            flag <= 1;
        else
            flag <= 0;
    end
    always@(*)begin
        case(CS)
            IDLE:if(data) NS = A; else NS = IDLE;
            A:if(~data) NS = B; else NS = A;
            B:if(data) NS = C; else NS = IDLE;
            C:if(data) NS = D; else NS = B;
            D:if(data) NS = A; else NS = B;
        endcase
    end

//*************code***********//
endmodule

若要求在当前周期输出状态机,有两种方式编写flag部分的always过程块。

  1. 当前周期输出方式一
always@(negedge rst or posedge clk)begin
        if(~rst)
            flag <= 0;
        else if(CS == C && data == 1)
            flag <= 1;
        else
            flag <= 0;
    end
  1. 当前周期输出方式二
always@(*)begin
        if(~rst)
            flag = 0;
        else if(CS == D)
            flag = 1;
        else
            flag = 0;
    end
全部评论

相关推荐

已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
10-05 23:02
东北大学 Java
我说句实话啊:那时候看三个月培训班视频,随便做个项目背点八股,都能说3 40w是侮辱价
点赞 评论 收藏
分享
评论
4
收藏
分享
牛客网
牛客企业服务