1、第六章 VHDL程序设计实践,组合逻辑设计 时序逻辑设计,组合逻辑设计,门电路的种类,门电路是逻辑电路的基本电路。按逻辑与、或、非三种运算,产生三类门电路:与门,或门,非门。输入变量不同,会有二与门,三与门;不同的逻辑运算可由与非门,或非门构成。在组合逻辑电路中,常见门电路有: 与非门 或非门 异或门 其他简单门电路,基本逻辑门,基本逻辑门,一、设计任务,用VHDL语言设计基本的逻辑门。,二、算法设计,用VHDL语言的逻辑操作符来描述。,三、VHDL源程序,ENTITY gates ISPORT(a,b:IN BIT;y1,y2,y3,y4,y5,y6:OUT BIT);END gates;A
2、RCHITECTURE beh OF gates ISBEGIN,y1=a AND b; -构成与门y2=a OR b; -构成或门y3=NOT a; -构成非门y4=a NAND b; -构成与非门y5=a XOR b; -构成异或门y6=a XNOR b; -构成同或门; END beh;,四、程序说明,1应注意VHDL语言的各种逻辑操作符对操作数的要求。,2由基本的逻辑门可实现任意逻辑函数的功能。,3注意赋值语句的正确使用方法,赋值对象只能是信号或变量,不能是常数。例如若把赋值语句写成“1=NOT 0”,则是错误的。,4仿真波形如图,优先编码器,一、设计任务,用VHDL描述一个优先编码器
3、。该电路有8个输入端,3个输出端。,二、算法设计,利用顺序语句中的IF语句或并行语句中的条件信号赋值语句来描述。因为这两类语句本身就具有优先顺序。在这里用IF语句来描述。,三、VHDL源程序,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY encoder ISPORT(d:IN STD_LOGIC_VECTOR(7 DOWNTO 0);y:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);END encoder;ARCHITECTURE beh OF encoder ISBEGIN,PROCESS(d)BEGINIF d(7)=0
4、 THEN y=”000”;ELSIF d(6)=0 THEN y=”001”;ELSIF d(5)=0 THEN y=”010”;ELSIF d(4)=0 THEN y=”011”;ELSIF d(3)=0 THEN y=”100”;ELSIF d(2)=0 THEN y=”101”;ELSIF d(1)=0 THEN y=”110”;ELSIF d(0)=0 THEN y=”111”;END IF;END PROCESS; END beh;,四、程序说明,1本设计可用顺序语句中的IF语句或并行语句中的条件信号赋值语句来描述。因为这两类语句本身就具有优先顺序。在本例中,输入端d7的优先级最高
5、,只要d7=0,编码器的结果都由d7=0决定;d0的优先级最低,只有当其他输入端信号无效时,才对d0=0进行编码。,2本例的仿真波形如图2所示。图中,在050ns时间段内,d7、d3、d0均出现了低电平,但编码器只对d7=0进行编码,输出y=”000”。,译码器,一、设计任务,用VHDL描述一个3线8线译码器。该电路有3个输入端,8个输出端。,1、3线-8线译码器,二、算法设计,利用并行语句中的选择信号赋值语句描述设计,利用真值表辅助,很容易编写出该程序。,三、VHDL源程序,ENTITY decoder3_8 ISPORT(a:IN BIT_VECTOR(2 DOWNTO 0);y:OUT
6、BIT_VECTOR(7 DOWNTO 0);END decoder3_8;ARCHITECTURE beh OF decoder3_8 ISBEGINWITH a SELECTy= “11111110” WHEN “000”,“11111101” WHEN “001”,“11110111” WHEN “011”,“11101111” WHEN “100”,“11011111” WHEN “101”,“10111111” WHEN “110”,“01111111” WHEN “111”;END beh;,四、程序说明,1由于输入端a2a1a0在任意时刻的取值是唯一的,即所有的取值之间都处于同一
7、优先级,故利用并行的选择信号赋值语句很容易编写。,2.本设计的仿真波形见图。从图中不难看出,对每一个确定的输入,都有一个唯一的输出端对应(低电平有效)。,“11111011” WHEN “010”,4仿真波形如图,一、设计任务,设计一个二十进制BCD译码器。译码器的输入为4位二进制数din,输出为以8421BCD码表示的两个十进制数a(个位)和b(十位)。,二、算法设计,如果输入din小于10时,a=din,b为0;如果din大于等于10,则a=din-10,同时向十位发出进位,b为1。因此利用顺序的IF语句编写比较方便。,2、二-十进制BCD译码器,三、VHDL源程序,ENTITY deco
8、der2_10 ISPORT(din:IN INTEGER RANGE 15 DOWNTO 0;a,b:OUT INTEGER RANGE 9 DOWNTO 0);END decoder2_10;ARCHITECTURE beh OF decoder2_10 ISBEGINPROCESS(din)BEGINIF din10 THENa=din;b=0;ELSE,a=din-10;b=1;END IF;END PROCESS; END beh;,四、程序说明,1本程序采用IF语句编写,首先判断输入din是否小于10,若din10,则a=din,十位b为0;若din不小于10,则执行ELSE后的语
9、句,a=din-10,b= 1。,2本设计的仿真波形见图。,一、设计任务,设计一个七段显示译码器sevenv,驱动1个共阴极数码管。该电路的8421BDC输入为d,译码后的七段输出为a-g。,3、七段显示译码器,二、算法设计,用顺序的CASE语句描述电路,利用真值表辅助,很容易编写出该程序。,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY sevenv ISPORT(d:IN INTEGER RANGE 0 TO 9;s:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); END sevenv; ARCHITECTURE be
10、h OF sevenv IS BEGINPROCESS(d)BEGINCASE d ISWHEN 0 =s= “1111110”; -s6-s0对应a-g,三、VHDL源程序,WHEN 7 =ssss= “0000000”;END CASE;END PROCESS; END beh;,WHEN 1 =ssssss= “1011111”;,3本例的仿真波形见图。,四、程序说明,1为了阅读和描述上的方便,在这里把输入的8421BCD码定义成整数类型数据,在编译时,综合器会根据指定的取值范围,自动地将其编译成4位二进制d3d2d1d0。,2设计的输出s6-s0和数码管a-g对应。在编写程序时,应根据
11、共阴极数码管点亮段的情况来给s赋值。,数据分配器,一、设计任务,用VHDL描述一个1对4的数据分配器,数据输入为d,输出为y0、y1、y2、y3,选择信号为s0、s1。,二、算法设计,用顺序的IF语句描述电路,利用真值表辅助,很容易编写出该程序。,三、VHDL源程序,ENTITY ass ISPORT(d:IN BIT;s:IN BIT_VECTOR(1 DOWNTO 0);y:OUT BIT_VECTOR(3 DOWNTO 0); END ass; ARCHITECTURE beh OF ass IS BEGINPROCESS(d,s)BEGINIF s= “00” THENy= “000”
12、ELSIF s= “10” THEN,y= 0,四、程序说明,1本程序采用IF语句编写,按照选择信号输入端s1s0的取值的不同,将数据输入信号d送到相应的输出端。,2图示为数据分配器的仿真波形。,比较器,一、设计任务,设计一个数值比较器,对输入的2个8位二进制数d1和d2进行比较,比较的结果以输出信号f1(d1d2)、f2(d1=d2)、f3(d1d2)的有效信号来表示(高电平有效)。,二、算法设计,由于两个比较信号位数较多,为降低设计难度,可借助运算操作符,根据比较器的行为进行设计。,三、VHDL源程序,ENTITY comparator1 IS GENERIC(n:INTEGER :=8)
13、;PORT(d1,d2:IN STD_LOGIC_VECTOR(n-1 DOWNTO 0);f:OUT STD_LOGIC_VECTOR(3 DOWNTO 1); END comparator1; ARCHITECTURE beh OF comparator1 IS BEGINPROCESS(d1,d2)BEGINIF d1d2 THENf= “001”;ELSIF d1d2 THENf= “010”;,ELSIF d1=d2 THENf= “100”;END IF;END PROCESS; END beh;,四、程序说明,1、用GENERIC语句引入通用参数n,赋其初值为8。应用GENERI
14、C语句使程序通用性好,修改方便。,2、图示为该数据比较器的仿真波形图,由图不难看出实现了两个数据的正确比较。,加/减法器,一、设计任务,试设计一个4位二进制数的加/减法器,控制输入端为c,当c=1时,做加法运算;当c=0时,做减法运算。,二、算法设计,根据加/减法器的功能表,用顺序的IF语句很容易描述该电路。,三、VHDL源程序,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY add_sub ISPORT(c:IN STD_LOGIC;a,b:IN STD_LOGIC_VECT
15、OR(3 DOWNTO 0);s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);cout:OUT STD_LOGIC); END add_sub; ARCHITECTURE beh OF add_sub IS SIGNAL m:STD_LOGIC_VECTOR(4 DOWNTO 0);,IF c= 1 THENm=(0,BEGINPROCESS(a,b,c)BEGIN,2、图示为该加/减法器的仿真波形图,从图中不难看出该设计能完成2个4位二进制数的加/减法的运算,并能正确实现进位/借位。,四、程序说明,1、在STD_LOGIC_UNSIGNED程序包中对“+”和“-”进行了
16、重载,使得(0&a)和(0&b)能完成加减运算。,乘法器,一、设计任务,试设计一个3位二进制数的乘法器,乘数和被乘数分别为a20和b20,积为y50。,二、算法设计,虽然VHDL中有算术运算符,但在参与运算的数据位数较多的情况下,特别是乘法和除法运算符,综合后所对应的硬件电路将耗费巨大的硬件资源。当硬件资源有限而又必须进行乘法操作时,通常可用加法的形式实现乘法运算,这样可有效节约硬件资源。其运算原理如右图所示。,三、VHDL源程序,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY
17、 mul3_3 ISPORT(a,b:IN STD_LOGIC_VECTOR(2 DOWNTO 0);y:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); END mul3_3; ARCHITECTURE beh OF mul3_3 IS SIGNAL temp1:STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL temp2:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL temp3:STD_LOGIC_VECTOR(4 DOWNTO 0); BEGINtemp1=a WHEN b(0)= 1 ELSE “000”;temp2
18、=(a ,temp3=(a ,四、程序说明,1、本设计利用了3条并行条件信号赋值语句完成乘法运算。,2、赋值符“=”两边的数据类型和位数必须一致。当数据位数不相等时可用并置运算符“&”来扩展,并置运算符只能出现在赋值运算符“=”的右边。,3、本设计的仿真波形见图 。,只读存储器,一、设计任务,设计一个只读存储器,该存储器内存8组数据,每组数据8位,地址信号为rom_addr20,使能信号为en(低电平有效)。地址和所存储的数据的关系见表 。,二、算法设计,根据上表利用并行条件信号赋值语句进行设计。,三、VHDL源程序,ENTITY rom ISPORT(rom_addr:IN STD_LOGI
19、C_VECTOR(2 DOWNTO 0);en:IN STD_LOGIC;rom_out:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); END rom; ARCHITECTURE beh OF rom IS BEGINrom_out=“10000001” WHEN rom_addr=“000” AND en= 0 ELSE“10000010” WHEN rom_addr=“001” AND en= 0 ELSE“10000011” WHEN rom_addr=“010” AND en= 0ELSE,“10000100” WHEN rom_addr=“011” AND en
20、= 0 ELSE“10000101” WHEN rom_addr=“100” AND en= 0 ELSE“10000110” WHEN rom_addr=“101” AND en= 0 ELSE“10000111” WHEN rom_addr=“110” AND en= 0 ELSE“10001000” WHEN rom_addr=“111” AND en= 0 ELSE“ZZZZZZZZ”;,四、程序说明,1、ROM中数据的读出条件是en有效,同时数据地址也有效。,2、本程序设计的ROM,实际上是一个带有使能的3-8线译码器电路。,3、本设计的仿真波形见图。,第六章 VHDL程序设计实践,
21、组合逻辑设计 时序逻辑设计,时序逻辑设计,概述: 时序逻辑电路又称为同步电路,基础电路包括触发器、寄存器、计数器。 由数字电路知道,任何时序电路都以时钟为驱动信号,时序电路只是在时钟信号的边沿到来时,其状态才发生改变。因此,时钟信号是时序电路程序的执行条件,时钟信号是时序电路的同步信号。,时序逻辑设计,时钟的描述,上升沿到来的条件可写为: IF clk =1 AND clk LAST_VAULE = 0 AND clk EVENT; 时钟信号下降沿的属性描述为: IF clk = 0 AND clk LAST_VALUE = 1 AND clk EVENT; 比较上升沿,下降沿的描述方法,可以
22、归纳出时钟边沿属性描述的一般行式为: IF clock_signal = current_value ANDClock_signal LAST_VALUE ANDClock_signal EVENT,时钟的描述,时钟信号作为触发信号(1),时序电路中进程敏感信号是时钟信号 在时序电路描述中,时钟信号作为敏感信号,显式的出现在PROCESS语句后的括号中。 PRCESS(clock_signal) 时序信号边沿的到来将作为时序电路语句执行的条件来启动进程的执行。 这种以时钟为敏感信号的进程描述方法为:,时钟信号作为触发信号,时钟信号作为触发信号(2),PROCESS (clock_signal)
23、BEGINIF(clock_edge_condition)THENSignal_out = signal_in;其他时序语句END IF;END PROCESS; clock信号作为进程的敏感信号,每当clock发生变化,该进程就被触发、启动,而时钟边沿的条件得到满足时,才真正执行时序电路所对应的语句。,时钟信号作为同步信号,在时序电路的进程描述中,不用敏感信号方式,而用WAIT ON语句来控制程序的执行。在这种设计方式中,进程通常停留在WAIT ON语句上,这个点也称为进程的同步点,只有在时钟信号到来且满足边沿条件时,其余的语句才能执行。WAIT ON语句等待时钟信号的设计方法为: PROC
24、ESS BEGIN WAIT ON(clock_signal)UNTIL(clock_edge_condition);Signal_out = signal_in;- 其他时序语句END PROCESS;,时钟信号作为同步信号,时钟信号应用,无论IF语句还是WAIT ON语句,对时钟边沿说明时,一定要说明是上升沿还是下降沿。 WAIT ON语句,只能放在进程的最前面或最后面。 当时钟信号作为进程的敏感信号时,敏感信号表中不能出现一个以上的时钟信号。 复位信号和时钟信号可以同时出现在敏感表中。,时钟信号应用,复位电路,时序电路的初始状态应由复位信号来设置。根据复位信号对时序电路复位的操作不同,使
25、其可以分为同步复位和异步复位。 所谓异步复位,就是当复位信号有效时,时序电路立即复位,与时钟信号无关。,复位电路,同步复位(1),在设计时序电路同步复位功能时,VHDL程序要把同步复位放在以时钟为敏感信号的进程中定义,且用IF语句来描述必要的复位条件。 (A) PROCESS (clock_signal)BEGINIF (clock_edge_condition) THENIF (reset_condition) THEN Signal_out = reset_value;ELSE Signal_out = signal_in;- 其他时序语句END IF;END IF;END PROCESS
26、;,同步复位,同步复位(2),PROCESSBEGINWAIT ON (clock_signal) UNTIL (clock_edge_condition)IF (reset_condition) THENSignal_out = reset_value;ELSESignal_out = signal_in;- 其他时序语句END IF;END PROCESS;,异步复位(1),异步复位方法有三个要点: 首先,在进程敏感信号表中应有clk,Reset同时存在; 其次,用IF语句描述复位条件; 最后,ELSIF程序段描述时钟信号边沿的条件,并加clkEVENT属性。,异步复位(1),异步复位(2
27、),PROCESS(reset_signal,clock_signal) BEGIN IF(reset_condition)THEN -复位条件成立Signal_out =reset_value;-复位赋予输出信号ELSIF(clock_event AND clock_edge_condition)THENSignal_out =signal_in; -复位条件不成立执行正常时序电路功能-其他时序语句END IF;END PROCESS;,时序逻辑设计,触发器,一、设计任务,试设计一个带异步复位/置位、同步使能的D触发器。,1、D触发器,二、算法设计,根据D触发器的真值表,利用IF语句描述。,
28、三、VHDL源程序,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY dffe ISPORT(prn,clrn,en,clk,d:IN STD_LOGIC;q:OUT STD_LOGIC); END dffe; ARCHITECTURE beh OF dffe IS BEGIN,PROCESS(prn,clrn,en,clk)BEGINIF prn= 0 THENq= 1;ELSIF clrn= 0 THENq= 0;ELSIF clkevent AND clk= 1 THENIF en= 1 THENq=d;END IF;END IF;END
29、 PROCESS; END beh;,2、本设计的仿真波形如图所示。从图中不难看出,prn实现了异步置位,clrn实现了异步清零,它们均与时钟clk无关。en为同步使能端,在clk上升沿到来时才有效。,四、程序说明,1、在设计涉及“优先权操作”的描述时,用顺序语句描述“优先权操作”是很方便的,优先权高的操作先描述,优先权低的操作后描述。在本设计中,异步置位prn的优先权最高,所以先描述。,一、设计任务,JK触发器,试设计一个基本的JK触发器。,二、算法设计,利用其行为方式进行描述。本设计也可利用数据流的方式来描述,即根据JK触发器的特性方程 进行描述。,三、VHDL源程序,程序一(行为描述):
30、LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY jkdff ISPORT(clk,j,k:IN STD_LOGIC;q,qb:OUT STD_LOGIC);END jkdff;ARCHITECTURE beh OF jkdff ISSIGNAL qtmp,qbtmp:STD_LOGIC;BEGINPROCESS(clk,j,k)BEGINIF clkevent AND clk= 0 THEN,IF j= 0 AND k= 0 THEN NULL;ELSIF j= 0 AND k= 1 THENqtmp= 0;qbtmp= 1;ELSIF j= 1
31、 AND k= 0 THENqtmp= 1;qbtmp= 0;ELSEqtmp=NOT qtmp;qbtmp=NOT qbtmp;END IF;END IF;q=qtmp;qb=qbtmp;END PROCESS;END beh;,程序2(数据流描述):ENTITY jkdff ISPORT(clk,j,k:IN STD_LOGIC;q,qb:OUT STD_LOGIC);END jkdff;ARCHITECTURE beh OF jkdff ISSIGNAL qtmp:STD_LOGIC;BEGINPROCESS(clk,j,k)BEGINIF clkevent AND clk= 0 THE
32、Nqtmp=(j AND (NOT qtmp)OR(NOT k)AND qtmp);END IF;,四、程序说明,1、在利用VHDL进行数字电路描述时,若已知电路的逻辑方程,也可以用数据流的方式进行描述,这样的程序更加简洁。,2、JK触发器的仿真波形如图。,q=qtmp;qb=NOT qtmp;END PROCESS;END beh;,一、设计任务,3、T触发器,试设计一个T触发器。,二、算法设计,利用IF语句来描述。,三、VHDL源程序,ENTITY tdff ISPORT(clk,t:IN STD_LOGIC;q:OUT STD_LOGIC);END tdff;ARCHITECTURE b
33、eh OF tdff ISSIGNAL qtmp:STD_LOGIC;BEGINPROCESS(clk,t)BEGINIF clkevent AND clk= 1 THENIF t= 0 THEN NULL;ELSEqtmp=NOT qtmp;,END IF;END IF;END PROCESS;q=qtmp;END beh;,四、程序说明,1、程序中用到了关键字“NULL”,该关键字没有任何含义,只是将引导程序跳到下一条语句。,2、T触发器的仿真波形如图所示。,锁存器,一、设计任务,设计一个8位数据的锁存器,数据输入为din70,使能端为en(高电平有效),数据输出端为q70。,二、算法设计
34、,用条件涵盖不完整的IF语句实现锁存器。,三、VHDL源程序,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY latch ISPORT(en:IN STD_LOGIC;din:IN STD_LOGIC_VECTOR(7 DOWNTO 0);q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END latch;,ARCHITECTURE beh OF latch ISBEGINPROCESS(en,din)BEGINIF en= 1 THENq=din;END IF;END PROCESS;END beh;,2、本设计中的en是
35、一个异步信号,当其变化较快时有可能在输出端形成冒险干扰。,3、本设计的仿真波形如图4-17所示。,四、程序说明,1、用条件涵盖不完整的IF语句可以实现锁存器。若设计的不是锁存器,则必须使条件涵盖完整,以避免错误引入锁存器。,寄存器,一、设计任务,试设计一个具有异步清零、同步使能的8位数码寄存器。,二、算法设计,利用IF语句进行编写。,1、基本寄存器,三、VHDL源程序,ENTITY reg ISPORT(clr,en,clk:IN STD_LOGIC;din:IN STD_LOGIC_VECTOR(7 DOWNTO 0);q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
36、END reg; ARCHITECTURE beh OF reg IS BEGINPROCESS(clk,clr,en,din)BEGINIF clr= 0 THENq= “00000000”;ELSIF clkevent AND clk= 1 THEN,IF en= 1 THENq=din;END IF;END IF;END PROCESS;END beh;,四、程序说明,1、本设计在清零无效、同步使能条件下,在时钟上升沿寄存数码,因此在时钟上升沿到来之前应将寄存的数码准备好。,2、仿真波形如图。,一、设计任务,试设计一个4位串入串出双向移位寄存器。其控制输入端为kz,当kz=1时数据左移;
37、当kz=0时数据右移。dl为左移数据输入端;dr为右移数据输入端。outl为左移数据输出端;outr为右移数据输出端。时钟为clk,上升沿有效。,2、移位寄存器,二、算法设计,利用IF语句和数组赋值语句描述4位串入串出双向移位寄存器。,三、VHDL源程序,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY shift_4 ISPORT(dr,dl,clk,kz:IN STD_LOGIC;outr,outl:OUT STD_LOGIC); END shift_4; ARCHITECTURE beh OF shift_4 IS SIGNAL q:ST
38、D_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(clk)BEGINIF clkevent AND clk= 1 THENIF kz= 1 THEN,outl=q(3);q(3 DOWNTO 1)=q(2 DOWNTO 0);q(0)=dl;ELSEoutr=q(0);q(2 DOWNTO 0)=q(3 DOWNTO 1);q(3)=dr;END IF;END IF;END PROCESS; END beh;,2、本设计采用IF语句和数组赋值语句描述移位寄存器的移位操作,这样可使描述简单一些。,3、本设计的仿真波形如图所示。,四、程序说明,1、当kz=1时数据左
39、移,数据输入为dl;当kz=0时数据右移,数据输入为dr,计数器,一、设计任务,试设计一个带同步清零、同步使能、同步预置数的4位二进制数加法计数器,预置数输入为d30,计数输出为q30。,1、二进制计数器,二、算法设计,利用IF语句描述该计数器。,三、VHDL源程序,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY counter ISPORT(clk,clr,en,load:IN STD_LOGIC;d:IN STD_LOGIC_VECTOR(3 DOWNTO 0);q:BUF
40、FER STD_LOGIC_VECTOR(3 DOWNTO 0); END counter; ARCHITECTURE beh OF counter IS BEGINPROCESS(clk),BEGINIF clkevent AND clk= 1 THENIF clr= 0 THENq= “0000”;ELSIF en= 1 THENIF load= 1 THENq=d;ELSEq=q+1;END IF;END IF;END IF;END PROCESS; END beh;,四、程序说明,1、本程序中把计数输出q的数据类型定义为BUFFER,在结构体中不用再定义信号。,2、如要实现“q=q+1
41、”运算,必须使用“IEEE.STD_LOGIC_UNSIGNED”程序包。,3、本设计的仿真波形如图。,一、设计任务,试设计一个带借位输出的十进制减法计数器,时钟端为clk(上升沿计数),计数输出端为q30,借位输出为b。,2、十进制减法计数器,二、算法设计,根据十进制的进制规则,利用IF语句来描述该设计。,三、VHDL源程序,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY counter_10 ISPORT(clk:IN STD_LOGIC;q:OUT INTEGER RAN
42、GE 9 DOWNTO 0;b:OUT STD_LOGIC); END counter_10;,ARCHITECTURE beh OF counter_10 IS SIGNAL qb: INTEGER RANGE 9 DOWNTO 0; BEGINPROCESS(clk)BEGINIF clkevent AND clk= 1 THENIF qb= 0 THENqb=9;b= 1;ELSEqb=qb-1;b= 0;END IF;q=qb;END IF;END PROCESS; END beh;,四、程序说明,1、如要实现“qb=qb-1”运算,必须使用“IEEE.STD_LOGIC_UNSIGN
43、ED”程序包。,2、在时钟上升沿到来时,本程序首先判断计数值是否已减到0,若已到0则装载9,同时产生借位,否则,计数器继续减1。,3、用整数数据类型设计N进制计数器是很方便的。若要设计N进制计数器,只需把数据取值范围改为“INTEGER RANGE N-1 DOWNTO 0”,并把判断语句改为“IF qb= 0 THEN qb=N-1”即可。,一、设计任务,试设计一个BCD码60进制计数器。个位输出0-9,十位输出0-5,均用二进制数表示。其符号见图,其中y030为个位,y130为十位,oc为进位(高电平有效)。,3、BCD码60进制计数器,二、算法设计,个位计数器的模为10,十位计数器的模为
44、6。用IF语句描述该计数器。,三、VHDL源程序,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY counter_60 ISPORT(clk:IN STD_LOGIC;y0,y1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);oc:OUT STD_LOGIC); END counter_60; ARCHITECTURE beh OF counter_60 IS SIGNAL q,k:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL j
45、60:STD_LOGIC; BEGIN,P1:PROCESS(clk)BEGINIF clkevent AND clk= 1 THENIF q= “1001” THENq= “0000”;ELSEq=q+1;END IF;END IF;y0=q;END PROCESS;P2:PROCESS(clk)BEGINIF clkevent AND clk= 1 THENIF q= “1001” THEN,IF k= “0101” THENk= “0000”;ELSE k=k+1;END IF;ELSE k=k;END IF;END IF;y1=k;IF q= “1001” AND k= “0101”
46、THENj60= 1;ELSE j60= 0;END IF;oc=j60;END PROCESS;END beh;,四、程序说明,1、本设计描述的是一个同步计数器,由于十位计数器和个位计数器使用同一个时钟,所以在程序中使用了q= “1001”条件对十位计数器的时钟作用时刻进行控制。,2、BCD码60进制计数器的仿真波形如图所示。,一、设计任务,设计一个模值i可变的计数器,其模值的变化范围为2-15。,4、模值可变计数器,二、算法设计,用IF语句描述该计数器。,三、VHDL源程序,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LO
47、GIC_UNSIGNED.ALL;,ENTITY variable_m ISPORT(clk,cr:IN STD_LOGIC;i:IN INTEGER RANGE 1 TO 14;y:OUT INTEGER RANGE 0 TO 15); END variable_m; ARCHITECTURE beh OF variable_m IS SIGNAL fpq:INTEGER RANGE 0 TO 15; SIGNAL m:INTEGER RANGE 1 TO 14; BEGINPROCESS(clk)BEGINm=i-1;IF cr= 0 THENfpq=0;,ELSIF clkevent A
48、ND clk= 1 THENIF fpq=m THENfpq=0;ELSEfpq=fpq+1;END IF;END IF;y=fpq;END PROCESS; END beh;,2、用此类电路组成可变分频系数的分频器,可得到一系列频率信号。,3、模值可变计数器的仿真波形如图所示。,四、程序说明,1、本设计的关键是计数最大值的描述,只要写出“fpq=m”,并找出m的来源,设计即可完成。本程序中的m由人工输入。,一、设计任务,设计一个分频器,使输出为时钟信号CLK的2分频、4分频、8分频和16分频。,分频器,二、算法设计,用IF语句描述该分频器。,三、VHDL源程序,LIBRARY IEEE; U
49、SE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;,ENTITY clk_div ISPORT(clk: IN STD_LOGIC;clk_div2: OUT STD_LOGIC;clk_div4: OUT STD_LOGIC;clk_div8: OUT STD_LOGIC;clk_div16: OUT STD_LOGIC);END ENTITY clk_div;ARCHITECTURE rtl OF clk_div ISSIGNAL count: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(clk)BEGINIF(clk event AND clk=1) THENIF(count=“1111”) THEN,