集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1678|回复: 2

Verilog HDL 的 RTL 级状态机描述常用语法

[复制链接]
afei6969 发表于 2021-4-24 20:14:35 | 显示全部楼层 |阅读模式
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)
case_item1 : case_item_statement1;
case_item2 : case_item_statement2;
case_item3 : case_item_statement3;
case_item4 : case_item_statement4;
default : case_item_statement5;
endcase
其中,case_expression 就是 case 的判断条件表达式,在 FSM 描述中,它
一般为当前状态寄存器;每个 case_item 是 case 语句的分支列表,在 FSM 描述
中,它一般为 FSM 中的所有状态的罗列,从中还可以分析出状态的编码方
式;case_item_statement 为进入每个 case_item 的对应操作,在 FSM 中,即为
每个状态对应的状态转移或者输出,如果 case_item_statement 包含的操作不只
一条,可以用 begin/end 嵌套多条操作;default 是个可选的关键字,用以指明
当所列的所有 case_item 与 case_expression 都不匹配时的操作,在 FSM 设计
中,为了提高设计的安全性,排除所设计的 FSM 进入死循环,一般要求加上
default 关键字来描述 FSM 所需状态的补集状态下的操作。另外 Verilog 还支
持 casex 和 casez 等不同关键字,但是由于综合器对这两个关键字的支持情况
略有差异,所以笔者建议初学者使用完整的 case 结构而不使用 casex 或
casez。 例:某 FSM 的状态转移用 case/endcase 结构描述如下:
case (CS)
IDLE: begin
IDLE_out;
if (~i1) NS = IDLE;
if (i1 && i2) NS = S1;
if (i1 && ~i2) NS = ERROR;
end
S1: begin
S1_out;
if (~i2) NS = S1;
if (i2 && i1) NS = S2;
if (i2 && (~i1)) NS = ERROR;
end
S2: begin
S2_out;
if (i2) NS = S2;
if (~i2 && i1) NS = IDLE;
if (~i2 && (~i1)) NS = ERROR;
end
ERROR: begin ERROR_out;
if (i1) NS = ERROR;
if (~i1) NS = IDLE;
end
default: begin
Default_out;
NS = ERROR;
end
endcase
· task/endtask
task/endtask 在描述状态机是主要用途是将不同状态对应的输出用
task/endtask 封装,增强了代码的可维护性和可读性。
例:某状态机的 IDLE 状态的输出可以用 task/endtask 封装为“IDEL_out”
任务:
task IDLE_out;
begin
{w_o1,w_o2,w_err} = 3'b000;
end
endtask 当然描述状态机时也会使用到其它一些常用的 RTL 级语法,如 if/else,assign
等等,它们的功能和一般 RTL 描述方法一致,这里不在叙述。
hellokity 发表于 2021-4-24 20:17:18 | 显示全部楼层
Verilog HDL 的 RTL 级状态机描述常用语法
lihongkun16 发表于 2021-4-25 09:06:49 | 显示全部楼层
Verilog HDL 的 RTL 级状态机描述常用语法
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-29 01:48 , Processed in 0.056550 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表