不管是VHDL还是Verilog,在设计状态机时应遵循以下原则:
1.给状态机的输出分配默认值,防止综合器产生不必要的锁存器。
2.将状态机逻辑和所有的算术逻辑功能以及数据路径分离,包括与状态机输出值的分配分离,这也是为何推荐大家尽量使用多进程来描述状态机的原因。
3.如果设计中包含一个在多个状态都要使用的运算,那么在状态机外面定义这个运算,然后让状态机的输出逻辑来使用该运算结果。
4.使用简单的同步或异步复位来确保状态机定义了一个上电初始状态。如果状态机设计中,复位逻辑比较复杂,比如同时使用了一个异步复位和异步加载信号来定义初始状态,那么综合工具只会将状态机综合成普通逻辑。
采用Verilog编写时,为了更好地让综合工具识别Verilog编写的状态机,除了以上介绍的指导原则外,下面单独列出一些只针对Verilog的注意事项。
1.如果使用的是System Verilog,一定要使用枚举类型来描述状态机。
2.使用参数(Parameter)来对状态机进行分配,因为参数会使得状态机易读以及减少编码过程中的错误。
3.尽管Quartus II能够识别出整数,但是不建议直接使用整数来定义状态值
4.如果在状态转换逻辑中使用了下例所示的算术运算,那么Quartus II将不会识别状态机。
case(state)
0: begin
if(ena) next_state <= state + 2;
else next_state <= state + 1;
end
1: begin
...
endcase
5.如果将状态变量作为输出,那么Quartus II将无法识别状态机。
6.状态机中使用有符号变量,那么Quartus II将无法识别状态机。