第4讲 同步有限状态机设计_第1页
第4讲 同步有限状态机设计_第2页
第4讲 同步有限状态机设计_第3页
第4讲 同步有限状态机设计_第4页
第4讲 同步有限状态机设计_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Verilog硬件描述语言

VerilogHDL主讲陈付龙QQ:544056537f=ab…

安徽师范大学2015第5章VerilogHDL同步有限状态机设计状态机的基本概念状态机的编码方式复杂状态机的编写方法采用状态机来实现程序算法状态机状态机适合描述那些发生时有先后顺序或者有逻辑规律的事情。其本质是对具有逻辑顺序或时序规律事件的一种描述方法。时序逻辑电路设计过程由给定的逻辑功能建立原始状态图和状态表状态化简状态编码选择触发器类型确定激励方程组和输出方程组画出逻辑图并检查自启动有限状态机(FSM)它是一个有向的状态转移图形,由一组状态和一组相应的状态转移函数组成。状态机包含的要素可归纳为4个:现态、条件、动作、次态。“现态”和“条件”是因,“动作”和“次态”是果。现态:是指当前所处的状态。条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。有限状态机(FSM)感冒健康康复中休息淋雨吃药有限状态机(FSM)设计集成电路时,通常可将整个系统划分为数据单元和控制单元。其中控制单元的主体通常是一个有限状态机,它接收外部信号和数据单元产生的状态信息,产生控制信号序列。有了以上电路,就不难设计出复杂的控制序列来操纵数字系统的控制开关阵列。设计这样一个电路:1)能记住自己目前所处的状态;2)状态的变化只可能在同一个时钟的跳变沿时刻发生,而不可能发生在任意时刻;3)在时钟跳变沿时刻,如输入条件满足,则进入下一状态,并记住自己目前所处的状态,否则仍保留原来的状态;4)在进入不同的状态时刻,对系统的开关阵列做开启或关闭的操作。有限状态机(FSM)有限状态机能够克服纯硬件数字系统顺序方式控制不灵活的缺点。状态机的结构模式相对简单。状态机容易构成性能良好的同步时序逻辑模块。状态机的Verilog表述丰富多样。在高速运算和控制方面,状态机更有其巨大的优势。就可靠性而言,状态机的优势也是十分明显的。有限状态机(FSM)状态机一般包括组合逻辑和寄存器逻辑两部分。寄存器用于存储状态,组合电路用于状态译码和产生输出信号。状态机的下一个状态及输出不仅与输入信号有关,还与寄存器当前状态有关。根据输出信号产生方法的不同,状态机可分为米里(Mealy)机和摩尔(Moore)机。米里(Mealy)机的输出是当前状态和输入信号的函数。摩尔(Moore)机的输出仅是当前状态的函数。在硬件设计时,需自行决定采用哪种状态机。Mealy状态机下一状态的逻辑F输出逻辑

G状态寄存器clk输入输入输出激励信号当前状态时钟信号clk下一个状态=F(当前状态,输入信号);

输出信号=G(当前状态,输入信号);Moor状态机下一个状态=F(当前状态,输入信号)

输出信号=G(当前状态);下一状态的逻辑F输出逻辑

G状态寄存器clk输入输入激励信号时钟信号clk当前状态输出有限状态机(FSM)Idle

Start

StopClear!A!Reset/K2=0K1=0!Reset/K2=0K1=0A=1/K2=1

(!Reset|!A)/K2=0K1=1!Reset/K2=0K1=0A/K1=0状态机的设计包含两个主要过程:一是状态机的编码,二是状态机的建模。同步时钟:clk输入信号:reset、A输出信号:K1、K2状态转移发生在时钟上升沿触有限状态机(FSM)-编码状态编码又称状态分配。通常有多种编码方法,编码方案选择得当,设计的电路可以简单;反之,电路会占用过多的逻辑或速度降低。设计时,须综合考虑电路复杂度和电路性能这两个因素。二进制编码、格雷编码、完整一位热编码(verboseone-hot)、简化一位热编码(simplifiedone-hot)二进制编码:

Idle=2’b00Start=2’b01Stop=2’b10Clear=2’b11One-Hot编码:

Idle=4’b1000Start=4’b0100Stop=4’b0010Clear=4’b0001有限状态机(FSM)-编码二进制编码:使用较少的触发器和较多的组合逻辑;适用于CPLD和小型状态机设计;

One-Hot编码:使用较多的触发器和较少的组合逻辑;适用于FPGA和大型状态机设计;

有限状态机(FSM)-建模定义模块名和输入输出端口;定义输入、输出变量或寄存器;定义时钟和复位信号;定义状态变量和状态寄存器;用时钟沿触发的always块表示状态转移过程;在复位信号有效时给状态寄存器赋初始值;描述状态的转换过程:符合条件,从一个状态到另外一个状态,否则留在原状态;验证状态转移的正确性,必须完整和全面。有限状态机的Verilog描述:有限状态机(FSM)-建模用Verilog语言描述有限状态机可使用多种风格,不同的风格会极大地影响电路性能。通常有2种描述方式:单always块、多always块。单always块:将状态转移和状态的操作、判断等写到一个块中多always块:将状态转移写成一个单独的块,将状态的操作、判断写到其它块中状态转移是用寄存器实现的,是同步时序部分。状态的判断是组合逻辑。多always块方式将同步时序和组合逻辑分别放到不同的块中实现。状态机较复杂时,多always块是比较好的设计方式。结构清晰,便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。有限状态机(FSM)Idle

Start

StopClear!A!Reset/K2=0K1=0!Reset/K2=0K1=0A=1/K2=1

(!Reset|!A)/K2=0K1=1!Reset/K2=0K1=0A/K1=0同步时钟:clk输入信号:reset、A输出信号:K1、K2状态转移发生在时钟上升沿触modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;//定义时钟、复位和输入信号outputK2,K1;//定义输出控制信号的端口regK2,K1;//定义输出控制信号的寄存器reg[1:0]state;

//定义状态寄存器parameterIdle=2’b00,Start=2’b01,//定义状态变量参数值

Stop=2’b10,Clear=2’b11;always@(posedgeClock)if(!Reset)begin//定义复位后的初始状态和输出值

state<=Idle;K2<=0;K1<=0;endelsecase(state)Idle:beginif(A)beginstate<=Start;K1<=0;endelsestate<=Idle;end建模方法之一(二进制编码)Start:beginif(!A)state<=Stop;elsestate<=Start;endStop:begin//符合条件进入新状态,否则留在原状态

if(A)beginstate<=Clear;K2<=1;endelsestate<=Stop;endClear:beginif(!A)beginstate<=Idle;K2<=0;K1<=1;endelsestate<=Clear;endendcaseendmodule建模方法之一(二进制编码)modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg[3:0]state;

parameterIdle=4’b1000,Start=4’b0100,Stop=4’b0010,Clear=4’b0001;always@(posedgeclock)if(!Reset)beginstate<=Idle;K2<=0;K1<=0;endelsecase(state)Idle:if(A)beginstate<=Start;K1<=0;endelsestate<=Idle;建模方法之二(一位热编码)

Start:if(!A)state<=Stop;elsestate<=Start;Stop:if(A)beginstate<=Clear;K2<=1;endelsestate<=Stop;Clear:if(!A)beginstate<=Idle;K2<=0;K1<=1;endelsestate<=Clear;

default:state<=Idle;endcaseendmodule建模方法之二(一位热编码)modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg[1:0]state,nextstate;

parameterIdle=2'b00,Start=2'b01,Stop=2'b10,Clear=2'b11;

//--------每一个时钟沿产生一次可能的状态变化-----------always@(posedgeClock)beginif(!Reset)state<=Idle;elsestate<=nextstate;end建模方法之三(2个always)always@(stateorA)begincase(state)

Idle:if(A)beginnextstate=Start;K1=0;end

elsebeignnextstate=Idle;K2=0;k1=0;endStart:if(!A)nextstate=Stop;

elsebeginnextstate=Start;K2=0;k1=0;endStop:if(A)beginnextstate=Clear;K2=1;endelsebeginnextstate=Idle;K2=0;k1=0;end

Clear:if(!A)beginnextstate=Idle;K2=0;k1=0;endelsenextstate=Clear;default:nextstate=Idle;endcaseendendmodule建模方法之三(2个always)建模方法之四(多个always)modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg[1:0]state,nextstate;

parameterIdle=2'b00,Start=2'b01,Stop=2'b10,Clear=2'b11;

//--------每一个时钟沿产生一次可能的状态变化-----------always@(posedgeClock)beginif(!Reset)state<=Idle;elsestate<=nextstate;end//------产生下一状态的组合逻辑-------------------------

always@(stateorA)case(state)Idle:if(A)nextstate=Start;elsenextstate=Idle;Start:if(!A)nextstate=Stop;elsenextstate=Start;Stop:if(A)nextstate=Clear;elsenextstate=Stop;Clear:if(!A)nextstate=Idle;elsenextstate=Clear;default:nextstate=2'bxx;endcase建模方法之四(多个always)//----产生输出K1的组合逻辑--------------always@(stateorResetorA)if(!Reset)K1=0;elseif(state==Clear&&!A)//从Clear转向IdleK1=1;elseK1=0;

//---产生输出K2的组合逻辑---------------always@(stateorResetorA)if(!Reset)K2=0;elseif(state==Stop&&A)//从Stop转向ClearK2=1; elseK2=0;

endmodule建模方法之四(多个always)有限状态机(FSM)多数FPGA内触发器加多,且一位热编码的译码逻辑较为简单,建议利用FPGA实现的有限状态机采用一位热编码方式在比较复杂的状态机设计过程中,往往把状态的变化与输出的控制分成两部分来考虑。为了调试方便,还常常把每一个输出写成一个个独立的always组合块。在调试多输出状态机时,这样做比较容易发现问题和改正模块编写中出现的问题。建议在设计复杂的多输出状态机时采用两个或两个以上always块的编码风格。FSM的TestBench`timescale1ns/100psmoduletest();regClock,Reset,A;wir

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论