版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 为什么要设计有限状态机2 状态机是一种思想方法3 同步有限状态机的设计4 如何设计好状态机5 状态机设计举例?- 。In7ControlSwitchOut7In0Out0.In7ControlSwitchOut7In0Out0.ControlSwitchin 7:0开关out7:0tt31 0215 3262 88 0215 32 00 00outbuf7outbuf0.关outbuf 7:0开bus7:0tt31 0215 3262 88 0215 32 ZZ ZZLinkBusSwitchIn7ControlSwitchQ7CLOCKDQ7In6ControlSwitchQ6CLOCK
2、DQ6。带寄存器的八位数据通道控制器的verilog描述组合逻辑输出控制开关Sn in 7:0out 15:0in 7:0 8 d 31 8 d 202 16 d 93 16d 606延时10nsSn开关out15:0tttqdqdqdqdqdqdqdqdqdqdqdqdclock开关S1 开关S2组合逻辑组合逻辑寄存器1寄存器2寄存器3clock开关S5 寄存器Cqd开关S6开关S3 寄存器Bqd开关S4开关S1 寄存器Aqd开关S2clock 10nsS2开关S1tttSnS3tttS41 同步时序逻辑是指表示状态的寄存器组的值只可能在唯一确定的触发条件发生时刻改变 。同步时序逻辑中的触发
3、输入至少可以维持一个时钟后才会发生第二次触发 。2 异步时序逻辑是指触发条件由多个控制因素组成,任何一个因素的跳变都可以引起触发。记录状态的寄存器组其时钟输入端不是都连结在同一个时钟信号上。记录状态的寄存器组的输出在任何时刻都有可能发生变化 。1 许多综合器不支持异步时序逻辑的综合 2 用异步时序逻辑很难控制由组合逻辑和延迟所产生的冒险和竞争 若在同一时钟的正跳沿(或负跳沿)下对寄存器组既进行输入又进行输出,很有可能由于门的延迟使输入条件还未确定时,就输出了下一个状态,这种情况会导致逻辑的紊乱。可利用上一个时钟为下一个时钟创造触发条件。这种工作方式需要有一个前提:确定下一个状态所使用的组合确定
4、下一个状态所使用的组合电路的延迟与时钟到各触发器的差值必须小于一个时钟周期的电路的延迟与时钟到各触发器的差值必须小于一个时钟周期的宽度宽度。只有满足这一前提才可以避免逻辑紊乱。在实际电路的实现中,主要采取以下措施来:(1)全局时钟网络布线时尽量使各分支的时钟一致;(2)采用平衡树结构,在每一级加入缓冲器,使到达每个触发器时钟端的时钟同步。全局时钟网络触发器缓冲器 触发器1触发器n图1 全局时钟网示意图 图2 平衡树结构示意图同步有限状态机同步有限状态机ena_2ena_3ena_1组合逻辑 1寄存器组组合逻辑 2寄存器组组合逻辑 3寄存器组组合逻辑 N寄存器组input1 input2inpu
5、tn数字系统构成示意图图13.1 某学生在校生活状态转移图如果将图中的地点认为是状态将功能认为是状态的输出那么这张图就是标准的状态转移图图13.2 某学生在校生活状态转移图如果将圈中的地点认为是状态将功能认为是状态的输出将条件认为是状态转移的输入条件那么图也是一张标准的状态转移图 状态机特别适合描述那些发生有先后顺序或者有逻辑规律的事情,这就是状态机的本质。状态机是对具有逻辑顺序或时序规律的事件进行描述的一种方法。这个论断中最重要的两个词就是“逻辑顺序”和“时序规律”这两点就是状态机所要描述的核心和强项,换言之,所有具有逻辑顺序和时序规律的事情都适合用状态机描述。 状态转移图 状态转移图是状态
6、机描述中最自然的方式,状态转移图经常在设计规划阶段定义逻辑功能时使用,也可以在分析已有源代码中的状态机时使用,这种图形化的描述方式非常有助于理解设计意图。 状态转移列表 状态转移列表是用列表的方式描述状态机,是数字逻辑电路常用的设计方法之一,经常被用于状态化筒,对于可编程逻辑设计而言,由于可用逻辑资源比较丰富,而且状态编码要考虑设计的稳定性、安全性等因素,所以并不经常使用状态转移列表优化状态. HDL 语言描述状态机 如何使用HDL 语言描述状态机是本课程所要讨论的重点,使用HDL 语言描述状态机应具有一定的灵活性,但是决不是天马行空,而是有章可循的.通过使用一些规范的描述方法,可以使HDL
7、语言描述状态机更安全、更稳定、更高效、更易于维护. 有限状态机是是组合逻辑和寄存器组构成的硬件时序电路。有限状态机的状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态到另一个状态。 寄存器逻辑的功能是存储有限状态机的内部状态;而组合逻辑有可以分为次态逻辑和输出逻辑两部分,次态逻辑的功能是确定有限状态机的下一个状态,输出逻辑的功能是确定有限状态机的输出。 状态:也叫状态变量。在逻辑设计中,使用状态划分逻辑顺序和时序规律。比如设计伪随机码发生器时,可以用移位寄存器序列作为状态;在设计电机控制电路时,可以将电机的不同转速作为状态;在设计通信系统时,可
8、以将信令的状态作为状态变量等。 输出:输出指在某一个状态时特定发生的事件。如设计电机控制电路时,如果电机转速过高,则输出为转速过高报警,也可以伴随减速指令或降温措施等。 输入:指状态机中进入每个状态的条件,有的状态机没有输入条件,其中的状态转移较为简单,有的状态机有输入条件,当某个输入条件存在时才能转移到相应的状态。 摩尔型状态机: 摩尔型状态机的输出仅仅依赖于当前状态, 而与输入条件无关。例如图13-1 所示的例子,将图中的“地点”认为是状态,将“功能”认为是状态的“输出”,则每个输出仅与状态相关,所以它是一个摩尔型状态机。 米勒型状态机: 米勒型状态机的输出不仅依赖于当前状态,而且取决于该
9、状态的输入条件。例如图13-2 所示的例子,将图中的“地点”认为是“状态”,将“功能”认为是状态的“输出”,将“条件”认为是状态转移的“输入条件“,可以发现该学生到达什么地方,做什么事情都是由当前状态和输入条件共同决定的,所以它是一个米勒型状态机。下一状下一状态的逻态的逻辑辑 F F输出逻辑输出逻辑 G G状态状态寄存器寄存器图13.3 时钟同步的状态机结构 (Moor状态机)图13.4 时钟同步的状态机结构 (Mealy 状态机)下一状态下一状态的逻辑的逻辑 F F输出逻辑输出逻辑 G G状态状态寄存器寄存器 clk 输入图13.5 带流水线输出的Mealy 状态机 输出输出逻辑逻辑 G G
10、 状态转移图表示状态转移图表示RTLRTL级可综合的级可综合的 Verilog Verilog 模块表示模块表示module exp(out,datain,clk,rst);input clk,rst,datain;iutput out;reg,out;reg state; /状态变量always(posedge clk or posedge rst)if(rst) state,out=2b00;elsecase(state)1b0:begin out=1b0; if(!datain) state=1b0; else state=1b1; end1b1:begin out=datain; st
11、ate=1b0; enddefault state,out=2b00; endcaseendmodule图形表示:状态、转移、条件和逻辑开关图形表示:状态、转移、条件和逻辑开关图13.6 状态转移图Idle Start Stop Clear A/K1=0 !A A/K2=1 ! R e s e t / K 2 = 0 K1=0! R e s e t / K 2 = 0 K1=0 (!Reset |!A)/ K2=0 K1=1!Reset /K2=0 K1=0module fsm (Clock, Reset, A, K2, K1);module fsm (Clock, Reset, A, K2,
12、 K1);input Clock, Reset, A; /input Clock, Reset, A; /定义时钟、复位和输入信号定义时钟、复位和输入信号output K2, K1; /output K2, K1; /定义输出控制信号的端口定义输出控制信号的端口reg K2, K1; /reg K2, K1; /定义输出控制信号的寄存器定义输出控制信号的寄存器reg 1:0 state ; /reg 1:0 state ; /定义状态寄存器定义状态寄存器parameter Idle = 2b00, Start = 2b01, parameter Idle = 2b00, Start = 2b0
13、1, Stop = 2b10, Clear = 2b11; Stop = 2b10, Clear = 2b11;/定义状态变量参数值定义状态变量参数值 always (posedge Clock)always (posedge Clock) if (!Reset) if (!Reset) begin / begin /定义复位后的初始状态和输出值定义复位后的初始状态和输出值 state = Idle; K2=0; K1=0; state = Idle; K2=0; K1=0; end endelseelse case (state) case (state) Idle: begin Idle:
14、 begin if (A) begin if (A) begin state = Start; state = Start; K1=0; K1=0; end end else state = Idle; else state = Idle; end end Start: begin Start: begin if (!A) state = Stop; if (!A) state = Stop; else state = Start; else state = Start; end end Stop: begin Stop: begin /符合条件进入新状态,否则留在原状态符合条件进入新状态,否
15、则留在原状态 if (A) begin if (A) begin state = Clear; state = Clear; K2= 1; K2= 1; end end else state = Stop; else state = Stop; end end Clear: begin Clear: begin if (!A) begin if (!A) begin state = Idle; state = Idle; K2=0; K1=1; K2=0; K1=1; end end else state = Clear; else state = Clear; end end endcase
16、 endcaseendmodule endmodule 用独热码表示状态的状态机)用独热码表示状态的状态机)modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg3:0state;parameterIdle=4b1000,Start=4b0100,Stop=4b0010,Clear=4b0001; always (posedge clock) always (posedge clock) if (!Reset) if (!Reset) begin begin state = Idle; K2=0; K
17、1=0; state = Idle; K2=0; K1=0; end end else else case (state) case (state) Idle: if (A) begin Idle: if (A) begin state = Start; state = Start; K1=0; K1=0; end end else state = Idle; else state = Idle; modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg1:0state,nextstate;parame
18、terIdle=2b00,Start=2b01,Stop=2b10,Clear=2b11;方法四采用了另一种方法:直接把状态码定义方法四采用了另一种方法:直接把状态码定义为输出。也就是把状态码的指定与状态机控制为输出。也就是把状态码的指定与状态机控制的输出联系起来,把状态的变化直接用作输出,的输出联系起来,把状态的变化直接用作输出,这样做可以提高输出信号的开关速度并节省电这样做可以提高输出信号的开关速度并节省电路器件。这种设计方法常用在高速状态机中。路器件。这种设计方法常用在高速状态机中。建议同学们在设计高速状态机时采用方法四的建议同学们在设计高速状态机时采用方法四的风格。例中风格。例中sta
19、te3 state3 和和state0state0分别表示前面分别表示前面两个例子中的输出两个例子中的输出K2K2和和K1K1。module fsm (Clock, Reset, A, K2, K1, state);module fsm (Clock, Reset, A, K2, K1, state);input Clock, Reset, A;input Clock, Reset, A;output K2, K1;output K2, K1;output 4:0 state;output 4:0 state;reg 4:0 state ;reg 4:0 state ; assign assi
20、gn K2= state4; / K2= state4; / 把状态变量的最高位用作输出把状态变量的最高位用作输出K2K2assign assign K1= state0; / K1= state0; / 把状态变量的最低位用作输出把状态变量的最低位用作输出K1K10 01 二进制编码 二进制编码和格雷码都是压缩状态编码。二进制编码优点是使用状态变量少,但是从一个状态到相邻个状态变化时,同时有多个比特位发生变化,瞬步次数多,易发生毛刺2 格雷码从一个状态到相邻个状态变化时,每次只有一个比特位发生变化,虽减少了毛刺和多个暂态的可能,但是不适合有很多状态跳转的情况10进制数字码进制数字码格雷码格雷
21、码10进制数字码进制数字码格雷码格雷码00010511001011061101201117111130101811104010091010由于在有限状态机中,输出信号经常是通过状态的组合逻辑电路驱动,因此有可能由于输入信号的不同时到达而产生毛刺,如果状态机的所有状态是一个顺序序列,则可通过格雷编码来消除毛刺,但对于时序逻辑状态机中的复杂分支,格雷编码也不能达到消除毛刺的目的。3 独热码独热码是指对任意指定的状态,状态向量中只有1位为1,其余位都为0.n位的状态机需要n位触发器。这种状态机的速度与状态的数量无关,仅取决于到某特定状态的转移数量,速度很快,当状态很多时,使用二进制编码,状态机速度会
22、明显下载,而采用独热码,虽然多用了触发器,但译码简单,节省和简化了组合逻辑电路。独热码还具有设计简单、修改灵活、易于调试和综合等优点10进制数字码进制数字码独热码独热码10进制数字码进制数字码独热码独热码0000_0000_005000_0100_001000_0000_016000_1000_002000_0000_107001_0000_003000_0001_008010_0000_004000_0010_009100_0000_00编码方式属性定义及耗用资源参考状态机的异步置位与复位状态机的异步置位与复位 状态机的同步置位与复位状态机的同步置位与复位 直接设置法 异步置位与复位是与时钟
23、无关的.当异步置位与复位到来时它们立即分别置触发器的输出为1或0,不需要等到时钟沿到来才置位或复位。把它们列入always块的事件控制括号内就能触发always块的执行,因此,当它们到来时就能立即执行指定的操作。 状态机的异步置位与复位是用always块和事件控制实现的。 ( )沿关键词包括 posedge(用于高电平有效的set、reset或上升沿触发的时钟)和 negedge(用于低电平有效的set、reset或下降沿触发的时钟),信号可以按任意顺序列出。1)异步、高电平有效的置位(时钟的上升沿)(posedge clk or posedge set)2)异步低电平有效的复位(时钟的上升沿
24、)(posedge clk or negedge reset)3)异步低电平有效的置位和高电平有效的复位(时钟的上升沿)4)( posedge clk or negedge set or posedge reset )带异步高电平有效的置位与复位的always块样板always (posedge clk or posedge set or posedge reset) begin if(reset) begin /*置输出为0*/ end else if(set) begin /*置输出为1*/ end else begin /*与时钟同步的逻辑*/ end end 同步置位与复位是指只有在时
25、钟的有效跳变沿时刻置位或复位信号才能使触发器置位或复位(即,使触发器的输出分别转变为逻辑1或0)。 不要把set和reset信号名列入always块的事件控制表达式,因为当它们有变化时不应触发always块的执行。相反,always块的执行应只由时钟有效跳变沿触发,是否置位或复位应在always块中首先检查set和reset信号的电平。所以,set或reset的电平维持时间必须大于时钟沿的间隔时间,否则set和reset不能每次都能有效地完成置位和复位的工作。()其中沿关键词指 posedge(正沿触发)或 negedge(负沿触发)1)正沿触发(posedge clk)2)负沿触发(nege
26、dge clk)3)同步的具有高电平有效的置位与复位端的always块样板always (posedge clk) begin if(reset) begin /*置输出为0*/ end else if(set) begin /*置输出为1*/ end else begin /*与时钟同步的逻辑*/ end end评判 FSM 的标准 RTL 级状态机描述常用的语法推荐的状态机描述方法状态机设计的其他技巧1 FSM 要安全,稳定性高 所谓FSM 安全是指FSM 不会进入死循环,特别是不会进入非预知的状态,而且即使由于某些扰动进入非设计状态,也能很快恢复到正常的状态循环中来.这里面有两层含义,第
27、一,要求该FSM 的综合实现结果无毛刺等异常扰动;第二,要求状态机要完备、即使受到异常扰动进入非设计状态,也能很快恢复到正常状态2 FSM 速度快,满足设计的频率要求3 FSM 面积小,满足设计的面积要求4 FSM 设计要清晰易懂、易维护不规范的FSM 写法很难让其他人解读,过一段时间后设计者会发现其很难维护。 是前3项标准绝不是割裂的,它们之间有着紧密的内在联系,如果要求FSM安全,那么在很多时候都需要使用“如fu1I case” 的编码方式,即状态转移变量的所有向量组合情况都在FSM 中有相应的处理.这势必意味着要耗费更多的设计资源,有时也会影响FSM 的频率。所以各条标准要综合考虑,根据
28、设计的要求来权衡。当各条评判标准发生冲突时,按照标准的罗列顺序考虑,就是根据这些标准在设计中的重要性进行排列,也就是说第1条“FSM 要安全,稳定性高”的优先级最高,最重要,第四条“FSM 设计要清晰易懂、易维护的优先级最低,是相对次要的标准。在RTL 级设计可综合的FSM 时常用的关键宇如下: wire 、reg 等状态编码时(也就是用某种编码描述各个状态时)一般都要使用reg 寄存器型向量。 parameter用于描述状态名称,增强源代码的可读性,简化描述。 例如某状态机使用初始值为“0” 的独热码(one-hot) 编码方式定义的4bit 宽度的状态变量NS (代表Next State
29、,下一 状态)和CS (代表Current State ,当前状态) ,且状态机包含5 个具体状态IDLE (空闲状态)、S1 (工作状态。、S2 (工作状态2) 、S3 (工作状态3) 和ERROR (告警状态)代码如下:reg 3:0 NS , CS;parameter 3:0 /one hot with zero initial IDLE= 3b0000 ,S1= 3b0001 ,S2 =3b0010 ,S3= 3b0100 ,ERROR= 3bl000; always在FSM 设计中有3 种always 的使用方法,第一种用法是根据主时钟沿完成同步时序的状态迁移。例如某状态机从当前状态
30、cs 迁移到下一个状态NS 可以如下表述:/sequential state transitionalways (posedge clk or negedge nrst)if (!nrst)CS = IDLE;elseCS =NS;always 的第二种用法是根据信号敏感表完成组合逻辑的输出always 的第三种用法是根据时钟沿完成同步时序逻辑的输出 case/endcasecase/endcase 是FSM 描述中最重要的语法关键字,其语法结构如下:case (case_expression)case _item1 :case item statement1;case_item2 :case
31、 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 _ tem _ statement 为进入每个case tem 的对应操作,在FSM 描述中即为每个状态对
32、应的状态转移或者输出,如果case tem statement 包含的操作不只一条,可以用begin/end 嵌套多条操作default 是个可选的关键字,用以指明当所列的所有case_item 与case_ expression 都不匹配时的操作,在FSM 设计中,为了提高设计的安全性,避免所设计的FSM 进入死循环,一般要求加上defauIt关键字来描述FSM 所需状态的补集状态下的操作task/endtasktask/endtask 在描述状态机时的主要用途是将不同状态所对应的输出用task/endtask 封装,增强了代码的可维护性和可读性。例如某状态机IDLE 状态的输出可以用tas
33、k/endtask 封装为IDEL_out 任务task IDLe_ out;beginw ol , w o2 ,w err =3b000;end当然,在描述状态机时也会使用到其他一些常用的RTL 级语法,如if/else 和assign等,它们的功能与-一般的RTL 描述方法一致1:一段式FSM 描述方法 将整个状态机写到一个always 模块里,在该模块中既描述状态转移,又描述状态的输入和输出2:两段式FSM 描述方法 使用两个always 模块,其中一个always 模块采用同步时序的方式描述状态转移,而另一个模块采用组合逻辑的方式判断状态转移条件,描述状态转移规律 3:三段式FSM 描
34、述方法 一个aways 模块采用同步时序的方式描述状态转移,一个采用组合逻辑的方式判断状态转移条件,描述状态转移规律,第三个aways 模块使用同步时序电路描述每个状态的输出推荐使用后两种FSM 描述方法例:选用了一个非常典型的米勒型状态机,共有4 种状态,即IDEL 、Sl 、S2 和ERROR,输入信号包括时钟“clk” ,低电平异步复位信号“ nrst”和信号i1 、 i2 ,输出信号为“o1、“o2 和err 状态关系如图 所示。状态的输出如下:IDLE 状态的输出为o1 ,o2,err = 3b000;Sl 状态的输出为o1 ,o2,err = 3bl00;S2 状态的输出为o1 ,
35、o2,err = 3b010;ERROR 状态的输出为o1 ,o2 ,err =3b111 。 FSM 初始化状态 一个完备的状态机(健壮性强)应该具备初始化状态和默认状态。当芯片加电或者复位后,状态机应该能够自动将所有判断条件复位,并进入初始化状态。需要注意的是,大多数FPGA 都有GSR (Global SetIReset) 信号,当FPGA 加电后, GSR 信号默认对所有的寄存器、RAM 等单元置位或复位,这时配置于FPGA 的逻辑并未生效,所以不能保证正确地进入初始化状态,也就是说使用GSR 进入FPGA 的初始化状态,常常会产生种种不必要的麻烦。 常规的做法是采用异步复位信号,另一
36、种方法是将默认的初始状态的编码设为全零,这样当GSR 复位后,状态机将自动进入初始状态。 FSM 的编码Binary (二进制编码)、gray-code(格雷码)编码使用最少的触发器,较多的组合逻辑,而one-hot(独热码)编码则与之相反。one-hot 编码的最大优势在于状态跃迁时仅需要改变状态变量的某一个bit ,在一定程度上简化了比较逻辑,从而减少了毛刺产生的概率。 CPLD 的组合逻辑资源较为丰富,而FPGA 的触发器资源较为丰富,所以CPLD多使用gray code编码,而FPGA多使用one-hot编码。另一方面,对于小型设计而言使用gray-code 和binary 编码更有效
37、,而对于大型状态机而言则使用one-hot 编码更为高效。 推荐在24 个状态以上会用格雷码,在524 个状态会用独热码,在4 个状态以内用二进制码,独热码比二进制码在实现FSM 部分会占更多资源,但是译码输出控制简单,所以如果状态不是太多,独热码较好。状态太少译码不会太复杂,二进制就可以了。状态太多,独热码所占资源太多,综合考虑就用格雷码了。 FSM 状态编码定义 状态机可以用parameter 定义,但是不推荐使用define 宏定义的方式,因为define 宏定义在编译时会自动替换整个设计中所定义的宏,而parameter 仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态机混淆。
38、例如一个工程里面有两个module ,它们各包含一个FSM ,如果设计时都有IDLE 这一名称的状态,那么使用、define 宏定义就会发生混淆,而使用parameter 则不会造成任何不良影响。 FSM 输出 如果使用两段式FSM 描述Mealy 状态机,输出逻辑可以用?语句描述,或者使用case 语句判断转移条件与输入信号。如果输出条件比较复杂,而且多个状态共用某些输出,则建议使用task/endtask 将输出封装起来,达到模块复用的目的。 阻塞和非阻塞赋值 为了避免不必要的竞争,不论是做两段式还是三段式FSM 描述,都必须遵循时序逻辑always 模块使用非阻塞赋值=的原则,即当前状态
39、向下一状态时序转移和寄存FSM 输出等always 模块中都要使用非阻塞赋值;而组合逻辑always 模块则使用阻塞眠值=即状态转移条件判断和组合逻辑输出等always 模块中都要使用阻塞赋值。 FSM 的默认状态 完整的状态机应该包含一个默认( defauIt)状态,当转移条件不满足或者状态发生突变时,要能保证逻辑不会陷入死循环这是对状态机健壮性的一个重要要求,也就是常说的要具备自恢复功能。对应于编码上就是对case 和if.else 语句要特别注意,尽量使用完备的条件判断语句。Verilog 中,使用case 语句的时候要用defauIt建立默认状态。我们可以将其中一个状态不编码,指定其为
40、default 默认状态,则任何与所列状态机不匹配的状态都会转到default 状态,从而增强了FSM 的健壮性,另外也可以添加一个额外的default 状态,电路一旦运行到这个状态,就会自动跳转到IDLE 状态,从新启动状态机,这样做也能增强状态机的健壮性。 Full Case 与Parafull Case 综合属性 所谓Fu11 Case 是指FSM 的所有编码向量都可以与case 结构的某个分支或default 默认情况匹配起来.如果一个FSM 的状态编码是8bit,则对应的256个状态编码(全状态编码是2n 个)都可以与case 的某个分支或者default 映射起来. 所谓Paral
41、lel Case 是指在case 结构中,每个case 的判断条件表达式有且仅有惟一一个case 语句的分支与之对应,即两者关系是一一对应关系。用状态机实现下面的状态转移图用状态机实现下面的状态转移图1TwoAlwaysBlockFSMStyle(GoodStyle)modulefsm_cc4_2(gnt,dly,done,req,clk,rst_n);Outputgnt;inputdly,done,req,clk,rst_n;reggnt;parameter1:0IDLE=2b00,BBUSY=2b01,BWAIT=2b10,BFREE=2b11;reg1:0state,next;alway
42、s(posedgeclkornegedgerst_n)if(!rst_n)state=IDLE;elsestate=next;always(stateordlyordoneorreq)beginnext=2bx;gnt=1b0;case(state)IDLE:if(req)next=BBUSY;elsenext=IDLE;BBUSY:begingnt=1b1;if(!done)next=BBUSY;elseif(dly)next=BWAIT;elsenext=BFREE;endBWAIT:begingnt=1b1;if(!dly)next=BFREE;elsenext=BWAIT;endBFR
43、EE:if(req)next=BBUSY;elsenext=IDLE;endcaseendendmodule2OneAlwaysBlockFSMStyle(AvoidThisStyle!)modulefsm_cc4_1(gnt,dly,done,req,clk,rst_n);outputgnt;Reggnt;inputdly,done,req,clk,rst_nparameter1:0IDLE=2d0,BBUSY=2d1,BWAIT=2d2,BFREE=2d3;reg1:0state;always(posedgeclkornegedgerst_n)if(!rst_n)beginstate=ID
44、LE;gnt=1b0;endelsebeginstate=2bx;gnt=1b0;case(state)IDLE:if(req)beginstate=BBUSY;gnt=1b1;endelsestate=IDLE;BBUSY:if(!done)beginstate=BBUSY;gnt=1b1;endelseif(dly)beginstate=BWAIT;gnt=1b1;endelsestate=BFREE;BWAIT:if(dly)beginstate=BWAIT;gnt=1b1;endelsestate=BFREE;BFREE:if(req)beginstate=BBUSY;gnt=1b1;
45、endelsestate=IDLE;endcaseendendmodulemodulefsm_cc4_fp(outputreggnt,inputdly,done,req,clk,rst_n);parameter3:0IDLE=0,BBUSY=1,BWAIT=2,BFREE=3;reg3:0state,next;always(posedgeclkornegedgerst_n)if(!rst_n)beginstate=4b0;stateIDLE=1b1;endelsestate=next;always(stateordlyordoneorreq)beginnext=4b0;gnt=1b0;case
46、(1b1)/ambitfull_caseparallel_casestateIDLE:if(req)nextBBUSY=1b1;elsenextIDLE=1b1;stateBBUSY:begingnt=1b1;if(!done)nextBBUSY=1b1;elseif(dly)nextBWAIT=1b1;elsenextBFREE=1b1;endstateBWAIT:begingnt=1b1;if(!dly)nextBFREE=1b1;elsenextBWAIT=1b1;endstateBFREE:beginif(req)nextBBUSY=1b1;elsenextIDLE=1b1;enden
47、dcaseendendmodulemodulefsm_cc4_2r(outputreggnt,inputdly,done,req,clk,rst_n);parameter1:0IDLE=2b00,BBUSY=2b01,BWAIT=2b10,BFREE=2b11;reg1:0state,next;always(posedgeclkornegedgerst_n)if(!rst_n)state=IDLE;elsestate=next;always(stateordlyordoneorreq)beginnext=2bx;case(state)IDLE:if(req)next=BBUSY;elsenex
48、t=IDLE;BBUSY:if(!done)next=BBUSY;elseif(dly)next=BWAIT;elsenext=BFREE;BWAIT:if(!dly)next=BFREE;elsenext=BWAIT;BFREE:if(req)next=BBUSY;elsenext=IDLE;endcaseendalways(posedgeclkornegedgerst_n)if(!rst_n)gnt=1b0;elsebegingnt=1b0;case(next)IDLE,BFREE:;/defaultoutputsBBUSY,BWAIT:gnt=1b1;endcaseendendmodul
49、emodulefsm_cc4_fp(outputreggnt,inputdly,done,req,clk,rst_n);parameter3:0IDLE=0,BBUSY=1,BWAIT=2,BFREE=3;reg3:0state,next;always(posedgeclkornegedgerst_n)if(!rst_n)beginstate=4b0;stateIDLE=1b1;endelsestate=next;always(stateordlyordoneorreq)beginnext=4b0;gnt=1b0;case(1b1)/ambitfull_caseparallel_casesta
50、teIDLE:if(req)nextBBUSY=1b1;elsenextIDLE=1b1;stateBBUSY:begingnt=1b1;if(!done)nextBBUSY=1b1;elseif(dly)nextBWAIT=1b1;elsenextBFREE=1b1;endstateBWAIT:begingnt=1b1;if(!dly)nextBFREE=1b1;elsenextBWAIT=1b1;endstateBFREE:beginif(req)nextBBUSY=1b1;elsenextIDLE=1b1;endendcaseendendmodule参数赋值之后,声明state和next
51、时序always块用非阻塞赋值语句组合always块对state变量和其它的输入变量敏感组合always块用阻塞赋值语句组合always块里首先有一个next赋值语句6 在case语句之前有一个缺省的输出赋值语句一个状态里输出只能赋值一次在组合always块里状态转移图中的状态转移连线应该与if-else和if-else-if相同In the preceding sections, three different FSM designs were coded four different ways: (1) two alwaysblock coding style, (2) one alway
52、s block coding style, (3) onehot, two always block coding style, (4)three always block coding style with registered outputs.序列检测指的就是将一个指定的序列从数字码流中识别出来。本例中,我们将设计一个“10010”序列的检测器。设X为数字码流输入,Z为检出标记输出,高电平表示“发现指定序列”,低电平表示“没有发现指定序列”。考虑码流为“ 110010010000100101” 则有下表:module seqdet( x, z, clk, rst);input x,clk,
53、 rst;output z;reg 2:0 state;/状态寄存器wire z;parameter IDLE= d0, A=d1, B=d2, C=d3, D=d4, E=d5, F=d6, G=d7;assign z=(state=D & x=0) ? 1 :0;always (posedge clk or negedge rst)if(!rst)state=IDLE; elsecasex( state)IDLE: if(x=1) state=A; else state=idle;A: if (x=0) state=B; else state=A;B:if (x=0) state=
54、C; else state=F;C:if(x=1)state=D; elsestate=G;D:if(x=0) state=E; else state=A;E:if(x=0) state=C;else state=A;F: if(x=1) state=A; Else state=B;G: if(x=1)state=F; else state=G;default: state=IDLE;endcaseendmodule/文件:sequence.tftimescale 1ns/1nsmodule t;reg clk, rst;reg 23:0 data;wire z,x;assign x=data
55、23;initialbeginclk=0;rst=1;#2 rst=0;#30 rst=1; /复位信号data=b1100_1001_0000_1001_0100; /码流数据endalways #10 clk=clk; /时钟信号always (posedge clk) / 移位输出码流data=data22:0,data23;seqdet m ( .x(x), .z(z), .clk(clk), .rst(rst); /调用序列检测器模块/ Enter fixture code hereendmodule / t例5 设计一个序列检测器,用于检测串行的二进制序列,每当连续输入三个或三个以
56、上的1时,序列检测器的输出为1,其它情况下输出为0。 假设初始的状态为s0,输入一个1的状态记为s1,连续输入二个1后的状态记为s2,输入三个或以上1的状态记为s3,不论现态是何种状态一旦输入0的话,就返回到初始状态。根据题意,可画出状态图如图1所示。根据状态图以及前面状态机的介绍,可以采用一个always模块来描述,状态编码采用二进制编码,程序如:module fsm(clk,ina,out);input clk,ina;output out;reg out;parameter s0 = 3b00,s1 =3b01,s2 =3b10,s3=3b11;reg0:1state;always (p
57、osedge clk)beginstate=s0;out =0;case(state)s0:begin state=(ina)?s1:s0; out=0; ends1:beginstate=(ina)?s2:s0; out=0;ends2:beginstate=(ina)?s3:s0; out=0;ends3:beginstate=(ina)?s3:s0; out=1;endendcaseendendmodule 如果采用两个always来描述,程序的模块声明、端口定义和信号类型部分不变,只是改动逻辑功能描述部分,改动部分的程序如下:always (posedge dk)state_fsm =
58、next_state;always (state_fsm or ina)beginstate=s0; out =0;case(state_fsm )s0:beginnext_state=(ina)?s1:s0; out=0;ends1:beginnext state=(ina)?s2:s0; out=0;ends2:beginnext_state=(ina)?s3:s0; out=0;ends3:beginnext_state=(ina)?s3:s0; out=1;endendcaseendendmodule如果采用一位hot编码,仅改动参数设置的两行程序。采用一个always模块描述,改动部
59、分的程序如下 parameter s0 = 3b0001,s1 =3b0010,s2 =3b0100,s3=3b1000;reg0:3 state; 例例 仲裁器电路的设计仲裁器电路的设计目的是产生控制信号将给定系统中共享资源合理地分配给多个设备使用。每次只允许一个设备能使用该共享资源。假设系统的所有信号仅能在时钟正跳变沿时刻改变。每个设备都提供一个输入信号给仲裁器,该输入信号叫做请求信号,仲裁器发给每个设备单独一个输出信号,称作认可信号。某设备通过设置请求信号来申请使用资源。只要共享资源未被占用,仲裁器 应对所有发出的请求信号都予以考虑。基于优先级方案,仲裁器从中选择一个发出请求信号的设备并输出其认可信号。一旦该设备使用资源完成后,它应撤回请求信号假设系统有八台设备,分别称为设备1,设备2 ,设备3。设备8。请求信号被命名为r1、r2 、r3。r8,认可信号被叫做g1、g2 和g3。g8。设备被分配为不同的优先级,例如设备1的优先级最高,设备2 的优先级其次,设备8 的优先级最低。因此,若有多个设备同时发出请求信号,则仲裁器将把认可信号发给提出请求的设备中优先级最高的设备。A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 关于恢复与常年合作供应商合作关系的通知函7篇范本
- 答复供应商退货运费结算函8篇范本
- 2026年甘肃省合作市高三历史下册期末考试检测卷附参考答案【综合卷】
- 2026年广东省兴宁市高一历史下册期末考试测试卷(巩固)附答案
- 2025年福建省石狮市高二历史下册期末考试模拟卷含答案【考试直接用】
- 2025年贵州省赤水市高三历史下册期末考试测试卷及参考答案【能力提升】
- 2026年江苏省江阴市高二历史下册期末考试试卷附完整答案【全优】
- 2025年云南省宣威市高一历史下册期末考试检测卷及参考答案【巩固】
- 2025年江苏省兴化市高三历史上册期末考试自测卷及答案【基础+提升】
- 2026年广东省吴川市高考历史模拟卷(巩固)附答案
- 2025广西中考数学真题(原卷版)
- 血标本采集错误快速反应应急演练脚本及流程
- 2026年家庭服务机器人行业分析报告及未来发展趋势报告
- 初中化学九年级下册《常见的酸和碱》单元整体教学设计(教案)
- 机械加工工艺基础完整文档讲课文档
- 抗真菌药物课件
- 2023年潍坊市初中学业水平考试地理试题附答案
- 2022年上海市初中学业考试地理中考试卷真题(含答案详解)
- 皮影教学反思
- YY/T 1511-2017胶原蛋白海绵
- 船舶吃水差解析课件
评论
0/150
提交评论