数字电路与逻辑设计实验.docx
《数字电路与逻辑设计实验.docx》由会员分享,可在线阅读,更多相关《数字电路与逻辑设计实验.docx(20页珍藏版)》请在冰豆网上搜索。
![数字电路与逻辑设计实验.docx](https://file1.bdocx.com/fileroot1/2023-1/30/201d8800-7c3f-41e2-b469-dcabde928719/201d8800-7c3f-41e2-b469-dcabde9287191.gif)
数字电路与逻辑设计实验
数字电路与逻辑设计实验报告
学院:
班级:
姓名:
学号:
日期:
一.实验名称:
实验一:
QuartusII原理图输入法设计与实现
实验二:
用VHDL设计与实现组合逻辑电路
实验三:
用VHDL设计与实现时序逻辑电路
实验四:
用VHDL设计与实现数码管动态扫描控制器
二.实验所用器件及仪器:
1.计算机
2.直流稳压电源
3.数字系统与逻辑设计实验开发板
三.实验要求:
实验一:
(1)用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。
(2)用
(1)实现的半加器和逻辑门设计实现一个全加器,仿真并验证其功能,并下载到实验板上测试。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
(3)用3—8线译码器和逻辑门设计实现函数F=/C/B/A+/CB/A+C/B/A+CBA,仿真验证其功能并下载到实验板测试。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
注:
实验时将三个元器件放在一个newblockdiagram中实现。
实验二:
(1)用VHDL语言设计实现一个共阴极7段数码译码器,仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输入信号,7段数码管显示输出信号。
(2)用VHDL语言设计实现一个8421码转余三码的代码器,仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
(3)用VHDL语言设计实现一个4位二进制奇校验器,输入奇数个‘1’时,输出1,否则出0;仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
实验三:
(1)用VHDL语言设计实现一个带异步复位的8421十进制计数器,仿真验证其功能,并下载到实验板测试。
要求用按键设定输入信号,发光二极管显示输出信号。
(2)用VHDL语言设计实现一个分频系数为12,输出信号占空比为50%的分频器,仿真验证其功能。
注:
实验时将
(1)、
(2)和数码管译码器3个电路进行,并下载到实验板显示计数结果。
实验四:
(1)用VHDL语言设计实现六个数码管串行扫描电路,要求同时显示0,1,2,3,4,5这几个不同的数字图形到数码管上,仿真验证其功能,并下载到实验板测试。
(2)用VHDL语言设计实现六个数码管滚动显示电路:
A.循环左循环,左进右出。
状态为:
012345->123450->234501->345012->450123->501234->012345
B.向左滚动,状态为(X表示数码管不显示):
012345->12345X->2345XX->345XXX->45XXXX->5XXXXX->XXXXXX->XXXXX0->XXXX01->XXX012->XX0123->X01234->012345
四.实验原理及设计思路:
实验一:
(1)半加器是考虑两位二进制数相加,出来的结果有二者加后的一个低位数,和一个这两位数相加所得的进位数。
所以用异或门和与门即可实现双输入双输出的半加器。
(2)全加器可以以半加器为基础,在考虑两位二进制数相加时也考虑上地位的进位信号,输出与半加器类似。
(3)译码器加逻辑门可以实现相应的逻辑函数,将有相应最小项的输出项或即可。
实验二:
(1)共阴极7段数码译码器:
拨码开关的不同状态对应输入信号的0和1,通过改变拨码开关的状态改变输入值,此时用VHDL语言描述每个输入值下对应的数在数码管中的显示。
(2)8421码转余三码的代码器:
将8421BCD码加上0011即为对应的余三码,通过通过改变拨码开关的状态改变输入的84212BCD码,由四个LED灯的亮与灭(亮表示该值为1,灭表示0),来表示余三码的码值。
(3)奇偶校验电路:
同理用拨码开关设定输入信号,发光二极管显示输出信号,输入奇数个1时,对应的发光二极管亮,反之则为熄灭状态。
实验三:
(1)异步计数器:
由于是异步复位,且yibuclear(清零信号)优先级最高,当它有效时使状态清零。
或者当到达第11个状态(1010)时复位,使状态回归到初始状态(0000)。
其余时刻,用cp来计数,每按一次键cp=1,状态加1。
因此设计2个输入端,一个输出端数组即可。
(2)分频器:
是使cp经过12个周期,输出的信号正好完成一次完整的翻转,因此需要计数,该计数器模值为12,每六个状态时翻转一次。
(3)可以使用分频器为异步计数器提供脉冲信号,异步计数器的输出作为数码管译码管的输入,由数码管译码管显示当前数据。
实验四:
(1)六个数码管串行扫描电路:
由实验板上18号元件提供时钟,每过一个周期,亮一个数码管,且该数码管序号也会改变,因此需要两个数组来体现这种改变。
设选择一个管亮的数组为xuan(5downto0),数码管上控制输出数字形状的数组为guan(6downto0),通过输入的时钟改变状态(signalstatus),由状态定xuan,guan。
由于要求“同时显示”,我们知道闪烁发光的二极管闪烁频率较高时,我们将观察到持续点亮的现象,一个数码管要稳定,需要显示频率大于50HZ,现在需要6个数码管同时显示,因而时钟的频率应该大于300HZ。
(2)六个数码管滚动扫描电路:
大致原理同
(1),但是需要注意guan不再只有6个状态,需要用12个状态来配合周期循环使用。
需要每轮的管子状态改变一个位移。
此时可以把xuan由循环来赋值,实现控制不同时刻数码管的亮与灭。
五.实验模块端口及连接图:
实验三(3):
分频器的时钟信号接外部时钟,异步清零端接外部信号,异步清零信号有效时可以实现分频器部计数清零。
当外部时钟clk=1时,分频器部计数器的状态加1,每六个状态clk_out实现一次翻转。
分频器的输出作为异步计数器的时钟,异步计数器的异步复位端接外部输入,可由实验板上拨码开关实现。
这样就将外部时钟12分频后输入给异步计数器,异步计数器将计数输入数码译码器,实现控制数码管的状态,使之显示异步8421十进制计数器的此刻的数。
实验四:
(1)clk是输入信号,接外部时钟信号(location对应实验板18),要求频率大于300HZ,clear是异步复位信号。
guan为输出信号,连接到数码管上对应的7条线,控制这个数码管中每一段线的亮与灭,实现显示数字。
xuan是控制6个数码管此时应该亮哪一个。
由signalstatus根据输入信号确定此时对应的状态下的xuan和guan。
(2)循环左滚动:
输入信号为clk,clear。
Clear为异步复位信号,Clk接外部时钟,该时钟共有4种频率(可以通过改变粉红色按钮上的小拨码开关调整),为了使实验现象符合要求,我们可以选择最高频率并对它进行分频,分出我们所需要的合适的频率,再由分频器输出的信号控制状态变化,每来一个时钟改变一次状态,xuan和guan为输出信号,分别控制该时刻应该亮哪个数码管和这个数码管上每条线的亮与灭状态。
故clk接实验板上18,clear可由按键实现,xuan接实验板上cat(0~5)guan接数码管上每条线所对应的数字。
小周期计数器控制每位数码的显示,大周期计数器控制数码的移位。
(3)clk为输入信号,接外部时钟实验板上18,通过循环移位及每来一个cp对xuan进行一次赋值,选择此时该亮的灯。
通过改变输出guan和xuan,从而得出能熄灭能亮的现象。
guan接数码管上的每条线所对应位置,xuan接六个数码管的cat端
六.实验原理图或者VHDL代码:
(1)实验一
(2):
其中半加器ba的原理图如下所示:
(2)实验三(3)VHDL代码如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYsangeIS
PORT(
clk:
INSTD_LOGIC;
clear,clearyibu:
INSTD_LOGIC;
b:
OUTSTD_LOGIC_VECTOR(6downto0);
y2,y3,y4,y5,y6,y7:
OUTSTD_LOGIC
);
endsange;
ARCHITECTUREaOFsangeIS
componentfenpin
PORT(
clk:
INSTD_LOGIC;
clear:
INSTD_LOGIC;
clk_out:
OUTSTD_LOGIC
);
ENDcomponent;
componentyibu
PORT(
cp,clear:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDcomponent;
componentseg7_1
PORT(
a:
INSTD_LOGIC_VECTOR(3downto0);
b:
OUTSTD_LOGIC_VECTOR(6downto0);
c,d,e,f,g,h:
OUTSTD_LOGIC
);
ENDcomponent;
SIGNALna:
STD_LOGIC;
SIGNALnb:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
u1:
fenpinPORTMAP(clk=>clk,clear=>clear,clk_out=>na);
u2:
yibuPORTMAP(cp=>na,clear=>clearyibu,q=>nb);
u3:
seg7_1PORTMAP(a=>nb,b=>b,c=>y2,d=>y3,e=>y4,f=>y5,g=>y6,h=>y7);
ENDa;
其中fenpin,yibu,seg7_1的VHDL代码如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfenpinIS
PORT(
clk:
INSTD_LOGIC;
clear:
INSTD_LOGIC;
clk_out:
OUTSTD_LOGIC
);
ENDfenpin;
ARCHITECTUREaOFfenpinIS
SIGNALtmp:
INTEGERRANGE0TO5;
SIGNALclktmp:
STD_LOGIC;
BEGIN
PROCESS(clear,clk)
BEGIN
IFclear='0'THEN
tmp<=0;
ELSIF(clk'eventandclk='1')THEN
IFtmp=5THEN
tmp<=0;clktmp<=NOTclktmp;
ELSE
tmp<=tmp+1;
ENDIF;
ENDIF;
ENDPROCESS;
clk_out<=clktmp;
ENDa;
yibu:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYyibuIS
PORT(
cp,clear:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDyibu;
ARCHITECTUREaOFyibuIS
SIGNALtemp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(cp)
BEGIN
IFclear='1'THEN
temp<="0000";
elsIFtemp="1010"THEN
temp<="0000";
else
IF(cp'eventandcp='1')THEN
temp<=temp+1;
ENDIF;
endif;
ENDPROCESS;
q<=temp;
ENDa;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYseg7_1IS
PORT(
a:
INSTD_LOGIC_VECTOR(3downto0);
b:
OUTSTD_LOGIC_VECTOR(6downto0);
c,d,e,f,g,h:
OUTSTD_LOGIC
);
数码管译码器VHDL代码:
endseg7_1;
ARCHITECTUREseg7_1_archOFseg7_1IS
BEGIN
c<='0';d<='1';e<='1';f<='1';g<='1';h<='1';
PROCESS(a)
BEGIN
CASEaIS
WHEN"0000"=>B<="1111110";--0
WHEN"0001"=>B<="0110000";--1
WHEN"0010"=>B<="1101101";--2
WHEN"0011"=>B<="1111001";--3
WHEN"0100"=>B<="0110011";--4
WHEN"0101"=>B<="1011011";--5
WHEN"0110"=>B<="1011111";--6
WHEN"0111"=>B<="1110000";--7
WHEN"1000"=>B<="1111111";--8
WHEN"1001"=>B<="1111011";--9
WHENOTHERS=>B<="0000000";
ENDCASE;
ENDPROCESS;
END;
(3)实验四
(1)数据管串行扫描电路:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYchuanxingIS
PORT(
clk,clear:
INSTD_LOGIC;
guan:
outSTD_LOGIC_VECTOR(6downto0);
xuan:
OUTSTD_LOGIC_VECTOR(5downto0)
);
endchuanxing;
ARCHITECTUREyuOFchuanxingIS
signalstatus:
integerrange0to6;
BEGIN
process(clk)
begin
ifclear='0'thenstatus<=0;
elsif(clk'eventandclk='1')then
ifstatus=6thenstatus<=1;
else
status<=status+1;
endif;
endif;
endprocess;
PROCESS(status)
BEGIN
CASEstatusIS
WHEN1=>guan<="1111110";xuan<="011111";
WHEN2=>guan<="0110000";xuan<="101111";
WHEN3=>guan<="1101101";xuan<="110111";
WHEN4=>guan<="1111001";xuan<="111011";
WHEN5=>guan<="0110011";xuan<="111101";
WHEN6=>guan<="1011011";xuan<="111110";
WHENOTHERS=>guan<="0000000";xuan<="111111";
ENDCASE;
ENDPROCESS;
END;
(2)循环左滚动:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYmoveIS
PORT(clk,clear:
INSTD_LOGIC;
guan:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
xuan:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
ENDmove;
ARCHITECTUREzuoOFmoveis
SIGNALl:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALc:
STD_LOGIC_VECTOR(5DOWNTO0);
SIGNALt,cnt1:
INTEGERRANGE0TO5;
SIGNALtmp:
INTEGERRANGE0TO1999;
signalclk1:
STD_LOGIC;
BEGIN
Fenpin1:
PROCESS(clk,clear)
BEGIN
IFclear='0'THENtmp<=0;
ELSIFclk'EVENTANDclk='1'THEN
IFtmp=1999THEN
tmp<=0;
ELSE
tmp<=tmp+1;
ENDIF;
ENDIF;
ENDPROCESSfenpin1;
fenpin2:
PROCESS(tmp)
BEGIN
IFclk'EVENTANDclk='1'THEN
IFtmp<1000THEN
clk1<='0';
ELSE
clk1<='1';
ENDIF;
ENDIF;
ENDPROCESSfenpin2;
change:
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IF(cnt=5)THENt<=0;
ELSE
t<=cnt+1;
ENDIF;
ENDIF;
ENDPROCESSchange;
P0:
PROCESS(clk1)
BEGIN
IF(clk1'EVENTANDclk1='1')THEN
IF(cnt1=5)THENt1<=0;
ELSE
t1<=cnt1+1;
ENDIF;
ENDIF;
ENDPROCESSp0;
P1:
PROCESS(cnt,cnt1)
BEGIN
IF(clear='0')THENl<="0000000";
ELSE
CASEt+cnt1IS
WHEN0=>l<="1111110";
WHEN1=>l<="0110000";
WHEN2=>l<="1101101";
WHEN3=>l<="1111001";
WHEN4=>l<="0110011";
WHEN5=>l<="1011011";
WHEN6=>l<="1111110";
WHEN7=>l<="0110000";
WHEN8=>l<="1101101";
WHEN9=>l<="1111001";
WHEN10=>l<="0110011";
WHEN11=>l<="1011011";
WHENOTHERS=>l<="0000000";
ENDCASE;
ENDIF;
ENDPROCESSp1;
guan<=q_temp;
p2:
PROCESS(cnt)
BEGIN
IF(clear='0')THENc<="111111";
ELSE
CASEtIS
WHEN0=>c<="011111";
WHEN1=>c<="101111";
WHEN2=>c<="110111";
WHEN3=>c<="111011";
WHEN4=>c<="111101";
WHEN5=>c<="111110";
WHENOTHERS=>c<="111111";
ENDCASE;
ENDIF;
ENDPROCESSp2;
xuan<=count;
ENDzuo;
(3)亮了又熄灭:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYbianhuaIS
PORT(
clk,clear:
INSTD_LOGIC;
guan:
outSTD_LOGIC_VECTOR(6downto0);
xuan:
OUTSTD_LOGIC_VECTOR(5downto0)
);
endbianhua;
ARCHITECTUREweiOFbianhuaIS
signaltmp:
integerrange0to5;
signalw:
integerrange0to5;
signals:
integerrange0to10;
signalk:
integerrange0to1;
signalo:
integerrange0to6;
signalp:
integerrange-1to1;
signalclko:
std_logic_vector(0to5);
BEGIN
process(clear,clk)
begin
ifclear='0'then
tmp<=0;
w<=0;
s<=0;
k<=0;
o<=6;
p<=-1;
elsif(clk'eventandclk='1')then
iftmp=5then
tmp<=0;
w<=w+1;
else
tmp<=tmp+1;
endif;
ifw=6then
w<=0;
endif;
foriin0to5loop
ifk=0then
iftmp>=othen
clko(i)<='1';
elsiftmpclko(i)<='1';
elsiftmp
clko(i)<='0';
else
clko(i)<='1';
endif;
elsifk=1then
if(5-tmp)>=othen
clko(i)<='1';
elsiftmpclko(i)<='1';
elsiftmp
clko(i)<='0';
else
clko(i)<='1';
endif;
endif;
endloop;
iftmp=5then
o<=o+p;
endif;
ifo=0then
k<=1;
p<=1;
elsifo=6then
p<=-1;
k<=0;
endif;
foriin0to5loop
xuan(i)<=clko(i);
endloop;
s<=tmp+w;
CASEsIS
WHEN10=>guan<="0110011";
WHEN