Veilog三段式状态机 时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电 路的未来行为而必需考虑的所有历史信息。 状态机采用VerilogHDL语言编码,建议分为三个always段完成。这是为什么呢? 设计FSM的方法和技巧多种多样,但是总结起来有两大类:第一种,将状态转移和状态的 操作和判断等写到一个模块(process、block)中。另一种是将状态转移单独写成一个 模块,将状态的操作和判断等写到另一个模块中(在Verilog代码中,相当于使用两个“ always” block)。其中较好的方式是后者。其原因如下。 首先FSM和其他设计一样,最好使用同步时序方式设计,好处不再累述。而状态机实现后 ,状态转移是用寄存器实现的,是同步时序部分。状态的转移条件的判断是通过组合逻 辑判断实现的,之所以第二种比第一种编码方式合理,就在于第二种编码将同步时序和 组合逻辑分别放到不同的程序块(process,block)中实现。这样做的好处不仅仅是便 于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束 条件,利于布局布线器实现设计。 三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每 个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。 三段式描述方法虽然代码结构复杂了一些,但是换来的优势是使FSM做到了同步寄存器输 出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说 在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。 示例如下: //第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器 always @ (posedge clk or negedge rst_n) //异步复位 if(!rst_n) curr……