资源预览内容
第1页 / 共33页
第2页 / 共33页
第3页 / 共33页
第4页 / 共33页
第5页 / 共33页
第6页 / 共33页
第7页 / 共33页
第8页 / 共33页
第9页 / 共33页
第10页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
硬件描述语言及器件 教材:任勇峰等编著VHDL与硬件实现速成 主讲教师:刘文怡08/09学年第1学期教学安排n第1讲:VHDL概述及其开发环境 n第2讲:VHDL的基本元素 n第3讲:VHDL的进程 n第4讲:其它并行语句 n第5讲:VHDL实例剖析 n第6讲:VHDL的顺序描述语句 n第7讲:结构体的描述风格 n第8讲:计数器状态控制n第9讲:不同风格的状态机设计n第10讲:VHDL综合举例第9讲:不同风格的状态机设计n1 上节内容回顾n2 计数值与状态的关系n3 递变型状态变更控制n4 状态机使用n5 两种不同类型的状态机1 上节内容回顾n时序逻辑时序逻辑n复位的概念与功用、同步复位和异步复位复位的概念与功用、同步复位和异步复位n计数器设计、利用计数值控制状态变更计数器设计、利用计数值控制状态变更n时时序序逻逻辑辑电电路路又又称称为为同同步步电电路路,基基础础电电路路包包括括触触发发器器、寄寄存器、计数器。存器、计数器。n由数字电路知道,任何时序电路都以时钟为驱动信号,时由数字电路知道,任何时序电路都以时钟为驱动信号,时序电路只是在时钟信号的边沿到来时,其状态才发生改变。序电路只是在时钟信号的边沿到来时,其状态才发生改变。因此,时钟信号是时序电路程序的执行条件,时钟信号是因此,时钟信号是时序电路程序的执行条件,时钟信号是时序电路的同步信号。时序电路的同步信号。n什么是时钟?其作用是什么?什么是时钟?其作用是什么?复位,设定初始状态n时时序序电电路路的的初初始始状状态态应应由由复复位位信信号号来来设设置置。根根据据复复位位信信号号对对时时序序电电路路复复位位的的操操作作不不同同,使使其其可可以以分分为为同同步步复复位位和和异异步复位。步复位。n所谓异步复位,就是当复位信号有效时,时序电路立即复所谓异步复位,就是当复位信号有效时,时序电路立即复位,与时钟信号无关。位,与时钟信号无关。同步复位PROCESS(clock)BEGINifclock=1andclockEVENTthenifreset=1thensout=0;tmp=0;elsesout=sin;tmp=nottmp;endif; ENDIF;ENDPROCESS;sinclockresetsouttmp异步复位PROCESS(clock,reset)BEGINifreset=1thensout=0;tmp=0;elsifclock=1ANDclockEVENTthensout=sin;tmp=nottmp;endif;ENDPROCESS;sinclockresetsouttmp可逆计数器n可可逆逆计计数数器器根根据据计计数数脉脉冲冲的的不不同同,控控制制计计数数器器在在同同步步信信号号脉冲的作用,进行加脉冲的作用,进行加1操作,或者减操作,或者减1操作。操作。nCLR1时,计数器清零;时,计数器清零;n可逆计数器的计数方向,由特殊的控制端可逆计数器的计数方向,由特殊的控制端updn控制。控制。n当当updn=1时,计数器加时,计数器加1操作;操作;n当当updn=0时,计数器减时,计数器减1操作;操作;CLKCLRupdnQnLIBRARYIEEE;nUSEIEEE.STD_LOGIC_1164.ALL;nUSEIEEE.STD_LOGIC_UNSIGNED.ALL;nENTITYcountISnPORT(clk,clr,updn:INSTD_LOGIC;nQ:OUTSTD_LOGIC_VECTOR(7downto0);nENDcount;nARCHITECTUREexampleOFcountISnSIGNALcount_B:STD_LOGIC_VECTOR(7DOWNTO0);nBEGINnQ=count_B;nPROCESS(clr,clk)nBEGINnIF(clr=1)THENnCount_B=“00000000”;nELSIF(clkEVENTANDclk=1)THENnIF(updn=1)THENnCount_B=count_B+1;nELSEnCount_B=count_B1;nENDIF;nENDIF;nENDPROCESS;nENDexample;用计数器值做条件来控制时序nPROCESS(clr,clk)nBEGINnIF(clr=1)THENnCount_B=“00000000”;nq=0;nELSIF(clkEVENTANDclk=1)THENnCount_B=count_B+1;nIF(Count_B=“00000000”)THENnq=1;nELSIF(Count_B=“00000001”)THENnq=0;nELSIF(Count_B=“00000011”)THENnq=1;nELSIF(Count_B=“00000100”)THENnq=0;nENDIF;nENDIF;nENDPROCESS;nPROCESS(clr,clk)nBEGINnIF(clr=1)THENnCount_B=“00000000”;nq=0;nELSIF(clkEVENTANDclk=1)THENnIF(Count_B=“00001111”)THENnCount_B=“00000000”;nelsenCount_B=count_B+1;nIF(Count_B=“00000000”)THENnq=1;nELSIF(Count_B=“00000001”)THENnq=0;nELSIF(Count_B=“00000011”)THENnq=1;nELSIF(Count_B=“00000100”)THENnq=0;nENDIF;nENDIF;nENDIF;nENDPROCESS;调整周期用计数值控制产生精确时序n只要知道晶振频率f,即可知道周期T1/f;n使用一个计数器,可以通过计数值n,精确知道当计数值为n时消耗的时间tnT;n上例中以n为控制条件,可以控制其它信号在某时刻变高,某时刻变低,从而产生精确时序;n但要注意:时间分辨率(或叫最小控制时间间隔)取决于晶振频率。分频器nsignalcount:std_logic_vector(7DOWNTO0);nprocess(fosc,rst)nbeginnifrst=1thenncount=“00000000”;nq=0;nelsiffosceventandfosc=1thennifcount=00000010thenncount=00000000;nq=notq;nelsencount=count+1;nendif;nendif;nendprocess;2 计数值与状态的关系nPROCESS(clr,clk)nBEGINnIF(clr=1)THENnCount_B=“00000000”;nq=0;nELSIF(clkEVENTANDclk=1)THENnIF(Count_B=“00001111”)THENnCount_B=“00000000”;nelsenCount_B=count_B+1;nIF(Count_B=“00000000”)THENnq=1;nELSIF(Count_B=“00000001”)THENnq=0;nELSIF(Count_B=“00000011”)THENnq=1;nELSIF(Count_B=“00000100”)THENnq=0;nENDIF;nENDIF;nENDIF;nENDPROCESS;特点 n随着CLK的推进,计数器独立运转,不受各状态的支配;n计数器的每一计数值都可以用来对应不同的状态,这些状态都会遍历到,即使很多数值未出现,它也是存在的;n计数值的顺序决定了各状态发生的次序,这一次序是确定的;n计数的最大值决定了状态是有限的;n不同状态间的时间间隔是确定的,精确的;n具有明显的周期性。CLK计数器状态变更nPROCESS(clr,clk)nBEGINnIF(clr=1)THENnCount_B=“00000000”;nq=0;nELSIF(clkEVENTANDclk=1)THENn-IF(Count_B=“00001111”)THENn-Count_B=“00000000”;n-elsen-Count_B=count_B+1;nIF(Count_B=“00000000”)THENnq=1;Count_B=“00000001”;nELSIF(Count_B=“00000001”)THENnq=0;Count_B=“00000010”;nELSIF(Count_B=“00000010”)THENnCount_B=“00000011”;nELSIF(Count_B=“00000011”)THENnq=1;Count_B=“00000100”;nELSIF(Count_B=“00000100”)THENnq=0;Count_B=?;nENDIF;nENDIF;nENDIF;nENDPROCESS;更改一下 对比nIF(Count_B=“00001111”)THENnCount_B=“00000000”;nelsenCount_B=count_B+1;nIF(Count_B=“00000000”)THENnq=1;nELSIF(Count_B=“00000001”)THENnq=0;nELSIF(Count_B=“00000011”)THENnq=1;nELSIF(Count_B=“00000100”)THENnq=0;nENDIF;nENDIF;nIF(Count_B=“00000000”)THENnCount_B=“00000001”;q=1;nELSIF(Count_B=“00000001”)THENnCount_B=“00000010”;q=0;nELSIF(Count_B=“00000010”)THENnCount_B=“00000011”;-?nELSIF(Count_B=“00000011”)THENnCount_B=“00000100”;q=1;nELSIF(Count_B=“00000100”)THENnCount_B=?;q -code state:=101;WHEN 101 = state:=110; -code;WHEN 110 = state:=100; -code;WHEN 100 = state:=011; -code;WHEN 011 = state:=010; -code;WHEN 010 = state:=000; -code;WHENOTHERS= state:=000; -code;ENDCASE;endif;ENDPROCESS;END arc; 特点n上例实际上也可以看成计数器,是广义的计数器,计数值和次数由设计者保证;n如果值不连续,则不成其为计数器,只是状态递变;n如果在某一状态下,根据条件对下一个状态做了分支,则逻辑趋于复杂:nCASE state ISnWHEN 000 = nif x=1 thennstate:=101;nelsenstate:=“110”;nend ifnWHEN“001”=状态值的问题 n人为手工设置数值的方法具有局限性,容易重复、误写;人为手工设置数值的方法具有局限性,容易重复、误写;n一种较好的方法是定义常量,一次定义,任意使用,如:一种较好的方法是定义常量,一次定义,任意使用,如:nConstant ST1: std_logic_vector(2 Constant ST1: std_logic_vector(2 downtodownto 0):=“001”; 0):=“001”; nConstant ST2: std_logic_vector(2 Constant ST2: std_logic_vector(2 downtodownto 0):=“010”; 0):=“010”;nConstant ST3: std_logic_vector(2 Constant ST3: std_logic_vector(2 downtodownto 0):=“011”; 0):=“011”;nConstant ST4: std_logic_vector(2 Constant ST4: std_logic_vector(2 downtodownto 0):=“100”; 0):=“100”;nWHEN “WHEN “010010” =state:=“” =state:=“011011”;”; WHEN WHEN ST2ST2 =state =state:=ST3;:=ST3;n事实上,事实上,VHDLVHDL提供了一种更好的方法,专门定义状态序列,提供了一种更好的方法,专门定义状态序列,那就是枚举类型:那就是枚举类型:枚举类型定义状态机 n定义方式:定义方式:type名称名称is(元素元素1,元素元素2);n举例:举例:ntypeweekis(mon,tue,wed,thu,fri,sat,sun);ntypestd_logicis(U,X,0,1,Z,W,L,H,-);ntypestatesis(state0,state1,state2,state3);状态机样例 ntypewris(wr0,wr1,wr2,wr3,wr4,wr5);-结构级别结构级别nsignalstate:wr;-结构级别结构级别n复位时赋初始状态复位时赋初始状态statestatestatestatestate state=wr0;nendcase;4 状态机使用带复位的状态机ARCHITECTURE arc OF ss IStype states is (st0,st1,st2,st3);signal outc: states;BEGINPROCESS(clk) BEGIN IF reset=1 then outc outc outc outc outc outc ifx=1thenstate:=001;elsestate:=100; endif;WHEN001= ifx=1thenstate:=011; elsestate:=000; endif;WHEN011=WHENothers=ifx=1thenstate:=000;elsestate:=000;endif;ENDCASE;ENDIF;opIFX=0THENnext_state=s0;ELSEnext_state=s1;ENDIF;OPIFX=0THENnext_state=s3;ELSEnext_state=s2;ENDIF;OPIFX=0THENnext_state=s2;ELSEnext_state=s3;ENDIF;OPIFX=0THENnext_state=s3;ELSEnext_state=s0;ENDIF;OP=0;ENDCASE;ENDPROCESSstate_comp;PROCESS(CLK)BEGINIFCLKEVENTANDCLK=1THENpresent_stateIFX=0THENnext_state=s0;ELSEnext_state=s1;ENDIF;IFX=0THENop=0;ELSEopIFX=0THENnext_state=s3;ELSEnext_state=s2;ENDIF;IFX=0THENop=1;ELSEopIFX=0THENnext_state=s2;ELSEnext_state=s3;ENDIF;IFX=0THENop=0;ELSEopIFX=0THENnext_state=s3;ELSEnext_state=s0;ENDIF;IFX=0THENop=0;ELSEop=0;ENDIF;ENDCASE;ENDPROCESSstate_comp;PROCESS(CLK)BEGINIFCLKEVENTANDCLK=1THENpresent_stateIFX=0THENnext_state=s3;ELSEnext_state=s2;ENDIF;IFX=0THENop=1;ELSEopIFX=0THENnext_state=s2;ELSEnext_state=s3;ENDIF;IFX=0THENop=0;ELSEop=1;ENDIF;作业n用状态机设计如下时序:用状态机设计如下时序:n一旦探测到一旦探测到“写允许写允许” WREN” WREN变低,变低,FPGAFPGA控制控制8 8位数据线给位数据线给出数据出数据X X,然后,然后“写写”信号信号WRWR有效(变低),等到有效(变低),等到“接收接收完成完成”ROKROK信号变低,控制信号变低,控制“写信号写信号”WRWR变高,等待下一变高,等待下一次次“写允许写允许”,发送,发送X+1X+1,如此循环,写入递增数据。,如此循环,写入递增数据。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号