VHDL数码管动态扫描.docx

上传人:b****1 文档编号:15231927 上传时间:2023-07-02 格式:DOCX 页数:14 大小:311.53KB
下载 相关 举报
VHDL数码管动态扫描.docx_第1页
第1页 / 共14页
VHDL数码管动态扫描.docx_第2页
第2页 / 共14页
VHDL数码管动态扫描.docx_第3页
第3页 / 共14页
VHDL数码管动态扫描.docx_第4页
第4页 / 共14页
VHDL数码管动态扫描.docx_第5页
第5页 / 共14页
VHDL数码管动态扫描.docx_第6页
第6页 / 共14页
VHDL数码管动态扫描.docx_第7页
第7页 / 共14页
VHDL数码管动态扫描.docx_第8页
第8页 / 共14页
VHDL数码管动态扫描.docx_第9页
第9页 / 共14页
VHDL数码管动态扫描.docx_第10页
第10页 / 共14页
VHDL数码管动态扫描.docx_第11页
第11页 / 共14页
VHDL数码管动态扫描.docx_第12页
第12页 / 共14页
VHDL数码管动态扫描.docx_第13页
第13页 / 共14页
VHDL数码管动态扫描.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

VHDL数码管动态扫描.docx

《VHDL数码管动态扫描.docx》由会员分享,可在线阅读,更多相关《VHDL数码管动态扫描.docx(14页珍藏版)》请在冰点文库上搜索。

VHDL数码管动态扫描.docx

VHDL数码管动态扫描

北京邮电大学

数电实验报告

 

实验名称:

数码管扫描显示控制器设计与实现

 

学院:

信息与通信工程

姓名:

班级:

学号:

班内序号:

一.实验目的

1.掌握VHDL语言的语法规范,掌握时序电路描述方法;

2.掌握多个数码管动态扫描显示的原理和设计方法.

二.实验所用仪器及元器件

1.计算机

2.直流稳压电源

3.数字系统与逻辑设计实验开发板

三.实验任务及要求

1.用VHDL语言设计并实现六个数码管串行扫描电路,要求同时显示0,1,2,3,4,5这六个不同的数字图形到六个数码管上,仿真下载验证其功能。

2.用VHDL语言设计并实现六个数码管滚动显示电路。

(选作)

(1)循环滚动,始终点亮6个数码管,左出右进。

状态为:

012345-123450-234501-345012-450123-501234-012345

四.实验设计思路及过程

1.实验原理

为使得输入控制电路简单且易于实现,采用动态扫描的方式实现设计要求。

动态扫描显示需要由两组信号来控制:

一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。

各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。

因此在同一时刻如果各位数码管的位选线都处于选通状态的话,6位数码管将显示相同的字符。

若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式,即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。

同时,段线上输出相应位要显示字符的字型码。

这样在同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。

虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但由于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼的视觉印象就会是连续稳定地显示。

总之,多个数码管动态扫描显示,是将所有数码管的相同段并联在一起,通过选通信号分时控制各个数码管的公共端,循环一次点亮多个数码管,并利用人眼的视觉暂留现象,只要扫描的频率大于50Hz,将看不到闪烁现象。

6个数码管则需要50*6=300Hz以上才能看到持续稳定点亮的现象。

2.设计思路

设计时序电路,实验板上产生的时钟信号的频率为50MHz,频率过高,需要经过分频后才能满足电路的时延要求,所以需要经过一个分频器系数为2k的分频器,产生25kHz的扫描信号作为时钟,驱动计数器工作。

选用模值为6的计数器,通过一个3线至6线译码器,产生段码,依次控制6个LED的亮灭,使得某一时刻有且仅有一个LED点亮,同时产生对应的位段,将点亮的LED数码管赋值显示为相应的数码予以显示。

由于扫描频率较高,6位LED数码管序列将显示持续稳定的0至5的数码。

3.VHDL代码

实验任务1:

实现代码:

(1)分频系数为2k的分频器:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

useieee.std_logic_unsigned.all;

entitydiv_2Kis

port(clk_in:

instd_logic;

clk_out:

outstd_logic);

enddiv_2K;

architectureaofdiv_2Kis

signaltemp:

integerrange0to1999;

begin

p1:

process(clk_in)

begin

ifclk_in'eventandclk_in='1'then

iftemp=1999then

temp<=0;

elsetemp<=temp+1;

endif;

endif;

endprocessp1;

p2:

process(temp)

begin

iftemp=1999then

clk_out<='1';

else

clk_out<='0';

endif;

endprocessp2;

enda;

(2)动态扫描同时显示:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYLEDIS

PORT(CLK:

INSTD_LOGIC;

SG:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);--段码

BT:

OUTSTD_LOGIC_VECTOR(5DOWNTO0));--位码

END;

ARCHITECTUREarcOFLEDIS

componentdiv_2K

port(clk_in:

instd_logic;

clk_out:

outstd_logic);

endcomponent;

SIGNALCNT6:

INTEGERRANGE0TO5;

SIGNALA:

INTEGERRANGE0TO5;

SIGNALclk_tmp:

STD_LOGIC;

BEGIN

u1:

div_2kportmap(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计数器

ifCNT6=5then

CNT6<=0;

else

CNT6<=CNT6+1;

endif;

ENDIF;

ENDPROCESSP2;

P3:

process(A)

BEGIN

CASEAIS--实现数码管的显示功能

WHEN0=>SG<="1111110";

WHEN1=>SG<="0110000";

WHEN2=>SG<="1101101";

WHEN3=>SG<="1111001";

WHEN4=>SG<="0110011";

WHENOTHERS=>SG<="1011011";

ENDCASE;

ENDPROCESSP3;

ENDarc;

(3)代码分析

通过分频器输入产生选通脉冲,利用计数器的状态来控制译码器A的状态。

实现时通过连接引入分频信号,通过数据选择器A选择数码管。

计数器信号触发数据选择器,选择需要显示的位码和段码,由于有足够高的扫描频率,故最终实现动态扫描显示数字序列。

实验任务二

(1)

实现代码:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL

ENTITYLED2IS

PORT(CLK:

INSTD_LOGIC;

SG:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);

BT:

OUTSTD_LOGIC_VECTOR(5DOWNTO0));

ENDLED2;

ARCHITECTUREACEOFLED2IS

componentdiv_2K

port(clk_in:

instd_logic;

clk_out:

outstd_logic);

endcomponent;

SIGNALCNT6:

INTEGERRANGE0TO5;

SIGNALA:

INTEGERRANGE0TO5;

SIGNALCOUNT:

INTEGERRANGE0TO4999:

=0;

SIGNAlFLAG:

INTEGERRANGE0TO6:

=0;

SIGNAlFLAG_A:

INTEGERRANGE0TO5;

SIGNALclk_tmp:

STD_LOGIC;

BEGIN

u1:

div_2kportmap(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计数器

ifCNT6=5then

CNT6<=0;

else

CNT6<=CNT6+1;

endif;

IF(FLAG=6)THEN--设置标志

FLAG<=0;

ENDIF;

IFCOUNT=4999THEN--相当于另一个时钟

COUNT<=0;--计数周期为5000

FLAG<=FLAG+1;--当记满5000时左移动一位

ELSE

COUNT<=COUNT+1;--不满5000继续计数

ENDIF;

ENDIF;

ENDPROCESSP2;

P3:

process(A,FLAG,FLAG_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;

ENDACE;

代码分析:

代码主体和实验任务1中一致,基本思想也一致。

为实现移位,关键改动为新增一个计数器,技术周期远远大于扫描周期,这样,在一个大的计数周期内,对于要显示的6位数码进行动态扫描(和实验任务1中相同),显示出6种移位状态中的一种;在下一个大的周期内,利用FLAG标志,并使用求余运算将显示位的数码移位,比如,大的计数周期为0时,FLAG为0,显示“012345”六位数码,大的周期为1时,FALG为1,此时各位求余(即FLAG_A求余)对应的数码为123450,显示的数码也就为“123450”。

以此类推,实现循环移位。

五.仿真波形及分析

实验任务一:

实验任务二

(1):

波形分析:

实验任务一:

由波形可见,随着时钟脉冲的不断增加,模为六计数的计数器不断重复,0至5号LED数码管依次打开,其余管熄灭,同时,数码管显示数字从0至5依次出现,两者保持同步,即n号管亮时显示的数码为n。

这样每计数6次循环依次,可知仿真结果正确。

当扫描速度很快时,人眼将能看到持续稳定的0至5号数码显示。

在实验室实际测试时,下载到电路板测试成功,完成实验任务。

实验任务二

(1):

为了使仿真结果便于观察和打印,这里修改了COUNT值为20,也即在一个大的计数周期内,只扫描四遍(实际实现时需要动态扫描多次,如同实验任务1,产生稳定显示,只需把COUNT值加大即可)。

由波形可见,随着大计数周期的增加,依次产生012345-123450-234501-345012-450123-501234-012345……(游标线每次所指的地方就是发生移位的开始周期),这样便实现了循环移位。

实验室实测时,加大COUNT值为5000,观察到稳定持续的周期循环移位的数码显示,完成实验任务。

六.故障及问题分析

1.刚开始着手做的时候,没有思路,后来沿着利用人眼的视觉暂留效应,结合书上的分析,才找到要利用分时显示的原理,在这过程中学会了思考问题解决问题的方法。

2.在做仿真波形的时候由于刚开始把分频模块也加进去了,所以仿真波形很难设置,这样也很难观察出仿真结果的正确性,后来经过老师的指导和自己的摸索,原来只需将程序中的分频模块注释掉,将计数周期减小一点即可。

3.没到实验室之前总是不太懂那个时钟信号是怎么加进去的,后来经过与同学讨论才明白实验板上已经有了时钟信号,我们下载的时候只需锁定引脚即可。

4.在做实验任务二时,第一次下载后现实的时候,有闪烁的现象,后来把大的计数器周期改的大一些,就消除了闪烁的现象。

七.实验总结

1.进行数字电路实验,理论分析是十分重要的一环,只有逻辑分析透彻无误了,才能用语言进行描述,进而用硬件实现。

这次实验让我对VHDL这样一门硬件描述语言有了更加深刻的认识。

语言是描述设计者逻辑思想的,有什么样的逻辑思维就会产生什么样的代码,换句话说,逻辑思维错误将直接导致描述错误,进而不能实现数字逻辑。

应该着重优化逻辑思维,才能写出优秀的硬件代码。

2.硬件描述语言的学习,不同于一般编程语言的描述,它没有汇编那样深入硬件最底层,但从硬件抽象出来的逻辑却与硬件密不可分。

编写硬件描述代码,不仅要符合基本编程语言的规范,更应该时时刻刻联系实现功能的硬件,理解时序和组合的关系,理解同步和异步的差异,理解进程和信号的流程等等,这样才能使写出的代码效率更高。

3.这学期开始了数字电路与逻辑设计课程,从理论课堂学习基本设计理论到实验课动测试数字电路参数、编写VHDL代码实现逻辑功能,我对数字电路设计与实现的基本思想方法有了初步的了解,为以后进一步的学习和应用到通信等系统打下了扎实的基础。

八.参考文献

[1]数字电路与逻辑设计实验教程,北京:

北京邮电大学电路中心,2011

[2]刘培植等.数字电路与逻辑设计,北京:

北京邮电大学出版社,2009

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2