HDLbits: Fsm ps2

本题目理解起来有点难,要观察题目中给的三个时序图,通过时序图可以发现,状态有四个:byte1、byte2、byte3,还有一个"?"状态。其中,byte1的下一个状态一定是byte2,byte2的下一个状态一定是byte3,但是byte3的下一个状态可能是"?",需要通过in[3]来确定。于是先写出下面的代码(运行错误):

cs 复制代码
module top_module(
    input clk,
    input [7:0] in,
    input reset,    // Synchronous reset
    output done); //
    
    parameter byte1=4'b0001, byte2=4'b0010, byte3=4'b0100, byte_fault=4'b1000;

    
    reg [3:0] state,next_state;

    // State transition logic (combinational)
    always@(*)begin
        case(state)
            byte1: next_state = byte2;
            byte2: next_state = byte3;
            byte3: next_state = in[3]?byte1:byte_fault;
            byte_fault: next_state = in[3]?byte1:byte_fault; 
            default: next_state = byte1;
        endcase
    end

    // State flip-flops (sequential)
    always@(posedge clk)begin
        if(reset)
            state <= byte1;
        else
            state <= next_state;
    end
    
    always@(posedge clk)begin
        if(state == byte3)
            done <= 1;
        else
            done <= 0;
    end
    // Output logic
    //assign done = (state == byte3);

endmodule

通过对比大神写的代码,发现两个问题:1、reset时,state不是byte1而是byte_fault,这一点题目没说明白。2、done判断条件为什么不能用我写的always块而是assign?

cs 复制代码
module top_module(
    input clk,
    input [7:0] in,
    input reset,    // Synchronous reset
    output done); //
    
    parameter byte1=4'b0001, byte2=4'b0010, byte3=4'b0100, byte_fault=4'b1000;

    
    reg [3:0] state,next_state;

    // State transition logic (combinational)
    always@(*)begin
        case(state)
            byte1: next_state = byte2;
            byte2: next_state = byte3;
            byte3: next_state = in[3]?byte1:byte_fault;
            byte_fault: next_state = in[3]?byte1:byte_fault; 
            default: next_state = byte1;
        endcase
    end

    // State flip-flops (sequential)
    always@(posedge clk)begin
        if(reset)
            state <= byte_fault;
        else
            state <= next_state;
    end
    
    // Output logic
    assign done = (state == byte3);

endmodule
相关推荐
IM_DALLA3 个月前
【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL70
学习·fpga开发·verilog学习
IM_DALLA3 个月前
【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL74
学习·fpga开发·verilog学习
IM_DALLA3 个月前
【Verilog学习日常】—牛客网刷题—Verilog进阶挑战—VL25
学习·fpga开发·verilog学习
IM_DALLA3 个月前
【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL72、VL73
学习·fpga开发·verilog学习
IM_DALLA3 个月前
【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL65
学习·fpga开发·verilog学习
IM_DALLA3 个月前
【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL69
学习·fpga开发·verilog学习
IM_DALLA3 个月前
【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL64
学习·fpga开发·verilog学习
IM_DALLA3 个月前
【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL62
学习·fpga开发·verilog学习
Dale_e10 个月前
18 19 SPI接口的74HC595驱动数码管实验
经验分享·笔记·学习·fpga开发·verilog学习
Dale_e10 个月前
15 ABC基于状态机的按键消抖原理与状态转移图
经验分享·笔记·学习·fpga开发·verilog学习