北邮数字电路双色点阵实验报告 本文关键词:点阵,双色,北邮,数字电路,实验
北邮数字电路双色点阵实验报告 本文简介:数字电路与逻辑设计实验报告学院:电子工程学院班级:2011211203学号:2011210971班内序号:22姓名:郭一鸣指导老师:陈凌霄目录一、课题名称4二、摘要4三、设计任务要求4四、设计思路,总体结构框图41、基本框架42、在点阵上显示一个字或图案53、控制亮度53.1脉冲宽度调制(PWM)5
北邮数字电路双色点阵实验报告 本文内容:
数字电路与逻辑设计实验报告
学院:
电子工程学院
班级:
2011211203
学号:
2011210971
班内序号:
22
姓名:
郭一鸣
指导老师:
陈凌霄
目录
一、课题名称4
二、摘要4
三、设计任务要求4
四、设计思路,总体结构框图4
1、基本框架4
2、在点阵上显示一个字或图案5
3、控制亮度5
3.1脉冲宽度调制(PWM)5
3.2
亮度5
4、控制颜色6
5、实现三种模式的滚动7
5.1状态7
5.2如何存储需要译码的字符7
5.3如何进行译码7
6、总体框图8
五、控制器部分的状态转移图和流程图8
1、状态转移图9
2、流程图9
六、总体电路和分块电路的设计11
1、总体电路11
2、分块电路11
(1)pwm调制器11
(2)数据选择器(mux)13
(3)译码器(translate)14
(4)其他模块20
七、所实现的功能说明21
1、已完成的基本功能21
2、已完成的扩展功能21
3、器件资源占用情况21
4、关键波形仿真图21
(1)pwm调制器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、基本框架
时钟输入,分频至扫描频率,扫描频率控制扫描计数器,译码器将计数器状态译成对应输出
输出
clk
Cnt8
译码器
分频器
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、状态转移图
Function
two
Function
one
Swt=”01”
Swt=”00”
Swt=”01”
Swt=”11”
Swt=”10”
Swt=”00”
Swt=”10”
Swt=”10”
Swt=”01”
Swt=”11”
Swt=”10”
Swt=”00”
Function
three
Function
four
Swt为两位拨码开关,根据swt值的不同可以从任意一个状态直接跳到其他任意状态
Function
one:显示固定图形或字,可四级亮度调节
Function
two:显示固定图形或字,由红至绿八级渐变色
Function
three:三种滚动模式
Function
four:三种滚动模式且滚动中自动变色
2、流程图
开始
Swt的值变化
Swt=”00”?
Y
功能一
N
Swt=”01”?
Y
功能二
Swt的值变化
N
Swt=”10”?
Y
功能三
Swt的值变化
Swt的值变化
N
功能四
六、总体电路和分块电路的设计
1、总体电路
2、分块电路
上述总体电路中共使用10种模块,其中最关键的三种分别是:
(1)pwm调制器
library
ieee;
use
ieee.std_logic_1164.all;
use
ieee.std_logic_unsigned.all;
entity
pwm
is
port(
clk:IN
STD_LOGIC;
--实验板上50MHZ时钟输入
pwm1:out
std_logic;
--以下是六种频率为1000HZ,占空比从14%~84%的波
pwm2:out
std_logic;
pwm3:out
std_logic;
pwm4:out
std_logic;
pwm5:out
std_logic;
pwm6:out
std_logic
);
end
pwm;
architecture
project
of
pwm
is
begin
process(clk)--pwm,divider
variable
count:integer
range
0
to
49999;
begin
if
clk
event
and
clk=
1
then
--计数器,其模值决定分频比
if
count=49999
then
count:=0;
else
count:=count+1;
end
if;
end
if;
if
clk
event
and
clk=
1
then
--pwm1
if
countclkoutif
cnt2=0
then
clkout
clkoutrowrowrowrowrowrowrowrowrowtchange1tchange1tchange1tchange1
tchange1
pwm
pwm
pwm
pwm
pwm
colr
colr
colr
colr
colr
colr
colr
colr
colr
colr
if
pwm6=
1
then
colr
if
pwm5=
1
then
colr
if
pwm4=
1
then
colr
if
pwm3=
1
then
colr
if
pwm2=
1
then
colr
if
pwm1=
1
then
colrcolrcolr
--three-one
单字循环
colg
colr
colr
colr
colr
colr
colr
colr
colr
colr
colg
colg
colg
colg
colg
colg
colg
colg
colr
--three-two
左右滚动
colg
colr
colr
colr
colr
colr
colr
colr
colr
colr
colg
colg
colg
colg
colg
colg
colg
colg
colg
--three-three
上下滚动
colg
colr
colr
colr
colr
colr
colr
colr
colr
colr
colg
colg
colg
colg
colg
colg
colg
colg
colg
colr
<=
“00000000“;colg
<=
“00000000“;
end
case;
end
if;
end
process
;
(4)其他模块
其他模块均由简单的防抖,计数器,分频器等组成,从实验教材上均可得到。详见源代码部分。
七、所实现的功能说明
1、已完成的基本功能
(1)显示一个笑脸,四级亮度可通过一个btn切换
(2)显示一个笑脸,
从红到绿八级渐变色显示
(3)对于四个字母“MING”的单字循环、左右滚动、上下滚动显示,显示模式可通过一个btn切换
2、已完成的扩展功能
(1)在实现基本功能3时,可通过一个btn切换四种颜色
(2)在实现基本功能3时,可自动变换四种颜色,且可通过一个btn调节两种变色频率(2HZ,0.5HZ)
3、器件资源占用情况
器件资源使用情况如下:
Total
logic
elements:504/1270(40%)
Total
pins:29/116(25%)
4、关键波形仿真图
(1)pwm调制器
产生六种占空比的时钟信号。
仿真波形分析:pwm1~6是占空比14~84%的时钟信号。
(2)数据选择器
根据输入和计数器当前值输出不同的时钟信号控制变色频率。
仿真波形分析:
当swt=”00”或”01”时数据选择器无输出,对应功能一和功能二时控制变色的计数器值不改变。
当swt=”10”时,clkout=btn,即按键作为输出时钟,功能三中每按键一次,颜色变化一次。
当swt=”11”时,当cnt2=0时,clkout=clk1;当cnt2=1时,clkout=clk2。即功能四中两级变色频率可调。
(3)译码器
功能一、显示一个笑脸四级亮度可调
仿真波形分析:
根据cnt4记录的按键次数不同,colr译码出来占空比不同,从而改变亮度。
功能二、显示一个笑脸由红到绿八级渐变色
仿真波形分析:
Colr占空比从第一行到第八行依次减小,colg占空比从第一行到第八行依次增大。
功能三、滚动
1、单字循环
仿真波形分析:
仿真设置的状态改变的频率是扫描频率的16分之1,所以同一个字母显示两次后显示下一个字母。由可以看出显示了MING。
2、左右滚动
仿真波形分析:
Inst|count是状态计数值,每一个值对应一个状态,从这些图可以看出实现了MING的左右滚动。
3、上下滚动
仿真波形分析:
Inst|count是状态计数值,每一个值对应一个状态,从这些图可以看出实现的MING的上下滚动。
功能四、滚动自动变色
1、单字循环自动变色:
仿真波形分析:
Inst3|count是当前颜色状态的计数值,可以看出根据它的值改变,colr、colg的占空比循环变化,且对应MING单字循环。
2、左右滚动自动变色(前5个状态):
仿真波形分析:
Inst3|count是当前颜色状态的计数值,可以看出根据它的值改变,colr、colg的占空比循环变化,且对应MING左右滚动。
3、上下滚动自动变色(前5个状态)
仿真波形分析:
Inst3|count是当前颜色状态的计数值,可以看出根据它的值改变,colr、colg的占空比循环变化,且对应MING上下滚动。
八、故障及问题分析
故障:
在自己电脑上和主楼601使用QuartusII9.1编译通过的程序在主楼615使用QuartusII7.2编译全部报错,错误是不允许在引用数组中的一部分使用变量。并且后来发现使用QuartusII9.0编译同样全部报错。
问题分析:
QuartusII9.1版本支持的功能更多,而QuartusII9.0及以下版本不支持动态引用数组这个功能
九、总结
经过三周的努力,顺利完成了点阵实验的基本功能和扩展功能,并自主添加了额外的两种功能。通过本次实验,对于数字电路的设计我有了更深的理解,提高了实际设计能力和动手能力,收益颇丰。
十、所用元器件及测试仪表清单
1、数字电路与逻辑设计实验板一个
2、主楼601电脑一台
3、下载线一条
十一、完整源程序
1、总体原理图设计
2、防抖模块
library
ieee;
use
ieee.std_logic_1164.all;
use
ieee.std_logic_unsigned.all;
entity
fangdou
is
port(
clk:in
std_logic;
--输入时钟,时钟频率决定防抖效果,本程序接入的是1000HZ的时钟
reset:in
std_logic;
resetn:out
std_logic);
--防抖后的BTN输出
end
fangdou;
architecture
a
of
fangdou
is
signal
resetmp1,resetmp2:std_logic;
begin
process(clk)
begin
if(clk
event
and
clk=
0
)
then
resetmp2<=resetmp1;
resetmp1<=reset;
end
if;
end
process;
resetn<=clk
and
resetmp1
and
(not
resetmp2);
end
a;
3、一级分频器(pwm调制器)
library
ieee;
use
ieee.std_logic_1164.all;
use
ieee.std_logic_unsigned.all;
entity
pwm
is
port(
clk:IN
STD_LOGIC;
--实验板上50MHZ时钟输入
pwm1:out
std_logic;
--以下是六种频率为1000HZ,占空比从14%~84%的波
pwm2:out
std_logic;
pwm3:out
std_logic;
pwm4:out
std_logic;
pwm5:out
std_logic;
pwm6:out
std_logic
);
end
pwm;
architecture
project
of
pwm
is
begin
process(clk)--pwm,divider
variable
count:integer
range
0
to
49999;
begin
if
clk
event
and
clk=
1
then
--计数器,其模值决定分频比
if
count=49999
then
count:=0;
else
count:=count+1;
end
if;
end
if;
if
clk
event
and
clk=
1
then
--pwm1
if
count<7000
then
pwm1<=
1
;
else
pwm1<=
0
;
end
if;
end
if;
if
clk
event
and
clk=
1
then
--pwm2
if
count<14000
then
pwm2<=
1
;
else
pwm2<=
0
;
end
if;
end
if;
if
clk
event
and
clk=
1
then
--pwm3
if
count<21000
then
pwm3<=
1
;
else
pwm3<=
0
;
end
if;
end
if;
if
clk
event
and
clk=
1
then
--pwm4--50%
if
count<28000
then
pwm4<=
1
;
else
pwm4<=
0
;
end
if;
end
if;
if
clk
event
and
clk=
1
then
--pwm5
if
count<35000
then
pwm5<=
1
;
else
pwm5<=
0
;
end
if;
end
if;
if
clk
event
and
clk=
1
then
--pwm6
if
count<42000
then
pwm6<=
1
;
else
pwm6<=
0
;
end
if;
end
if;
end
process;
end
project;
4、二级分频器
library
ieee;
--基本分频器
use
ieee.std_logic_1164.all;
use
ieee.std_logic_unsigned.all;
entity
divider
is
port(
clk:in
std_logic;
clkout:
out
std_logic);
end
divider;
architecture
a
of
divider
is
signal
temp:std_logic;
begin
process(clk)
variable
count:integer
range
0
to
249;
begin
if
clk
event
and
clk=
1
then
if
count=249
then
count:=0;
temp<=not
temp;
else
count:=count+1;
end
if;
end
if;
end
process;
clkout<=temp;
end
a;
5、三级分频器
library
ieee;
--基本分频器
use
ieee.std_logic_1164.all;
use
ieee.std_logic_unsigned.all;
entity
divider2
is
port(
clk:in
std_logic;
clkout:
out
std_logic);
end
divider2;
architecture