Xilinx FPGA中有限状态机(FSM)的正确复位方式探讨
FPGA设计中局部同步复位的计数器同步问题
我日常使用Xilinx FPGA开发板,设计里会尽量避免全局复位信号;必须使用时,仅给绝对必要的寄存器加同步复位——比如只把有限状态机(FSM)拉回IDLE状态,不复位关联的计数器、移位寄存器等。但这里存在一个问题:如果复位触发时计数器正在运行,FSM回到IDLE后计数器会保留旧值,等FSM再次进入计数状态时,计数器会从旧值(比如5)开始计数,破坏原本的设计逻辑。
举个例子,原本的设计逻辑是计数器计数到10后,FSM才切换到下一状态,代码如下:
always_ff @(posedge clk) begin case(state) IDLE: state <= COUNT; COUNT: begin counter <= counter + 1; if(counter == 10 - 1) begin counter <= 0; state <= DATA; end end DATA: // 相关业务逻辑 ... endcase end
这种情况下,要是复位时计数器停在5,后续FSM再进入COUNT状态,计数器会从5开始累加,导致没到预设的10次就触发状态切换,逻辑出错。
那改成在进入COUNT状态前(也就是IDLE状态分支里)复位计数器,是不是就能确保无论复位何时触发都安全?修改后的代码如下:
always_ff @(posedge clk) begin case(state) IDLE: begin state <= COUNT; counter <= 0; end COUNT: begin counter <= counter + 1; if(counter == 10 - 1) begin state <= DATA; end end DATA: // 相关业务逻辑 ... endcase end
想知道资深工程师会不会采用这种设计方式,或者有没有对应的标准实践方案?
内容的提问来源于stack exchange,提问作者stackwryd
相关产品推荐
相关产品推荐

