tag 标签: fsm

相关博文
  • 热度 24
    2016-1-16 10:47
    1803 次阅读|
    0 个评论
    本文叙述概括了FPGA应用设计中的要点,包括,时钟树、FSM、latch、逻辑仿真四个部分。 FPGA的用处比我们平时想象的用处更广泛,原因在于其中集成的模块种类更多,而不仅仅是原来的简单逻辑单元(LE)。 早期的FPGA相对比较简单,所有的功能单元仅仅由管脚、内部buffer、LE、RAM构建而成,LE由LUT(查找表)和D触发器构成,RAM也往往容量非常小。 现在的FPGA不仅包含以前的LE,RAM也更大更快更灵活,管教IOB也更加的复杂,支持的IO类型也更多,而且内部还集成了一些特殊功能单元,包括: DSP:实际上就是乘加器,FPGA内部可以集成多个乘加器,而一般的DSP芯片往往每个core只有一个。换言之,FPGA可以更容易实现多个DSP core功能。在某些需要大量乘加计算的场合,往往多个乘加器并行工作的速度可以远远超过一个高速乘加器。 SERDES:高速串行接口。将来PCI-E、XAUI、HT、S-ATA等高速串行接口会越来越多。有了SERDES模块,FPGA可以很容易将这些高速串行接口集成进来,无需再购买专门的接口芯片。 CPU core:分为2种,软core和硬core。软core是用逻辑代码写的CPU模块,可以在任何资源足够的FPGA中实现,使用非常灵活。而且在大容量的FPGA中还可以集成多个软core,实现多核并行处理。硬core是在特定的FPGA内部做好的CPU core,优点是速度快、性能好,缺点是不够灵活。 不过,FPGA还是有缺点。对于某些高主频的应用,FPGA就无能为力了。现在虽然理论上FPGA可以支持的500MHz,但在实际设计中,往往200MHz以上工作频率就很难实现了。 FPGA设计要点之一:时钟树 对于FPGA来说,要尽可能避免异步设计,尽可能采用同步设计。 同步设计的第一个关键,也是关键中的关键,就是时钟树。 一个糟糕的时钟树,对FPGA设计来说,是一场无法弥补的灾难,是一个没有打好地基的大楼,崩溃是必然的。 具体一些的设计细则: 1)尽可能采用单一时钟; 2)如果有多个时钟域,一定要仔细划分,千万小心; 3)跨时钟域的信号一定要做同步处理。对于控制信号,可以采用双采样;对于数据信号,可以采用异步fifo。需要注意的是,异步fifo不是万能的,一个异步fifo也只能解决一定范围内的频差问题。 4)尽可能将FPGA内部的PLL、DLL利用起来,这会给你的设计带来大量的好处。 5)对于特殊的IO接口,需要仔细计算Tsu、Tco、Th,并利用PLL、DLL、DDIO、管脚可设置的delay等多种工具来实现。简单对管脚进行Tsu、Tco、Th的约束往往是不行的。 可能说的不是很确切。这里的时钟树实际上泛指时钟方案,主要是时钟域和PLL等的规划,一般情况下不牵扯到走线时延的详细计算(一般都走全局时钟网络和局部时钟网络,时延固定),和ASIC中的时钟树不一样。对于ASIC,就必须对时钟网络的设计、布线、时延计算进行仔细的分析计算才行。 FPGA设计要点之二:FSM FSM:有限状态机。这个可以说时逻辑设计的基础。几乎稍微大一点的逻辑设计,几乎都能看得到FSM。 FSM分为moore型和merly型,moore型的状态迁移和变量无关,merly型则有关。实际使用中大部分都采用merly型。 FSM通常有2种写法:单进程、双进程。 初学者往往喜欢单进程写法,格式如下: always @( posedge clk or posedge rst ) begin if ( rst == 1'b1 ) FSM_status = ......; else case ( FSM_status ) ......; endcase end 简单的说,单进程FSM就是把所有的同步、异步处理都放入一个always中。 优点: 1)看起来比较简单明了,写起来也不用在每个case分支或者if分支中写全对各个信号和状态信号的处理。也可以简单在其中加入一些计数器进行计数处理。 2)所有的输出信号都已经是经过D触发器锁存了。 缺点: 1)优化效果不佳。由于同步、异步放在一起,编译器一般对异步逻辑的优化效果最好。单进程FSM把同步、异步混杂在一起的结果就是导致编译器优化效果差,往往导致逻辑速度慢、资源消耗多。 2)某些时候需要更快的信号输出,不必经过D触发器锁存,这时单进程FSM的处理就比较麻烦了。 双进程FSM,格式如下: always @( posedge clk or posedge rst ) begin if ( rst == 1'b1 ) FSM_status_current = ...; else FSM_status_current = FSM_status_next; always @(*) begin case ( FSM_status_current ) FSM_status_next = ......; endcase end 从上面可以看到,同步处理和异步处理分别放到2个always中。其中FSM状态变量也采用2个来进行控制。双进程FSM的原理我这里就不多说了,在很多逻辑设计书中都有介绍。这里描述起来太费劲。 优点: 1)编译器优化效果明显,可以得到很理想的速度和资源占用率。 2)所有的输出信号(除了FSM_status_current)都是组合输出的,比单进程FSM快。 缺点: 1)所有的输出信号(除了FSM_status_current)都是组合输出的,在某些场合需要额外写代码来进行锁存。 2)在异步处理的always中,所有的if、case分支必须把所有的输出信号都赋值,而且不能出现在FSM中的输出信号回送赋值给本FSM中的其他信号的情况,否则会出现 latch。 latch会导致如下问题: 1)功能仿真结果和后仿不符; 2)出现无法测试的逻辑; 3)逻辑工作不稳定,特别是latch部分对毛刺异常敏感; 4)某些及其特殊的情况下,如果出现正反馈,可能会导致灾难性的后果。 这不是恐吓也不是开玩笑,我就亲眼见过一个小伙把他做的逻辑加载上去后,整个FPGA给炸飞了。后来怀疑可能是出现正反馈导致高频振荡,最后导致芯片过热炸掉(这个FPGA芯片没有安装散热片)。 FPGA设计要点之三:latch 首先回答一下: 1)stateCAD没有用过,不过我感觉用这个东东在构建大的系统的时候似乎不是很方便。也许用system C或者system Verilog更好一些。 2)同步、异步的叫法是我所在公司的习惯叫法,不太对,不过已经习惯了,呵呵。 这次讲一下latch。 latch的危害已经说过了,这里不再多说,关键讲一下如何避免。 1)在组合逻辑进程中,if语句一定要有else!并且所有的信号都要在if的所有分支中被赋值。 always @( * ) begin if ( sig_a == 1'b1 ) sig_b = sig_c; end 这个是绝对会产生latch的。 正确的应该是 always @( * ) begin if ( sig_a == 1'b1 ) sig_b = sig_c; else sig_b = sig_d; end 另外需要注意,下面也会产生latch。也就是说在组合逻辑进程中不能出现自己赋值给自己或者间接出现自己赋值给自己的情况。 always @( * ) begin if ( rst == 1'b1 ) counter = 32'h00000000; else counter = counter + 1; end 但如果是时序逻辑进程,则不存在该问题。 2)case语句的default一定不能少! 原因和if语句相同,这里不再多说了。 需要提醒的是,在时序逻辑进程中,default语句也一定要加上,这是一个很好的习惯。 3)组合逻辑进程敏感变量不能少也不能多。 这个问题倒不是太大,verilog2001语法中可以直接用 * 搞定了。 顺便提一句,latch有弊就一定有利。在FPGA的LE中,总存在一个latch和一个D触发器,在支持DDR的IOE(IOB)中也存在着一个latch来实现DDIO。不过在我们平时的设计中,对latch还是要尽可能的敬而远之。 FPGA设计要点之四:逻辑仿真 仿真是FPGA设计中必不可少的一步。没有仿真,就没有一切。 仿真是一个单调而繁琐的工作,很容易让人产生放弃或者偷工减料的念头。这时一定要挺住! 仿真分为单元仿真、集成仿真、系统仿真。 单元仿真:针对每一个最小基本模块的仿真。单元仿真要求代码行覆盖率、条件分支覆盖率、表达式覆盖率必须达到100%!这三种覆盖率都可以通过MODELSIM来查看,不过需要在编译该模块时要在Compile option中设置好。 集成仿真:将多个大模块合在一起进行仿真。覆盖率要求尽量高。 系统仿真:将整个硬件系统合在一起进行仿真。此时整个仿真平台包含了逻辑周边芯片接口的仿真模型,以及BFM、Testbench等。系统仿真需要根据被仿真逻辑的功能、性能需求仔细设计仿真测试例和仿真测试平台。系统仿真是逻辑设计的一个大分支,是一门需要专门学习的学科。 博文来源: fy2k的博客——FPGA乐园! EDNC BLOG
  • 热度 16
    2015-3-24 13:47
    1227 次阅读|
    0 个评论
      硬件描述语言Verilog为数字系统设计人员提供了一种在广泛抽象层次上描述数字系统的方式,同时,为计算机辅助设计工具在工程设计中的应用提供了方法。该语言支持早期的行为结构设计的概念,以及其后层次化结构设计的实现。这在设计过程中,进行逻辑结构部分设计时可以将行为结构和层次化结构混合起来;为确认正确性还可以将描述进行模拟,并提供一些用于自动设计的综合工具。因而Verilog语言为设计者进行大型复杂数字系统的设计提供了途径。超大规模集成电路设计的典型流程如图1所示。   本文将以顺序状态逻辑有限状态机的设计为例介绍用Verilog语言设计数字电路的一般过程。    1 设计规范与设计构思   电子设计工程师在设计过程中不可避免地会遇到设计可执行特殊操作序列电路的工作,如用来控制其他电路进行操作的控制器,而有限状态机(Finite Status Machine,FSM)是设计这种能执行特殊操作序列电路的一种非常有效的模型。FSM的结构通常由当前状态寄存器、下一状态逻辑和输出逻辑三部分构成。FSM也有很多种模型,本文仅以顺序状态逻辑FSM的设计为例来说明用Verilog进行集成电路设计的一般设计过程。为简单起见,本设计只设计了包含有8个状态的顺序状态逻辑FSM。8个状态分别为One、Two、ThreeA、ThreeB、ThTeeC、Dummy、Four、Five。开始状态为One,各状态之间的转换关系如图2所示。   该顺序状态逻辑FSM的功能及要求如下。   (1)同步复位信号Reset至少要维持4个时钟周期的高电平信号,以保证状态机进入状态One。   (2)当状态机在5个状态中循环时,A、B、C 3个输入按优先级使状态机从状态Two进入相应的状态ThreeA、ThreeB、ThreeC、Dummy。   (3)复位后,如果A持续为高电平,则输出信号Y1的周期为时钟周期的5倍,且高电平维持的时间为1个时钟周期。   (4)如果A、B维持为低电平,而C维持为高电平,则输出信号Y3的周期为时钟周期的5倍,且高电平维持的时间为1个时钟周期。   (5)如果A维持低电子,而B维持高电平,则输出信号Y2与Y1和Y3不同,只维持1个时钟周期的高电平。因为当状态机进入状态ThreeB时,信号BeenInState3B被设置为1,而该信号就会禁止状态机再次进入状态ThreeB,直到另一个复位信号出现为止。   以上是一个时序电路的设计,如何保证正确的时序是设计的关键。根据设计要求,该状态机至少应该有8个端口:5个输入端口(A、B、C、Reset、Clock),3个输出端口(Y1、Y2、Y3)。其中输入端A、B、C和Reset信号均由时钟边缘进行触发,Reset具有最高的优先权,而输入信号A、B、C的优先权则依次递减。   该顺序状态逻辑有限状态机的端口示意图和设计构思图分别如图3和图4所示。    2 用Verilog语言编写源代码   3 源代码功能仿真   通常EDA(Electronic Design Automation)工具都为设计人员提供了测试平台,以验证数字电子系统设计在功能和时序二方面的正确性。不同的EDA工具提供的平台会有差别,但是它们都可以实现对被测试对象加载测试信号,并且能够通过波形输出或文件记录输出等方式来方便地进行观察及比较仿真结果。而测试用的激励代码通常是由设计人员自己编写。为了便于清楚地观察、比较仿真结果,本设计对一个340ns时间段进行了模拟,且测试代码考虑了各种可能出现的激励情况,具体的测试代码如下:    4 逻辑综合   逻辑综合的目标是将寄存器时间逻辑(RTL)的HDL(HardwareDescriptionLanguage)代码映射到具体的工艺上加以实现,因而从这一步开始,设计过程与实现工艺相关联。实现自动综合的前提是要有逻辑综合库的支持。综合库内部包含了相应的工艺参数,最典型的有:门级延时、单元面积、扇入扇出系数等。设计一个电子系统,总有相应的设计目标,如时钟频率、芯片面积、端口驱动能力等。自动综合工具将这些设计指标作为综合过程的约束条件,在给定的包含工艺参数的综合库中选取最佳单元,实现综合过程。 与模拟工具一样,目前有许多优秀的综合工具借助现有的综合库能将Verilog语言源代码进行综合,转化成门级电路图,并且可以根据设计者施加的约束条件对电路进行优化,生成相应的门级网表。Synopsys公司的DC(DesignCompiler)就是一个比较好的逻辑综合工具。DC逻辑综合与优化后得到的电路图如图6所示。      5 门级仿真   综合之后所得到的电路是否仍能满足设计要求,同样需要通过仿真来确定,逻辑综合之后的仿真称为门级仿真。门级网表是使用门电路以及电路之间的连接来描述电路的方式。门级仿真与RTL仿真不同的是,门级仿真包含了门单元的延时信息,因而门级仿真需要相应工艺的仿真库支持。把综合后得到的网表中门级延时参数提取出来后,对被测试对象进行反标,然后再进行仿真,得到的结果如图7所示。   从门级仿真所得到的波形图输出结果来看,本设计在功能与时序上是符合设计要求的。    6 后端设计   门级仿真通过后,接着就是进行版图规划;版图规划好以后就进行布局与布线;在版图的布局布线都已确定后,可以从版图中进一步提取出连线电阻、电容等参数。   生成版图之后,把从版图中提取出的参数反标到门级网表中,进行包含门延时、连线延时的门级仿真,称作后仿真。这一步主要是进行时序模拟,如果时序不能满足设计要求,通常需要修改版图的布局与布线、逻辑综合的约束条件,有时也可能回到RTL描述、行为级描述甚至设计规范或算法实现上加以调整。版图得到验证后就可以交付生产厂家做到硅片上。    7 结束语   由以上的设计过程可以看出,Verilog语言的最大特点是简洁、灵活、高效,其编程风格和C语言极其相似,所以很容易学习和掌握。同时,Verilog语言还具有底层描述方面的优势,而且其设计方法与具体工艺无关,这就使得用Verilog语言编写的功能模块具有很高的可重用性。随着集成电路的深亚微米制造技术、设计技术的迅速发展,集成电路已进入片上系统(System on a Chip,SoC)设计时代。SoC设计的最大挑战之一是IP(Intellectual Property)模块的有效使用和重用。IP模块的重用,除能缩短SoC芯片设计的时间外,还能降低设计和制造成本,提高可靠性。在SoC设计中,可重用的IP模块越多,设计过程的效率就会越高。由此可见,Verilog语言在SoC设计中可以发挥更大的作用。因此,能用Verilog语言进行电路设计是每个电子设计工程师必须掌握的基本技术。
  • 热度 12
    2014-5-11 14:00
    1148 次阅读|
    0 个评论
    如今,家电越来越普及,智能化程度也越来越高,对软件的质量也相应提出了新的要求。 对于一个业内软件开发者,经常要“拷问”自己的问题就是:“我该怎么写才容易改?我该怎么写才不容易出错?”。在软件相关行业中,代码更改几乎总是会发生的,而且可能不是一次两次。造成更改的原因有很多种,如:需求改变、添加/删除功能、软件自身有bug等等。在家电业中,在你对一款产品编写代码时,你应该意识到,它可能还有后续衍生产品,可能会添加或更改一些功能。在业内混过的coder都应该经历过这样的情况:在产品批产前或批产后,发现软件还存在bug,于是加班找bug,加班返工,被老板批,被上司骂,很不舒服。 更改在所难免,我们是否可以让“改”变得更容易;bug无法避免,我们是否可以尽量减少它。下面我就谈谈我的一些经验,抛砖引玉。不足之处,不吝赐教。 在下面的讨论中,我们谈论的都是家电,不再每次都重复这两个字了。 从大的架构上讲,使用的绝大多数都是前后台。将系统要执行的任务放在while循环中,将一些对响应速度要求高的代码放在中断服务程序中。如下所示: volatile uint8 Flag_SysTick ;   int main ( void ) {     static uint8 Process_index ;       while ( true )     {         if ( Flag_SysTick )         {             Flag_SysTick = false ;               Task_0 ();               Process_index ++;             switch ( Process_index )             {                 case 1 :                     Task_1 ();                     break ;                 case 2 :                     Task_2 ();                 break ;                 case 3 :                     Task_3 ();                 break ;                 case 4 :                     Task_4 ();                 break ;                 case 5 :                     Task_5 ();                     Process_index = 0 ;                 break ;                  default :                     Process_index = 0 ;                 break ;             }         }     }     return 0; }   void Int_0(void) interrupt 0 {     Flag_SysTick = true; }   void Int_1(void) interrupt 1 {     ... }   ... 对于家电软件来说,这种结构已经足够好了。 在上面这种大的结构上,我们如何去精心安排,得到易写易改不易错的软件呢? 先来举个例子,看看传统方法的不足,再来想想解决办法。 产品往往有多种状态,在各状态下,往往有不同的显示规则,按键响应规则,负载控制规则及时间处理规则。下面是一款洗衣机的各个状态及其描述:   状态 描述 按键响应规则描述 显示规则 负载控制 时间处理 State_Off 关机状态 按启动键,进入设置状态 无显示 关闭所有负载 无时间处理 State_Set 设置状态 … … … 10分钟无用户操作,进入关机状态 State_FuzzyCheck 模糊检状态 … … … … State_Error 故障状态 … … … … State_Service 服务状态 … … … … State_VersionSetting 变种设置状态 … … … … State_UITest 界面检测状态 … … … … State_NoWaterCheck 无水检状态 … … … … State_FactoryTest 工厂模式 … … … … State_BurnTest 老化模式 … … … … State_SpinTest 连脱测试 … … … … State_?? 后续可能添加 … … … …   大部分产品规格书都会有上图类似的说明,按状态分章节描述各状态的按键响应规则、显示控制规则、负载控制规则及时间处理规则。按照上表所描述的规则,我们的软件传统上是这样写的: typedef enum {     STATE_OFF ,     STATE_SET ,     STATE_FUZZY_CHECK ,     STATE_ERROR ,     STATE_SERVICE ,     STATE_VERSION_SET ,     STATE_UI_TEST ,     STATE_NO_WATER_CHECK ,     STATE_FACTORY_TEST ,     STATE_BURN_TEST ,     STATE_SPIN_TEST } State_t ;   State_t System_CurrentState ;   /* 按键处理函数 */ void KeyAction_Deal ( void ) {     if ( System_CurrentState == STATE_OFF )     {         /* 按键处理 */         if ( Key_ActionType == KEY_SHORT )         {             if ( Key_Code == KEY_POWER )             {                 ...             }             else if ( Key_Code == KEY_START )             {                 ...             }         }         else if ( Key_ActionType == KEY_LONG )         {             if(Key_Code == KEY_POWER)             {                 ...             }             else if (Key_Code == KEY_START)             {                 ...             }         }         ...     }     else if (System_CurrentState == STATE_SET)     {         /* 按键处理 */         ...         ...     }     else if (System_CurrentState == STATE_FUZZY_CHECK)     {         /* 按键处理 */         ...         ...     }     else if (System_CurrentState == STATE_ERROR)     {         /* 按键处理 */         ...         ...     }     else if (System_CurrentState == STATE_SERVICE)     {         /* 按键处理 */         ...         ...     }     else if (System_CurrentState == STATE_VERSION_SET)     {         /* 按键处理 */         ...         ...     }     else if (System_CurrentState == STATE_UI_TEST)     {         /* 按键处理 */         ...         ...     }     else if (System_CurrentState == STATE_NO_WATER_CHECK)     {         /* 按键处理 */         ...         ...     }     else if (System_CurrentState == STATE_FACTORY_TEST)     {         /* 按键处理 */         ...         ...     }     else if (System_CurrentState == STATE_BURN_TEST)     {         /* 按键处理 */         ...         ...     }     else if (System_CurrentState == STATE_SPIN_TEST)     {         /* 按键处理 */         ...         ...     }     ... }   /* 显示控制函数 */ void Display_Ctr(void) {     /* 同 KeyAction_Deal函数结构。*/     ... }   /* 负载控制函数 */ void Load_Ctr(void) {     /* 同 KeyAction_Deal函数结构。*/     ... }   /* 时间控制函数 */ void Timer_Ctr(void) {     /* 同 KeyAction_Deal函数结构。*/     ... }   看看上面的代码,很明显能看出它有以下几点稍显不足: 同样的逻辑判断出现了4次。对当前系统状态的判断,在上面4个 处理函数中都有出现。 逻辑嵌套较深。 缺乏灵活性。对某一状态进行修改,都要在庞大的if else中找到对应的分支进行修改。(最好是一个状态一个文件,改这个状态就只打开这个文件。) 单片机系统资源的浪费。要执行第n个分支中的语句,都要经历前面n-1个判断,而且还重复了多次。 实际上,上面那些不足都是可以避免的。具体思想如下(有限状态机概念):     各个状态对应有相对独立的.c文件,其中包含该状态自己的按键处理、显示控制、负载控制及时间控制等函数。在运行时,当符合某状态迁移条件时(如,在关机状态按电源键迁移到设置状态,预约状态时间到迁移到工作状态等),将目标状态的各逻辑处理函数放入预先定义好的函数指针变量中。主系统循环只要从函数指针变量中取得对应函数的地址并调用它就可以了。其实挺简单是不是。带来的好处是显而易见的,比如工作状态出现了工作逻辑或显示逻辑问题,我知道问题肯定在State_Work.c中,我打开它并且编辑它,而且我确切知道我不会影响其它任何状态。要添加一个新的状态同样很方便,新建一个.c文件,写入该状态的逻辑处理函数就OK了。没有重复的状态检测,整个结构清爽干净。同时速度也快了些。 具体的实现代码我就不写在这里了,有兴趣的可以下载附件中的文件看看。 附件中的代码我只写了3个状态,下面看看各状态运行时截图:       采用这种分状态和状态迁移的方式去编码,你会发现你的的思路是清晰的,不会因为状态的过多而引入不必要的复杂度。加一个状态,也就是加一个.c文件而已。   工程为Visual Studio 2013的 完整代码及可执行程序请见附件
  • 热度 13
    2014-3-29 14:55
    1116 次阅读|
    0 个评论
      硬件描述语言Verilog为数字系统设计人员提供了一种在广泛抽象层次上描述数字系统的方式,同时,为计算机辅助设计工具在工程设计中的应用提供了方法。该语言支持早期的行为结构设计的概念,以及其后层次化结构设计的实现。这在设计过程中,进行逻辑结构部分设计时可以将行为结构和层次化结构混合起来;为确认正确性还可以将描述进行模拟,并提供一些用于自动设计的综合工具。因而Verilog语言为设计者进行大型复杂数字系统的设计提供了途径。超大规模集成电路设计的典型流程如图1所示。   本文将以顺序状态逻辑有限状态机的设计为例介绍用Verilog语言设计数字电路的一般过程。    1 设计规范与设计构思   电子设计工程师在设计过程中不可避免地会遇到设计可执行特殊操作序列电路的工作,如用来控制其他电路进行操作的控制器,而有限状态机(Finite Status Machine,FSM)是设计这种能执行特殊操作序列电路的一种非常有效的模型。FSM的结构通常由当前状态寄存器、下一状态逻辑和输出逻辑三部分构成。FSM也有很多种模型,本文仅以顺序状态逻辑FSM的设计为例来说明用Verilog进行集成电路设计的一般设计过程。为简单起见,本设计只设计了包含有8个状态的顺序状态逻辑FSM。8个状态分别为One、Two、ThreeA、ThreeB、ThTeeC、Dummy、Four、Five。开始状态为One,各状态之间的转换关系如图2所示。   该顺序状态逻辑FSM的功能及要求如下。   (1)同步复位信号Reset至少要维持4个时钟周期的高电平信号,以保证状态机进入状态One。   (2)当状态机在5个状态中循环时,A、B、C 3个输入按优先级使状态机从状态Two进入相应的状态ThreeA、ThreeB、ThreeC、Dummy。   (3)复位后,如果A持续为高电平,则输出信号Y1的周期为时钟周期的5倍,且高电平维持的时间为1个时钟周期。   (4)如果A、B维持为低电平,而C维持为高电平,则输出信号Y3的周期为时钟周期的5倍,且高电平维持的时间为1个时钟周期。   (5)如果A维持低电子,而B维持高电平,则输出信号Y2与Y1和Y3不同,只维持1个时钟周期的高电平。因为当状态机进入状态ThreeB时,信号BeenInState3B被设置为1,而该信号就会禁止状态机再次进入状态ThreeB,直到另一个复位信号出现为止。   以上是一个时序电路的设计,如何保证正确的时序是设计的关键。根据设计要求,该状态机至少应该有8个端口:5个输入端口(A、B、C、Reset、Clock),3个输出端口(Y1、Y2、Y3)。其中输入端A、B、C和Reset信号均由时钟边缘进行触发,Reset具有最高的优先权,而输入信号A、B、C的优先权则依次递减。   该顺序状态逻辑有限状态机的端口示意图和设计构思图分别如图3和图4所示。    2 用Verilog语言编写源代码   3 源代码功能仿真   通常EDA(Electronic Design Automation)工具都为设计人员提供了测试平台,以验证数字电子系统设计在功能和时序二方面的正确性。不同的EDA工具提供的平台会有差别,但是它们都可以实现对被测试对象加载测试信号,并且能够通过波形输出或文件记录输出等方式来方便地进行观察及比较仿真结果。而测试用的激励代码通常是由设计人员自己编写。为了便于清楚地观察、比较仿真结果,本设计对一个340ns时间段进行了模拟,且测试代码考虑了各种可能出现的激励情况,具体的测试代码如下:    4 逻辑综合   逻辑综合的目标是将寄存器时间逻辑(RTL)的HDL(HardwareDescriptionLanguage)代码映射到具体的工艺上加以实现,因而从这一步开始,设计过程与实现工艺相关联。实现自动综合的前提是要有逻辑综合库的支持。综合库内部包含了相应的工艺参数,最典型的有:门级延时、单元面积、扇入扇出系数等。设计一个电子系统,总有相应的设计目标,如时钟频率、芯片面积、端口驱动能力等。自动综合工具将这些设计指标作为综合过程的约束条件,在给定的包含工艺参数的综合库中选取最佳单元,实现综合过程。 与模拟工具一样,目前有许多优秀的综合工具借助现有的综合库能将Verilog语言源代码进行综合,转化成门级电路图,并且可以根据设计者施加的约束条件对电路进行优化,生成相应的门级网表。Synopsys公司的DC(DesignCompiler)就是一个比较好的逻辑综合工具。DC逻辑综合与优化后得到的电路图如图6所示。      5 门级仿真   综合之后所得到的电路是否仍能满足设计要求,同样需要通过仿真来确定,逻辑综合之后的仿真称为门级仿真。门级网表是使用门电路以及电路之间的连接来描述电路的方式。门级仿真与RTL仿真不同的是,门级仿真包含了门单元的延时信息,因而门级仿真需要相应工艺的仿真库支持。把综合后得到的网表中门级延时参数提取出来后,对被测试对象进行反标,然后再进行仿真,得到的结果如图7所示。   从门级仿真所得到的波形图输出结果来看,本设计在功能与时序上是符合设计要求的。    6 后端设计   门级仿真通过后,接着就是进行版图规划;版图规划好以后就进行布局与布线;在版图的布局布线都已确定后,可以从版图中进一步提取出连线电阻、电容等参数。   生成版图之后,把从版图中提取出的参数反标到门级网表中,进行包含门延时、连线延时的门级仿真,称作后仿真。这一步主要是进行时序模拟,如果时序不能满足设计要求,通常需要修改版图的布局与布线、逻辑综合的约束条件,有时也可能回到RTL描述、行为级描述甚至设计规范或算法实现上加以调整。版图得到验证后就可以交付生产厂家做到硅片上。    7 结束语   由以上的设计过程可以看出,Verilog语言的最大特点是简洁、灵活、高效,其编程风格和C语言极其相似,所以很容易学习和掌握。同时,Verilog语言还具有底层描述方面的优势,而且其设计方法与具体工艺无关,这就使得用Verilog语言编写的功能模块具有很高的可重用性。随着集成电路的深亚微米制造技术、设计技术的迅速发展,集成电路已进入片上系统(System on a Chip,SoC)设计时代。SoC设计的最大挑战之一是IP(Intellectual Property)模块的有效使用和重用。IP模块的重用,除能缩短SoC芯片设计的时间外,还能降低设计和制造成本,提高可靠性。在SoC设计中,可重用的IP模块越多,设计过程的效率就会越高。由此可见,Verilog语言在SoC设计中可以发挥更大的作用。因此,能用Verilog语言进行电路设计是每个电子设计工程师必须掌握的基本技术。
  • 热度 13
    2013-10-20 15:11
    1324 次阅读|
    0 个评论
    状态机的设计步骤: 1.    深入的理解问题(Understand the problem)。用非常严谨的风格去解释问题的描述是非常重要的。对于状态机,你必须搞清楚什么样的输入会产生什么样的输出。 2.    获得一个对状态机的理论性的描述(Obtain an abstract representation of the FSM)。一旦你理解了问题,你必须用一种易于操作的形式表达出来,状态图是一种比较好的表示方法。      3.    对状态机进行优化(Perform state minimization.)。从上一步过来,通常会导致很多状态,很多状态会有相同的行为描述,这些状态应该被优化成同一个状态。 4.    进行状态编码的赋值(Perform state assignment)。编码方式好坏决定了执行的速度。 5.    选择何种类型的触发器来实现状态机(Choose flip-flop types for implementing the FSM's state),J-K触发器会减少门,但会改变转换表。D触发器是比较简明的实现过程。 6.    实现有限状态机(Implement the finite state machine) 四:写状态机需要注意的问题: 设计方案完全取决于设计要求:面积,速度。 1:如果有可能的话,选择output = state类型状态机是一个理想的方案,因为速度最快,使用的面积最小。 2:在设计状态机时,对于所有的输出信号在每一个时钟周期的取值,都必须作出非常明确的定义。也就是说在每一个状态周期里面,对每一个输出值,在该状态可能的各种情况下,都必须有明确的赋值。否则,综合结果会多很多不必要的门。 这是因为:由于没有在每一个状态周期里面给输出信号赋值,因而需要有硬件来维持原来的输出信号值保持不变。综合工具解决的唯一办法:把输出信号值反馈给多路选择器,当某一时钟周期没有给输出信号赋值时,多路选择器再把这个值送给输出信号,使得输出信号值得以维持不变。(这就是锁存LATCH效应) 3:注意消除锁存器,看下面的例子   现在就详细说一下one-hot状态机: 1.one-hot编码:s0 = “0001” ; s1 = “0010”; s2 = “0100”; s3 = “1000”;                 每一个状态用掉一个触发器,状态数等于触发器的数目。这就意味着触发器数目增加,而状态译码组合电路被优化掉了。对于寄存器资源丰富的xilinx器件来说,是非常适合的。 2.one-hot状态机的好处:      现在的FPGA每一个逻辑块中都包含了一个和多个触发器,对于仅需要触发器的one-hot编码解码来说,提供了很好的条件。下面列举了一些用one-hot设计的好处: a)    对寄存器资源丰富xilinx fpga来说更易于适配和布线。 b)     one-hot状态机是典型的相当快速的状态机。他的速度与状态的个数没有任何关系,仅仅决定于状态变迁到一个特殊状态的这种转换的数量(instead depend only on the number of transitions into a particular state)。 c)    不用担心你会在发现最佳的状态机编码方式。因为其他设计的状态机如果在加入一些状态或者改变其他一些什么的话,那就可能不再最优了。One-hot编码方式在所有状态机中是最佳的,最优的。 d)     one-hot状态机很容易设计。状态图能够直接被画成原理图或者被直接用vhdl语言写出来,而不用编码成状态表。 e)    修改起来简单明了。增加和删掉一些状态或者改变一些敏感量等式能被综合器很容易的执行,而不会影响余下的状态机。 f)    很容易从vhdl或者verilog综合。 g)    比其他一些高性能的状态机没有任何的布线面积的浪费。 h)    能够用静态时序分析的方法很容易的找出危险的不合理的状态机转换路径。
相关资源
  • 所需E币: 1
    时间: 2022-5-5 16:12
    大小: 95.35KB
    CodingAndScriptingTechniquesForFSMDesignsWithSynthesis-Optimized,Glitch-FreeOutputs(CliffordE.Cummings)
  • 所需E币: 1
    时间: 2022-5-1 22:43
    大小: 951.94KB
    上传者: ZHUANG
    基于有限状态机(FSM)的多传感器信息融合在轮式运动机器人编程中的应用
  • 所需E币: 0
    时间: 2021-3-25 01:46
    大小: 308.31KB
    上传者: stanleylo2001
    状态机资料FSM设计指导状态机设计FSM简介:FSM分两大类:米里型和摩尔型,组成要素有输入(包括复位),状态(包括当前状态的操作),状态转移条件,状态的输出条件,图1为状
  • 所需E币: 0
    时间: 2020-9-19 21:08
    大小: 212.4KB
    上传者: bwj312
    FPGA设计方法与技巧类资料FSM设计指导
  • 所需E币: 0
    时间: 2020-8-24 00:14
    大小: 694.68KB
    上传者: czdian2005
    FPGA设计方法与技巧类资料FSM设计指导
  • 所需E币: 3
    时间: 2019-12-25 17:20
    大小: 76.14KB
    上传者: 238112554_qq
    基于VerilogHDL设计的自动数据采集系统……
  • 所需E币: 3
    时间: 2019-12-25 15:53
    大小: 276.54KB
    上传者: wsu_w_hotmail.com
    通过嵌入式实时操作系统(VxWorks),实现了视频监控系统的解决方案.研究了在VxWorks系统下实现设备和数据通信的关键技术和相应机制,并采用有限状态机(FSM)解决了串行数据通信的帧同步.文中重点分析了采用计数器信号量解...第28卷第3期北方交通大学学报V。1.28№.3至Q丝笙鱼旦』Q坠堡垒&些堡坠塑墅堡垦丛』!壑塑!坠堕旦墼!!堡星曼!些』些;至Q些文章编号:1000―1506(2004)03一0079一03VxWorks嵌入式系统下视频监控系统通信的研究吴北玲,梁夷,赵天石(北京交通大学电子信息工程学院,北京100044)摘要:通过嵌入式实时操作系统(Vx……
  • 所需E币: 3
    时间: 2019-12-25 10:32
    大小: 636.42KB
    上传者: rdg1993
    系统定义与分析嵌入式系统概论五系统定义与分析北京大学软件与微电子学院嵌入式系统概论定义与分析-ObjectsTointroducetheconceptsofembeddedsystemrequirementsTodescribefunctionalandnon-functionalrequirementsToexplaintwotechniquesfordescribingembeddedsystemrequirementsToexplainhowsoftwarerequirementsmaybeorganizedinarequirementsdocument北京大学软件与微电子学院嵌入式系统概论定义和分析-主要内容SystemDefinitionSystemAnalysisSummary北京大学软件与微电子学院嵌入式系统概论SystemDefinitionTermsandConceptsDevelopingACommonUnder……
  • 所需E币: 3
    时间: 2019-12-25 10:32
    大小: 433.32KB
    上传者: 978461154_qq
    系统行为描述(计算)模型嵌入式系统概论四系统行为描述(计算)模型北京大学软件与微电子学院嵌入式系统概论计算模型(ComputationModel)概述时序程序模型有限状态机(FSM)并发进程模型数据流模型流程图小结北京大学软件与微电子学院嵌入式系统概论计算模型-概述(1)计算模型(computationModel)描述系统的处理行为(过程)的方法模型作用帮助设计者理解和描述系统行为减少系统缺陷(bug)Mostsystembugscomefrommistakesmadedescribingthedesiredbehaviorratherthanfrommistakesinimplementingthatbehavior.北京大学软件与微电子学院嵌入式系统概论计算模型-概述(2)描述嵌入式系统的模型时序程序模型(sequentialprogrammodel)提供一组语句、语句排列的规则……
  • 所需E币: 3
    时间: 2020-1-4 23:41
    大小: 9.56KB
    上传者: quw431979_163.com
    FSM设计指导……
  • 所需E币: 4
    时间: 2020-1-4 23:42
    大小: 82.36KB
    上传者: rdg1993
    fsm设计好文章(cummings)……
  • 所需E币: 5
    时间: 2019-12-25 16:00
    大小: 332.18KB
    上传者: 978461154_qq
    如何写好状态机第6章如何写好状态机节选自《Verilog设计与验证》作者:吴继华、王诚状态机是逻辑设计的重要内容,状态机的设计水平直接反应工程师的逻辑功底,所以许多公司的硬件和逻辑工程师面试中,状态机设计几乎是必选题目。本章在引入状态机设计思想的基础上,重点讨论如何写好状态机。本章主要内容如下:状态机的基本概念;如何写好状态机;使用SynplifyPro分析FSM。6.1状态机的基本概念本节的重点在于帮助读者理解状态机的基本概念和应用场合。6.1.1状态机是一种思想方法相信大多数工科学生在学习数字电路时都学习过状态机的基本概念,了解一些使用状态机描述时序电路的基本方法。但是,笔者希望大家能扩展思维,认识到状态机不仅仅是一种时序电路设计工具,它更是一种思想方法。我们先看下面一个简单的例子。在大学生活中,某学生的在校的学习生活可以简单地概括为宿舍、教室、食堂之间的周而复始,用图6-1就可以形象地表现出来。这里画这张图,并不是要讨论这个学生是否是一个“乖乖”类型学生,请大家注意,如果将图中的“地点”认为是“状态”,将“功能”认为是状态的“输出”,这张图就是一张标准的状态转移图,也就是说,我们用状态机的方式清晰地描述了这个学生的在校生活方式。第6章如何写好状态机图6-1某学生在校生活状态转移图如果读者认为这张图描述的学生生活过于单调而怀疑状态机描述方法的威力,我们再看看另一位生活丰富多彩的学生的在校生活,他(她)的在校生活方式可以用图6-2表示。……