数字电路与逻辑设计第4次实验 VHDL.docx
《数字电路与逻辑设计第4次实验 VHDL.docx》由会员分享,可在线阅读,更多相关《数字电路与逻辑设计第4次实验 VHDL.docx(14页珍藏版)》请在冰豆网上搜索。
数字电路与逻辑设计第4次实验VHDL
北京邮电大学
实验报告
实验名称:
数码管扫描显示控制器设计与实现
学院:
信息与通信工程学院
班级:
2012211105
姓名:
许春超
学号:
2012210137
日期:
2014.5.29
一.实验目的
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’表示数码管不显示。
四.实验设计思路及VHDL代码实现波形图
(1)实验原理:
为使得输入控制电路简单且易于实现,采用动态扫描的方式实现设计要求。
动态扫描显示需要由两组信号来控制:
一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。
各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。
因此在同一时刻如果各位数码管的位选线都处于选通状态的话,6位数码管将显示相同的字符。
若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式,即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。
同时,段线上输出相应位要显示字符的字型码。
这样在同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。
虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但由于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼的视觉印象就会是连续稳定地显示。
总之,多个数码管动态扫描显示,是将所有数码管的相同段并联在一起,通过选通信号分时控制各个数码管的公共端,循环一次点亮多个数码管,并利用人眼的视觉暂留现象,只要扫描的频率大于50Hz,将看不到闪烁现象。
6个数码管则需要50*6=300Hz以上才能看到持续稳定点亮的现象。
实验题目一.
1.设计思路及框图
设计时序电路,输入时钟经过一个分频器,产生2kHz的扫描信号作为时钟,驱动计数器工作。
选用模值为6的计数器,通过一个3线至6线译码器,产生段码,依次控制6个LED的亮灭,使得某一时刻有且仅有一个LED点亮,同时产生对应的,将点亮的LED数码管赋值显示为相应的数码予以显示。
由于扫描频率较高,6位LED数码管序列将显示持续稳定的0至5的数码。
Count(5)seg7
clkclk_tmp…………
count(0)seg1
实验设计思路框图
2.对应的VHDL代码如下:
注:
事前准备的2k分频代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydiv2kis
port(
clk_in:
instd_logic;
clk_out:
outstd_logic
);
end;
architectureaofdiv2kis
signalcnt:
integerrange0to999;
signalclk_tmp:
std_logic;
begin
process(clk_in)
begin
if(clk_in'eventandclk_in='1')then
if(cnt=999)then
cnt<=0;clk_tmp<=notclk_tmp;
else
cnt<=cnt+1;
endif;
endif;
endprocess;
clk_out<=clk_tmp;
end;
实现代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitystandis
port(
clk:
instd_logic;
cat:
outstd_logic_vector(5downto0);
S:
outstd_logic_vector(6downto0)
);
end;
architecturestand1ofstandis
componentdiv2k
port(clk_in:
instd_logic;clk_out:
outstd_logic);
endcomponent;
signalcnt6:
integerrange0to5;
signalA:
integerrange0to5;
signalclk_tmp:
std_logic;
begin
u1:
div2kportmap(clk,clk_tmp);
P1:
process(cnt6)
begin
casecnt6is
when0=>cat<="011111";A<=0;
when1=>cat<="101111";A<=1;
when2=>cat<="110111";A<=2;
when3=>cat<="111011";A<=3;
when4=>cat<="111101";A<=4;
when5=>cat<="111110";A<=5;
whenothers=>null;
endcase;
endprocessp1;
P2:
process(clk_tmp)
begin
if(clk_tmp'eventandclk_tmp='1')then
cnt6<=cnt6+1;
if(cnt6=5)then
cnt6<=0;
endif;
endif;
endprocessP2;
P3:
process(A)
begin
caseAis
WHEN0=>S<="1111110";
WHEN1=>S<="0110000";
WHEN2=>S<="1101101";
WHEN3=>S<="1111001";
WHEN4=>S<="0110011";
WHEN5=>S<="1011011";
WHENOTHERS=>NULL;
endcase;
endprocessP3;
endstand1;
3.仿真波形
如下两张图所示
图一为012345—>012345—>012345—>……
图一
图二主要显示一个周期与前后周期的连接。
图二
实验题目二.
1.
设计思路
Seg7~seg1
Cat6~cat
设计思路框图
通过分频器输入产生选通脉冲,控制0至5号LED数码管依次亮灭,同时使用数码显示信号使得数码管显示相应数码。
实现时通过连接引入分频信号,通过数据选择器选择数码管。
计数器信号触发数据选择器,赋值给位码触发数码管显示数码。
最终实现动态扫描显示数字序列。
2.VHDL代码如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYscan_ledIS
PORT(CLK:
INSTD_LOGIC;
SG:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
BT:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
END;
ARCHITECTUREarcOFscan_ledIS
componentdiv2k
port(clk_in:
instd_logic;
clk_out:
outstd_logic);
endcomponent;
SIGNALCNT6:
INTEGERRANGE0TO6;
SIGNALA:
INTEGERRANGE0TO5;
SIGNALCOUNT:
INTEGERRANGE0TO5001:
=0;
SIGNAlFLAG:
INTEGERRANGE0TO7:
=0;
SIGNAlFLAG_A:
INTEGERRANGE0TO5;
SIGNALclk_tmp:
STD_LOGIC;
BEGIN
u1:
div2kportmap(clk_in=>CLK,clk_out=>clk_tmp);
P1:
process(CNT6)
BEGIN
CASECNT6IS
WHEN0=>BT<="011111";A<=0;
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
CNT6<=CNT6+1;
ifCNT6=5then
CNT6<=0;
endif;
IF(FLAG=6)THEN
FLAG<=0;
ENDIF;
IFCOUNT=5THEN
COUNT<=0;
FLAG<=FLAG+1;
ELSE
COUNT<=COUNT+1;
ENDIF;
ENDIF;
ENDPROCESSP2;
P3:
process(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;
endarc;
2.仿真波形
下列图形所示状态为(轮回滚动显示)
012345—>123450—>234501—>345012—>450123—>501234—>012345—>……
图一.012345—>123450状态转变
图二.123450—>234501状态转变
图三.234501—>345012状态转变
图四.345012—>450123状态转变
图五.450123—>501234状态转变
图六.501234—>012345状态转变
五.波形分析
1.实验题目一波形分析
由波形可见,随着时钟模六计数的不断重复,0至5号LED数码管依次打开,其余管熄灭,同时,数码管显示数字从0至5依次出现,两者保持同步,即第i号管亮时显示的数码为i。
这样每计数6次循环依次,可知仿真结果正确。
当扫描速度很快时,人眼将能看到持续稳定的0至5号数码显示。
在实验室实际测试时,检查仿真波形正确后便可以下载到电路板测试,完成实验任务。
2.实验题目二波形分析
为了使仿真结果便于打印,这里修改了COUNT值为5,也即在一个大的计数周期内,只扫描一遍(实际实现时需要动态扫描多次,如同实验任务1,产生稳定的数码显示,只需把COUNT值加大即可)。
在实验室内下载到电路板上测试时,随着大计数周期的增大,依次产生稳定的012345-123450-234501-345012-450123-501234-012345……,这样便实现了循环移位。
实验室实测时,加大COUNT值为5000,观察到稳定持续的周期循环移位的数码显示,完成实验任务。
六.故障及问题分析
1.分频问题
理论上当频率大于50Hz时人眼并可以产生错觉。
所以在选用频率时理论上选择大于50Hz即可。
但是实验测试时有两点限制:
一是下载电路板有自己的频率产生,分频小难以控制;二是选择分频过大会导致系统生成波形时运行慢。
所以综上,选择了2k分频。
2.静态扫描问题
主要问题是需要产生数码管显示控制电平和数码管译码电平保持同步。
所以借助六计数器来帮助保持两者同步。
3.动态扫描问题
初始编写代码时,误将COUNT计数器放入p3进程中,导致触发逻辑错误,大周期计数不工作,显示数码不能移位。
后将模6和模5000两个计数器同时放入p2进程,统一使用一个时钟边沿触发,这样符合了同步时序电路设计的基本思想,触发正确,再借助求余的方法使显示数码才正常同步移位。
七.总结与结论
对于本次实验,总的感觉是比前面三次提高了很大难度,主要问题还是来源于LED与数码管译码同步显示的设计。
总体的框架设计便不难,难就难在各个模块之间的连接,需要设置中间变量使前后模块能顺利连接而且要使整个电路的功能不被影响。
此外,这次实验过程中,掌握了新的级联语法,上一次实验是借助component语法实现级联,这次是直接用多个process语法进行级联。
相比之下process语法可能比较繁琐。
但是灵活度大,而且容易理解。
Component语法是使用简单,但前提是要充分了解代码,实行按连接过程比较抽象。
实验过程中,选择合适的计数模值还有时间区间可以使仿真波形能更容易显示出来,虽然波形生成过程可能会耗时久一些,但是可以得到整个过程波形。
对于本课程的实验,可以说是收获最大的一次实验。
课程时间安排合理,就在理论课程结束之后,可以把所学知识当即用在实验上,让学生对《数字电路与逻辑设计》的兴趣度不减。
从第一堂课开始接触qutartusII软件,再到后面深入学习VHDL语言,从软件仿真实现了电路的设计,可以更形象的得到波形,更能帮助我们理解课上的知识。
此外,本学期实验的语言学习,包括语法的要求,都让我们学会在实验过程中要严谨,认真对待每一次实验。
还有老师每次实验验收的要求严格,更重视细节上的东西,如波形的显示时间区间,以及各个状态都是要求甚严,让我们不得不课前认真预习,了解题目要求,到实验室测试过程可以更好更快地完成任务。
最后,给实验中心提一个建议:
希望每年的实验题目能适当更新,避免学生上网直接XX往年的题目解答。