《计数器VHDL描述.ppt》由会员分享,可在线阅读,更多相关《计数器VHDL描述.ppt(46页珍藏版)》请在三一办公上搜索。
1、LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DFF1 IS PORT(CLK:IN STD_LOGIC;D:IN STD_LOGIC;Q:OUT STD_LOGIC);END;ARCHITECTURE bhv OF DFF1 IS SIGNAL Q1:STD_LOGIC;-类似于在芯片内部定义一个数据的暂存节点 BEGIN PROCESS(CLK,Q1)BEGIN IF CLKEVENT AND CLK=1 THEN Q1=D;END IF;END PROCESS;Q=Q1;-将内部的暂存数据向端口输出(双横线-是注释符号)END bhv;,
2、简单时序电路的VHDL描述,D触发器,D触发器,LIBRARY IEEE;ENTITY JKCFQ IS PORT(J,K,CLK:IN STD_LOGIC;Q,QB:BUFFER STD_LOGIC);END ENTITY JKCFQ;ARCHITECTURE ART OF JKCFQ ISSIGNA Q_S,QB_S:STD_LOGIC;BEGIN,JK触发器,PROCESS(CLK,J,K)ISBEGIN IF(CLKEVENT AND CLK=1)THEN IF(J=0 AND K=1)THEN Q_S=0;QB_S=1;ELSIF(J=1 AND K=0)THEN Q_S=1;QB_
3、S=0;ELSIF(J=1 AND K=1)THEN Q_S=NOT Q_S;QB_S=NOT QB_S;END IF;END IF;Q=Q_S;QB=QB_S;END PROCESS;END ARCHITECTURE ART;,JK触发器,计数器,计数器是数字电路和计算机中广泛应用的一种逻辑部件,可累计输入脉冲的个数,可用于定时、分频、时序控制等。,计数器设计时注意事项,边沿(上升沿还是下降沿)复位方式(同步复位与异步复位)有无置数功能计数制(对二进制计数还是十进制计数器)是否可逆,PROCESS(clock_signal)BEGIN IF(clock_edge_condition)THEN
4、 Signal_out=signal_in;其他时序语句 END IF;END PROCESS;,边沿(上升沿还是下降沿),复位:设定初始状态,时序电路的初始状态应由复位信号来设置。根据复位信号对时序电路复位的操作不同,使其可以分为同步复位和异步复位。所谓异步复位,就是当复位信号有效时,时序电路立即复位,与时钟信号无关。,同步复位,PROCESS(clock)BEGINif clock=1 and clockEVENT thenif reset=1 then sout=0;tmp=0;elsesout=sin;tmp=not tmp;end if;END IF;END PROCESS;,sin
5、,clock,reset,sout,tmp,异步复位,PROCESS(clock,reset)BEGINif reset=1 thensout=0;tmp=0;elsif clock=1 AND clockEVENT thensout=sin;tmp=not tmp;end if;END PROCESS;,sin,clock,reset,sout,tmp,可逆计数器,可逆计数器根据计数脉冲的不同,控制计数器在同步信号脉冲的作用,进行加1操作,或者减1操作。可逆计数器的计数方向,由特殊的控制端updn控制。当updn=1时,计数器加1操作;当updn=0时,计数器减1操作;,LIBRARY IE
6、EE;ENTITY count IS PORT(clk,clr,updn:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(7 downto 0);END count;ARCHITECTURE example OF count IS SIGNAL count_B:STD_LOGIC_VECTOR(7 DOWNTO 0);,BEGIN Q=count_B;PROCESS(clr,clk)BEGIN IF(clr=1)THEN Count_B=“00000000”;ELSIF(clkEVENT AND clk=1)THEN IF(updn=1)THEN Count_B=cou
7、nt_B+1;ELSE Count_B=count_B 1;END IF;END IF;END PROCESS;END example;,PROCESS(clr,clk)BEGINIF(clr=1)THEN Count_B=“00000000”;q=0;ELSIF(clkEVENT AND clk=1)THENIF(Count_B=“00001111”)THEN Count_B=“00000000”;elseCount_B=count_B+1;END IF;END IF;END PROCESS;,调整进制,一、基本计数器的设计,计数器是数字系统的一种基本部件,是典型的时序电路。计数器的应用十分
8、广泛,常用于数/模转换、计时、频率测量等。,加法计数器VHDL源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY countbasic IS PORT(clk:IN STD_LOGIC;q:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);END countbasic;ARCHITECTURE a OF counbasict ISBEGIN,PROCESS(clk)VARIABLE qtmp:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGI
9、N IF clk event AND clk=1 THENqtmp:=qtmp+1;END IF;q=qtmp;END PROCESS;END a;,二、同步清零的计数器,同步清零计数器只是在基本计数器的基础上增加了一个同步清零控制端,本例设计一个同步清零的递增计数器,它只需以下基本引脚:时钟输入端:clk;计数输出端:Q;同步清零端:clr。,VHDL源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY countclr IS PORT(clk:IN STD_LOGIC;clr:
10、IN STD_LOGIC;q:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);END countclr;ARCHITECTURE a OF countclr IS,BEGINPROCESS(clk)VARIABLE qtmp:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN IF clkevent AND clk=1 THEN IF clr=0 THEN qtmp:=00000000;ELSE qtmp:=qtmp+1;END IF;END IF;q=qtmp;END PROCESS;END a;,异步清零计数器的参考程序如下:LIBRARY IEE
11、E;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY countyibu IS PORT(clk:IN STD_LOGIC;clr:IN STD_LOGIC;q:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);,END countyibu;ARCHITECTURE a OF countyibu ISBEGINPROCESS(clk,clr)BEGIN IF clr=0 THEN q=00000000;ELSIF clkevent AND clk=1 THEN q=q+1;END IF;E
12、ND PROCESS;END a;,三、同步预置数的计数器,有时计数器不需要从0开始累计计数,而希望从某个数开始往前或往后计数。这时就需要有控制信号能在计数开始时控制计数器从期望的初始值开始计数,这就是可预加载初始计数值的计数器。本例设计了一个对时钟同步的预加载(或称预置)计数器。,一个同步清零、使能、同步预置数的计数器应具备的脚位有:时钟输入端:clk;计数输出端:Q;同步清零端:clr;同步使能端:en;加载控制端:load;加载数据输入:din。,VHDL源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNS
13、IGNED.ALL;ENTITY countload IS PORT(clk:IN STD_LOGIC;clr,en,load:IN STD_LOGIC;din:IN STD_LOGIC_VECTOR(7 DOWNTO 0);q:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);END countload;,ARCHITECTURE a OF countload ISBEGINPROCESS(clk)BEGIN IF clkevent AND clk=1 THEN IF clr=0 THEN q=00000000;ELSIF EN=1 THEN IF load=1 THE
14、N q=din;ELSE q=q+1;,END IF;END IF;END IF;END PROCESS;END a;,四、同步清零的可逆计数器,前面所介绍的计数器其程序的计数趋势都是递增的,当然也可以通过将“Q=Q+1”改为“Q=Q-1”使其变为递减计数器。本例用VHDL设计了一个可逆计数器,可通过方向控制端控制计数器递增计数或递减计数。,一个同步清零可逆计数器至少应具备的脚位有:时钟输入端:clk;计数输出端:Q;方向控制端:dire;清零控制端:clr。,VHDL源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC
15、_UNSIGNED.ALL;ENTITY countud IS PORT(clk:IN STD_LOGIC;clr:IN STD_LOGIC;dire:IN STD_LOGIC;q:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);END countud;,ARCHITECTURE a OF countud ISBEGINPROCESS(clk)BEGIN IF clkevent AND clk=1 THEN IF clr=0 THEN q=00000000;ELSIF dire=1 THEN,q=q+1;ELSE q=q-1;END IF;END IF;END PROC
16、ESS;END a;,五、带进制的计数器,前面几个实验中,计数最高值都受计数器输出位数的限制,当位数改变时,计数最高值也会发生改变。如对于8位计数器,其最高计数值为“11111111”,即每计255个脉冲后就回到“00000000”;而对于16位计数器,其最高计数值为“FFFFH”,每计65 535个时钟脉冲后就回到“0000H”。,时钟输入端:clk;计数输出端:Q;同步清零端:clr;同步使能端:en;加载控制端:load;加载数据输入:din。,VHDL源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSI
17、GNED.ALL;ENTITY count128 IS PORT(clk:IN STD_LOGIC;clr,en,load:IN STD_LOGIC;din:IN STD_LOGIC_VECTOR(7 DOWNTO 0);q:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);END count128;,ARCHITECTURE a OF count128 ISBEGINPROCESS(clk)BEGIN IF clkevent AND clk=1 THEN IF clr=0 THEN q=00000000;ELSIF q=01111111 THEN q=00000000;
18、ELSIF en=1 THEN IF load=1 THEN q=din;,ELSE q=q+1;END IF;END IF;END IF;END PROCESS;END a;,LIBRARY IEEE;ENTITY CNTM60 IS PORT(CI:IN STD_LOGIC;-计数控制NRESET:IN STD_LOGIC;-异步复位控制 LOAD:IN STD_LOGIC;-置数控制 D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);CLK:IN STD_LOGIC;CO:OUT STD_LOGIC;-进位输出 QH:BUFFER STD_LOGIC_VECTOR(3
19、DOWNTO 0);-输出高4位 QL:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);-输出低4位END ENTITY CNTM60;,60进制计数器,ARCHITECTURE ART OF CNTM60 ISBEGINCO=1WHEN(QH=“0101”AND QL=“1001”AND CI=1)ELSE0;-进位输出的产生PROCESS(CLK,NRESET)BEGINIF(NRESET=0)THEN-异步复位QH=0000;QL=0000;ELSIF(CLKEVENT AND CLK=1)THEN-同步置数IF(LOAD=1)THENQH=D(7 DOWNTO
20、4);Q L=D(3 DOWNTO 0);ELSIF(CI=1)THEN-模60的实现IF(QL=9)THENQL=0000;,60进制计数器,IF(QH=5)THEN QH=0000;ELSE-计数功能的实现 QH=QH+1;END IF;ELSEQL=QL+1;END IF;END IF;-END IF LOADEND IF;END PROCESS;END ARCHITECTURE ART;,60进制计数器,六、分频器设计,分频器就是根据输入时钟,采用计数器,计多次数输出一次。从而实现降频。,最简单的时钟输出,process(fosc,rst)beginif rst=1 thenq=0;e
21、lse q=not q;end if;end process;本例中,fosc两个沿都会触发进程,rst,fosc,q,q,q=0,q=1,分频器(2分频),signal count:std_logic_vector(7 DOWNTO 0);process(fosc,rst)beginif rst=1 thencount=“00000000”;q=0;elsif foscevent and fosc=1 thenif count=00000010 thencount=00000000;q=not q;-q是count(0)2分频elsecount=count+1;end if;end if;e
22、nd process;,流水灯设计,LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY led1water ISPORT(clk:IN STD_LOGIC;led:OUT STD_LOGIC_VECTOR(7 downto 0);END led1water;ARCHITECTURE led1water_architecture OF led1water ISsignal cnt:integer range 0 to 7;signal led_inter:std_logic_vector(7 downto 0);,流水灯设计,BEGINprocess(
23、clk)begin if clkevent and clk=1 then if cnt=7 then cnt=0;else cnt=cnt+1;end if;end if;end process;,process(cnt)begin case cnt is when 0=led_inter(7 downto 1)1);led_inter(0)led_inter(7 downto 2)1);led_inter(1)led_inter(7 downto 3)1);led_inter(2)1);when 3=led_inter(7 downto 2)1);led_inter(3)1);when 4=led_inter(7 downto 3)1);led_inter(4)1);,when 5=led_inter(7 downto 2)1);led_inter(5)1);when 6=led_inter(7 downto 3)1);led_inter(6)1);when 7=led_inter(7 downto 2)1);led_inter(7)1);end case;end process;led=led_inter;END led1water_architecture;,