在 Verilog的江湖里,流传着一段,两段,三段式状态机的传说。它们各有优劣,本文就书写三段式状态机的错误原因进行探寻。 本文会涉及到Verilog的基本语法,需要一定的Verilog基础,包括对reg,always,状态机的一些认识,数字电路基础。
三段式状态机,将状态机分为三段,功能为状态转移,状态转移条件判断,输出逻辑等。存在问题的“三段式状态机”代码如下:
三段式状态机,将状态机分为三段,功能为状态转移,状态转移条件判断,输出逻辑等。存在问题的“三段式状态机”代码如下:
always @ (posedge clk or posedge rst)if (rst)
state <= IDLE;else
state <= next_state;always @ (posedge clk or posedge rst)if (rst) begin
next_state <= IDLE;endelsecase (state)
IDLE:if (!empty) begin
next_state <= WAIT;endelse begin
next_state <= IDLE;end
...endcase
程序比较简单,于是直接上板验证。经过上板调试,发现问题存在于当empty为低时,rd_en并没有拉高。于是,我首先怀疑整个系统是不是一直处于复位状态。经过查找,发现rst一直保持低电平,整个程序不在复位状态。这就很神奇了。后来,经过提醒和仔细查找原因,才发现这个状态机写的其实存在问题。状态转移条件判断和状态