可编程逻辑器件及EDA技术实验报告.docx
《可编程逻辑器件及EDA技术实验报告.docx》由会员分享,可在线阅读,更多相关《可编程逻辑器件及EDA技术实验报告.docx(34页珍藏版)》请在冰豆网上搜索。
可编程逻辑器件及EDA技术实验报告
可编程逻辑器件及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_2is
port(a,b,c,d:
instd_logic;
f:
outstd_logic_vector(3downto0));
endexample3_2;
architecturebehavioralofexample3_2is
begin
f(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_4is
port(sin:
instd_logic;
i:
instd_logic_vector(7downto0);
a:
outstd_logic_vector(2downto0);
e,s:
outstd_logic);
endexample3_4;
architecturebehavioralofexample3_4is
begin
process(sin,i)
begin
ifsin='1'then
a<="111";e<='1';s<='1';
else
ifi(7)='0'then
a<="000";e<='0';s<='1';
elsifi(6)<='0'then
a<="001";e<='0';s<='1';
elsifi(5)<='0'then
a<="010";e<='0';s<='1';
elsifi(4)<='0'then
a<="011";e<='0';s<='1';
elsifi(3)<='0'then
a<="100";e<='0';s<='1';
elsifi
(2)<='0'then
a<="101";e<='0';s<='1';
elsifi
(1)<='0'then
a<="110";e<='0';s<='1';
elsifi(0)<='0'then
a<="111";e<='0';s<='1';
else
a<="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_6is
PORT(hex:
INSTD_LOGIC_VECTOR(3DOWNTO0);
segment:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
END;
ARCHITECTUREbehavioralOFexample3_6IS
BEGIN
PROCESS(hex)
BEGIN
CASEhex(3DOWNTO0)IS
WHEN"0000"=>segment<="0111111";--X"3F"'0
WHEN"0001"=>segment<="0000110";--X"06"'1
WHEN"0010"=>segment<="1011011";--X"5B"'2
WHEN"0011"=>segment<="1001111";--X"4F"'3
WHEN"0100"=>segment<="1100110";--X"66"'4
WHEN"0101"=>segment<="1101101";--X"6D"'5
WHEN"0110"=>segment<="1111101";--X"7D"'6
WHEN"0111"=>segment<="0000111";--X"07"'7
WHEN"1000"=>segment<="1111111";--X"7F"'8
WHEN"1001"=>segment<="1101111";--X"6F"'9
WHEN"1010"=>segment<="1110111";--X"77"'10
WHEN"1011"=>segment<="1111100";--X"7C"'11
WHEN"1100"=>segment<="0111001";--X"39"'12
WHEN"1101"=>segment<="1011110";--X"5E"'13
WHEN"1110"=>segment<="1111001";--X"79"'14
WHEN"1111"=>segment<="1110001";--X"71"'15
WHENOTHERS=>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_7is
Port(d:
instd_logic_vector(3downto0);
a:
instd_logic_vector(1downto0);
e:
instd_logic;
f:
outstd_logic);
endexample3_7;
architecturebehavioralofexample3_7is
begin
process(e,a,d)
begin
ife='0'then
caseais
when"00"=>f<=d(0);
when"01"=>f<=d
(1);
when"10"=>f<=d
(2);
when"11"=>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_10is
port(sel:
instd_logic;
a,b:
instd_logic_vector(7downto0);
mux_out:
outstd_logic_vector(7downto0));
endexample3_10;
architecturebehavioralofexample3_10is
begin
process(sel,a,b)
begin
ifsel='1'then
mux_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_12is
port(a,b:
instd_logic_vector(7downto0);
gt,eq,lt:
outstd_logic);
endexample3_12;
architecturebehavioralofexample3_12is
signalsab:
std_logic_vector(1downto0);
begin
sab<=a(7)&b(7);
process(a,b)
begin
case(sab)is
when"00"=>
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;
when"01"=>
gt<='1';eq<='0';lt<='0';
when"10"=>
gt<='1';eq<='0';lt<='0';
when"11"=>
ifa(6downto0)>b(6downto0)thengt<='0';eq<='0';lt<='1';
elsifa(6downto0)=b(6downto0)thengt<='0';eq<='1';lt<='0';
elsegt<='1';eq<='0';lt<='0';
endif;
whenothers=>
gt<='0';eq<='1';lt<='0';
endcase;
endprocess;
endbehavioral;
实验分析:
从程序可以看到,利用并置的方法从输入数据中分离出符号位,然后用case语句将符号位的四种组态分开,分别处理。
实验波形仿真图:
7、算术运算单元电路设计
实验原理:
算术运算单元电路是构成处理器CPU的算术逻辑单元(ALU)的一个重要组成部分。
实验内容:
例3.13试用VHDL设计一个8位二进制数的加法器。
它的程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityfulladderis
port(ai,bi,cin:
instd_logic;
si,cio:
outstd_logic);
endfulladder;
architecturebehavioraloffulladderis
begin
si<=(aixorbi)xorcin;
cio<=(aiandbi)or(cinandai)or(cinandbi);
endbehavioral;
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityexample3_13is
port(a,b:
instd_logic_vector(7downto0);
ci:
instd_logic;
co:
outstd_logic;
s:
outstd_logic_vector(7downto0));
endexample3_13;
architecturebehavioralofexample3_13is
componentfulladder
port(ai,bi,cin:
instd_logic;
si,cio:
outstd_logic);
endcomponent;
signalcarry:
std_logic_vector(8downto0);
begin
carry(0)<=ci;
co<=carry(8);
gen:
foriIN0to7generate
add:
fulladderportmap(
ai=>a(i),
bi=>b(i),
cin=>carry(i),
si=>s(i),
cio=>carry(i+1));
endgenerategen;
endbehavioral;
实验分析:
8位二进制加法器可以由8个全加器通过级联的方式构成。
实验波形仿真图如下:
二、时序逻辑电路设计
根据逻辑电路功能,逻辑电路可分为组合逻辑电路和时序逻辑电路两大类。
其特点是电路任意时刻的稳态输出仅取决于该时刻的输入信号,而与电路原来的状态无关。
1、常用触发器设计
实验原理:
触发器(flip-flop)是能存储一位二进制数的逻辑电路,是时序逻辑电路的基本单元电路。
触发器具有两个稳定状态,用来表示逻辑状态或二进制数的0和1。
实验内容:
例3.14试用VHDL设计一个D触发器。
它参考程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
ENTITYexample3_14IS
PORT(CLK:
INSTD_LOGIC;
D:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC);
END;
ARCHITECTUREbehavioralOFexample3_14IS
BEGIN
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'
THENQ<=D;
ENDIF;
ENDPROCESS;
END;
电路结构图:
实验波形仿真图:
实验原理:
对于时序电路的控制,通常可以划分为同步方式和异步方式。
同步方式是指控制信号只有在时钟有效时才起作用,简称同步控制;异步方式是指控制系统起作用不需要时钟信号有效,简称异步控制。
实验内容:
例3.15试用VHDL设计一个具有异步复位和同步置位的D触发器。
它的参考程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityexample3_15is
port(d:
instd_logic;
clk:
instd_logic;
clr,set:
instd_logic;
q:
outstd_logic);
endexample3_15;
architecturebehavioralofexample3_15is
begin
process(clk,clr,set)
begin
ifclr='1'thenq<='0';
elsifrising_edge(clk)then
ifset='1'then
q<='1';
else
q<=d;
endif;
endif;
endprocess;
endbehavioral;
电路结构图:
实验波形仿真图:
2、常用数码寄存器设计
数码寄存器用于寄存数据,不能进行数据移位。
它被广泛地应用于各类数字计算机和数字系统中。
一般来说,寄存器是借助时钟脉冲的作用把数据寄存在触发器内,寄存数据的位数和所用触发器的个数是相等的,因为一个触发器能储存1位二进制码,所以用N触发器组成的寄存器能储存一组N二进制码。
按照数码寄存器的功能,可以把数码寄存器的功能划分为寄存器、锁存器和移位寄存器等。
实验内容:
例3.17试用VHDL设计一个8位锁存器。
它的参考程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityexample3_17is
port(d:
instd_logic_vector(7downto0);
le:
instd_logic;
q:
outstd_logic_vector(7downto0));
endexample3_17;
architecturebehavioralofexample3_17is
signalqin:
std_logic_vector(7downto0);
begin
p1:
process(d)
begin
ifle='1'then
qin<=d;
endif;
endprocessp1;
p2:
process(le)
begin
iffalling_edge(le)then
q<=qin;
endif;
endprocessp2;
endbehavioral;
实验波形仿真图:
3、常用计数器设计
计数的功能就是累计输入脉冲的个数。
实现计数功能的数字电路就称为计数器(counter)。
被计数的脉冲(简称计数脉冲)可以是周期性脉冲,也可以是非周期性脉冲,它通常加载计数器的时钟输入端,作为计数器的时钟脉冲。
计数器在循环中的状态个数叫做计数器的模(modulus)。
在循环中有m个状态的计数器称为模m计数器,或称m分频计数器。
实验内容:
例3.21试用VHDL设计一个十进制计数器。
它的参考程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityexample3_21is
port(en,clk:
instd_logic;
q:
outstd_logic_vector(3downto0);
qcc:
outstd_logic);
endexample3_21;