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

状态机-重叠序列检测

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
全部评论

相关推荐

06-19 19:06
门头沟学院 Java
点赞 评论 收藏
分享
05-09 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务