数码管扫描显示控制器的设计与实现
一、六个数码管串行扫描电路
1. 实验任务要求:
⑴掌握VHDL语言的语法规范,掌握时序电路描述方法 ⑵掌握多个数码管动态扫描显示的原理及设计方法 2. 设计思路和过程
用VHDL语言设计并实现六个数码管串行扫描电路,要求同时显示0、1、2、3、4、5这6个不同的数字图形到6个数码管上,仿真并下载验证其功能:
使用模6计数器产生一个M=6的信号,控制“数码管选通控制信号”cat的输出,低电平点亮管,使“0至5号”6个数码管依次点亮;同时控制数字的输出,依次输出0至5。由于使用了同一个模6计数器,使得cat的输出与数字的输出是同步的,第k号数码管亮时输出k.当时钟频率足够大时(6个数码管需要300Hz以上的频率),数码管能稳定显示,在视觉上表现为同时显示0、1、2、3、4、5这6个不同的数字图形到6个数码管上 3. VHDL 程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY shiyanshi1 IS PORT(
clk,clear:IN STD_LOGIC;
cat:OUT STD_LOGIC_VECTOR(5 downto 0); b:OUT STD_LOGIC_VECTOR(6 downto 0) );
end shiyanshi1;
ARCHITECTURE shumaguan OF shiyanshi1 IS
SIGNAL q_temp: STD_LOGIC_VECTOR(2 downto 0); BEGIN
PROCESS(clk) BEGIN
IF(clk'event and clk='1') THEN IF clear='0' THEN q_temp<=\"000\";
ELSIF q_temp=\"101\" THEN q_temp<=\"000\"; ELSE
q_temp<=q_temp+1;
END IF;
CASE q_temp IS
WHEN \"000\" => cat <=\"111110\"; --0 WHEN \"001\" => cat <=\"111101\"; --1 WHEN \"010\" => cat <=\"111011\"; --2 WHEN \"011\" => cat <=\"110111\"; --3 WHEN \"100\" => cat <=\"101111\"; --4 WHEN \"101\" => cat <=\"011111\"; --5 WHEN OTHERS => cat <=\"111111\"; END CASE; CASE q_temp IS
WHEN \"000\" => b <=\"1111110\"; --0 WHEN \"001\" => b <=\"0110000\"; --1 WHEN \"010\" => b <=\"1101101\"; --2 WHEN \"011\" => b <=\"1111001\"; --3 WHEN \"100\" => b <=\"0110011\"; --4 WHEN \"101\" => b <=\"1011011\"; --5 WHEN OTHERS => b <=\"0000000\"; END CASE; END IF; END PROCESS; END shumaguan; 4. 仿真波形图
5. 仿真波形图分析
如图,clear为复位信号,cp为时钟信号,cat5至cat0为数码管选通控制信号,b为数码管所显示的数字图形。低电平时数码管亮,由图可知,六个管依次点亮,且点亮的数码管的序号与所显示的数字是同步对应的,即0至5号数码管点亮时显示数字0至5。当时钟频率足够大(大于300Hz)时,数码管可以稳定显示,视觉上表现为同时显示0、1、2、3、4、5这6个不同的数字图形到6个数码管上。 6. 故障及问题分析
故障:下载到实验板上后不能正确显示数字
描述:VHDL程序、仿真波形图均没有错误,但实验板上数字图形处于倒置状
态
解决:最后发现分配管脚时b7至b0被错误的按a,b,c,d,e,f,g的顺序分配了。将其调整为b0至b7按a,b,c,d,e,f,g的顺序分配。
二、 六个数码管滚动扫描电路,要求循环左滚动
1.实验任务要求:
⑴掌握VHDL语言的语法规范,掌握时序电路描述方法 ⑵掌握多个数码管动态扫描显示的原理及设计方法 2.设计思路和过程
用VHDL语言设计并实现六个数码管滚动扫描电路,要求循环左滚动,始终点亮6个数码管,左出右进。状态为012345→123450→234501→345012→450123→501234→012345:
使用模6计数器产生一个M=6的信号,控制数字的输出,依次输出0至5;同时控制“数码管选通控制信号”cat的输出,低电平点亮管,使“0至5号”6个数码管依次点亮。当数字输出一个循环时产生一个信号flag,使cat暂时不变,然后数字进入下个循环,cat继续按模6计数器的变化方式改变。
这样做相当于数字每循环一次,cat与数字的变化相比延后一位。在视觉上表现为数字循环左滚动,始终点亮6个数码管,左出右进。状态为012345→123450→234501→345012→450123→501234→012345。
为了使数码管能稳定显示,加一个M值足够大的计数器充当分频器,使cat停滞一次后,输出的数字CNTOUT进入下个循环,cat继续按模6计数器的变化方式改变,CNTOUT要经过M个循环(这M个循环里点亮的数码管的序号和所显示的数字的一一对应关系是稳定的)才能发出下个信号flag使cat再次停滞。
3.VHDL程序 LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY shiyanshi2 IS PORT(CLK:IN STD_LOGIC;
Y:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); CAT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); SEL:OUT STD_LOGIC_VECTOR(2 DOWNTO 0) );
END ENTITY shiyanshi2;
ARCHITECTURE ART OF shiyanshi2 IS
SIGNAL CNTOUT:STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL S,S1:STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL JS:STD_LOGIC_VECTOR(8 DOWNTO 0); SIGNAL CLR: STD_LOGIC; SIGNAL FLAG:STD_LOGIC;
BEGIN
P1: PROCESS(CLK,FLAG) BEGIN
IF(CLK'EVENT AND CLK='1') THEN --检测clk高电平
IF CNTOUT=\"101\" THEN --该段为模6计数器 CNTOUT<=\"000\"; ELSE
CNTOUT<=CNTOUT+1; END IF;
IF JS=\"100000000\"THEN --该段为分频器 JS<=\"000000000\"; ELSE
JS<=JS+1; END IF; CLR<=JS(8);
IF FLAG='1' THEN ----该段为控制数码管的滚动 IF S=\"101\" THEN S<=\"000\"; ELSE S<=S+1; END IF; ELSE
S<=S; END IF; SEL<=S; END IF;
END PROCESS;
P2:PROCESS(CLR) BEGIN CASE CLR IS WHEN '1' =>
IF CNTOUT=\"101\" THEN FLAG<='0'; ELSE
FLAG<='1'; END IF;
WHEN '0'=>FLAG<='1'; END CASE; END PROCESS;
P3:PROCESS(S) BEGIN
CASE S IS ----该段为几号数码管亮 WHEN \"000\"=>CAT<=\"111110\"; WHEN \"001\"=>CAT<=\"111101\";
WHEN \"010\"=>CAT<=\"111011\";
WHEN \"011\"=>CAT<=\"110111\"; WHEN \"100\"=>CAT<=\"101111\"; WHEN \"101\"=>CAT<=\"011111\"; WHEN OTHERS=>CAT<=\"111111\"; END CASE; END PROCESS;
P4:PROCESS(CNTOUT) BEGIN
CASE CNTOUT IS ----该段为显示数字 WHEN \"000\"=>Y<=\"1111110\"; WHEN \"001\"=>Y<=\"0110000\"; WHEN \"010\"=>Y<=\"1101101\";
WHEN \"011\"=>Y<=\"1111001\"; WHEN \"100\"=>Y<=\"0110011\"; WHEN \"101\"=>Y<=\"1011011\"; WHEN OTHERS=>Y<=\"0000000\"; END CASE; END PROCESS;
END ARCHITECTURE ART; 4.仿真波形图
具体变化过程如下: 图甲:
图乙:
图丙:
5.仿真波形图分析
如图,CLK为时钟信号,Y为数码管所显示的数字图形,CNTOUT为输出的数字。 SEL为点亮的数码管的序号,CAT5至CAT0为数码管选通控制信号。低电平时数码管亮。由图可知,当SEL未做延后处理时,点亮的数码管的序号和所显示的数字的一一对应关系是稳定的。CNTOUT经过M个循环后,SEL停滞一个时钟周期,然后继续变化,使得在视觉上表现为数字循环左滚动,始终点亮6个数码管,左出右进。图甲的状态为123450→234501;图乙为234501→345012;图丙为345012→450123。
6.故障及问题分析
故障一:一开始数码管不能稳定显示
分析:没有设计分频器,数码管的各个状态持续时间都不够长。
解决:设置M=256的分频器,使cat停滞一次后,数字要经过M个循环才能发出下个信号flag使cat再次停滞,即每个状态均持续M个循环,每个循环为6个时钟周期,共6*M个时钟周期。
故障二:增加分频器后数码管仍不能稳定显示
分析:数字CNTOUT经M循环发出信号flag使cat停滞后,进入下M个循环,但cat却始终不变,直到下一flag到来
解决:使cat每次停滞时间只有一个时钟周期。
三、总结和结论
通过本学期《数字电路与逻辑设计实验教程》的学习,我进一步巩固了数字电路与逻辑设计的相关知识,熟悉了数字逻辑器件、数字可编程逻辑器件,尤其是MAX7000S系列;掌握了QUARTUS软件的使用方法,学会了用QUARTUS设计原理图、仿真、下载验证;初步掌握了VHDL语言,学习了很多数字电路课程中的
逻辑器件的VHDL程序,学会了依照实验要求编写VHDL程序去实现一个电路、状态机。
通过本学期的学习,我收获的不止是知识,更重要的是分析、解决问题的能力。在学习用QUARTUS设计原理图时,我锻炼了分析实验要求、判断电路结构的能力,在编写VHDL程序时,尤其是设计和实现数码管扫描显示控制器时,分析问题、解决问题的能力显得更加重要。为了实现数字循环左滚动,经过反复思索,我选择了只对数码管选通控制信号cat进行处理的方案。然而在具体编写时却遇到了各种问题:如因忽略了分频器的设计导致数码管显示结果不稳定,同一进程放入了多个时钟信号等,最后都经过严密的分析排查一一解决。
遗憾的是因为经验的欠缺和面临的困难,自己曾经放弃了只处理数码管选通控制信号的方案,想改用处理显示数字的方案,最后又返回原来的设计,没有持之以恒,浪费了一些时间,使得最后一个实验没有时间完成了。
虽然这学期的实验已经结束,但我将永远铭记它,铭记从中学到的知识,铭记在其中培养的能力,铭记在勤奋思索、征服困难时洒下的汗水,我将带着这笔财富,在以后的学业和生活中昂然前行。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务