[吾题有解] HDLBits :Fsm ps2 / Fsm ps2data
本题是一道常规的FSM设计题记录的目的是状态机的状态中出现了忽略输入的状态。经过分析不难发现此题的FSM需要四个状态分别是IDLE状态初始状态也可以表示接收到了一个0的状态、已接收1状态S1已接收1x状态S2x表示不关心in[3]输入以及已接收1xx状态S3。由此我们可以画出如下所示Moore型状态机的状态转移图。需要注意的是题目中时序图描述中的这一句话Note that this is not the same as a 1xx sequence recognizer.Overlapping sequences are not allowed here…也就是说这不是一个“1xx”序列检测器并不检测重叠序列只有在状态走过1xx并输出done 1之后才重新开始判断下一个状态是回到IDLE还是直接进入S1即使in[3]的输入序列是“1111”也不会重复输出1对于状态图来说就是S3不会出现指向自身的状态转换。最后给出题目的Verilog HDLmoduletop_module(input clk,input[7:0]in,input reset,// Synchronous resetoutput done);//localparam IDLE4b0001, S1 4b0010,S24b0100, S3 4b1000;reg[3:0]state;reg[3:0]next_state;// State transition logic (combinational)always (*)case(state)IDLE:next_statein[3]?S1:IDLE;S1:next_stateS2;S2:next_stateS3;S3:next_statein[3]?S1:IDLE;endcase// State flip-flops (sequential)always (posedge clk)if(reset)stateIDLE;elsestatenext_state;// Output logicassign done(stateS3);endmodule第二题Fsm ps2data我们可以实现一个24bit的移位寄存器left shift register。每当有新的字节输入时该移位寄存器就左移8位并将新的字节移入再将输出信号直接与模块输出out_bytes相连这样每个时钟上升沿输出的out_bytes就是该上升沿之前三个输入的字节最先出现的在最高字节。到这里我们可以发现由于out_bytes只在done 1时有效其余状态下不关心。那么这个输出其实是和done无关的无论done输出是0还是1out_bytes均输出此时刻之前的三个输入字节在done 1输出题目要求的三个字节只是恰好而已24bits移位寄存器并没有对此做出判断。所以只需要在代码对应位置添加如下代码即可// New: Datapath to store incoming bytes.reg[23:0]datapath;always (posedge clk)if(reset)datapath24d0;else//datapath {datapath[15:0], in}; Also a way to output.datapathdatapath8|in;assign out_bytesdatapath;PS第一次见到这里编译需要排队