第 6 章 如何写好状态机
142
“FSM 设计要清晰易懂、易维护”的优先级最低,是相对次要的标准。
6.2.2 RTL 级状态机描述常用语法
本书第 2、3 章论述了 Verilog 的基本语法和常用关键字,其中在 RTL 级设计可综合的
FSM 相关的常用关键字如下:
? wire 、 reg 等
对 wire 、 reg 等变量、向量定义不加累述,需要补充的是状态编码时
(也就是用某种编码描述各个状态)一般都要使用 reg 寄存器型向量。
? parameter
用于描述状态名称,增强源代码可读性,简化描述。
例: 某状态机使用初始值为“ 0”的独热码( one-hot )编码方式定义的 4bit 宽
度的状态变量 NS(代表 Next State ,下一状态)和 CS(代表 Current State ,
当前状态),且状态机包含 5 个具体状态 IDLE (空闲状态) 、 S1 (工作状态 1)、 S2
(工作状态 2)、S3(工作状态 3)、ERROR(告警状态),则代码如下:
reg [3:0] NS,CS;
parameter [3:0] //one hot with zero initial
IDLE = 3 ’b0000,
S1 = 3 ’b0001,
S2 = 3 ’b0010,
S3 = 3 ’b0100,
ERROR = 3’b1000;
? always
在 FSM 设计中有 3 种 always 的使用方法,第 1 种用法是根据主时钟沿,
完成同步时序的状态迁移。
例:某状态机从当前状态 CS迁移到下一个状态 NS 可以如下表述:
//sequential state transition
always @ (posedge clk or negedge nrst)
if (!nrst)
CS <= IDLE;
else
CS <=NS;
always 的第 2 种用法是根据信号敏感表,完成组合逻辑的输出。
always 的第 3 种用法是根据时钟沿,完成同步时序逻辑的输出。
? case/endcase
case/endcase 是 FSM 描述中最重要的语法关键字,这里我们要详细讨论一
下。 case/endcase 的基本语法结构如下:
case (case_expression)