[吾题有解] HDLBits : Exams/2013 q2bfsm

张开发
2026/4/4 4:53:13 15 分钟阅读
[吾题有解] HDLBits : Exams/2013 q2bfsm
本题在状态机的实现上并不算复杂只要能够通过题目描述画出状态转移图就能够得出标准的三段式状态机只是其中有两个关键点需要特别注意因而作此纪录希望大家批评指正本题涉及两个关键点监视输入x的时机即如何为输入x设置相关状态理解“在两个周期内输入y为1则……”这句话的实现第一个关键点题中有多次指明then after the next clock edge the FSM has to set the output f to 1 for one clock cycle.Then, the FSM has to monitor the x input.hint : The FSM does not begin to monitor the x inputuntilthe cycle after f is 1.题目中称若复位则保持在A状态取消复位后将输出一个时钟周期的f 1在这之后才进入x的监视状态这就说明需要一个状态来表示“输出了f 1”之后才进入x相关的状态我们将这个状态称为“F”对于x的序列判断需要一个IDLE状态表示x的默认状态或称首先接收到0的状态而非直接从“F”状态判断输入x 1进而判断x 0这样当x的输入序列不符合101需要跳回到某个状态重新开始时就有了一个“立足点”。不使用“F”状态的原因是F状态负责f的输出如果跳回这个状态会导致f输出1而f只在状态机脱离复位状态的下一个时钟周期上升沿输出1个时钟周期的1第二个关键点在于对于涉及次数的状态跳转使用计数器还是直接将其化为状态本身我的观点是如果转换后的状态不是很多则优先采用转换为状态的方法。题目中的描述“在两个周期内若输入y 1”很自然地联想到可以创建一个计数器对y的输入进行计数但是在某些情况下这会带来计数器溢出的问题如果再结合标志位则会使原本描述简洁的状态机在形式上变得复杂。因此将x接收到101序列后对输入y两周期内是否出现1的判断转化为相应的状态得到状态转移图如下如图所示当x输入序列101之后g持续输出1之后进入到输入y的判断中如果y在第一个状态或者第二个状态跳转到“已经输入1”状态Y_1则g继续保持1输出直到复位发生若y时钟没有输入1则先跳转到“第一次没有输入1”状态Y_0后跳转到“第二次没有输入1”状态Y_00,此时g持续输出0直到复位发生。While maintaining g 1 the FSM has to monitor the y input.…But if y does not become 1 within two clock cycles, then the FSM should set g 0 permanently (until reset).因此只要明白了以上两个关键点此题的思路就不难分析。最后给出本题的Verilog HDLmoduletop_module(input clk,input resetn,// active-low synchronous resetinput x,input y,output f,output g);localparam A0,F1,X_IDLE2,X_13,X_104,X_1015,Y_06,Y_17,Y_008;reg[3:0]state;reg[3:0]next_state;always (posedge clk)if(~resetn)stateA;elsestatenext_state;always (*)case(state)A:next_stateF;F:next_stateX_IDLE;X_IDLE:next_statex?X_1:X_IDLE;X_1:next_statex?X_1:X_10;X_10:next_statex?X_101:X_IDLE;X_101:next_statey?Y_1:Y_0;Y_1:next_stateY_1;Y_0:next_statey?Y_1:Y_00;Y_00:next_stateY_00;endcase assign fstateF;assign gstateX_101||stateY_0||stateY_1;endmodule

更多文章