基本逻辑设计及调试实验报告.docx

上传人:b****5 文档编号:28397454 上传时间:2023-07-13 格式:DOCX 页数:16 大小:444.34KB
下载 相关 举报
基本逻辑设计及调试实验报告.docx_第1页
第1页 / 共16页
基本逻辑设计及调试实验报告.docx_第2页
第2页 / 共16页
基本逻辑设计及调试实验报告.docx_第3页
第3页 / 共16页
基本逻辑设计及调试实验报告.docx_第4页
第4页 / 共16页
基本逻辑设计及调试实验报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

基本逻辑设计及调试实验报告.docx

《基本逻辑设计及调试实验报告.docx》由会员分享,可在线阅读,更多相关《基本逻辑设计及调试实验报告.docx(16页珍藏版)》请在冰豆网上搜索。

基本逻辑设计及调试实验报告.docx

基本逻辑设计及调试实验报告

基本试验报告

 

实验一:

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灯就随即熄灭,修改语句的顺序解决

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1