双色点阵显示控制器 北京邮电大学数字电路综合实验报告.docx

上传人:b****6 文档编号:7152292 上传时间:2023-01-21 格式:DOCX 页数:33 大小:387.72KB
下载 相关 举报
双色点阵显示控制器 北京邮电大学数字电路综合实验报告.docx_第1页
第1页 / 共33页
双色点阵显示控制器 北京邮电大学数字电路综合实验报告.docx_第2页
第2页 / 共33页
双色点阵显示控制器 北京邮电大学数字电路综合实验报告.docx_第3页
第3页 / 共33页
双色点阵显示控制器 北京邮电大学数字电路综合实验报告.docx_第4页
第4页 / 共33页
双色点阵显示控制器 北京邮电大学数字电路综合实验报告.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

双色点阵显示控制器 北京邮电大学数字电路综合实验报告.docx

《双色点阵显示控制器 北京邮电大学数字电路综合实验报告.docx》由会员分享,可在线阅读,更多相关《双色点阵显示控制器 北京邮电大学数字电路综合实验报告.docx(33页珍藏版)》请在冰豆网上搜索。

双色点阵显示控制器 北京邮电大学数字电路综合实验报告.docx

双色点阵显示控制器北京邮电大学数字电路综合实验报告

 

数字电路综合实验报告

班级:

姓名:

班内序号:

学号:

日期:

一、实验摘要

采用EDA技术的自顶向下的模块化设计方法,借助相关开发软件,例如QualtusⅡ软件,将硬件描述语言——VHDL程序固化于具有丰富I/O口、内部逻辑和连线资源的FPGA(现场可编程门阵列)中。

该技术具有系统设计效率高、集成度好、保密性强、易于修改、易于实现等优点,成为当今数字系统设计主流技术。

此方式所制作的LED点阵控制器,由于是纯硬件行为,具有速度快、可靠性高、抗干扰能力强、开发周期短等显著优点。

二、实验任务

(1)任务要求

双色点阵显示控制器

设计实现一个8×8双色点阵显示控制器。

基本要求:

1、固定红色显示一个汉字或图形,显示亮度4级可调,用一个btn按钮实现亮度调节,

亮度变化视觉效果要尽量明显。

2、用从红到绿8级渐变色显示一个固定汉字或图形。

3、分别用单字循环显示、左右滚动显示、上下滚动显示三种显示方式单色显示四个汉

字或图形,显示过程中,显示方式用一个btn按键进行切换。

4、显示的图形或汉字要尽量饱满美观。

提高要求:

1、滚动显示过程中实现四种显示颜色的自动变换,颜色变化视觉效果要尽量明显。

2、自拟其它功能。

(2)EDA点阵显示汉字原理

  以8×8的LED点阵为例,8×8的LED点阵是由64个发光二极管按矩阵形式排列而成,每一行上的发光管有一个公共的阳极(或阴极),每一列上的发光管有一个公共的阴极(或阳极),一般按动态扫描方式显示汉字或图形。

由于所用实验板上提供有1kHz的时钟,本例设计中利用该时钟进行扫描,使每行扫描时间为1ms,实验结果显示亮度合适。

现以行扫描为例简单说明动态扫描显示的原理。

工作时先将要扫描行的点阵字模从各列上输出,再让译码器选中(扫描)该行,使本行得以显示,接着再送下一行数据,再使下一行有效,直到8行全被扫描一遍。

至此,一幅完整的文字信息就显现出来,然后再反复扫描这8行直至显示新的信息。

以下设计采用行扫描方式实现滚动显示。

三、任务解析和系统设计(设计思路、总体框图、分块设计、流程图、状态转移图)

设计思路:

基本要求:

1、固定红色显示一个汉字或图形,显示亮度4级可调,用一个btn按钮实现亮度调节,

亮度变化视觉效果要尽量明显。

要实现亮度四级可调,选择用四个不同的占空比来控制发红光的发光二极管,当占空比较大时,则在红色发光二极管显示的亮度也就最强。

选择红色发光二极管不同的亮度时,即相当于选择四个不同的占空比。

当检测到时钟的上升沿时,占空比发生变化。

所以还需要再设计一个模值为4的计数器来控制这四个不同的占空比。

发光二极管的八行输出是通过一个八计数器来控制的。

行总而言之,显示亮度四级可调的固定红色汉字,要设计一个模值为4的计数器的模块,一个模值为8的计数器,一个有四个不同的占空比模块。

通过红色发光二极管显示输出。

2、用从红到绿8级渐变色显示一个固定汉字或图形。

从红到绿八级渐变色,首先八种颜色的变化可以通过上一个功能里设计的模值为8的计数器来控制。

然后颜色的变化不同则也是通过8个不同的占空比来实现,发光二极管有两个不同颜色的输出,红色和绿色占空比不一样,混合在在一起则会出现不同的颜色。

3、分别用单字循环显示、左右滚动显示、上下滚动显示三种显示方式单色显示四个汉字或图形,显示过程中,显示方式用一个btn按键进行切换。

单字循环显示是通过检测到每一个移位时钟时,就将每一行按位向左移八位。

左右滚动显示是通过行扫描实现左移,是通过每来一个移位时钟,将每一行的字模按位左移一位,扫描时钟到来时送出移位后的新字模,通过8次移位,可将一个汉字移出点阵平面,按类似的道理,也可以将一个汉字经8次移位后移进点阵平面。

上下滚动显示则相反的,是通过列扫描实现上移,是通过每来一个移位时钟,将每一行的字模按位上移一位,扫描时钟到来时送出移位后的新字模,通过8次移位,可将一个汉字移出点阵平面。

因此,需要模值为8的计数器模块,一个移动的模块。

提高要求:

1、滚动显示过程中实现四种显示颜色的自动变换,颜色变化视觉效果要尽量明显。

实现跟基本要求的第三个功能实现类似,只是显示四个不同的汉字时,加上四个不同的占空比就可以实现。

总体框图(整体模块连接图):

四、分块设计

(1)防抖模块:

设计原因:

只要有按键或是拨码开关,防抖电路就是不可缺少的一个模块。

否则,按键信号中的一些毛刺和抖动往往会引起电路不可预知的错误。

功能:

将带有抖动的信号进行识别和判断,输出持续时间超过0.1s的高电平信号。

(2)计数器4模块

设计原因:

此次实验要求的第一个功能的四级亮度可调,需要用到一个计数器4来控制四种两度,当检测到计数器4输出的时钟发生变化时,既检测到上升沿时,占空比就要发生变化,从而达到四种不同的亮度。

在第三个功能实现里,分别用单字循环显示、左右滚动显示、上下滚动显示三种显示方式单色显示四个汉字,三种功能的切换也需要用到计数器4,只需要把计数器4的最后一个状态制0就可。

功能:

计数器4是把clk的四个周期记做一个count,当检测到count的上升的时钟时,占空比或者状态发生变化,从而达到控制的作用。

(3)计数器8模块

设计原因:

首先8*8的点阵行和列都有8个输出,需要用计数器8的输出时钟来控制,当检测到计数器8的时钟沿上升时,则输出一行或者列。

功能:

用来控制点阵8row行输出,还有8colr和colg列的输出。

(4)占空比模块

设计原因:

第一个功能的亮度四级可调,四种不同的亮度需要通过四种不同的占空比来调节实现。

还有第二个功能的8级渐变色,8种颜色的变化,也是通过发光二极管红色和绿色两种颜色的占空比不同来达到混合后的8种不同颜色。

最有提高要求里的滚动显示过程中实现四种显示颜色的自动变换,是四个不同的字,红绿颜色有四种不同的占空比实现的。

功能:

占空比实际上就是正脉冲的持续时间与脉冲总周期的一个比值。

占空比越大,高电平持续的时间也就越长,亮度也就越强。

(5)分频模块

设计原因:

由于实验板只能提供25MHz的时钟信号,而电路中只能使用较低频率的时钟:

功能:

用于将实验板上的25MHz的时钟信号经分频后输出

(6)移动模块

设计原因:

定义滚动控制,一个gundong2的取值范围是0到3,控制的单字的扫描,一次移动8列,计数器8每检测到一个上升沿即输出一列,到计数器记完它的一个周期8时,点阵也就完整的输出了一个字,此时移动一次为8位。

一个gundong1的取值范围是0到31,用来控制行和列的扫描。

即计数器8每输出一列,则移动一行或者一列,从而达到单字循环显示、左右滚动显示、上下滚动显示三种显示方式。

不过,最后为了方便,把这个模块移进了计数器8的设计模块里。

功能:

每检测到时钟的上升沿,gundong计数加1,行扫描实现左移,是通过每来一个移位时钟,将每一行按位左移一位,扫描时钟到来时则开始移位。

通过8次移位,可将一个汉字移出点阵平面,按类似的道理,也可以将一个汉字经8次移位后移进点阵平面。

(7)功能实现模块

设计原因和功能:

实现四个功能。

第一个功能固定红色显示一个汉字或图形,显示亮度4级可调,通过四种不同的占空比调节亮度,输出仅需要用到红色的发光二极管。

用从红到绿8级渐变色显示一个固定汉字或图形,通过八种不同的占空比来控制两种颜色的输出,调和出8种不同的颜色。

分别用单字循环显示、左右滚动显示、上下滚动显示三种显示方式单色显示四个汉字或图形,通过行扫描,列扫描检测到计数器8的时钟和移位的位数来控制三种不同的滚动模式。

滚动显示过程中实现四种显示颜色的自动变换,只需要将输出颜色的占空比加入到三种不同的滚动模式里面就可以了。

 

五、程序代码

防抖模块源代码:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityfangdouis

port(

clk:

instd_logic;

reset:

instd_logic;

resetn:

outstd_logic);

endfangdou;

architectureaoffangdouis

signalresetmp1,resetmp2:

std_logic;

begin

process(clk)

begin

if(clk'eventandclk='0')then

resetmp2<=resetmp1;

resetmp1<=reset;

endif;

endprocess;

resetn<=clkandresetmp1and(notresetmp2);

enda;

计数器4模块源代码:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityjishu4is

port(

clk:

instd_logic;

cnt4:

outintegerrange0to7);

endjishu4;

architectureaofjishu4is

begin

process(clk)

variablecount:

integerrange0to3;--Count为中间变量,给cnt4赋值

begin

if(clk'eventandclk='1')then

ifcount=3thencount:

=0;

else

count:

=count+1;

endif;

endif;

cnt4<=count;

endprocess;

enda;

计数器8模块源代码:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityjishuqi8is

port(

clk:

instd_logic;

cnt8:

outintegerrange0to7);

endjishuqi8;

architectureaofjishuqi8is

begin

process(clk)

variablecount:

integerrange0to7;--中间变量,Count为中间变量,给cnt8赋值

begin

if(clk'eventandclk='1')then

ifcount=7thencount:

=0;

else

count:

=count+1;

endif;

endif;

cnt8<=count;

endprocess;

enda;

占空比模块源代码:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityzhankongbiis--亮度四级可调的设置

port(

clk:

INSTD_LOGIC;

pwm1:

outstd_logic;--Pwm为count计数时钟占空比的控制

pwm2:

outstd_logic;

pwm3:

outstd_logic;

pwm4:

outstd_logic);

endzhankongbi;

architectureaofzhankongbiis

begin

process(clk)

variablecount:

integerrange0to49;--下载可用49999

begin

ifclk'eventandclk='1'then

ifcount=49

thencount:

=0;

elsecount:

=count+1;

endif;

endif;

ifclk'eventandclk='1'then

ifcount<40

thenpwm1<='1';

elsepwm1<='0';

endif;

endif;

ifclk'eventandclk='1'then

ifcount<30

thenpwm2<='1';

elsepwm2<='0';

endif;

endif;

ifclk'eventandclk='1'then

ifcount<20

thenpwm3<='1';

elsepwm3<='0';

endif;

endif;

ifclk'eventandclk='1'then

ifcount<10

thenpwm4<='1';

elsepwm4<='0';

endif;

endif;

endprocess;

enda;

分频模块源代码:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityfenpinis

port(

clk:

instd_logic;

clkout:

outstd_logic);

endfenpin;

architectureaoffenpinis

signalxinhao:

std_logic;

begin

process(clk)

variablecount:

integerrange0to9;--仿真可取50hz到100hz,下载时可为249

begin

ifclk'eventandclk='1'then

ifcount=9then

count:

=0;

xinhao<=notxinhao;

elsecount:

=count+1;

endif;

endif;

clkout<=xinhao;

endprocess;

enda;

移动模块源代码:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitygundongis

port(

clk:

instd_logic;

gundong1:

outintegerrange0to31;--水平滚动垂直滚动的扫描

gundong2:

outintegerrange0to3);--单字滚动的扫描

endgundong;

architectureaofgundongis

begin

process(clk)

variablecount1:

integerrange0to31;

variablecount2:

integerrange0to3;

begin

if(clk'eventandclk='1')

then

ifcount1=31

thencount1:

=0;

elsecount1:

=count1+1;

endif;

ifcount2=3

thencount2:

=0;

elsecount2:

=count2+1;

endif;

endif;

gundong1<=count1;

gundong2<=count2;

endprocess;

enda;

功能实现模块源代码:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityTranslationis

port(

swt:

instd_logic_vector(1downto0);

cnt4:

inintegerrange0to3;

cnt8:

inintegerrange0to7;

dz4:

inintegerrange0to3;--单字滚动的

color32:

inintegerrange0to31;--水平滚动,垂直滚动

pwm1:

instd_logic;

pwm2:

instd_logic;

pwm3:

instd_logic;

pwm4:

instd_logic;

pwm5:

instd_logic;

pwm6:

instd_logic;

row:

outstd_logic_vector(7downto0);

colr:

outstd_logic_vector(7downto0);

colg:

outstd_logic_vector(7downto0)

);

endTranslation;

architectureprojectofTranslationis

typerisarray(7downto0)ofstd_logic_vector(38downto0);

typer1isarray(38downto0)ofstd_logic_vector(7downto0);

signalset:

r;

signalsetud:

r1;

begin

set<=(

"000000000111110011111111001010100000000",--水平滚动的定义

"000000000010010001010010001010100000000",

"000000000010010000110100001010100000000",

"011111100011111011111110001010100111111",

"000000000000001000010000001010100000000",

"000000001111111000010000001010100000000",

"000000000000101000010000010010100000000",

"000000000000011000010000100010100000000"

);

setud<=(

"00000000",--垂直滚动的定义

"00000000",

"00000000",

"01111110",

"00000000",

"00000000",

"00000000",

"00000000",

"01111100",

"00100100",

"00100100",

"00111110",

"00000010",

"11111110",

"00001010",

"00000110",

"11111111",

"01010010",

"00110100",

"11111110",

"00010000",

"00010000",

"00010000",

"00010000",

"00101010",

"00101010",

"00101010",

"00101010",

"00101010",

"00101010",

"01001010",

"10001010",

"00000000",

"00000000",

"00000000",

"01111110",

"00000000",

"00000000",

"00000000"

);

process(cnt8)

begin

casecnt8is

when0=>row<="01111111";--所有行的取值情况

when1=>row<="10111111";

when2=>row<="11011111";

when3=>row<="11101111";

when4=>row<="11110111";

when5=>row<="11111011";

when6=>row<="11111101";

when7=>row<="11111110";

whenothers=>row<="11111111";

endcase;

endprocess;

process(cnt4,swt,cnt8,pwm1,pwm2,pwm3,pwm4,pwm5,pwm6,dz4,color32,set,setud)

variablelight:

std_logic;

begin

ifswt="00"then--light

casecnt4is

when0=>light:

='1';--亮度的调节

when1=>light:

=pwm6;

when2=>light:

=pwm4;

when3=>light:

=pwm1;

whenothers=>light:

='0';

endcase;

colg<="00000000";

iflight='1'then--heart

casecnt8is

when0=>colr<="01000010";

when1=>colr<="11100111";

when2=>colr<="11111111";

when3=>colr<="11111111";

when4=>colr<="11111111";

when5=>colr<="01111110";

when6=>colr<="00111100";

when7=>colr<="00011000";

whenothers=>colr<="00000000";--实现第一种功能固定红字的四级亮度可调

endcase;

elsecolr<="00000000";

endif;

endif;

ifswt="01"then--8level

casecnt8is--运用红绿两种颜色的占空比不同,从而实现8种颜色的渐变

when0=>colr<="01000010";colg<="00000000";--实现第二种功能,八种颜色可变

when1=>ifpwm6='1'thencolr<="11100111";colg<="00000000";elsecolr<="00000000";colg<="11100111";endif;

when2=>ifpwm5='1'thencolr<="11111111";colg<="00000000";elsecolr<="00000000";colg<="11111111";endif;

when3=>ifpwm4='1'thencolr<="11111111";colg<="00000000";elsecolr<="00000000";colg<="11111111";endif;

when4=>ifpwm3='1'thencolr<="11111111";colg<="000000

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1