数码管扫描显示控制器实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京邮电大学
实验报告
课程名称:数字电路与逻辑设计实验
实验名称:数码管扫描显示控制器设计与实现学院:信息与通信工程学院
班级:
姓名:
学号:
日期:2012年4月22日
一.课题名称:数码管扫描显示控制器设计与实现
二.实验目的
1. 掌握VHDL语言的语法规范,掌握时序电路描述方法
2. 掌握多个数码管动态扫描显示的原理及设计方法
三.实验所用仪器及元器件
1. 计算机
2. 直流稳压电源
3. 数字系统与逻辑设计实验开发板
四.实验任务要求
1. 用VHDL语言设计并实现六个数码管串行扫描电路,要求同时显示0,1,2,3,4,5这六个不同的数字图形到六个数码管上,仿真下载验证其功能,并下载到实验板上测试。
2. 用VHDL语言设计并实现六个数码管滚动显示电路。
(选作)
①循环左滚动,始终点亮6个数码管,左出右进。
状态为:012345-123450-
234501-345012-450123-501234-012345
②向左滚动,用全灭的数码管充右边,直至全部变灭,然后再依次从右边一个
一个地点亮。
状态为:012345-12345X-2345XX-345XXX-45XXXX-5XXXXX -XXXXXX-XXXXX0-XXXX01-XXX012-XX0123-X01234-012345,其中’X’表示数码管不显示。
五.实验设计思路及过程
1.实验原理
为使得输入控制电路简单且易于实现,采用动态扫描的方式实现设计要求。
动态扫描显示需要由两组信号来控制:一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。
多个数码管动态扫描显示,是将所有数码管的相同段并联在一起,通过选通信号分时控制每个数码管的公共端,循环依次点亮多个数码管,利用人眼的视觉暂留现象,只要扫描的频率大于50Hz,将看不到闪烁现象。
扫描显示方式就是
在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。
同时,段线上输出相应位要显示字符的字型码。
这样在同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。
当闪烁显示的发光二级管闪烁频率较高时我们将看到持续点亮的现象。
同理,当多个数码管一次显示,当切换速度足够快时,我们将看到所有的数码管都是同时在显示。
一个数码管要稳定显示要求显示频率大于50Hz,那么6个数码管则
需要50*6=300Hz以上才能看到持续稳定点亮的现象。
2.设计思路
数码管亮灭的控制:设计时序电路,产生数码管的选通控制信号,分别对应6个共阴极数码管的公共端,当cat=‘0’时,其对应的数码管被点亮,因此,
通过控制cat1~cat6,就可以控制6个数码管循环依次点亮。
要求任意时刻,最
多只有一个cat为‘0’,其余为‘1’。
由于扫描信号大于300Hz,人眼将看到数码管持续稳定点亮。
数码管显示字形的控制:定义七维数组num,分别控制数码管的abcdefg七段,高电平亮,低电平灭,故可以实现012345等数字。
异步清零的控制:从外部输入信号clear,高电平时控制数码管正常显示,
低电平时数码管全部熄灭。
3.VHDL代码
实验任务1:串行扫描电路
--shumaguan
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity shumaguan is --定义数码管实体
port (
clear,clkin:in std_logic;
num:out std_logic_vector(6 downto 0); --控制字形的数码管段输入端信号cat:out std_logic_vector(5 downto 0) --选通控制信号
);
end shumaguan;
architecture behave of shumaguan is --数码管行为
signal state:integer range 0 to 6; --定义随机变量描述数码管状态begin
process(clear,clkin)
begin
if clear='0' then state<=0; --清零所有数码管灭灯
elsif(clkin'event and clkin='1') then --上升沿有效
if state=6 then state<=1; --状态在1~6之间循环
else state<=state+1;
end if;
end if;
end process;
process(state) --输出状态,控制哪个数码管亮灯begin
case state is
when 1=> num <="1111110";cat<="011111"; --第一个数码管显示0
when 2=> num <="0110000";cat<="101111"; --第二个数码管显示1
when 3=> num <="1101101";cat<="110111"; --第三个数码管显示2
when 4=> num <="1111001";cat<="111011"; --第四个数码管显示3
when 5=> num <="0110011";cat<="111101"; --第五个数码管显示4
when 6=> num <="1011011";cat<="111110"; --第六个数码管显示5
when others=> num <="0000000";cat<="000000";
end case;
end process;
end behave;
实验任务2-1:循环向左滚动
--shumaguan gundongshixian
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity gundongxianshi1 is --定义实体
port (
clear,clkin:in std_logic;
num:out std_logic_vector(6 downto 0); --控制段输入端
cat:out std_logic_vector(0 to 5) --控制数码管亮灭
);
end gundongxianshi1;
architecture behave of gundongxianshi1 is --定义行为signal state:integer range 0 to 6; --定义随机变量描述数码管状态
signal x:integer range 0 to 5:=0;
signal s:integer range 0 to 11:=0; --循环显示012345012345
signal clkout:std_logic_vector(0 to 5); --输出
begin
process(clear,clkin)
begin
if clear='0' then state<=0; --异步清零
elsif(clkin'event and clkin='1') then --上升沿有效
if state=6 then state<=1; x<=x+1; --数码管1到6循环扫描
else state<=state+1; --状态移动
end if;
if x=6 then x<=0;
end if;
for i in 0 to 5 loop
if state<i+1 then
clkout(i)<='1';
elsif state<i+2 then
clkout(i)<='0';
else clkout(i)<='1';
end if;
end loop;
for i in 0 to 5 loop
cat(i)<=clkout(i); ---将clkout值赋给cat,控制数码管亮灭end loop;
s<=state+x;
case s is--实现数码管的显示功能
when 1 => num <="1111110";
when 2 => num <="0110000";
when 3 => num <="1101101";
when 4 => num <="1111001";
when 5 => num <="0110011";
when 6 => num <="1011011";
when 7 => num <="1111110";
when 8 => num <="0110000";
when 9 => num <="1101101";
when 10 => num <="1111001";
when 11 => num <="0110011";
when others =>num<="0000000";
end case;
end if;
end process;
end behave;
六.仿真波形及分析
实验任务1:
分析:从图中可清楚看见,clear为高电平时,六个数码管串行扫描。
当clear为低电平时,实现异步清零。
数码管选通控制信号cat[i]为0时,对应的数码管被点亮。
num[n]分别对应着数码管的7段输入端,高电平为亮,低电平暗。
如cat 为“011111”且num为“1111110”时,第一个数码管亮且显示‘0’。
下载到实验板上测试就可以看到六个数码管分别显示0-5六个不同的数字.
实验任务2-1:
分析:由图中可见,六个数码管滚动显示功能实现,左出右进。
状态为:012345-123450-234501-345012-450123-501234-012345
七.故障及问题分析
1.仿真波形中出现毛刺,最开始以为是时钟周期设得太小所致,所以增大了时
钟周期,但毛刺仍不消失,后来觉得应该是自己编写的程序中由于写了两个process,存在冒险所致。
2.在分配管脚后下载到实验板上,拨动开关没有数码管没有显示。
原来是自己
分配管脚后没有重新编译VHDL文件。
于是重新编译通过下载后,实验板正确显示数字。
八.总结和结论
本学期数字电路与逻辑设计共进行了四次实验,每次实验我都很认真地预习课本、编写程序,课上认真听讲,课后复习总结。
虽然期间也遇到了一些小问题,但通过自己的努力和老师同学的帮助都解决了这些问题,并得到了很多可贵的经验。
这些经验可以总结如下:
1.关于QUARTUSII软件的使用和VHDL语言的学习。
通过教材和相关软件使用帮助的阅读,我在很短时间内掌握这些有用的软件和编程语言,这些都锻炼了我的自学能力、逻辑思考能力和信息检索能力。
同时,在设计VHDL程序时,要多看书,多思考作者为什么要这么编写程序,争取用最简洁的语言实现所需要的功能。
2.关于实验操作
数电实验实际动手操作的部分不多,大部分实验都是计算机和实验板通过逻辑运算帮我们完成。
但在实验中我对实验板的操作虽然很简单,但我对自己编写的程序实现的功能有了更直观的了解。
3.关于仿真波形输入信号频率的设定
在有次实验中我设置的输入信号频率不对,使输入状态不完整,在验收时老师一眼看出我的错误并且耐心讲解,在此要感谢老师的帮助。
虽然我知道老师在讲课时已经提过这个易错点,但还是自己错一次才有更深的印象。
所以之后的实验我都认真分析输入的频率参数,得到了正确的波形。
总的说来,这学期数字电路与逻辑设计实验课程的学习是成功的,在设计电路的同时也巩固了我理论课上学过的知识,提高了综合运用能力和动手能力。
在实验中,我学会了使用QUARTUS软件的使用,掌握了VHDL语言,熟悉了实验板的操作和测试,也学会了检查和分析电路中出现问题的原因,并且通过自己的思考找到了解决方法。
同时,这次实验也考验了我的耐心和细心程度,我从中受益匪浅。
希望在下学期的数电实验中继续努力,有更长足的进步!。