数字电路与逻辑设.docx
《数字电路与逻辑设.docx》由会员分享,可在线阅读,更多相关《数字电路与逻辑设.docx(13页珍藏版)》请在冰豆网上搜索。
数字电路与逻辑设
数字电路与逻辑设
计实验报告
学院:
信息与通信工程学院
班级:
姓名
学号
序号:
一、实验名称和实验任务要求
实验一:
QuartusII图形输入法设计;
EDA基础实验1
(1)
(2)(3)必做,选做VHDL实现全加器
(1)用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。
(2)用实验内容1中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输出信号,发光二极管显示输出信号。
(3)用3线——8线译码器(74LS138)和逻辑门设计实现函数F,仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输出信号,发光二极管显示输出信号。
实验二:
组合逻辑电路的设计与实现;
(1)数码管译码器(第七章实验2
(2))
用VHDL语言设计实现一个共阴极7段数码管译码器,仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输出信号,七段数码管显示输出信号。
(2)8421码转余3码(第七章实验3
(2))
用VHDL设计实现一个8421码转换为余3码的代码转换器,仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输出信号,发光二极管显示输出信号。
(3)奇校验器(第七章实验4
(2))
用VHDL设计实现一个4为二进制奇校验器,输入奇数个‘1’时,输出为‘1’,否则输出‘0’,仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输出信号,发光二极管显示输出信号。
实验三:
时序电路的设计与实现;
(1)8421十进制计数器(第七章实验8
(2))
用VHDL设计实现一个带异步复位的8421码十进制计数器,仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输出信号,发光二极管显示输出信号。
(2)分频器(第七章实验11
(1))
用VHDL设计实现一个分频系数为12,分频输出信号占空比为50%的分频器。
要求在QuartusII平台上设计程序并仿真验证设计。
(3)将
(1)、
(2)和数码管译码器3个电路进行链接,并下载到实验板显示计数结果;
实验四:
数码管动态扫描控制器、点阵行扫描控制器(二选一);
(1)用VHDL语言设计并实现六个数码管串行扫描电路,要求同时显示0,1,2,3,4,5这六个不同的数字图形到六个数码管上,仿真下载验证其功能。
(2)用VHDL语言设计并实现六个数码管滚动显示电路。
循环滚动,始终点亮6个数码管,左出右进。
状态为:
012345-123450-234501-345012-450123-501234-012345
二、实验三(3)和实验四模块端口说明及连接图
实验三(3)
分频器与异步计数器共用reset复位键,clk为分频器时钟信号,分频器输出信号为计数器提供时钟信号,计数器的输出为数码管译码器输入信号。
实验四
(1)
clk为输入时钟,经过一个分频器,产生2kHz的扫描信号作为时钟,驱动计数器工作。
选用模值为6的计数器,通过一个3线至6线译码器,产生段码,依次控制6个LED的亮灭,使得某一时刻有且仅有一个LED点亮,同时产生对应的,将点亮的LED数码管赋值显示为相应的数码予以显示。
由于扫描频率较高,6位LED数码管序列将显示持续稳定的0至5的数码
实验四
(2)
为实现移位,在
(1)的基础上关键改动为新增一个计数器,技术周期远远大于扫描周期,这样,在一个大的计数周期内,对于要显示的6位数码进行动态扫描(和实验任务1中相同),显示出6种移位状态中的一种;在下一个大的周期内,利用FLAG标志,并使用求余运算将显示位的数码移位。
三、实验一
(2)、实验三(3)和实验四的原理图或VHDL代码
1、实验一
(2)的原理图
2、实验三(3)VHDL代码
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfinalIS
PORT(clk,reset:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
cat:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
ENDfinal;
ARCHITECTUREaOFfinalIS
COMPONENTV8_2IS
PORT(clk,reset:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENTV8_2;
COMPONENTV11_1IS
PORT(clk,clear:
INSTD_LOGIC;
clk_out:
OUTSTD_LOGIC);
ENDCOMPONENTV11_1;
COMPONENTseg7_1IS
PORT(
a:
INSTD_LOGIC_VECTOR(3DOWNTO0);
b:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
cat:
OUTSTD_LOGIC_VECTOR(5DOWNTO0)
);
ENDCOMPONENTseg7_1;
SIGNALa:
STD_LOGIC;
SIGNALe:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
u1:
V8_2PORTMAP(clk=>a,reset=>reset,q=>e);
u2:
V11_1PORTMAP(clk=>clk,clear=>reset,clk_out=>a);
u3:
seg7_1PORTMAP(a=>e,b=>q,cat=>cat);
ENDa;
3、实验四的VHDL代码
分频器:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysiis
port(clk_in:
instd_logic;
clk_out:
outstd_logic);
end;
architectureaofsiis
signalcnt:
integerrange0to999;
signalclk_tmp:
std_logic;
begin
process(clk_in)
begin
if(clk_in'eventandclk_in='1')then
ifcnt=999then
cnt<=0;clk_tmp<=notclk_tmp;
else
cnt<=cnt+1;
endif;
endif;
endprocess;
clk_out<=clk_tmp;
end;
六个数码管串行扫描电路
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSIIIS
PORT(CLK:
INSTD_LOGIC;
SG:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
BT:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
END;
ARCHITECTUREarcOFSIIIS
componentsi
port(clk_in:
instd_logic;clk_out:
outstd_logic);
endcomponent;
SIGNALCNT6:
INTEGERRANGE0TO6;
SIGNALA:
INTEGERRANGE0TO5;
SIGNALclk_tmp:
STD_LOGIC;
BEGIN
u1:
siportmap(clk_in=>CLK,clk_out=>clk_tmp);
P1:
process(CNT6)
BEGIN
CASECNT6IS--3线至6线译码器
WHEN0=>BT<="011111";A<=0;--A为位码
WHEN1=>BT<="101111";A<=1;
WHEN2=>BT<="110111";A<=2;
WHEN3=>BT<="111011";A<=3;
WHEN4=>BT<="111101";A<=4;
WHEN5=>BT<="111110";A<=5;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSP1;
P2:
process(clk_tmp)
BEGIN
IFclk_tmp'EVENTANDclk_tmp='1'THEN--实现模6计数器
CNT6<=CNT6+1;
ifCNT6=5then
CNT6<=0;
endif;
ENDIF;
ENDPROCESSP2;
P3:
process(A)
BEGIN
CASEAIS--实现数码管的显示功能
WHEN0=>SG<="1111110";WHEN1=>SG<="0110000";
WHEN2=>SG<="1101101";WHEN3=>SG<="1111001";
WHEN4=>SG<="0110011";WHEN5=>SG<="1011011";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSP3;
ENDarc;
循环滚动,始终点亮6个数码管,左出右进
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYsiiiIS
PORT(CLK:
INSTD_LOGIC;
SG:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
BT:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
END;
ARCHITECTUREarcOFsiiiIS
componentsi
port(clk_in:
instd_logic;
clk_out:
outstd_logic);
endcomponent;
SIGNALCNT6:
INTEGERRANGE0TO6;
SIGNALA:
INTEGERRANGE0TO5;
SIGNALCOUNT:
INTEGERRANGE0TO5001:
=0;
SIGNAlFLAG:
INTEGERRANGE0TO7:
=0;
SIGNAlFLAG_A:
INTEGERRANGE0TO5;
SIGNALclk_tmp:
STD_LOGIC;
BEGIN
u1:
siportmap(clk_in=>CLK,clk_out=>clk_tmp);
P1:
process(CNT6)
BEGIN
CASECNT6IS
WHEN0=>BT<="011111";A<=0;--3线至6线译码器
WHEN1=>BT<="101111";A<=1;
WHEN2=>BT<="110111";A<=2;
WHEN3=>BT<="111011";A<=3;
WHEN4=>BT<="111101";A<=4;
WHEN5=>BT<="111110";A<=5;
WHENOTHERS=>NULL;ENDCASE;
ENDPROCESSP1;
P2:
process(clk_tmp)
BEGIN
IFclk_tmp'EVENTANDclk_tmp='1'THEN--实现模6计数器
CNT6<=CNT6+1;
ifCNT6=5then
CNT6<=0;
endif;
IF(FLAG=6)THEN--设置标志
FLAG<=0;
ENDIF;
IFCOUNT=5000THEN--相当于另一个时钟
COUNT<=0;--计数周期为5000
FLAG<=FLAG+1;--当记满5000时左移动一位
ELSE
COUNT<=COUNT+1;--不满5000继续计数
ENDIF;
ENDIF;
ENDPROCESSP2;
P3:
process(A)
BEGIN
FLAG_A<=((A+FLAG)mod6);--使用求余运算实现移位
CASEFLAG_AIS--实现数码管的显示功能
WHEN0=>SG<="1111110";WHEN1=>SG<="0110000";
WHEN2=>SG<="1101101";WHEN3=>SG<="1111001";
WHEN4=>SG<="0110011";WHEN5=>SG<="1011011";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSP3;
endarc;
四、实验一
(2)、实验三(3)和实验四的仿真波形图
实验一
(2)全加器
实验三(3)
实验四
(1)
实验四
(2)
五、仿真波形图分析
实验一的全加器:
其中ain为被加数,bin为加数,相邻低位来的进位数为cin,输出本位和为sum,向相邻高位进位数为cout。
实现二进制加法。
实现的函数关系为sum=ain⊕bin⊕cin
实验三(3):
分频器与异步计数器共用reset复位键,clk为分频器时钟信号,分频器输出信号为计数器提供时钟信号,计数器的输出为数码管译码器输入信号。
即用先用分频器实现了对时钟信号的12分频,分频输出信号占空比为50%,分频器输出作为带异步复位的8421码十进制计数器的时钟信号,计数器的输出作为数码管的输入信号,控制数码管的显示。
实验四
(1):
通过分频器输入产生选通脉冲,控制0至5号LED数码管依次亮灭,同时使用数码显示信号使得数码管显示相应数码。
实现时通过连接引入分频信号,通过数据选择器选择数码管。
计数器信号触发数据选择器,赋值给位码触发数码管显示数码。
最终实现动态扫描显示数字序列。
实验四
(2)代码主体和实验任务1中一致,基本思想也一致。
为实现移位,关键改动为新增一个计数器,技术周期远远大于扫描周期,这样,在一个大的计数周期内,对于要显示的6位数码进行动态扫描(和实验任务1中相同),显示出6种移位状态中的一种;在下一个大的周期内,利用FLAG标志,并使用求余运算将显示位的数码移位,比如,大的计数周期为0时,FLAG为0,显示“012345”六位数码,大的周期为1时,FALG为1,此时各位求余(即FLAG_A求余)对应的数码为123450,显示的数码也就为“123450”。
以此类推,实现循环移位。
六、故障及问题分析
上实验课之前,需要下载安装Quartus软件,由于版本的原因,尝试了好几次才安装并破解成功,其中有一个问题就是习惯性的安装在了中文目录下。
实验一半加器的步骤书上罗列的很详细,一步一步来几乎没有问题,而且上课老师又带领做了一下,就是到了全加器,由于保存的名称不符,导致浪费了很多时间。
实验二由于教材上有相关的例题,所以没有出现大的问题,基本都能自己解决。
实验三由于上课老师要求的与我自己预习时想的不一样,所以在代码的合并上出现一些问题。
最后是参考老师的PPT模板完成VHDL修改。
实验四的
(1)老师的PPT上基本就给出了雏形,只需稍加修改,用软件运行一下就好,
(2)则是参考了网上的资料,但是网上资料的计数模值有问题,需要修改一下。
七、总结和结论
总的来说这学期的数电实验次数虽然不多,但是确实能够学到一些东西。
感觉和前面电路实验很大的一点不同是:
数电实验不需要我们一步一步去搭实验电路,一切都在电路板上完成,相比较电路的结构,我们更需要了解电路的功能,尤其是电路在工作状态下的各项参数。
进行数字电路实验,理论分析是十分重要的一环,只有逻辑分析透彻无误了,才能用语言进行描述,进而用硬件实现。
这次实验让我对VHDL这样一门硬件描述语言有了更加深刻的认识。
语言是描述设计者逻辑思想的,有什么样的逻辑思维就会产生什么样的代码,换句话说,逻辑思维错误将直接导致描述错误,进而不能实现数字逻辑。
应该着重优化逻辑思维,才能写出优秀的硬件代码。
虽然这学期的数电实验与理论课都结束了,但是我知道,数字电路与逻辑这门课将一直伴随着我们的学习、工作。
所以我打算在空余时间努力精习一下VHDL语言。