VHDL.docx
《VHDL.docx》由会员分享,可在线阅读,更多相关《VHDL.docx(20页珍藏版)》请在冰豆网上搜索。
![VHDL.docx](https://file1.bdocx.com/fileroot1/2023-5/26/6aaa9861-3a20-4c2b-860a-e06da091fe64/6aaa9861-3a20-4c2b-860a-e06da091fe641.gif)
VHDL
实验练习要求掌握:
1.掌握MAX+PLUSII的基本操作方法
2.文本输入、编辑、建库、存盘、综合。
3.文本编辑时对VHDL语言的格式要求,能够查错。
4.波型仿真步骤,打开波型编辑器、节点输入、输入波型设置、存盘、仿真、时标调整。
5.了解图形编辑方法。
实验2-1.实验内容:
3-8译码器的设计。
当EN=1时,译码器正常工作;当EN=0时,译码器不工作。
LIBRARYieee;
USEieee.std_logic_1164.ALL;
ENTITYdecode3_8IS
PORT(a,b,c,en:
INSTD_LOGIC;
y:
OUTSTD_LOGIC_VECTOR(7downto0));
ENDdecode3_8;
ARCHITECTUREqqqOFdecode3_8IS
BEGIN
indate<=c&b&a;
PROCESS(indate,en)
BEGIN
IFen='1'THEN;
CASEindateIS
WHEN"000"=>y<="11111110";
WHEN"001"=>y<="11111101";
WHEN"010"=>y<="11111011";
WHEN"011"=>y<="11110111";
WHEN"100"=>y<="11101111";
WHEN"101"=>y<="11011111";
WHEN"110"=>y<="10111111";
WHEN"111"=>y<="0111111";
WHENothers=>segment<="XXXXXXX";
ENDCASE;
ELSE
y<="11111111";
ENDIF;
ENDPROCESS;
ENDqqq;
--***********************************************
实验2-2.用构造体的结构描述方式实现如图所示组合逻辑电路,仿真其功能并进行功能描述。
方法1
--***********************************************
LIBRARYieee;
USEieee.std_logic_1164.all;
ENTITYnot2IS
PORT(a:
INSTD_LOGIC;
c:
OUTSTD_LOGIC);
ENDnot2;
ARCHITECTUREand22OFnot2IS
BEGIN
c<=nota;
ENDand22;
--***********************************************
LIBRARYieee;
USEieee.std_logic_1164.all;
ENTITYnand2IS
PORT(a,b:
INSTD_LOGIC;
c:
inOUTSTD_LOGIC);
ENDnand2;
ARCHITECTUREand22OFnand2IS
BEGIN
c<=anandb;
ENDand22;
--***********************************************
LIBRARYieee;
USEieee.std_logic_1164.ALL;
ENTITYsssIS
PORT(
ai,bi:
INSTD_LOGIC;
mi,li:
INOUTSTD_LOGIC;
gi:
OUTSTD_LOGIC);
ENDsss;
ARCHITECTUREaOFsssIS
COMPONENTnot2--元件调用声明
PORT(a:
INSTD_LOGIC;
c:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTnand22--元件调用声明
PORT(a,b:
INSTD_LOGIC;
c:
OUTSTD_LOGIC);
ENDCOMPONENT;
signalaa,bb:
STD_LOGIC;
BEGIN
u1:
not2
PORTMAP(ai,aa);
u2:
not2
PORTMAP(bi,bb);
u3:
nand22
PORTMAP(aa,bi,mi);
u4:
nand22
PORTMAP(bb,ai,li);
u5:
nand22
PORTMAP(mi,li,gi);
ENDa;
--***********************************************
方法2采用逻辑表达式的描述方式实现如图所示组合逻辑电路
--***********************************************
LIBRARYieee;
USEieee.std_logic_1164.ALL;
ENTITYsss2IS
PORT(
ai,bi:
INSTD_LOGIC;
mi,li:
inOUTSTD_LOGIC;
gi:
OUTSTD_LOGIC);
ENDsss2;
ARCHITECTUREaOFsss2IS
SIGNALaa,bb:
STD_LOGIC;
BEGIN
aa<=notai;
bb<=notbi;
mi<=aanandbi;
li<=bbnandai;
gi<=minandli;
ENDa;
--***********************************************
实验3-1.描述一个7段显示译码器逻辑(共阴极),仿真其功能。
LIBRARYieee;
USEieee.std_logic_1164.ALL;
ENTITYdecode4_7IS
PORT(
bcd:
INSTD_LOGIC_VECTOR(3downto0);
segment:
OUTSTD_LOGIC_VECTOR(6downto0));
ENDdecode4_7;
ARCHITECTUREqqqOFdecode4_7IS
BEGIN
PROCESS(bcd)
BEGIN
CASEbcdIS
WHEN"0000"=>segment<="0111111";--06fh
WHEN"0001"=>segment<="0000110";--106h
WHEN"0010"=>segment<="1011011";--25bh
WHEN"0011"=>segment<="1001111";--34fh
WHEN"0100"=>segment<="1100110";--466h
WHEN"0101"=>segment<="1101101";--56dh
WHEN"0110"=>segment<="1111100";--67ch
WHEN"0111"=>segment<="0000111";--707h
WHEN"1000"=>segment<="1111111";--87fh
WHEN"1001"=>segment<="1100111";--967h
WHENothers=>segment<="0000000";--others
ENDCASE;
ENDPROCESS;
ENDqqq;
--***********************************************
实验3-2.设计一个3bits的可逆计数器。
提示信息:
由名称可以知道,它的计数方式可以加(检测到CLK时钟的上升沿,计数器加1),也可以减(检测到CLK时钟的上升沿,计数器减1)。
使用一个控制信号DIR决定计数器是作加法或减法的动作。
LIBRARYieee;
USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.ALL;
ENTITYcount3IS
PORT(clk,dir:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(2downto0));
ENDcount3;
ARCHITECTUREqqqOFcount3IS
signalq_3:
STD_LOGIC_VECTOR(2downto0);
BEGIN
q(0)<=q_3(0);
q
(1)<=q_3
(1);
q
(2)<=q_3
(2);
PROCESS(clk,dir)
BEGIN
IFclk'EVENTANDclk='1'THEN
IFdir='1'THEN
q_3<=q_3+'1';
else
q_3<=q_3-'1';
ENDIF;
ENDIF;
ENDPROCESS;
ENDqqq;
--***********************************************
实验4-1.如下表所示为四位双向移位寄存器74LS194的真值表,编写程序描述该逻辑,仿真其功能。
其中各端口功能说明如下:
D0~D3:
并行数码输入端。
Cr:
异步清0端,低电平有效。
SR,SL:
右移,左移串行数码输入端。
S1,S0:
工作方式控制端。
00不变、01左移、10右移、11置数。
LIBRARYieee;
USEieee.std_logic_1164.ALL;
ENTITYshift4IS
PORT(
cr,cp,sr,sl,s1,s0:
inSTD_LOGIC;
d:
inSTD_LOGIC_VECTOR(3downto0);
q:
OUTSTD_LOGIC_VECTOR(3downto0));
ENDshift4;
ARCHITECTUREqqqOFshift4IS
signalq_4:
STD_LOGIC_VECTOR(3downto0);
BEGIN
q(0)<=q_4(0);
q
(1)<=q_4
(1);
q
(2)<=q_4
(2);
q(3)<=q_4(3);
PROCESS(cr,cp,s1,s0)
BEGIN
IFcr='0'THEN
q_4<="0000";
elsifcp'EVENTANDcp='1'THEN
IFs1='1'ANDs0='0'THEN
q_4(3)<=sl;
q_4
(2)<=q_4(3);
q_4
(1)<=q_4
(2);
q_4(0)<=q_4
(1);
elsifs1='0'ANDs0='1'THEN
q_4(0)<=sr;
q_4
(1)<=q_4(0);
q_4
(2)<=q_4
(1);
q_4(3)<=q_4
(2);
elsifs1='1'ANDs0='1'THEN
q_4<=d;
else
ENDIF;
else
ENDIF;
ENDPROCESS;
ENDqqq;
--***********************************************
实验5-1.设计1个4位加减法器,实体名称为subadd4。
完成后仿真验证。
输入端口:
a,b——实现加法与减法运算的操作数输入(4位);
sub——控制端,值为’0’时实现加法运算,值为’1’时实现减法运算。
输出端口:
s——和与差输出(4位);
co——进位与借位输出。
LIBRARYieee;
USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.ALL;
ENTITYsubadd4IS
PORT(a,b:
INSTD_LOGIC_VECTOR(3downto0);
sub:
INSTD_LOGIC;
s:
OUTSTD_LOGIC_VECTOR(3downto0);
co:
OUTSTD_LOGIC);
ENDsubadd4;
ARCHITECTUREqqqOFsubadd4IS
signalss:
STD_LOGIC_VECTOR(4downto0);
BEGIN
PROCESS(a,b,sub)
BEGIN
IF(sub='0')THEN
ss<=a+b;
else
ss<=a-b;
ENDIF;
s(0)<=ss(0);
s
(1)<=ss
(1);
s
(2)<=ss
(2);
s(3)<=ss(3);
co<=ss(4);
ENDPROCESS;
ENDqqq;
--***********************************************
实验5-2.
(1)完成1位全加器的设计。
提示信息:
输入为A,B,C,其中A、B为输入数据,C为输入的进位标志位;输出为Sum和Carr,其中Sum为本次运算结果位,Carr为本次进位标志位。
步骤1.一位半加器设计。
--***********************************************
LIBRARYieee;
USEieee.std_logic_1164.all;
ENTITYhalf_adderIS
PORT(a,b:
INSTD_LOGIC;
s,co:
OUTSTD_LOGIC);
ENDhalf_adder;
ARCHITECTUREddddOFhalf_adderIS
signalc,d:
STD_LOGIC;
BEGIN
c<=aorb;
d<=anandb;
co<=notb;
s<=candd;
ENDdddd;
步骤2.一位全加器设计。
--***********************************************
LIBRARYieee;
USEieee.std_logic_1164.all;
ENTITYfull_adderIS
PORT(a,b,cin:
INSTD_LOGIC;
s,co:
OUTSTD_LOGIC);
ENDfull_adder;
ARCHITECTUREddddOFfull_adderIS
signalu0_s,u0_co,u1_co:
STD_LOGIC;
COMPONENThalf_adder--元件调用声明
PORT(a,b:
INSTD_LOGIC;
s,co:
OUTSTD_LOGIC);
ENDCOMPONENT;
BEGIN
u0:
half_adder
PORTMAP(a,b,u0_s,u0_co);
u1:
half_adder
PORTMAP(u0_s,cin,s,u1_co);
co<=u0_cooru1_co;
ENDdddd;
--***************************************************
实验5-2.
(2)完成4位全加法器的设计。
提示信息:
一个4位的全加法器可以由4个1位的全加法器级联而成。
LIBRARYieee;
USEieee.std_logic_1164.all;
ENTITYfull4IS
PORT(cin:
INSTD_LOGIC;
a,b:
INSTD_LOGIC_VECTOR(3downto0);
co:
OUTSTD_LOGIC;
s:
OUTSTD_LOGIC_VECTOR(3downto0));
ENDfull4;
ARCHITECTUREddddOFfull4IS
SIGNALc:
STD_LOGIC_VECTOR(3downto0);
COMPONENTfull_adder--元件调用声明
PORT(a,b,cin:
INSTD_LOGIC;
s,co:
OUTSTD_LOGIC);
ENDCOMPONENT;
BEGIN
u0:
full_adder
PORTMAP(a(0),b(0),cin,s(0),c(0));
u1:
full_adder
PORTMAP(a
(1),b
(1),c(0),s
(1),c
(1));
u2:
full_adder
PORTMAP(a
(2),b
(2),c
(1),s
(2),c
(2));
u3:
full_adder
PORTMAP(a(3),b(3),c
(2),s(3),c(3));
co<=c(3);
ENDdddd;
--**************************************************
VHDL语言课下练习:
1.非同步复位/置位D触发器的设计。
设计思路:
参考P156/例7-32
--**************************************************
2.设计一个串行输入、串行输出移位寄存器它具有两个输入端:
数据输入端a,时钟输入端clk;一个数据输出端b。
设计思路:
参考P159-160/例7-37/例7—36。
--**************************************************
3.设计一个带允许端的十二进制计数器。
该计数器由4个触发器构成,clr输入端用于清零,en端用于控制计数器工作,clk为时钟脉冲(计数脉冲)输入端,qa,qb,qc,qd为计数器的4位二进制计数值输出端。
设计思路:
参考P165/例7-41。
--**************************************************
4.设计一个可并行置数,并行输出的3位移位寄存器。
输入端口:
Clk——时钟输入端;
Clrn——同步清零端,低电平有效;
Sh——移位控制端,低电平有效;
Di——移位输入端;
Ldn——置数控制端,高电平有效;
D——置数输入端(3位)。
清零操作优先级别最高,其次是移位操作,最后是置数操作。
移位方向不限定。
输出端口:
Q——输出端(3位)。
LIBRARYieee;
USEieee.std_logic_1164.all;
ENTITYshift3IS
PORT(Sh,Ldn,Di,Clk,Clrn:
INSTD_LOGIC;
D:
INSTD_LOGIC_VECTOR(2DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDshift3;
ARCHITECTUREaOFshift3IS
Signaltmp:
STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
PROCESS(Clk)
BEGIN
IF(Clk'EventANDClk='1')THEN
IFClrn='0'THEN
tmp<="000";
ELSIFSh='1'THEN
tmp
(2)<=Di;
tmp
(1)<=tmp
(2);
tmp(0)<=tmp
(1);
ELSIFLdn='1'THEN
tmp<=D;
ENDIF;
ENDIF;
ENDPROCESS;
Q<=tmp;
ENDa;
--**************************************************
5.设计1个8位二进制数的求补电路,(说明:
补码求取规则为正数的补码与其原码相同,负数的补码等于其原码除符号位保持不变,其余各位按位取反,再在最低位加1。
)
输入端口:
a——原码输入(8位)。
输出端口:
b——补码输出(8位)。
设计思路:
原码输入的最高位a(7)为符号位,为零时b=a,为零时b=nota+‘1’,
参考P146/例7-16
--**************************************************
6.设计一个两位数的十进制计数器(十进制计数器即按照8421BCD码进行计数的电路)。
输入端口:
Clrn——同步清零端,低电平有效;
Load——同步置数端,低电平有效;且清零操作优先于置数操作。
Ent1——计数使能端;
Clk——时钟输入端。
Da,Db——置数输入端,其中Da对应个位,Db对应十位。
输出端口:
Qa,Qb——计数输出端,其中Qa对应个位,Qb对应十位;
Co——进位输出端。
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_unsigned.all;
ENTITYbcd2IS
PORT(clrn,Load,ent1,clk:
INSTD_LOGIC;
da,db:
INSTD_LOGIC_VECTOR(3downto0);
qa,qb:
OUTSTD_LOGIC_VECTOR(3downto0);
co:
OUTSTD_LOGIC);
ENDbcd2;
ARCHITECTUREaOFbcd2IS
SIGNALent2:
STD_LOGIC;
BEGIN
PROCESS(clk)
VARIABLEtmpa,tmpb:
STD_LOGIC_VECTOR(3downto0);
BEGIN
IF(clk'eventANDclk='1')THEN
IFclrn='0'THEN
tmpa:
="0000";
tmpb:
="0000";
ELSIFLoad='0'THEN
tmpa:
=Da;
tmpb:
=Db;
ELSIFEnt1='1'THEN
IFtmpa="1001"THEN
tmpa:
="0000";
IFtmpb="1001"THEN
tmpb:
="0000";
ELSE
tmpb:
=tmpb+1;
ENDIF;
ELSE
tmpa:
=tmpa+1;
ENDIF;
ENDIF;
ENDIF;
Qa<