大二下数电实验报告.docx
《大二下数电实验报告.docx》由会员分享,可在线阅读,更多相关《大二下数电实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
大二下数电实验报告
数字电路与逻辑设计实验
实
验
报
告
班级:
___________
学号:
___________
姓名:
______________
日期:
___2015/5/30_________
一、实验目的
(1)熟悉QuartusII原理图输入法进行电路设计和仿真
(2)掌握QuartusII图形模块单元的生成与调用
(3)熟悉实验板的使用
(4)熟悉用VHDL语言设计组合逻辑电路的方法
(5)熟悉用QuartusII文本输入法进行电路设计
(6)熟悉不同的编码及其之间的转换
(7)熟悉用VHDL语言设计时序逻辑电路的方法
(8)熟悉计数器、分频器的设计方法
(9)掌握多个数码管动态扫描显示的原理及设计方法
二、实验器材
(1)计算机
(2)直流稳压电源
(3)数字系统与逻辑设计实验开发板
三、实验名称与要求
实验一QuartusII原理图输入法设计与实现
任务要求:
(1)用逻辑门设计一个半加器,仿真验证其功能,并生成新的半加器图形模块单元;
(2)实验内容
(1)中生成的半加器模块和逻辑门设计一个全加器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号;
(3)用74LS138译码器逻辑门设计实现函数
,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。
实验内容
1、半加器
连接图:
2、全加器
连接图:
仿真图:
仿真分析:
实验用生成的半加器模块单元设计一个全加器,有三个输入,ai,bi,ci-1分别为两加数以及上一级的进位输出。
有两个输出:
si为加数之和,ci为进位输出,实现了一位全加器功能。
3、3线-8线译码器74LS138和逻辑门设计实现函数F
连接图:
仿真图:
实验二用VHDL设计与实现组合逻辑电路
任务要求:
(1)用VHDL语言设计实现一个共阴极7段数码管译码器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,7段数码管显示输出信号;
(2)用VHDL语言设计实现一个8421码转换为余3码的代码转换器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号;
(3)用VHDL语言设计实现一个4位二进制奇校验器,输入奇数个“1”时输出为“1”,否则输出为“0”,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。
实验内容
1、数码管译码器
代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYPR1_CL2IS
PORT(
a:
INSTD_LOGIC_VECTOR(3downto0);
b:
OUTSTD_LOGIC_VECTOR(6downto0)
);
endPR1_CL2;
ARCHITECTUREPR1_CL2_archOFPR1_CL2IS
BEGIN
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;
仿真图:
2、8421码——余3码
代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYPR2_CL2IS
PORT(A:
INSTD_LOGIC_VECTOR(3DOWNTO0);
B:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDPR2_CL2;
ARCHITECTUREbehaveOFPR2_CL2IS
BEGIN
PROCESS(A)
BEGIN
CASEAIS
WHEN"0000"=>B<="0011";
WHEN"0001"=>B<="0100";
WHEN"0010"=>B<="0101";
WHEN"0011"=>B<="0110";
WHEN"0100"=>b<="0111";
WHEN"0101"=>b<="1000";
WHEN"0110"=>b<="1001";
WHEN"0111"=>b<="1010";
WHEN"1000"=>b<="1011";
WHEN"1001"=>b<="1100";
WHENOTHERS=>B<="0000";
ENDCASE;
ENDPROCESS;
ENDbehave;
仿真图:
3、奇偶校验器
代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYPR3_CL2IS
PORT(
a:
INSTD_LOGIC_VECTOR(3downto0);
b:
OUTSTD_LOGIC_VECTOR(0downto0)
);
endPR3_CL2;
ARCHITECTUREPR3_CL2_archOFPR3_CL2IS
BEGIN
PROCESS(a)
BEGIN
CASEaIS
WHEN"0000"=>b<="0";
WHEN"0001"=>b<="1";
WHEN"0010"=>b<="1";
WHEN"0011"=>b<="0";
WHEN"0100"=>b<="1";
WHEN"0101"=>b<="0";
WHEN"0110"=>b<="0";
WHEN"0111"=>b<="1";
WHEN"1000"=>b<="1";
WHEN"1001"=>b<="0";
WHEN"1010"=>b<="0";
WHEN"1011"=>b<="1";
WHEN"1100"=>b<="0";
WHEN"1101"=>b<="1";
WHEN"1110"=>b<="1";
WHEN"1111"=>b<="0";
ENDCASE;
ENDPROCESS;
END;
仿真图:
实验三用VHDL设计与实现时序逻辑电路
任务要求:
(1)用VHDL语言设计实现一个带异步复位的8421码十进制计数器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号;
(2)用VHDL语言设计实现一个分频系数为12,分频输出信号占空比为50%的分频器,仿真验证其功能;
(3)将
(1)
(2)和数码管译码器三个电路进行连接,并下载到实验板显示计数结果。
实验内容
1、带异步复位的8421码十进制计数器
代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcount10IS
PORT(
clk,clear:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDcount10;
ARCHITECTUREbehaveOFcount10IS
SIGNALq_temp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(clk,clear)
BEGIN
IFclear='1'THEN
q_temp<="0000";
ELSIF(clk'eventANDclk='1')THEN
IFq_temp="1001"THEN
q_temp<="0000";
ELSEq_temp<=q_temp+1;
ENDIF;
ENDIF;
ENDPROCESS;
q<=q_temp;
ENDbehave;
仿真图:
2、分频器
代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdiv_12IS
PORT(
clk,clear:
INSTD_LOGIC;
clk_out:
OUTSTD_LOGIC);
ENDdiv_12;
ARCHITECTUREbehaveOFdiv_12IS
SIGNALtemp:
INTEGERRANGE0TO5;
SIGNALclktemp:
STD_LOGIC;
BEGIN
PROCESS(clk,clear)
BEGIN
IFclear='1'THEN
temp<=0;
ELSIF(clk'eventANDclk='1')THEN
IFtemp=5THEN
temp<=0;clktemp<=notclktemp;
ELSEtemp<=temp+1;
ENDIF;
ENDIF;
ENDPROCESS;
clk_out<=clktemp;
ENDbehave;
仿真图:
3、将1、2和数码管译码器3个电路进行链接,并下载到实验板显示计数结果
代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYlianjie1IS
PORT
(
CLK,CLEAR:
INSTD_LOGIC;
OP:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
CAT:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
ENDlianjie1;
ARCHITECTUREbehaveOFlianjie1IS
COMPONENTdiv_12
PORT(
clk,clear:
INSTD_LOGIC;
clk_out:
OUTSTD_LOGIC);
endcomponent;
COMPONENTcount10
PORT(
clk,clear:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
endcomponent;
COMPONENTPR1_CL2
PORT(
a:
INSTD_LOGIC_VECTOR(3downto0);
C:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);
b:
OUTSTD_LOGIC_VECTOR(6downto0)
);
endcomponent;
SIGNALclktmp:
STD_LOGIC;
SIGNALclktemp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
u1:
div_12
PORTMAP(clk=>CLK,clear=>CLEAR,clk_out=>clktmp);
u2:
count10
PORTMAP(clk=>clktmp,clear=>CLEAR,q=>clktemp);
u3:
PR1_CL2
PORTMAP(a=>clktemp,b=>OP,c=>CAT);
ENDbehave;
端口说明及连接图:
先分频器加外部时钟输入,然后其输出链接到异步复位10进制计数器作为时钟输入,再链接到数码管译码器的输入端,最后通过数码管译码器输出显示。
12分频器和异步复位10进制计数器的clear端高电平有效。
仿真图:
仿真分析:
每输入12个脉冲时计数器便计数一次,计数器为0-9循环计数,再根据0-9数字对应的数码管abcdefg字段输出b[6]…b[0],0对应的是1111110,1对应的是0110000,2对应的是1101101,3对应的是1111001,4对应的是0110011,5对应的是1011011,6对应的是1011111,7对应的是1110000,8对应的是1111111,9对应的是1111011.c[5]…c[0]对应6个数码管,由于过程中只需一个数码管显示且为共阴极,故设置c[5]为0,其余均为1.clear为异步复位信号,当clear为1时,计数器便回到0,重新开始计数,此时数码管也输出相应的“1111110”.
实验四用VHDL设计与实现相关电路
任务要求:
(1)用VHDL语言设计并实现六个数码管滚动显示电路
I、循环左滚动,始终点亮6个数码管,左出右进。
状态为:
012345—123450—234501—345012—450123—501234—012345—……
代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityPR2_CL4is
port(clear,clk_in:
instd_logic;
cat:
outstd_logic_vector(5downto0);
a_out:
outstd_logic_vector(6downto0));
end;
architecturearchofPR2_CL4is
signaltmp:
std_logic_vector(6downto0);
signalcount:
integerrange0to149;
signalcat_tmp:
std_logic_vector(5downto0);
begin
process(clk_in,clear)
begin
IF(clear=’1’)THENcat_tmp<=”111111”;
elsif(clk_in'eventandclk_in='1')then
ifcount=24then
cat_tmp<="011111";
count<=count+1;
elsifcount=49then
cat_tmp<="101111";
count<=count+1;
elsifcount=74then
cat_tmp<="110111";
count<=count+1;
elsifcount=99then
cat_tmp<="111011";
count<=count+1;
elsifcount=124then
cat_tmp<="111101";
count<=count+1;
elsifcount=149then
cat_tmp<="111110";
count<=0;
elsecount<=count+1;
endif;
endif;
endprocess;
process(cat_tmp)
begin
casecat_tmpis
when"011111"=>tmp<="1111110";
when"101111"=>tmp<="0110000";
when"110111"=>tmp<="1101101";
when"111011"=>tmp<="1111001";
when"111101"=>tmp<="0110011";
when"111110"=>tmp<="1011011";
whenothers=>tmp<="0000000";
endcase;
endprocess;
cat<=cat_tmp;
a_out<=tmp;
END;
分频器代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityPR2_CL3IS
generic(n:
integer:
=5);
port(clk,clr:
instd_logic;clkout:
outstd_logic);
endPR2_CL3;
architecturessofPR2_CL3IS
signaltemp:
integerrange0ton;
signalclktemp:
std_logic;
begin
process(clr,clk)
begin
if(clk'last_value='0'andclk'eventandclk='1')then
if(clr='1')then
temp<=0;
elsif(temp=n)then
temp<=0;clktemp<=notclktemp;
else
temp<=temp+1;
endif;
endif;
endprocess;
clkout<=clktemp;
endss;
端口连接图
先分频器加外部时钟输入,然后其输出链接到数码管译码器作为时钟输入,最后通过数码管译码器输出显示。
中间设置显示的数码管cat[5]…cat[0],控制器循环显示,再设置每个数码管显示数字a_out[6]…a_out[0],最终完成输出。
分频器的clear端高电平有效。
仿真结果:
仿真分析:
仿真时设置的是240分频,每输入240*6个脉冲,cat便在“011111”,“101111”,“110111”,“111011”,“111101”,“1111101”间循环一次,与此对应每个数码管输出也在123450,234501,345012,450123,501234,012345之间不断循环。
当clear为1是,cat输出为“111111”,a_out输出为“0000000”,对应实验板上便是数码管无任何输出。
三、故障分析
前两次实验都非常基础,书上也有详细的操作步骤,因此很容易完成。
第三次以及第四次实验需要设置复位信号clear,开始时按照之前设置其为周期16us的脉冲,发现扰乱实验,后学习了利用设置其占空比来有效处理这个信号。
实验三中先按照实验要求设置的12分频,下载到板子上测试时发现正常只显示8,后来了解到实验板是50M分频,在此处做了修改;而实验四中再次利用了50M分频,经老师指出扫描速度过慢。
经过两次实验学会了根据实际需要设置合适的分频。
四、实验总结
这学期是第一次接触到数电实验,感觉和模电实验有很大的不同,数电实验需要我们操作的是代码和连接图,灵活性非常高,而且误差较小。
相比电路的结构,我们更需要了解电路的功能。
代码也可以不断改进,寻找最优化的代码。
由于本学期实验都比较简单,所以我们忽视了冒险,经常会出现毛刺,但对我们的电路几乎没有影响所以我们没有处理,下学期做综合实验的时候应该考虑冒险带来的危害并寻找相应的措施消除。