数码管扫描显示控制器的设计与实现.docx
- 文档编号:24066109
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:13
- 大小:170.80KB
数码管扫描显示控制器的设计与实现.docx
《数码管扫描显示控制器的设计与实现.docx》由会员分享,可在线阅读,更多相关《数码管扫描显示控制器的设计与实现.docx(13页珍藏版)》请在冰豆网上搜索。
数码管扫描显示控制器的设计与实现
数码管扫描显示控制器的设计与实现
班级:
2011211120
学号:
2011210582
姓名:
刘谋亚
班内序号:
14
一.实验目的
1.掌握VHDL语言的语法规范,掌握时序电路描述方法
2.掌握多个数码管动态扫描显示的原理及设计方法
二.实验所用仪器及元器件
1.计算机
2.直流稳压电源
3.数字系统与逻辑设计实验开发板
三.实验任务要求
1.用VHDL语言设计并实现六个数码管串行扫描电路,要求同时显示0,1,2,3,4,5这六个不同的数字图形到六个数码管上,仿真下载验证其功能。
2.用VHDL语言设计并实现六个数码管滚动显示电路。
(选作)
I.循环滚动,始终点亮6个数码管,左出右进。
状态为:
012345-123450-234501-345012-450123-501234-012345
II.向左滚动,用全灭的数码管充右边,直至全部变灭,然后再依次从右边一个一个地点亮。
状态为:
012345-12345X-2345XX-345XXX-45XXXX-5XXXXX-XXXXXX-XXXXX0-XXXX01-XXX012-XX0123-X01234-012345,其中’X’表示数码管不显示。
四.实验设计思路及过程
1.实验原理
为使得输入控制电路简单且易于实现,采用动态扫描的方式实现设计要求。
动态扫描显示需要由两组信号来控制:
一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。
各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。
因此在同一时刻如果各位数码管的位选线都处于选通状态的话,6位数码管将显示相同的字符。
若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式,即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。
同时,段线上输出相应位要显示字符的字型码。
这样在同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。
虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但由于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼的视觉印象就会是连续稳定地显示。
总之,多个数码管动态扫描显示,是将所有数码管的相同段并联在一起,通过选通信号分时控制各个数码管的公共端,循环一次点亮多个数码管,并利用人眼的视觉暂留现象,只要扫描的频率大于50Hz,将看不到闪烁现象。
6个数码管则需要50*6=300Hz以上才能看到持续稳定点亮的现象。
2.设计思路
设计时序电路,输入时钟经过一个分频器,产生2kHz的扫描信号作为时钟,驱动计数器工作。
选用模值为6的计数器,通过一个3线至6线译码器,产生段码,依次控制6个LED的亮灭,使得某一时刻有且仅有一个LED点亮,同时产生对应的,将点亮的LED数码管赋值显示为相应的数码予以显示。
由于扫描频率较高,6位LED数码管序列将显示持续稳定的0至5的数码。
3.VHDL代码
A.实验任务1
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYsmgIS
PORT(clk,clear:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
countout:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
ENDsmg;
ARCHITECTUREbehaveOFsmgIS
SIGNALq_temp:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALcount:
STD_LOGIC_VECTOR(5DOWNTO0);
SIGNALcnt:
INTEGERRANGE0TO5;
BEGIN
p1:
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IF(cnt=5)THENcnt<=0;
ELSE
cnt<=cnt+1;
ENDIF;
ENDIF;
ENDPROCESS;
p2:
PROCESS(cnt)
BEGIN
IF(clear='0')THENcount<="111111";
ELSE
CASEcntIS
WHEN1=>count<="101111";q_temp<="0110000";
WHEN2=>count<="110111";q_temp<="1101101";
WHEN3=>count<="111011";q_temp<="1111001";
WHEN4=>count<="111101";q_temp<="0110011";
WHEN5=>count<="111110";q_temp<="1011011";
WHEN0=>count<="011111";q_temp<="1111110";
ENDCASE;
ENDIF;
ENDPROCESS;
countout<=count;
q<=q_temp;
ENDbehave;
通过分频器输入产生选通脉冲,控制0至5号LED数码管依次亮灭,同时使用数码显示信号使得数码管显示相应数码。
实现时通过连接引入分频信号,通过数据选择器选择数码管。
计数器信号触发数据选择器,赋值给位码触发数码管显示数码。
最终实现动态扫描显示数字序列。
B.实验任务2-I
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYsmg1IS
PORT(clk,clear:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
countout:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
ENDsmg1;
ARCHITECTUREbehaveOFsmg1IS
SIGNALq_temp:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALcount:
STD_LOGIC_VECTOR(5DOWNTO0);
SIGNALcnt,cnt1:
INTEGERRANGE0TO5;
SIGNALtmp:
INTEGERRANGE0TO19999;
signalclk1:
STD_LOGIC;
BEGIN
p0:
PROCESS(clk,clear)
BEGIN
IFclear='0'THENtmp<=0;
ELSIFclk'EVENTANDclk='1'THEN
IFtmp=19999THEN
tmp<=0;
ELSE
tmp<=tmp+1;
ENDIF;
ENDIF;
ENDPROCESSp0;
p1:
PROCESS(tmp)
BEGIN
IFclk'EVENTANDclk='1'THEN
IFtmp<10000THEN
clk1<='0';
ELSE
clk1<='1';
ENDIF;
ENDIF;
ENDPROCESSp1;
p2:
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IF(cnt=5)THENcnt<=0;
ELSE
cnt<=cnt+1;
ENDIF;
ENDIF;
ENDPROCESSp2;
p3:
PROCESS(clk1)
BEGIN
IF(clk1'EVENTANDclk1='1')THEN
IF(cnt1=5)THENcnt1<=0;
ELSE
cnt1<=cnt1+1;
ENDIF;
ENDIF;
ENDPROCESSp3;
p4:
PROCESS(cnt,cnt1)
BEGIN
IF(clear='0')THENq_temp<="0000000";
ELSE
CASEcnt+cnt1IS
WHEN0=>q_temp<="1111110";
WHEN1=>q_temp<="0110000";
WHEN2=>q_temp<="1101101";
WHEN3=>q_temp<="1111001";
WHEN4=>q_temp<="0110011";
WHEN5=>q_temp<="1011011";
WHEN6=>q_temp<="1111110";
WHEN7=>q_temp<="0110000";
WHEN8=>q_temp<="1101101";
WHEN9=>q_temp<="1111001";
WHEN10=>q_temp<="0110011";
WHEN11=>q_temp<="1011011";
WHENOTHERS=>q_temp<="0000000";
ENDCASE;
ENDIF;
ENDPROCESSp4;
q<=q_temp;
p5:
PROCESS(cnt)
BEGIN
IF(clear='0')THENcount<="111111";
ELSE
CASEcntIS
WHEN0=>count<="011111";
WHEN1=>count<="101111";
WHEN2=>count<="110111";
WHEN3=>count<="111011";
WHEN4=>count<="111101";
WHEN5=>count<="111110";
WHENOTHERS=>count<="111111";
ENDCASE;
ENDIF;
ENDPROCESSp5;
countout<=count;
ENDbehave;
C.实验任务2-II
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYsmg2IS
PORT(clk,clear:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
countout:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
ENDsmg2;
ARCHITECTUREbehaveOFsmg2IS
SIGNALq_temp:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALcount:
STD_LOGIC_VECTOR(5DOWNTO0);
SIGNALcnt,cnt1:
INTEGERRANGE0TO11;
SIGNALtmp:
INTEGERRANGE0TO19999;
signalclk1:
STD_LOGIC;
BEGIN
p0:
PROCESS(clk,clear)
BEGIN
IFclear='0'THENtmp<=0;
ELSIFclk'EVENTANDclk='1'THEN
IFtmp=19999THEN
tmp<=0;
ELSE
tmp<=tmp+1;
ENDIF;
ENDIF;
ENDPROCESSp0;
p1:
PROCESS(tmp)
BEGIN
IFclk'EVENTANDclk='1'THEN
IFtmp<10000THEN
clk1<='0';
ELSE
clk1<='1';
ENDIF;
ENDIF;
ENDPROCESSp1;
p2:
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IF(cnt=11)THENcnt<=0;
ELSE
cnt<=cnt+1;
ENDIF;
ENDIF;
ENDPROCESSp2;
p3:
PROCESS(clk1)
BEGIN
IF(clk1'EVENTANDclk1='1')THEN
IF(cnt1=11)THENcnt1<=0;
ELSE
cnt1<=cnt1+1;
ENDIF;
ENDIF;
ENDPROCESSp3;
p4:
PROCESS(cnt,cnt1)
BEGIN
IF(clear='0')THENq_temp<="0000000";
ELSE
CASEcnt+cnt1IS
WHEN6=>q_temp<="1111110";
WHEN7=>q_temp<="0110000";
WHEN8=>q_temp<="1101101";
WHEN9=>q_temp<="1111001";
WHEN10=>q_temp<="0110011";
WHEN11=>q_temp<="1011011";
WHENOTHERS=>q_temp<="0000000";
ENDCASE;
ENDIF;
ENDPROCESSp4;
q<=q_temp;
p5:
PROCESS(cnt)
BEGIN
IF(clear='0')THENcount<="111111";
ELSE
CASEcntIS
WHEN0=>count<="011111";
WHEN1=>count<="101111";
WHEN2=>count<="110111";
WHEN3=>count<="111011";
WHEN4=>count<="111101";
WHEN5=>count<="111110";
WHENOTHERS=>count<="111111";
ENDCASE;
ENDIF;
ENDPROCESSp5;
countout<=count;
ENDbehave;
基本思路和实验一显示类似,只是需要做到显示数字不断变化,因此先采用分频器得到一个频率稍低的时钟信号,控制另一个计数器技术状态的转换,这样使得数字变换的频率稍微不同于数码管接通的顺序,具体实现两种不同的滚动显示的时候计数器的状态个数也是有点区别的。
其他步骤基本和实验一显示相同。
五.仿真波形及分析
1.仿真波形
由波形可见,随着时钟模六计数的不断重复,0至5号LED数码管依次打开,其余管熄灭,同时,数码管显示数字从0至5依次出现,两者保持同步,即n号管亮时显示的数码为n。
这样每计数6次循环依次,可知仿真结果正确。
当扫描速度很快时,人眼将能看到持续稳定的0至5号数码显示。
2-1仿真波形
由波形可见,随着大计数周期的增加,依次产生012345-123450-234501-345012-450123-501234-012345……,这样便实现了循环移位。
2-2仿真波形
由波形可见,随着大计数周期的增加,依次产生012345-12345X-2345XX-345XXX-45XXXX-5XXXXX-XXXXXX-XXXXX0-XXXX01-XXX012-XX0123-X01234-012345,其中’X’表示数码管不显示。
六.故障及问题分析
问题:
实验过程中数码管不能循环滚动,数字显示出现问题,出现一堆乱码。
原因:
时钟频率不对。
解决方法:
调整时钟频率。
七.总结和结论
通过本次实验,我深入学习了vhdl语言,学会了用Quartus仿真进行EDA实验。
在实验过程中对数字电路课上学的东西有了新的认识。
这次实验加强了我的的动手能力,加深了我对数字电路的理解,也让我发现了自己的一些知识漏洞。
我也希望在今后的实验中能学到更多,收获更多。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数码管 扫描 显示 控制器 设计 实现