Verilog模块编程
有限状态机
有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,其状态只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向哪一状态还是留在原状态不但取决于各个输入值,还取决于当前所在状态。
Verilog HDL语言设计可综合的状态机的指导原则
1.大多数FPGA内部的触发器数据相当多,可采用译码逻辑最为简单独热码状态机;
2.采用case,casex或casez语句来建立状态机的模型,因为这些语句表达清晰明了;
3.在上电时硬件电路的状态机进入的状态是不确定的,最好设定default的状态,以防止锁死;
4.状态机应该有一个异步或同步复位端,以便在通电时将硬件电路复位到有效状态,也可以在操作中将硬件电路复位;
5.目前大多数综合器往往不支持在一个always块中由多个事件触发的状态机,为了能综合出有效的电路,用Verilog HDL描述的状态机应明确地由唯一时钟触发。目前大多数综合器不能综合采用VerilogHDL描述的异步状态。异步状态机是没有确定时钟的状态机,它的状态转移不是由唯一的时钟跳变沿所触发。
语言指导
always块:
- 每个always块只能有一个事件控制"@(event-expression)",而且要紧跟在always关键字后面。
- always块可以表示时序逻辑或者组合逻辑,也可以用always块既表示电平敏感的透明锁存器又
同时表示组合逻辑。但是不推荐使用这种描述方法,因为这容易产生错误和多余的电平敏感的透
明锁存器。 - 带有posedge 或 negedge 关键字的事件表达式表示沿触发的时序逻辑,没有posedge 或negedge
关键字的表示组合逻辑或电平敏感的锁存器,或者两种都表示。在表示时序和组合逻辑的事件
控制表达式中如有多个沿和多个电平,其间必须用关键字 “ or ” 连接 。 - 每个表示时序always块只能由一个时钟跳变沿触发,置位或复位最好也由该时钟跳变沿触发。
- 每个在always块中赋值的信号都必需定义成reg型或整型。整型变量缺省为32bit,使用Verilog
操作符可对其进行二进制求补的算术运算。综合器还支持整型量的范围说明,这样就允许产生不
是32位的整型量。句法结构:integer[:]。 - always块中应该避免组合反馈回路。每次执行always块时,在生成组合逻辑的always块中赋值
的所有信号必需都有明确的值;否则,需要设计者在设计中加入电平敏感的锁存器来保持赋值前
的最后一个值,只有这样综合器才能正常生成电路。如果不这样做综合器会发出警告提示设计中
插入了锁存器。如果在设计中存在综合器认为不是电平敏感锁存器的组合回路时,综合器会发出
错误信息(例如设计中有异步状态机时)。
赋值:
- 对一个寄存器型(reg)和整型(integer)变量给定位的赋值只允许在一个always块内进行,如在
另一always块也对其赋值,这是非法的。 - 把某一信号值赋为’bx,综合器就把它解释成无关状态&#