可编程逻辑器件及EDA技术实验报告一、组合逻辑电路设计数字逻辑电路按照逻辑功能的特点分为两类,一类是组合逻辑电路,简称为组合电路;另一类是时序逻辑电路,简称为时序电路。组合电路的特点是电路任意时刻输出状态只取决该时刻的输入状态,而与该时刻钱的电路状态无关。1、逻辑门电路设计实验原理:逻辑门电路包括基本逻辑门电路和符合逻辑门电路。VHDL语言可以直接支持的逻辑运算符共有七种逻辑运算,它们是:NOT逻辑非AND逻辑与NAND逻辑与非OR逻辑或NOR或非XOR异或XNOR异或非实验内容:例3-2的参考程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityexample3_2isport(a,b,c,d:instd_logic;f:outstd_logic_vector(3downto0));endexample3_2;architecturebehavioralofexample3_2isbeginf(0)=(aandb)or(bandc)or(notbandnotc);f(1)=(aandbandc)ornot(notaornotbornotc);f(2)=(axorbxorc)or(not(d)and(aorc));f(3)=not((aandb)xor(candd))or((aandbandd)xor(bandcandd));endbehavioral;实验分析:用逻辑运算符是实现了相对较为复杂的逻辑运算。参考程序中使用括号来强制控制逻辑运算的优先级,对于用VHDL设计,这种写法是必修的。用这种方法可以简单、快捷地完成逻辑电路设计。电路结构图:实验波形仿真如下图:2、常用编码器设计编码是指用文字、符号和数码等来表示某种信息的过程。在数字系统中,由于采用二进制运算来处理数据,因此通常是将信息编成若干位二进制代码,而在逻辑电路中,信号都是以高、低电平的形式给出的。实现编码的数字电路称作编码器(encoder),编码器的逻辑功能就是把输入的每一个高低电平信号编成一组对应的二进制代码。实验原理:根据8线-3线优先编码器的真值表可得,优先编码器的编码输入、编码输出均为低电平有效,且有使能输入和使能输出功能。实验内容:例3.4试用VHDL设计一个8线-3线优先编码器,编码器输出为反码输出。它的程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityexample3_4isport(sin:instd_logic;i:instd_logic_vector(7downto0);a:outstd_logic_vector(2downto0);e,s:outstd_logic);endexample3_4;architecturebehavioralofexample3_4isbeginprocess(sin,i)beginifsin='1'thena=111;e='1';s='1';elseifi(7)='0'thena=000;e='0';s='1';elsifi(6)='0'thena=001;e='0';s='1';elsifi(5)='0'thena=010;e='0';s='1';elsifi(4)='0'thena=011;e='0';s='1';elsifi(3)='0'thena=100;e='0';s='1';elsifi(2)='0'thena=101;e='0';s='1';elsifi(1)='0'thena=110;e='0';s='1';elsifi(0)='0'thena=111;e='0';s='1';elsea=111;e='1';s='0';endif;endif;endprocess;endbehavioral;实验分析:在8线-3线优先编码器的设计中,使用了IF-ELSIF-ELSE-ENDIF语句,该语句具有优先级关系。电路结构图:实验波形仿真图:3、常用译码器设计译码为编码的逆过程。实现译码的逻辑电路称为译码器(decoder)。译码器是少输入、多输出的逻辑电路,它的输入、输出间存在一对一的映射关系,其逻辑功能是将每组输入的代码译成对应的输出高或低有效的一路电平信号。实验原理:半导体数码管有共阳极和共阴极两种类型。共阳极数码管的7个发光二极管的阴极接在一起,通常接地,而七个阳极则是独立的。共阳极数码管与共阴极数码管相反,七个发光二极管的阳极接在一起,通常经过限流电阻后接+5V电源,而阴极是独立的。实验内容:例3.6试用VHDL设计一个半导体数码管的七段显示译码器。程序参考如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityexample3_6isPORT(hex:INSTD_LOGIC_VECTOR(3DOWNTO0);segment:OUTSTD_LOGIC_VECTOR(6DOWNTO0));END;ARCHITECTUREbehavioralOFexample3_6ISBEGINPROCESS(hex)BEGINCASEhex(3DOWNTO0)ISWHEN0000=segment=0111111;--X3F'0WHEN0001=segment=0000110;--X06'1WHEN0010=segment=1011011;--X5B'2WHEN0011=segment=1001111;--X4F'3WHEN0100=segment=1100110;--X66'4WHEN0101=segment=1101101;--X6D'5WHEN0110=segment=1111101;--X7D'6WHEN0111=segment=0000111;--X07'7WHEN1000=segment=1111111;--X7F'8WHEN1001=segment=1101111;--X6F'9WHEN1010=segment=1110111;--X77'10WHEN1011=segment=1111100;--X7C'11WHEN1100=segment=0111001;--X39'12WHEN1101=segment=1011110;--X5E'13WHEN1110=segment=1111001;--X79'14WHEN1111=segment=1110001;--X71'15WHENOTHERS=NULL;ENDCASE;ENDPROCESS;END;实验分析:当共阴极数码管的某一阳极接高电平时,相应的二极管发光,若要显示某字形,则使相应几段的二极管发光即可,所以共阴极数码管需要有输出高电平有效的译码器去驱动,而共阴极数码管则需要输出低电平有效的译码器去驱动。上面程序是一个能驱动共阳极数码管的7段译码器的VHDL程序。实验波形仿真如下:4、数据选择器设计数据选择器(multiplexer)是在地址选择信号的控制下,从多路输入数据中选择一路作为输出的逻辑电路,叫做多路开关,简称MUX。实验原理:在可编程逻辑器件的设计中经常用数据选择器来实现课编程逻辑器件内部数据总线的连接。实验内容:例3.7试用VHDL设计4选1数据选择器。参考程序:Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_arith.all;Useieee.std_logic_unsigned.all;Entityexample3_7isPort(d:instd_logic_vector(3downto0);a:instd_logic_vector(1downto0);e:instd_logic;f:outstd_logic);endexample3_7;architecturebehavioralofexample3_7isbeginprocess(e,a,d)beginife='0'thencaseaiswhen00=f=d(0);when01=f=d(1);when10=f=d(2);when11=f=d(3);endcase;endif;endprocess;endbehavioral;实验分析:一个4选1数据选择器,D3~D0为4个数据输入,F为数据输出,A1、A0是地址选择输入。当A1、A0为不同代码时,D3~D0中不同输入通道数据送至输出端F。E为使能端,当E=0时,数据选择器正常工作,否则禁止工作。实验波形仿真:5、数据分配器设计在数字信号的传输过程中,常常需要将一路数据分配到多路通道中去。实现这种功能的逻辑电路,叫做数据分配器(Demultiplexer),简称DEMUX,其电路为单输入、多输出形式。实验内容:例3.10试用VHDL设计两总线数据分配器。它的参考程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityexample3_10isport(sel:instd_logic;a,b:instd_logic_vector(7downto0);mux_out:outstd_logic_vector(7downto0));endexample3_10;architecturebehavioralofexample3_10isbeginprocess(sel,a,b)beginifsel='1'thenmux_out=a;elsemux_out=b;endif;endprocess;endbehavioral;实验分析:D为被传输的数据输入,A、B是(地址)选择输入,Q0~Q3为数据输出。电路结构图:实验波形仿真图:6、数值比较器设计数值比较器是用来比较两个数据之间市值关系的电路。按照比较的数据类型划分,数值比较器可分为无符号数二进制比较器和有符号数二进制比较器。实验内容:例3.12试用VHDL设计两个8位有符号数的数值比较器,比较分别输出大于、小于和相等的结果。它的程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityexample3_12isport(a,b:instd_logic_vector(7downto0);gt,eq,lt:outstd_logic);endexample3_12;architecturebehavioralofexample3_12issignalsab:std_logic_vector(1downto0);beginsab=a(7)&b(7);process(a,b)begincase(sab)iswhen00=ifa(6downto0)b(6downto0)thengt='1';eq='0';lt='0';elsifa(6downto0)=b(6downto0)thengt='0';eq='1';lt='0';elsegt='0';eq='0';lt='1';endif;when01=gt='1';eq='0';lt='0';when10=gt='1';eq='0';lt='0';when11=ifa(6down