大二下数电实验报告Word文件下载.docx
《大二下数电实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《大二下数电实验报告Word文件下载.docx(19页珍藏版)》请在冰点文库上搜索。
(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
0001"
0110000"
--1
0010"
1101101"
--2
0011"
1111001"
--3
0100"
0110011"
--4
0101"
1011011"
--5
0110"
1011111"
--6
0111"
1110000"
--7
1000"
1111111"
--8
1001"
1111011"
--9
WHENOTHERS=>
0000000"
ENDCASE;
ENDPROCESS;
END;
2、8421码——余3码
ENTITYPR2_CL2IS
PORT(A:
INSTD_LOGIC_VECTOR(3DOWNTO0);
B:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDPR2_CL2;
ARCHITECTUREbehaveOFPR2_CL2IS
PROCESS(A)
CASEAIS
B<
1010"
1011"
1100"
WHENOTHERS=>
ENDbehave;
3、奇偶校验器
ENTITYPR3_CL2IS
OUTSTD_LOGIC_VECTOR(0downto0)
endPR3_CL2;
ARCHITECTUREPR3_CL2_archOFPR3_CL2IS
0"
1"
1101"
1110"
1111"
实验三用VHDL设计与实现时序逻辑电路
(1)用VHDL语言设计实现一个带异步复位的8421码十进制计数器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号;
(2)用VHDL语言设计实现一个分频系数为12,分频输出信号占空比为50%的分频器,仿真验证其功能;
(3)将
(1)
(2)和数码管译码器三个电路进行连接,并下载到实验板显示计数结果。
1、带异步复位的8421码十进制计数器
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcount10IS
PORT(
clk,clear:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDcount10;
ARCHITECTUREbehaveOFcount10IS
SIGNALq_temp:
STD_LOGIC_VECTOR(3DOWNTO0);
PROCESS(clk,clear)
IFclear='
1'
THEN
q_temp<
="
ELSIF(clk'
eventANDclk='
)THEN
IFq_temp="
ELSEq_temp<
=q_temp+1;
ENDIF;
ENDPROCESS;
q<
=q_temp;
2、分频器
ENTITYdiv_12IS
clk,clear:
clk_out:
OUTSTD_LOGIC);
ENDdiv_12;
ARCHITECTUREbehaveOFdiv_12IS
SIGNALtemp:
INTEGERRANGE0TO5;
SIGNALclktemp:
STD_LOGIC;
PROCESS(clk,clear)
temp<
=0;
ELSIF(clk'
IFtemp=5THEN
clktemp<
=notclktemp;
ELSEtemp<
=temp+1;
clk_out<
=clktemp;
3、将1、2和数码管译码器3个电路进行链接,并下载到实验板显示计数结果
ENTITYlianjie1IS
PORT
(
CLK,CLEAR:
OP:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
CAT:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
ENDlianjie1;
ARCHITECTUREbehaveOFlianjie1IS
COMPONENTdiv_12
endcomponent;
COMPONENTcount10
q:
COMPONENTPR1_CL2
C:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);
SIGNALclktmp:
STD_LOGIC;
SIGNALclktemp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
u1:
div_12
PORTMAP(clk=>
CLK,clear=>
CLEAR,clk_out=>
clktmp);
u2:
count10
clktmp,clear=>
CLEAR,q=>
clktemp);
u3:
PR1_CL2
PORTMAP(a=>
clktemp,b=>
OP,c=>
CAT);
端口说明及连接图:
先分频器加外部时钟输入,然后其输出链接到异步复位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='
)then
ifcount=24then
cat_tmp<
011111"
count<
=count+1;
elsifcount=49then
101111"
elsifcount=74then
110111"
elsifcount=99then
111011"
elsifcount=124then
111101"
elsifcount=149then
111110"
=0;
elsecount<
endif;
endprocess;
process(cat_tmp)
begin
casecat_tmpis
when"
=>
tmp<
whenothers=>
endcase;
cat<
=cat_tmp;
a_out<
=tmp;
分频器代码
entityPR2_CL3IS
generic(n:
integer:
=5);
port(clk,clr:
clkout:
outstd_logic);
endPR2_CL3;
architecturessofPR2_CL3IS
signaltemp:
integerrange0ton;
signalclktemp:
std_logic;
process(clr,clk)
if(clk'
last_value='
0'
andclk'
eventandclk='
)then
if(clr='
temp<
elsif(temp=n)then
=notclktemp;
else
=temp+1;
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分频,经老师指出扫描速度过慢。
经过两次实验学会了根据实际需要设置合适的分频。
四、实验总结
这学期是第一次接触到数电实验,感觉和模电实验有很大的不同,数电实验需要我们操作的是代码和连接图,灵活性非常高,而且误差较小。
相比电路的结构,我们更需要了解电路的功能。
代码也可以不断改进,寻找最优化的代码。
由于本学期实验都比较简单,所以我们忽视了冒险,经常会出现毛刺,但对我们的电路几乎没有影响所以我们没有处理,下学期做综合实验的时候应该考虑冒险带来的危害并寻找相应的措施消除。