HDLBits Fsm ps2data

HDLBits Fsm ps2data_第1张图片

 1、这个题刚开始写的时候还想判断一下是否是正确的值的时候才输出,后来发现只有当done拉高时才检测输出端口,其他时间输出啥都无所谓。因为后边的根本不用。,算是有点理解了使能端是干啥用的。只有当使能位拉高的时候才开始检测。其余时间无效

2、通过看答案才明白的一点思路。

完整代码如下:

module top_module(
    input clk,
    input [7:0] in,
    input reset,    // Synchronous reset
    output [23:0] out_bytes,
    output done); //

	parameter A=0,B=1,C=2,D=3;
    reg [2:0]state,next_state;
    always@(*)begin
        case(state)
            A:next_state=in[3]?B:A;
            B:next_state=C;
            C:next_state=D;
            D:next_state=in[3]?B:A;
            default:next_state=A;
        endcase
    end
            
    // State transition logic (combinational)
    always@(posedge clk)begin
        if(reset)begin
            state<=A;
        end
        else begin
            state<=next_state;
        end
        
    end
    // State flip-flops (sequential)
    assign done=(state==D);
  
    always@(posedge clk)begin//首先是判断当前状态是啥a或者d才是一帧的开头,如果中间有输错根本不在意但是当done拉高时那三个是一定输出的。
        					 //简单来说就是只有当done拉高才检测输出的是啥。
        if(next_state==B)begin
            if(state==A|state==D)begin
                out_bytes[23:16]<=in;
            end
        end
        else if(state==B)
           out_bytes[15:8]<=in;
        else if(state==C)
            out_bytes[7:0]<=in;
        
    end
    // New: Datapath to store incoming bytes.

endmodule

HDLBits Fsm ps2data_第2张图片

 

你可能感兴趣的:(FPGA,HDLBits刷题,fpga开发)