北邮 数电实验上报告.docx
《北邮 数电实验上报告.docx》由会员分享,可在线阅读,更多相关《北邮 数电实验上报告.docx(15页珍藏版)》请在冰点文库上搜索。
北邮数电实验上报告
数字电路与逻辑设计实验(上)
实
验
报
告
学院:
专业:
姓名:
班级:
学号:
日期:
一、实验名称及实验任务要求
1.实验一
(2):
Quartus原理图输入法设计实现全加器。
用实验一
(1)中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能。
2.实验三(3):
用VHDL语言将8421十进制计数器,分频器和数码管译码器三个电路进行链接。
3.实验四:
数码管扫描显示控制器设计与实现。
用VHDL语言设计并实现六个数码管串行扫描电路,要求同时显示0,1,2,3,4,5这六个不同的数字到六个数码管上,仿真验证其功能。
二、实验三(3)和实验四模块端口说明及连接图
1.实验三(3)连接图:
模块端口说明:
ain为时钟输入端,clear为异步清零输入端,bout[6,0]为控制数码管显示数字输出端,catout[5,0]为控制数码管亮灭输出端。
2.实验四连接图:
模块端口说明:
clk_in为时钟输入端,clear为异步清零输入端,cat[5,0]为控制数码管亮灭输出端。
三、实验一
(2),实验三(3)和实验四的仿真原理图或VHDL代码
1.实验一
(2)仿真原理图:
2.实验三(3)VHDL代码:
分频器代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYseg7_1IS
PORT(
a:
INSTD_LOGIC_VECTOR(3downto0);
b:
OUTSTD_LOGIC_VECTOR(6downto0);
cat:
OUTSTD_LOGIC_VECTOR(5downto0)
);
ENDseg7_1;
ARCHITECTUREseg_7_1_archOFseg7_1IS
BEGIN
PROCESS(a)
BEGIN
cat<="011111";
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;
计数器代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcount10IS
PORT(
clk,clear:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDcount10;
ARCHITECTUREaOFcount10IS
SIGNALq_temp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(clk)
BEGIN
IFclear='1'THEN
q_temp<="0000";
ELSIF(clk'eventandclk='0')THEN
IFq_temp="1001"THEN
q_temp<="0000";
ELSE
q_temp<=q_temp+1;
ENDIF;
ENDIF;
ENDPROCESS;
q<=q_temp;
ENDa;
数码管译码器代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYseg7_1IS
PORT(
a:
INSTD_LOGIC_VECTOR(3downto0);
b:
OUTSTD_LOGIC_VECTOR(6downto0);
cat:
OUTSTD_LOGIC_VECTOR(5downto0)
);
ENDseg7_1;
ARCHITECTUREseg_7_1_archOFseg7_1IS
BEGIN
PROCESS(a)
BEGIN
cat<="011111";
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;
将以上三个器件连接的代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYshiyan3IS
PORT(ain,clear:
INSTD_LOGIC;
bout:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
catout:
OUTSTD_LOGIC_VECTOR(5downto0));
ENDENTITYshiyan3;
ARCHITECTUREaOFshiyan3IS
COMPONENTdiv_12
PORT(clk:
INSTD_LOGIC;
clk_out:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTcount10
PORT(clk,clear:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENT;
COMPONENTseg7_1
PORT(
a:
INSTD_LOGIC_VECTOR(3downto0);
b:
OUTSTD_LOGIC_VECTOR(6downto0);
cat:
OUTSTD_LOGIC_VECTOR(5downto0)
);
ENDCOMPONENT;
SIGNALc0,c1,c2,c3,c4:
STD_LOGIC;
BEGIN
u1:
div_12PORTMAP(clk=>ain,clk_out=>c4);
u2:
count10PORTMAP(clk=>c4,clear=>clear,q(3)=>c3,q
(2)=>c2,q
(1)=>c1,q(0)=>c0);
u3:
seg7_1PORTMAP(a(3)=>c3,a
(2)=>c2,a
(1)=>c1,a(0)=>c0,b(6DOWNTO0)=>bout(6DOWNTO0),cat(5downto0)=>catout(5downto0));
END;
3.实验四VHDL代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYstaticIS
PORT(
clear,clk_in:
inSTD_LOGIC;
num:
outSTD_LOGIC_VECTOR(6DOWNTO0);
cat:
outSTD_LOGIC_VECTOR(5DOWNTO0));
ENDENTITY;
ARCHITECTUREoneOFstaticIS
SIGNALstatus:
integerRANGE0TO6;
BEGIN
PROCESS(clk_in)
BEGIN
IFclear='1'THENstatus<=6;
ELSIF(clk_in'eventANDclk_in='1')THEN
IFstatus=5THENstatus<=0;
ELSIFstatus=6THENstatus<=0;
ELSEstatus<=status+1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(status)
BEGIN
CASEstatusIS
WHEN0=>num<="1111110";cat<="011111";
WHEN1=>num<="0110000";cat<="101111";
WHEN2=>num<="1101101";cat<="110111";
WHEN3=>num<="1111001";cat<="111011";
WHEN4=>num<="0110011";cat<="111101";
WHEN5=>num<="1011011";cat<="111110";
WHEN6=>num<="1111110";cat<="000000";
WHENOTHERS=>num<="0000000";cat<="000000";
ENDCASE;
ENDPROCESS;
ENDone;
四、实验一
(2),实验三(3)及实验四仿真波形图
1.实验一
(2)仿真波形图:
2.实验三(3)仿真波形图:
分频器仿真波形图:
8421十进制计数器仿真波形图:
数码管显示控制器仿真波形图:
总仿真波形图:
3.实验四仿真波形图:
五、仿真波形图分析
1.实验一
(2)仿真波形图分析:
a、b、c分别表示加数,被加数及低位进位逻辑,ci、si分别表示向高位的进位及全加和。
设定a、b、c的时钟周期分别为4us、2us、1us,则可方便的观察到ci、si的波形变化。
2.实验三(3)仿真波形图分析:
ain表示时钟输入,clear表示异步清零输入。
初始时,bout[6,0]为“1111110”,数码管显示数字“0”,时钟输入经分频系数为12的分频器及8421十进制计数器处理后,每过12个时钟周期,数码管上显示的数字加1,直到bout[6,0]为“1111011”,即数码管显示“9”时,再过12个时钟周期,8421十进制计数器“归零”,数码管显示也“归零”。
当异步清零端输入“1”时,8421十进制计数器立即清零,bout[6,0]为“1111110”,数码管显示数字“0”,同时8421十进制计数器重新开始计数,再经过12个时钟周期后,数码管显示数字“1”。
catout[5,0]为控制六个数码管亮灭的输出端,当catout[5,0]为“011111”时,即cat[5]对应的数码管亮,其余数码管灭。
3.实验四仿真波形图分析:
clk_in表示时钟输入,clear表示异步清零输入。
初始时,num[6,0]为“1111110”,数码管显示数字“0”,经过一个时钟周期后,数码管显示数字加1,经过5个时钟周期后,num[6,0]为“1011011”,即数码管显示数字“5”时,再过一个时钟周期,数码管“归零”;而同时,cat[5,0]则从“011111”变化到“111110”,即从cat[5]对应的数码管亮到cat[0]对应的数码管亮,即实现了串行扫描,当频率足够快时,则会看到6个数码管上同时显示0、1、2、3、4、5。
当异步清零端输入“1”时,num[6,0]立即变为“1111110”,数码管显示数字“0”,即实现了异步清零。
六、故障及问题分析
1. 创建工程时,工程名称与顶层设计实体的名称需要一致,选择实验板MAXⅡ EPM1270T144C5,以及正确的芯片参数。
2.下载后,按键没有反应。
检验相应管脚是否设置正确,检查管脚是否失效。
3. 数码管显示乱码。
检查相应的输出译码部分是否正确,相应管脚设置是否正确。
若都正确,换一块实验板试试。
4.仿真波形中的end time不能随意设置,需注意计算合适的endtime。
七、总结和结论
通过这次数电实验,我学习并熟悉了Quartus软件,也学习了VHDL语言的编写、VHDL程序设计。
VHDL程序设计,不用拘泥用某种具体器件的选择和使用,使设计者能专注于工程各部分所需要完成的功能,逻辑感强,可读性强、可移植性好。
同时,我也意识到数字电路的设计最困难以及最重要的还是实验的设计,而不是代码的编写。
只要设计思路对了,将所需的模块都设计好了,代码的编写相对于设计还是相对简单的。