打印

Verilog三段式状态机描述

[复制链接]
1657|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wmsk|  楼主 | 2012-9-8 17:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。
状态机采用VerilogHDL语言编码,建议分为三个always段完成。
三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器, 然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。
三段式描述方法虽然代码结构复杂了一些,但是换来的优势是使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。
示列如下:

//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器
always @ (posedge clk or negedge rst_n)  //异步复位
if(!rst_n)
   current_state <= IDLE;
else
   current_state <= next_state;//注意,使用的是非阻塞赋值

//第二个进程,组合逻辑always模块,描述状态转移条件判断
always @ (current_state)   //电平触发
  begin
    next_state = x;  //要初始化,使得系统复位后能进入正确的状态
    case(current_state)
    S1: if(...)
       next_state = S2;  //阻塞赋值
    ...
    endcase
end

//第三个进程,同步时序always模块,格式化描述次态寄存器输出
always @ (posedge clk or negedge rst_n)
...//初始化
case(next_state)
S1:
   out1 <= 1'b1;  //注意是非阻塞逻辑
S2:
   out2 <= 1'b1;
default:...   //default的作用是免除综合工具综合出锁存器。
endcase
end
评分
参与人数 4威望 +6 收起 理由
lphaff + 1 个人觉得两段式足够了。
seaboy6 + 1
Backkom80 + 2
GoldSunMonkey + 2

相关帖子

沙发
可木| | 2012-9-10 22:27 | 只看该作者
:lolgood

使用特权

评论回复
板凳
Backkom80| | 2012-9-11 08:02 | 只看该作者
呵呵,建意三段式,

使用特权

评论回复
地板
GoldSunMonkey| | 2012-9-11 10:22 | 只看该作者
:)

使用特权

评论回复
5
shu081| | 2012-10-7 10:40 | 只看该作者
看看了 谢谢!

使用特权

评论回复
6
david-xia| | 2012-11-2 09:09 | 只看该作者
看看了 谢谢!

使用特权

评论回复
7
lphaff| | 2012-11-5 09:26 | 只看该作者
个人觉得两段式足够了。
一段用来确定下一状态,
一段用来输出。
第一个always应该是可以省略的。
@楼主

使用特权

评论回复
8
wmsk|  楼主 | 2012-11-5 22:17 | 只看该作者
个人觉得两段式足够了。
一段用来确定下一状态,
一段用来输出。
第一个always应该是可以省略的。
@楼主
lphaff 发表于 2012-11-5 09:26
嗯谢谢啦。

使用特权

评论回复
9
GoldSunMonkey| | 2012-11-5 22:36 | 只看该作者
谢谢啦。

使用特权

评论回复
10
lphaff| | 2012-11-6 11:24 | 只看该作者
猴哥,别光顾着谢谢,给分啊。你懂的

使用特权

评论回复
11
xiao6666| | 2012-11-6 22:49 | 只看该作者
;P

使用特权

评论回复
12
suzixiang0| | 2013-10-23 14:21 | 只看该作者
不错~~~谢谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

411

帖子

1

粉丝