基本逻辑设计及调试实验报告.docx
《基本逻辑设计及调试实验报告.docx》由会员分享,可在线阅读,更多相关《基本逻辑设计及调试实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
![基本逻辑设计及调试实验报告.docx](https://file1.bdocx.com/fileroot1/2023-7/11/26e0eaab-7a39-411e-b7cb-a3b25ba387c2/26e0eaab-7a39-411e-b7cb-a3b25ba387c21.gif)
基本逻辑设计及调试实验报告
基本试验报告
实验一:
7段译码器
一,实验目的
1、学习基于VHDL语言设计组合逻辑。
2、学习VHDL语言的编程规范,初步养成良好的编程习惯。
二,设计要求
设计一个7段数码管显示译码器,并用4位拨码开关和数码管验证其功能。
三,完成情况
已完成。
四,设计思路及方案选择。
显示译码器是一种比较常用的组合逻辑模块,可以通过多种方式来实现。
方法一:
采用经典设计方法,用基本门电路设计实现;
方法二:
调用现成的74系列功能模块(如7447)实现;
方法三:
基于VHDL语言设计实现。
在实验中,采用方法三实现。
五,实验原理。
采用拨码开关,设置四个输入端,控制数码管,使其能根据输入的不同而现实显示0~F。
六,实验内容。
硬件连接图
(1)VHDL源程序
libraryIEEE;
useIEEE.Std_logic_1164.all;
useIEEE.Std_logic_arith.all;
useIEEE.Std_logic_unsigned.all;
entityseg7is
port(
SWD:
inStd_logic_vector(3downto0);
seg:
outStd_logic_vector(7downto0));
endseg7;
architectureaofseg7is
begin
process(SWD)
begin
caseSWDis
when"0000"=>seg<="11111100";
when"0001"=>seg<="01100000";
when"0010"=>seg<="11011010";
when"0011"=>seg<="11110010";
when"0100"=>seg<="01100110";
when"0101"=>seg<="10110110";
when"0110"=>seg<="10111110";
when"0111"=>seg<="11100000";
when"1000"=>seg<="11111110";
when"1001"=>seg<="11110110";
when"1010"=>seg<="11101110";
when"1011"=>seg<="00111110";
when"1100"=>seg<="10011100";
when"1101"=>seg<="01111010";
when"1110"=>seg<="10011110";
when"1111"=>seg<="10001110";
whenothers=>seg<="00000000";
endcase;
endprocess;
enda;
(2)编译
对文件seg7.vhd进行编译综合及管脚分配后,执行一次全编译。
(3)仿真
使用QuartusⅡ对其进行仿真。
波形仿真图如下
将仿真正确的程序分配管脚,下载到试验箱中进行硬件仿真,采用键控方式,选用高低电平,连接好数码管,当输入“0001”时,数码管显示‘1’当输入“1111”时,显示‘F’等等显示0~F个数字,都与键控一一对应,控制正确
七,遇到的问题及解决方法
1,数码管的共阴和共阳没有判断正确,导致数码管没有显示正确的数字,在把根据共阳编写的程序修改成共阴的之后,该问题得到解决。
2,在分配管脚时,误认为a为最低位,管脚分配错误。
重新分配后,解决。
3,在进行波形仿真时,保存后却无法编译,在device中选择后问题解决
实验二,8421BCD码加法器
一,实验目的:
1、学习基于VHDL语言设计组合逻辑。
2、学习VHDL语言的编程规范,初步养成良好的编程习惯。
二、设计要求
设计一个BCD码加法器,并设计硬件电路进行验证。
三.完成情况:
已完成。
四,设计思路及方案选择。
8421BCD码加法器与一般二进制加法器的运算规则一样,不同的是,需要对相加以后的结果进行变换,保证相加之后的结果仍然为8421BCD码。
实现可以分两步完成:
首先将两个BCD码按照二进制相加,然后将得到的二进制数转换为8421BCD码。
经过选择决定用VHDL设计实现。
五,实验原理。
8421BCD码从0000~1001所以当相加的和<9时,正常输出,当和>9时,需要加6进行修正。
六,实验内容。
1件连接图
2,VHDL源程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityjiafais
port(a,b:
instd_logic_vector(3downto0);
p:
outstd_logic_vector(4downtown0);
endjiafa;
architecturebehaveofjiafais
signald1,d2,s,t:
std_logic_vector(3downto0);
begin
d1<="0"&a;
d2<="0"&b;
t<=d1+d2;
s<=twhent<10elset+6;
p<=s;
endbehave;
3编译
综合编译无误及引脚分配后,进行全编译。
4仿真
使用QuartusⅡ对其进行仿真。
波形仿真如下:
采用二组拨码开关每组四个,作为加数和被加数,将端口同时连在两个数码管上,是显示的更直观。
和用二个数码管显示,分别是各位和十位。
当控制输入时,能正确的显示结果。
七,遇到的问题及解决方法
1,对when语句运用的不熟练,经过几次修改,达到目标。
2,实验还有不足,如果加数或被加数不是8421bcd码,应该控制其使出为一个统一的值,表示输入错误。
但在试验中没有达到。
实验三:
计数器
一、实验目的
1、学习基于VHDL设计时序逻辑;
2、学习VHDL语言的规范化编程,掌握计数器的描述方法。
二.设计要求
设计一个可逆10进制计数器,用1位拨码开关进行加减控制:
输入为0时进行加计数,当输入为1时进行减计数;用1位拨码开关进行同步清零控制:
输入为0时清零,输入为1
时正常计数。
计数结果用数码管显示。
三.完成情况:
已完成。
四,设计思路及方案选择。
计数器是一类比较典型的时序逻辑模块,基于VHDL语言设计灵活方便,利用进程语句和条件语句,可以描述任意进制的计数器。
五,实验原理。
根据要求,要设置一个复位端,设置一个加减控制,是计数器能够复位和加减。
可用IF的嵌套的实现。
六.实验内容
1,硬件连接图
2,VHDL源程序。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity counteris
port(clk,clr,en:
in std_logic;
Q:
out std_logic_vector(3 downto 0));
end counter;
architecture behave ofcounteris
singala:
std_logic_vector(3 downto 0);
begin
Q<=a;
process(clk,clr,en)
begin
if(clr='1')then
a<="0000";
elsif(clk' event and clk='1')then
if(en='0')then
if(a="1001")then
a<="0000";
else a<=a+1;
end if;
else
if(a="0000")then
a<="1001";
else a<=a-1;
end if;
end if;
end if;
end process;
end behave;
连接好时钟,输出端连数码管,选择好时钟的周期,可实现清零,加技术和减计数,达到要求
七,遇到的问题及解决方法
1,最开始硬件仿真时不知道时钟该如何连接。
后解决
2,Endif的个数没有弄清导致编译一直无法通过。
后解决
实验四:
按键去抖动
一、实验目的
1、学习基于VHDL描述状态机的方法;
2、学习VHDL语言的规范化编程,学习按键去抖动的原理方法。
二设计要求
机械式轻触按键是常用的一种外围器件,由于机械原因导致的抖动会使得按键输入出现毛刺。
设计一个按键去抖动电路,并用按键作为时钟,结合计数器观察去抖动前后的效果有什么不同
三.完成情况:
已完成。
四,设计思路及方案选择。
按键去抖动通常采用延时判断的方法,去除按键过程中出现的毛刺。
其实现过程是:
当查询到按键按下时,延时一段时间再去判断按键是否仍然被按下,若是则此次按键有效,否则看作是干扰。
这可以利用状态机来实现,
采用VHDL编程实现
五,实验原理。
用状态机或计数器延时,当高电平持续一个比较长的时间后,进行判断,若仍为高电平,则认为其有效,计数器加1。
否则不计数。
六.实验内容
1,硬件连接图
2.软件设计
(1)输入设计文件
按照设计提示设计并输入VHDL源程序。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityqdis
port(clk:
instd_logic;
sd:
instd_logic;
z:
outstd_logic_vector(3downto0));
endqd;
architecturebehaveofqdis
typestateis(s0,s1,s2,s3);
signals:
state;
signalq:
std_logic_vector(3downto0);
signalp:
std_logic;
begin
process(clk)
begin
if(clk'eventandclk='1')then
casesis
whens0=>if(sd='1')thens<=s1;
elses<=s0;
endif;
whens1=>if(sd='0')thens<=s0;
elses<=s2;
endif;
whens2=>if(sd='0')thens<=s0;
elses<=s3;
endif;
whens3=>if(sd='0')thens<=s0;
elses<=s3;
endif;
endcase;
endif;
if(clk'eventandclk='1')then
if(s=s3)then
if(p='0')then
q<=q+1;p<='1';
endif;
elsep<='0';
endif;
endif;
z<=q;
endprocess;
endbehave;
(2)编译
综合编译无误及引脚分配后,进行全编译。
(3)仿真
使用QuartusⅡ对其进行仿真。
波形图如下:
当高电平没达到三个周期时,不计数,超过,则开始计数,且只加1
七,遇到的问题及解决方法
1,开始程序延时去抖动成功,但是按键不恢复,就会一直进行计数,把whens3=>if(sd='0')thens<=s0;
elses<=s1;
改为:
whens3=>if(sd='0')thens<=s0;
elses<=s3;
后问题解决。
无论按的时间多长,都会只加1
2,按键开光应选择高电平触发方式,而非高低电平。
实验五:
抢答器
一、实验目的
1、学习基于VHDL设计时序逻辑;
2、学习VHDL语言的规范化编程,学习抢答器的设计方法。
二,设计要求
设计一个4路抢答器,当按下抢答键开始抢答,设置4个按键作为4路抢答开关,4个LED作为抢答显示,一旦抢答成功,蜂鸣器发声,与抢答开关对应的LED亮。
三.完成情况:
已完成。
四、设计方案
抢答器具有存储功能,属于时序电路范畴。
该设计可以利用触发器来完成设计。
用触发器
的清零端作为抢答控制,触发器输出做反馈来禁止抢答。
五,实验原理。
当有人抢答成功后,阻止其他人抢答,按键无效,除非重新进行复位
六.实验内容
1,硬件连接图
(1)输入设计文件
按照设计提示设计并输入VHDL源程序。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityqdqis
port(clk,clk1:
instd_logic;
clr:
instd_logic;
s0,s1,s2,s3:
instd_logic;
state:
outstd_logic_vector(3downto0);
led:
outstd_logic_vector(3downto0);
beep:
outstd_logic);
endqdq;
architecturebehaveofqdqis
signala:
std_logic_vector(3downto0);
begin
process(clk,clr,s0,s1,s2,s3)
begin
ifclr='1'thena<="0000";led<="0000";
elsif(clk'eventandclk='1')then
if(s3='1')andnot(a(0)='1'ora
(1)='1'ora
(2)='1')then
a(3)<='1';
elsif(s2='1')andnot(a(0)='1'ora
(1)='1'ora(3)='1')then
a
(2)<='1';
elsif(s1='1')andnot(a(0)='1'ora
(2)='1'ora(3)='1')then
a
(1)<='1';
elsif(s0='1')andnot(a
(1)='1'ora
(2)='1'ora(3)='1')then
a(0)<='1';
elseb<='0';
endif;
endif;
caseais
when"0001"=>state<="0001";led(0)<='1';
when"0010"=>state<="0010";led
(1)<='1';
when"0100"=>state<="0011";led
(2)<='1';
when"1000"=>state<="0100";led(3)<='1';
whenothers=>state<="0000";
endcase;
endprocess;
beep<=clk1whennot(a=”0000”)else'0';
endbehave;
3编译
综合编译无误及引脚分配后,进行全编译。
4仿真
使用QuartusⅡ对其进行仿真。
波形仿真如下:
输入开关设为高电平有效,当有人抢答后对应的LED灯亮数码管显示第几个人抢答成功。
蜂鸣器响,直至被清零。
七,遇到的问题及解决方法
1,开始当按键不按,蜂鸣器就不响了将语句改为:
beep<=clk1whennot(a=”0000”)else'0';解决
2开关开始设为高低电平,导致复位后,复位前置1的开关不能为0
3,开始按键不按,LED灯就随即熄灭,修改语句的顺序解决