文档库 最新最全的文档下载
当前位置:文档库 › 数码管扫描显示控制器设计与实现——北京邮电大学数字电路实验报告

数码管扫描显示控制器设计与实现——北京邮电大学数字电路实验报告

数码管扫描显示控制器设计与实现——北京邮电大学数字电路实验报告
数码管扫描显示控制器设计与实现——北京邮电大学数字电路实验报告

北京邮电大学

实验报告

学 院: 信息与通信工程学院

班 级: 2010211123 姓

名: XXX

学 号: XXXXXXXX

期:

2012年4月20日

实验名称: 数码管扫描显示控制器设计与实现

目录

一?实验目的 (3)

二?实验所用仪器及元器件 (3)

三?实验任务要求 (3)

四?实验设计思路及过程 (3)

1.实验原理 (3)

2.设计思路 (4)

3.VHDL代码 (4)

五?仿真波形及分析 (8)

1.仿真波形 (8)

2.波形分析 (9)

六?故障及问题分析 (9)

1.频率设置问题 (9)

2.触发问题 (10)

七?本实验总结与结论 (10)

八?学期总结 (10)

一.实验目的

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

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

.实验所用仪器及元器件

1.计算机

2.直流稳压电源

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

三.实验任务要求

用VHDL语言设计并实现六个数码管串行扫描电路,要求同时显示

0, 1, 2, 3, 4, 5这六个不同的数字图形到六个数码管上,仿真下载验证其功能。

四.实验设计思路及过程

1.实验原理

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

动态扫描显示需要由两组信号来控制:一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。

各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。因此在同一时刻如果各位数码管的位选线都处于选通状态的话,6位数码管将显示

第3页

相同的字符。若要各位数码管能够显示出与本位相应的字符,就必须采用扫描 显示方式,即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的 位选线处于关闭状态。同时,段线上输出相应位要显示字符的字型码。这样在 同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环 下去,就可以使各位数码管显示出将要显示的字符。

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

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

50Hz ,将看不到闪烁现象。6个

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

2. 设计思路

设计时序电路,输入时钟经过一个分频器,产生

2kHz 的扫描信号作为时

钟,驱动计数器工作。选用模值为 6的计数器,通过一个6路的数据分配器, 产生段码,依次控制6个LED 的亮灭,使得某一时刻有且仅有一个 LED 点亮, 同时产生对应的,将点亮的 LED 数码管赋值显示为相应的数码予以显示。由于 扫描频率较高,6位LED 数码管序列将显示持续稳定的 0至5的数码。

3. VHDL 代码

①实现代码

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_ un sig ned.all;

port(clk_in: in std

」ogic;

en tity test1201 is //这是第十二个实验,test1201为文件名

//定义三个端口,一个时钟输入,一个控

cat:out std_logic_vector(5 dow nto 0); // 制哪个数码管工作的cat 控制信号, a_out:out std_logic_vector(6 downto 0));// 个控制数码管上的哪些灯亮

end test1201;

architecture a of test1201 is

sig nal tmp:std」o gic_vector(6 dow nto 0);

sig nal cn t: in teger range 0 to 149999;

sig nal cat_tmp:std_logic_vector(5 dow nto 0); begi n process(clk_i n)

begi n

if(clk_ in' eve nt and clk_i n='1') the n

if cn t=24999 then

cat_tmp<="011111";

cn t<=c nt+1;

elsif cn t=49999 then

cat_tmp<="101111";

cn t<=c nt+1;

elsif cn t=74999 then

cat_tmp<="110111"; cn t<=c nt+1;

elsif cn t=99999 then

cat_tmp<="111011";

cn t<=c nt+1;

elsif cnt=124999 then cat_tmpv="111101"; cn t<=c nt+1;

elsif cn t=149999 then

//定义三个临时信号

//计数值从0到149999

//cat控制信号的临时信号

//上升沿有效

//25000个周期为一个周期,实

//现1KHZ分频的功能。0-249

//99时第一个数码管亮

//25000-49999时第二个数码管亮//以下依此类推

cat_tmp<="111110";

cnt<=0;

else cn t<=c nt+1;

end if;

end if;

case cat_tmp is

whe n"011111"=>tmp<="1111110";

whe n"101111"=>tmp<="0110000";

whe n"110111"=>tmp<="1101101";

whe n"111011"=>tmp<="1111001";

whe n"111101"=>tmp<="0110011";

whe n"111110"=>tmp<="1011011";

when others=>tmpv="0000000";

end case;

end process;

cat<=cat_tmp;

a_out<=tmp;

end a;

//根据cat_tmp来控制哪个数码管工作

//第一个数码管显示0?需要abcdef亮//第二个数码管显示1,bc亮

//以下依此类推

②代码说明

通过分频器输入产生选通脉冲,控制0至5号LED数码管依次亮灭,同时使用数码显示信号使得数码管显示相应数码。实现时通过连接引入分频信号,通过数据选择器选择数码管。计数器信号触发数据选择器,赋值给位码触发数码管显示数码。最终实现动态扫描显示数字序列。

五.仿真波形及分析

1.仿真波形

2.波形分析

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

步,即n号管亮时显示的数码为n。具体来说catO为低电平时第一个数码管应

该显示0,即abcdef为高电平,亮,g为低电平灭;catl为低电平时,第一个

数码管应该显示1,即bc为高电平亮,其余为低电平灭;依此类推。这样每计数

6次循环一次,可知仿真结果正确。当扫描速度很快时,人眼将能看到持续稳定

的0至5号数码显示。在实验室实际测试时,下载到电路板测试成功,完成实验

任务。

六. 故障及问题分析

1.频率设置问题

当频率设置过高时,计数周期将大大增加,每个周期内的扫描次数也增加,但考虑到人眼的分辨能力,频率只需大于300Hz即可,过大将增大系统开销,故采用

1kHz分频器。

2?触发问题

刚开始编写代码时,没有考虑到下载到实验板的问题,没有设置分频电路,而

且cat控制端也没有设置为自动分为六路,而是把它做成了6个输入端。后来想到如果要下载到实验板上时不可能靠手动去扳动开关让其控制数码管的工作与否。于是想到实验板上给出的elk是50M HZ,结合人眼的视觉暂留效应,最后将频率定为1KH;。设置了一个ent信号用来计数,当cnt=24999时,即elk_in有25000个上升沿时,cat0为低电平,其余为高电平;当cnt=49999时,即clk_in有50000个上升沿后,catl为低电平,其余为高电平;依此类推。于是就实现了1个50MHz的信号分成六路1KHz的时钟信号。然后根据每个数码管需要显示的数字来进行赋值。

七. 本实验总结与结论

1.经过逻辑分析,编写VHDL代码,然后调试,进行波形仿真,最后下载到实验板实现, 一系列

工序之后,成功实现了本实验要求。

2?进行数字电路实验,理论分析是十分重要的一环,只有逻辑分析透彻无误了,才能

用语言进行描述,进而用硬件实现。这次实验让我对VHDL这样一门硬件描述语言有

了更加深刻的认识。语言是描述设计者逻辑思想的,有什么样的逻辑思维就会产生什么样的代码,换句话说,逻辑思维错误将直接导致描述错误,进而不能实现数字逻辑。应该着重优化逻辑思维,才能写出优秀的硬件代码。

3?硬件描述语言的学习,不同于一般编程语言的描述,它没有汇编那样深入硬件最底层,但从硬件抽象出来的逻辑却与硬件密不可分。编写硬件描述代码,不仅要符合基本编程语言的规范,更应该时时刻刻联系实现功能的硬件,理解时序和组合的关系,理解同步和异步的差异,理解进程和信号的流程等等,这样才能使写出的代码效率更高。

八. 本课程总结

1.这学期开始了数字电路与逻辑设计课程,从理论课堂学习基本设计理论到实验课动

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

2.数字电路与逻辑设计是一门很有用的学科,就像袁老师说的在当今社会书店课本上

得内容已经远远不能满足现在的需求,应运而生的类似quartus的软件发挥着越来越

重要的作用。在数字电路应用日趋广泛的今天,学习基本数字电路理论和实现方法有十分重要的意义,实验课开始VHDL编程也是很有意义的。理论分析有助于优化和提升逻辑思维能力,动手操作有利于锻炼实践能力。这两方面的训练都是很有益处的。经过一个学期的实验课程的学习我最大的收获就是会初步使用quartus软件进行

VHDL代码的编写并进行波形仿真和下载演示,这虽然是一个简单的入门,但却打下了一个很好的基础,为将来进行更大规模的设计做铺垫。

3.本学期做实验时出现过一些困难,有的在自己独立思考后顺利解决,而有的则通过

询问老师和同学得到解答。还记得遇到的第一个问题就是process的敏感信号列表的

问题。最初编程时没有把所有的输入信号全都写在敏感信号列表中,导致时钟信号变化时输出波形没有变化,后来通过看书得以解决这个问题。还有一个是在做分频器时开始是写了两个进程,第一个进程实现分频功能,第二个进程实现调占空比的功能。但是后来发现这样编写会出现毛刺,原因是两个进程是并行的,其中有一个进程是逻辑电路会出现毛刺。将两个进程合成一个进程后得以解决毛刺问题。

4.最后写一点关于这门课程的建议:一个是延长课时,感觉现在上完了课但是只是一个很初步的入门,我们还有很长的路要走,还有很多的东西需要学习。建议增加这么实验课的课时,让大家能学得更透彻更深入。再一个是能布置一些大一点的作业,这学期完成的实验都是一些很小的实验,代码比较短,逻辑关系比较简单。希望可以有更有难度的大作业,这样对能力有更好的锻炼。

相关文档