59第四章PLD设计实例本章中,我们将应用VHDL语言和电路原理图,在Altera公司的MAX+PLUSII软件平台上实现一些PLD设计实例。实例中所用的芯片是Altera公司可编程逻辑器件EPF10K10LC84-3,并将每一设计结果下载到杭州众和电子技术开发有限公司开发的EDA实验开发系统上进行验证和演示。4.1数字显示译码器一.设计要求:当每输入一脉冲信号时,数码管就显示一随脉冲信号递增的十六进制数,从数字1开始直至数字F。二.设计方法:此电路的设计框图如图4-1a所示。当低频的脉冲信号输入计数器后,七段译码器将计数器的输出译为相应的十六进制数,并由数码管显示出来。设计时,底层的计数器、译码器模块可由VHDL语言来实现;顶层的设计则可直接采用原理图输入法(图4-1b)。图4-1a数字显示译码器的设计框图三.源程序和原理图:四位二进制加法计数器七段译码器共阴极数码管脉冲信号libraryieee;useieee.std_logic_1164.all;entitycnt4bisport(clk:instd_logic;--时钟信号clr:instd_logic;--清零信号en:instd_logic;--时钟使能信号dout:bufferintegerrange0to15);end;architectureoneofcnt4bisbeginprocess(clk,clr,en)beginifclr='1'thendout=0;elsif(clk'eventandclk='1')thendout=dout+1;endif;60四位二进制加法计数器cnt4b.vhd的VHDL源程序ifen='1'thendout=dout+1;endif;endif;endprocess;end;libraryieee;useieee.std_logic_1164.all;entitydeclisport(din:instd_logic_vector(3downto0);--输入四位二进制数cs:instd_logic;--时钟信号com:outstd_logic;--位选信号led7s:outstd_logic_vector(6downto0)--输出七段码);end;architectureoneofdeclisbeginprocess(din)begincom=cs;casediniswhen0000=led7s=0111111;--显示“0”when0001=led7s=0000110;--显示“1”when0010=led7s=1011011;--显示“2”when0011=led7s=1001111;--显示“3”when0100=led7s=1100110;--显示“4”when0101=led7s=1101101;--显示“5”when0110=led7s=1111101;--显示“6”when0111=led7s=0000111;--显示“7”when1000=led7s=1111111;--显示“8”when1001=led7s=1101111;--显示“9”when1010=led7s=1110111;--显示“A”when1011=led7s=1111100;--显示“B”61七段译码器decl.vhd的VHDL源程序图4-1b数字显示译码器原理图四.实验板配置:本实例采用实验板中的第8种结构。时钟信号CLK1采用CLOCK1中的任何一组,CLK2采用CLOCK2中的1024HZ,按键5作为清零控制信号,按键6作为时钟使能信号,译码结果显示在数码管1上。习题:设计一能递增显示各种不同符号的显示器,工作方式同此实例。4.28位二进制并行加法器一.设计要求:当外加时钟信号的上升沿到达时,能实现8位二进制数并行相加,并输出和及进位信号。二.设计方法:多位加法器的构成有两种方式:并行和串行。并行加法器是一种超前进位加法逻辑电路,每位的进位只由加数和被加数决定,而与低位的进位无关,因而运算速度较快;串行加法器则是将全加器级联构成多位加法器,虽然电路比较简单,但运算速度较慢。并行加法器通常比串行级联加法器占用更多的资源,随着位数的增加,相同位数的并行加法器与串行加法器的容量差快速增大。因此,在工程中使用加法器时,要在速度和容量之间寻找平衡。when1100=led7s=0111001;--显示“C”when1101=led7s=1011110;--显示“D”when1110=led7s=1111001;--显示“E”when1111=led7s=1110001;--显示“F”whenothers=led7s=null;endcase;endprocess;end;62实验结果表明,4位二进制并行加法器和串行级联加法器占用几乎相同的资源。这样,多位数加法器可以由4位二进制并行加法器串联构成。本实例中的8位二进制并行加法器即是由2个4位二制并行加法器级联而成的。4位二制并行加法器由VHDL语言来实现;顶层的8位二进制并行加法器则通过原理图输入法将两个4位二进制加法器级连而成。三.源程序和原理图:4位二进制并行加法器add4b.vhd的VHDL语言源程序图4-28位二进制并行加法器原理图libraryieee;useieee.std_logic_1164.all;useieee.std_logic_signed.all;entityadd4bisport(cin:instd_logic;--低位的进位信号a,b:instd_logic_vector(3downto0);--加数及被加数s:outstd_logic_vector(3downto0);--和cout:outstd_logic--高位的进位信号);end;architectureoneofadd4bissignalcrlt:std_logic_vector(4downto0);begincrlt=a+b+cin;s=crlt(3downto0);cout=crlt(4);end;63四.实验板配置:本实例采用实验板中的第4种结构。低位的进位信号CIN通过按键输入,输出的进位信号用发光二极管D8来显示;加数A从低到高由按键1、2输入,被加数B从低到高由按键3、4输入,输出的和由数码管7、8显示。习题:设计一8位二进制减法器。(提示:根据二进制数相减等于补码相加的道理,将减数的每一位取反,同时将加法器的借位输入cin0置高电平。注意,此种结构的减法器,其溢出或借位的输出电平是0。)4.3模可变8位二进制加法计数器一.设计要求:每当外加时钟上升沿到达时,8位计数器即累加一次。可变模通过2个选择位M1、M0来决定,要求当M1、M0取00、01、10、11四个数值时,分别可构成10进制、16进制、32进制、128进制4种加法计数方式。二.设计方法:采用VHDL语言进行设计,通过选择位M1、M0的不同取值来控制进位信号的产生,从而实现不同进制的计数器。三.源程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitycnt8bisport(clr:instd_logic;--清零信号clk:instd_logic;--时钟信号m:instd_logic_vector(1downto0);--模的选择位dout:bufferstd_logic_vector(7downto0));end;architectureoneofcnt8bisbeginprocess(clk,clr,m)beginif(clr='1')thendout=00000000;elsif(clk'eventandclk='1')then--时钟上升沿到达if(m=0)then--取第一种模64模可变8位二进制加法计数器cnt8b.vhd的VHDL语言源程序四.实验板配置:本实例采用实验板中的第4种结构。时钟信号CLK采用CLOCK1中的任何一组,清零信号由按键8控制,选择位M的数值由按键1输入,输出结果在数码管7、8上显示。习题:设计一4位模可变加减计数器。4.4秒表一.设计要求:当外加时钟信号的频率为1HZ,要求秒表能精确到1秒。if(dout9)then--模为9,十进制计数器dout=dout+1;elsedout=00000000;endif;elsif(m=1)then--取第二种模if(dout15)then--模为15,十六进制计数器dout=dout+1;elsedout=00000000;endif;elsif(m=2)then--取第三种模if(dout31)then--模为31,32进制计数器dout=dout+1;elsedout=00000000;endif;elsif(m=3)then--取第四种模if(dout127)then--模为127,128进制计数器dout=dout+1;elsedout=00000000;endif;endif;endif;endprocess;end;65二.设计方法:图4-3a秒表的设计框图电路的设计框图如图4-3a所示。由于秒钟是六十进制的,所以可通过一十进制计数器和一六进制计数器来完成时间的计数。整个设计采用自上而下的设计方法,底层的计数模块采用VHDL语言来实现,顶层则可直接采用原理图输入法。三.源程序和原理图:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitycnt10isport(clk:instd_logic;--时钟信号clr:instd_logic;--清零信号cs:instd_logic;--时钟使能信号qq:bufferstd_logic_vector(3downto0);co:outstd_logic--进位信号);endcnt10;architectureoneofcnt10isbeginprocess(clk,clr,cs)beginif(clr='1')then--clr=1时,电路清零qq=0000;elsif(clk'eventandclk='1')thenif(cs='1')then--cs=1时,计数启动if(qq=9)thenqq=0000;秒钟个位(十进制计数器)秒钟十位(六进制计数器)1HZ译码显示译码显示66十进制加法计数器cnt10.vhd的VHDL语言源程序elseqq=qq+1;endif;endif;endif;endprocess;process(qq)beginif(qq=9)thenco='0';elseco='1';endif;endprocess;end;libraryieee;useieee.std_logic_1164.all;entitycnt6isport(clk:instd_logic;--时钟信号clr:instd_logic;--清零信号cs:instd_logic;--时钟使能信号qq:bufferintegerrange0to15);end;architectureoneofcnt6isbeginprocess(clk,clr,cs)beginifclr='1'then--clr=1时,电路清零qq=0;elsif(clk'eventandclk='1')thenif(cs='1')then--cs=1时,计数启动67六进制加法计数器cnt6.vhd的VHDL语言源程序图4-3b秒表的原理图四.实验板配置:本实例采用实验板中的第1种结构。时钟信号CLK采用CLOCK1中的1HZ,清零信号CLR和时钟使能信号CS分别由按键1、2控制,输出结果显示在数码管1、2上。习题:设计一能精确到秒的60秒定时器。4.5六位数字频率计一.设计要求:采用直接测频法设计