北邮数字电路双色点阵实验报告精Word文档下载推荐.docx
《北邮数字电路双色点阵实验报告精Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《北邮数字电路双色点阵实验报告精Word文档下载推荐.docx(39页珍藏版)》请在冰豆网上搜索。
1、已完成的基本功能(21
2、已完成的扩展功能(21
3、器件资源占用情况(21
4、关键波形仿真图(21
(1pwm调制器(21
(2数据选择器(22
(3译码器(22
八、故障及问题分析(28
九、总结(29
十、所用元器件及测试仪表清单(29
十一、完整源程序(29
1、总体原理图设计(29
2、防抖模块(29
3、一级分频器(pwm调制器(30
4、二级分频器(32
5、三级分频器(32
6、模2计数器(33
7、模4计数器(34
8、模8计数器(34
9、滚动状态计数器(模4模32计数器组合(35
10、数据选择器(36
11、译码器(36
十二、参考文献(43
欢迎学弟学妹下载!
一、课题名称
双色点阵显示控制器
二、摘要
本实验使用在QuartusII9.1的软件基础上,使用VHDL设计输入和原理图设计输入混合编程,设计了一个8×
8双色点阵显示器,实现了控制固定图形的亮度和颜色以及多个字母不同模式的滚动且同时手动、自动变色的功能。
关键词:
数字电路,双色点阵,VHDL,滚动
三、设计任务要求
设计实现一个8×
8双色点阵显示控制器。
基本要求:
1、固定红色显示一个汉字或图形,显示亮度4级可调,用一个btn按钮实现亮度调节,
亮度变化视觉效果要尽量明显。
2、用从红到绿8级渐变色显示一个固定汉字或图形。
3、分别用单字循环显示、左右滚动显示、上下滚动显示三种显示方式单色显示四个汉
字或图形,显示过程中,显示方式用一个btn按键进行切换。
4、显示的图形或汉字要尽量饱满美观。
提高要求:
1、滚动显示过程中实现四种显示颜色的自动变换,颜色变化视觉效果要尽量明显。
2、自拟其它功能。
四、设计思路,总体结构框图
1、基本框架
时钟输入,分频至扫描频率,扫描频率控制扫描计数器,译码器将计数器状态译成对应输出
2、在点阵上显示一个字或图案
在任何一个时刻,点阵中同时只可能有一行亮,为了让人眼看到稳定的八行八列图形,必须利用人眼的视觉暂留,让八行循环点亮并且达到一定频率。
因为人眼对于闪烁频率在50HZ以上的光源会看到是一直亮的,故对于八行的点阵,点亮频率至少需要50×
8HZ才能保证人眼看到稳定的图案。
因此,可以知道基本框架中,分频器要把实验板上的50MHZ的时钟分到400HZ以上,这里可选择1000HZ,控制模8计数器,译码器将模8计数器的计数值译成row、colr管脚上的高低电平信号。
3、控制亮度
3.1脉冲宽度调制(PWM
控制亮度需要有占空比不同的波,以这些信号去控制点亮的时间。
生成这种信号,我们必须考虑以下几个问题:
频率是多少。
在不进行亮度控制时,模8计数器的每一个值的持续时间对应某一行亮的时间,而我们现在要控制这个时间,那些占空比不同的波的周期就必须和模8计数器的周期一致,否则必然造成混乱。
而模8计数器对应着扫描频率,也就是第一级分频器分出的频率,那些占空比不同的波也可以作为第一级分频器输出的时钟信号,故根据这里的分析我们可以将第一级分频器和脉冲宽度调制器合并成一个模块。
占空比多大。
我们第一个功能需要4级亮度,第二个功能需要8级渐变色,故可选择生成占空比14%、28%、42%、56%、70%、84%六种占空比的时钟信号,占空比为0%和100%可以直接在程序中对电平赋‘0’或‘1’不需要生成。
3.2亮度
用占空比不同的时钟信号改变点亮时间以控制亮度。
在译码部分增加一个判断条件,如果控制此时亮度的占空比的时钟信号电平为‘1’,则正常译码;
如果此时电平为‘0’,那么对管脚colr或colg赋八位低电平向量“00000000”。
Pwm当外部输入量不同时,是占空比不同的时钟信号。
Shuzu2是8×
8数组。
4、控制颜色
用不同占空比的时钟信号分别控制每一行colr、colg点亮的时间,使colr从第一行到第八行点亮时间依次减少(100~0%,使colg从第一行到第八行点亮时间依次增加(0~100%。
由此即可出现由红到绿的八级渐变色。
Pwm1~6,是占空比14~84%的时钟信号。
5、实现三种模式的滚动
5.1状态
首先需要明确的是,每滚动一次,也即点阵图案每变化一次,就对应一个状态。
我们要想知道某一时刻要显示出什么样的图案,就必须知道当前是第几个状态。
所以我们需要一个状态计数器,以它的计数值去控制当前显示哪种图案。
对于单字循环,每次显示一个字,MING四个字母对应4个状态,需要模4计数器。
对于左右滚动和上下滚动,每次移动一行或者一列,对应32个状态,需要模32计数器。
因为滚动的频率三者都相同,可以考虑将模4计数器和模32计数器合在一起以减少模块数目。
5.2如何存储需要译码的字符
点阵上的每一个图案对应8个行向量,单字循环4个状态对应32个行向量,左右滚动和上下滚动对应256个行向量。
如果在程序中直接用每一个状态对应一个when、case语句去译码,工程量会非常大,而且不易修改,不易扩展。
考虑把这4个字母存储在一个二维数组中,为了方便左右滚动和上下滚动的译码,将这四个字母存在8×
39(最后7列是第一个字母M的前7列和39×
8数组中(最后7行是第一个字母M的前7行。
5.3如何进行译码
当我们译码时,可以根据当前状态计数器的计数值动态引用数组中的行向量。
这样译码部分只需要8行代码即可,而静态引用的话,左右和上下滚动每种就需要写256行。
以下是程序左右滚动部分的截图,以此为例简要介绍动态引用数组中的行向量。
8×
39数组,存储,纵坐标从下至上0~7,横坐标从左至右38~0,即坐标横纵均最大的点在左上角。
其中Move是状态计数器的值,0~31。
对于cnt8=0,move=0点阵第一行显示的是数组的第一行的1~8(标号38~31,而当cnt8=0不变,move=1时,点阵第一行2~9列(标号37~30。
根据move值增大依次译码数组中后面的列。
6、总体框图
五、控制器部分的状态转移图和流程图
本程序中,译码部分是主要的控制器,根据输入量的不同作出不同种类的译码。
1、状态转移图
Swt为两位拨码开关,根据swt值的不同可以从任意一个状态直接跳到其他任意状态Functionone:
显示固定图形或字,可四级亮度调节
Functiontwo:
显示固定图形或字,由红至绿八级渐变色
Functionthree:
三种滚动模式
Functionfour:
三种滚动模式且滚动中自动变色
2、流程图
Y
六、总体电路和分块电路的设计
1、总体电路
2、分块电路
上述总体电路中共使用10种模块,其中最关键的三种分别是:
(1pwm调制器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitypwmis
port(
clk:
INSTD_LOGIC;
--实验板上50MHZ时钟输入
pwm1:
outstd_logic;
--以下是六种频率为1000HZ,占空比从14%~84%的波
pwm2:
outstd_logic;
pwm3:
pwm4:
pwm5:
pwm6:
outstd_logic
;
endpwm;
architectureprojectofpwmis
begin
process(clk--pwm,divider
variablecount:
integerrange0to49999;
ifclk'
eventandclk='
1'
then--计数器,其模值决定分频比ifcount=49999then
count:
=0;
elsecount:
=count+1;
endif;
ifclk'
then--pwm1
ifcount<
7000then
pwm1<
='
elsepwm1<
0'
then--pwm2
14000then
pwm2<
elsepwm2<
then--pwm3
21000then
pwm3<
elsepwm3<
then--pwm4--50%
28000then
pwm4<
elsepwm4<
then--pwm5
35000then
pwm5<
elsepwm5<
then--pwm6
42000then
pwm6<
elsepwm6<
endprocess;
endproject;
(2数据选择器(mux
entitymux2is
clk1:
instd_logic;
--低频时钟输入(0.5HZ
clk2:
--高频时钟输入(2HZ
btn:
instd_logic;
--按键脉冲输入
cnt2:
inintegerrange0to1;
swt:
instd_logic_vector(1downto0;
clkout:
--输出时钟
endmux2;
architectureaofmux2is
process(clk1,clk2,btn,swt
caseswtis—只对功能三四有效
when"
10"
=>
clkout<
=btn;
--当功能三时,输出时钟为btn脉冲
11"
ifcnt2=0thenclkout<
=clk1;
elseclkout<
=clk2;
--功能四时,根据cnt2值不同,输出低频、高频时钟
whenothers=>
endcase;
enda;
(3译码器(translate
entitytranslateis
cnt8:
INintegerrange0to7;
cnt4:
INintegerrange0to3;
INstd_logic_vector(1downto0;
move:
INintegerrange0to31;
--状态计数器值,模32
move1:
--状态计数器值,模4
change:
--变色状态计数器,模4
row:
outstd_logic_vector(7downto0;
colr:
colg:
outstd_logic_vector(7downto0
endtranslate;
architectureprojectoftranslateis
signaltchange1:
std_logic;
signaltchange2:
signalpwm:
typerisarray(7downto0ofstd_logic_vector(38downto0;
--定义8×
39二维数组signalshuzu:
r;
--8*39定义数组信号
typer1isarray(38downto0ofstd_logic_vector(7downto0;
--定义39×
8二维数组signalshuzu1:
r1;
--39*8定义数组信号
typer2isarray(7downto0ofstd_logic_vector(7downto0;
8数组signalshuzu2:
r2;
--8*8定义数组信号
shuzu<
=(--8*39赋值"
100000010011110010000001011111101000000"
"
110000110001100011000001100000011100001"
101001010001100010100001100000001010010"
100110010001100010010001100000001001100"
"
100000010001100010001001100011111000000"
100000010001100010000101100010011000000"
100000010001100010000011100000011000000"
;
shuzu1<
=(--39*8赋值
10000001"
11000011"
10100101"
10011001"
00111100"
00011000"
11000001"
10100001"
10010001"
10001001"
10000101"
10000011"
01111110"
10000000"
10001111"
shuzu2<
=(
8*8赋值
11111111"
11011011"
01100110"
process(cnt8--controlrowvector
CASEcnt8IS--控制每一行能够亮的时刻
when0=>
row<
="
01111111"
when1=>
10111111"
when2=>
11011111"
when3=>
11101111"
when4=>
11110111"
when5=>
11111011"
when6=>
11111101"
when7=>
11111110"
endprocess;
process(change,swt,pwm5,pwm2--controlmovecolor
casechangeis---根据变色状态计数器值的不同,使tchange1和tchange2成为不同占空比的波,分别控制colr、colg点亮时长
when0=>
tchange1<
tchange2<
when1=>
=pwm5;
=pwm2;
when2=>
when3=>
tchange1<
process(cnt4,pwm1,pwm3,pwm5--controllight
casecnt4is--根据cnt4记录的按键次数,使pwm成为占空比不同的波,控制固定图形的4级亮度
pwm<
=pwm1;
=pwm3;
process(cnt8,cnt4,swt,pwm,pwm1,pwm2,pwm3,pwm4,pwm5,pwm6,move,move1,tchange1,tchange2,shuzu,shuzu1,shuzu2--function1
ifswt="
00"
then--functionone四级亮度
colg<
00000000"
ifpwm='
then
casecnt8is
colr<
=shuzu2(7;
=shuzu2(6;
=shuzu2(5;
=shuzu2(4;
=shuzu2(3;
=shuzu2(2;
=shuzu2(1;
=shuzu2(0;
="
elsecolr<
01"
then--function2colr,colg八级渐变色
CASEcnt8IS
=shuzu2(7;
ifpwm6='
thencolr<
=shuzu2(6;
elsecolr<
ifpwm1='
thencolg<
elsecolg<
ifpwm5='
=shuzu2(5;
ifpwm2='
ifpwm4='
=shuzu2(4;
ifpwm3='
=shuzu2(3;
=shuzu2(2;
=shuzu2(1;
=shuzu2(0;
orswt="
then--functionthree,four功能三四使用相同的译码部分,不同点在于变色计数器的驱动时钟不同。
功能三中,变色时钟是btn,每按键一次,可改变一种颜色;
功能四中,变色时钟是低频、高频时钟,自动变色。
casecnt4is
--three-one单字循环
iftchange1='
casecnt8is--红色
=shuzu(7((38-8*move1downto(31-8*move1;
=shuzu(6((38-8*move