三段式状态机

上一篇 / 下一篇  2007-06-30 14:36:50 / 天气: 晴朗 / 心情: 高兴 / 个人分类:Backup

时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。

    状态机采用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

三段式并不是一定要写为3个always块,如果状态机更复杂,就不止3段了。


TAG: EDA

引用 删除 changqingteng   /   2008-07-16 11:43:15
5
八一的旅程 引用 删除 ryanpjj   /   2008-04-06 11:33:16
我在写状态机时,在后仿真时总出线下列错误:
** Error: (vsim-3043) test_state2.map_tfw(25): Unresolved reference to 'IDLE' in UUT.IDLE.
#         Region: /test_state2
# ** Error: (vsim-3043) test_state2.map_tfw(26): Unresolved reference to 'S1' in UUT.S1.
#         Region: /test_state2
# ** Error: (vsim-3043) test_state2.map_tfw(27): Unresolved reference to 'S2' in UUT.S2.
#         Region: /test_state2
# ** Error: (vsim-3043) test_state2.map_tfw(28): Unresolved reference to 'ERROR' in UUT.ERROR.


S1,S2,ERROR,IDLE 都是我定义的状态,搞不明白什么原因。
谢谢指点,我的油箱pingjianjun@eyou.com
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-09-06  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 8682
  • 日志数: 96
  • 建立时间: 2006-08-07
  • 更新时间: 2007-06-30

RSS订阅

Open Toolbar