原创 Verilog三段式状态机描述

2008-6-6 10:40 4335 4 4 分类: FPGA/CPLD

Verilog三段式状态机描述



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


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

文章评论0条评论)

登录后参与讨论
相关推荐阅读
jihengzhang_621642575 2009-03-10 09:42
VC多线程编程
VC中多线程使用比较广泛而且实用,在网上看到的教程.感觉写的挺好.一、问题的提出编写一个耗时的单线程程序:  新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHR...
jihengzhang_621642575 2008-09-02 13:26
VC 从文本中读取数据
 CStdioFile fp; CString strFileName,cmdRecord; byte cmd,addr,data0,data1,data2,data3; CFileDialog My...
jihengzhang_621642575 2008-05-28 08:40
浅谈GCC预编译头技术
 文/jorge 节选所谓预编译头,就是把头文件事先编译成一种二进制的中间格式,供后续的编译过程使用。GCC编译头文件后的中间文件是*.gch。如何将头文件编译为.gch文件呢?用g++编译,格式:g...
jihengzhang_621642575 2008-03-31 08:45
做职场名牌
    当下是市场经济,所有的东西都可能成为商品,包括人,就是劳动力,虽然人不能称为东西,并且也不能说不是东西。    当自己购买一件商品时,财力所能及的情况下,会优先选择名牌,多数情况下会有所保障。...
jihengzhang_621642575 2008-03-21 11:07
决定高薪的细节守则 激励自己
每天晚上8点到10点之间,你在做什么基本决定着你是薪水见涨,还是薪水见降。8点到10点之间,是在有目的性阅读,还是为明天的事情做准备,甚至在充电专业或研习第二专长?不管是哪一样,都有可能迈向成功,一个...
广告
我要评论
0
4
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /3 下一条