北邮数电实验报告 双色点阵显示控制器.docx
《北邮数电实验报告 双色点阵显示控制器.docx》由会员分享,可在线阅读,更多相关《北邮数电实验报告 双色点阵显示控制器.docx(50页珍藏版)》请在冰豆网上搜索。
北邮数电实验报告双色点阵显示控制器
数字电路与逻辑设计
实验设计方案
题目:
双色点阵显示控制器
一、设计思路
⏹基本要求:
1.固定红色显示一个汉字或图形,显示亮度4级可调,用一个btn按钮实现亮度调节,亮度变化视觉效果要尽量明显。
2.用从红到绿8级渐变色显示一个固定汉字或图形。
3.分别用单字循环显示、左右滚动显示、上下滚动显示三种显示方式单色显示四个汉字或图形,显示过程中,显示方式用一个btn按键进行切换。
4.显示的图形或汉字要尽量饱满美观。
⏹提高要求:
5.滚动显示过程中实现四种显示颜色的自动变换,颜色变化视觉效果要尽量明显。
6.自拟其它功能。
二、系统设计
总体框图
方框图(模块划分)
ASM图
MDS图
三、仿真波形及仿真分析
1.时钟分频
分析:
这个进程组用于产生不同频率的时钟用于不同用途的时钟信号,图中所表达的也是如此,不同频率的时钟信号。
对于lightness信号来说,它是一个低分频的,可控占空比的信号,图中所示为占空比为80%时的信号。
2.防抖
分析:
Mode_in和intensity_in信号有短时间的抖动现象,在经过防抖之后,短时间的抖动并不会影响mode和intensity信号。
Mode_in和intensity_in信号有长时间的高电平,这会使控制电路既要检测上升沿又要检测下降沿。
经过防抖程序之后,将控制信号mode和intensity处理成脉冲信号,这样控制电路只需检测是否有正脉冲就可以了。
3.状态控制与亮度调节
分析:
每当mode信号有一个正脉冲时,state就变化一次。
每当intensity信号有一个正脉冲时,lightness就改变一次占空比。
4.颜色改变
分析:
当状态改变到S1的时候,占空比信号才会改变。
从图中可以看出,可控占空比信号是每八个时间单位为一组,这八个时间单位分别代表着第一行被选中、第二行被选中、……第八行被选中。
当第一行被选中时,可以清楚看到红色和绿色控制信号的占空比是不同的,这样就会导致点阵点的颜色中红色成分和绿色成分亮度不同,从而改变其颜色。
5.字符显示部分
分析:
从图中可以看出,当模式切换后,列内容信号会被赋予不同的值,且随时间而改变。
6.显示部分
分析:
从图中可以看出,各个信号之间的逻辑关系符合代码中的表达式。
四、源程序(含注释)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYpointmatrixIS
PORT(
clk:
INSTD_LOGIC;
mode_in:
INSTD_LOGIC;
intensity_in:
INSTD_LOGIC;
row:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
red_col:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
green_col:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDpointmatrix;
ARCHITECTUREaOFpointmatrixIS
TYPEall_stateIS(S0,S1,S2,S3,S4);
SIGNALstate:
all_state;
SIGNALclk_move:
STD_LOGIC;
SIGNALclk_div:
STD_LOGIC;
SIGNALclk_occupy:
STD_LOGIC;
SIGNALclk_temp:
STD_LOGIC;
SIGNALclk_lightness:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALdata0,data1,data2,data3,data4,data5,data6,data7:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALdata_row:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALdata_col:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALgr_occupy:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALre_occupy:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALmode:
STD_LOGIC;
SIGNALintensity:
STD_LOGIC;
SIGNALoccupy_count:
INTEGERRANGE0TO100;
SIGNALtmp1,tmp2,tmp3,tmp4:
STD_LOGIC;
BEGIN
div_move:
PROCESS(clk)--用于防抖的分频
VARIABLEcount:
INTEGERRANGE0TO25000000;
BEGIN
IFclk'EVENTANDclk='1'THEN
IFcount=9999999THEN
count:
=0;
ELSE
count:
=count+1;
ENDIF;
IFcount<5000000THEN
clk_move<='1';
ELSE
clk_move<='0';
ENDIF;
ENDIF;
ENDPROCESSdiv_move;
div_occupy:
PROCESS(clk)--控制占空比进程和数码管显示的高频时钟
VARIABLEcount:
INTEGERRANGE0TO25000000;
BEGIN
IFclk'EVENTANDclk='1'THEN
IFcount=19999THEN
count:
=0;
ELSE
count:
=count+1;
ENDIF;
IFcount<10000THEN
clk_occupy<='1';
ELSE
clk_occupy<='0';
ENDIF;
ENDIF;
ENDPROCESSdiv_occupy;
div_clk:
PROCESS(clk)--控制字符图形显示的高频时钟
VARIABLEcount:
INTEGERRANGE0TO25000000;
BEGIN
IFclk'EVENTANDclk='1'THEN
IFcount=159999THEN
count:
=0;
ELSE
count:
=count+1;
ENDIF;
IFcount<80000THEN
clk_div<='1';
ELSE
clk_div<='0';
ENDIF;
ENDIF;
ENDPROCESSdiv_clk;
div_temp:
PROCESS(clk)--用于防抖进程组和检测输入信号的中频时钟
VARIABLEcount:
INTEGERRANGE0TO25000000;
BEGIN
IFclk'EVENTANDclk='1'THEN
IFcount=255THEN
count:
=0;
ELSE
count:
=count+1;
ENDIF;
IFcount<128THEN
clk_temp<='1';
ELSE
clk_temp<='0';
ENDIF;
ENDIF;
ENDPROCESSdiv_temp;
in_mode:
PROCESS(mode_in,clk_temp,tmp1,tmp2)--按键防抖1
BEGIN
IFclk_temp'eventANDclk_temp='0'THEN
tmp1<=tmp2;
tmp2<=mode_in;
ENDIF;
mode<=clk_tempANDtmp2AND(NOTtmp1);
ENDPROCESSin_mode;
in_intensity:
PROCESS(intensity_in,clk_temp,tmp3,tmp4)--按键防抖2
BEGIN
IFclk_temp'eventANDclk_temp='0'THEN
tmp3<=tmp4;
tmp4<=intensity_in;
ENDIF;
intensity<=clk_tempANDtmp4AND(NOTtmp3);
ENDPROCESSin_intensity;
state_choose:
PROCESS(mode)--状态机状态选择
BEGIN
IFmode'EVENTANDmode='1'THEN
CASEstateIS
WHENS0=>state<=S1;
WHENS1=>state<=S2;
WHENS2=>state<=S3;
WHENS3=>state<=S4;
WHENS4=>state<=S0;
ENDCASE;
ENDIF;
ENDPROCESSstate_choose;
intensity_choose:
PROCESS(intensity)
BEGIN
IFintensity'EVENTANDintensity='1'THEN
CASEoccupy_countIS
WHEN100=>occupy_count<=50;
WHEN50=>occupy_count<=25;
WHEN25=>occupy_count<=12;
WHEN12=>occupy_count<=100;
WHENOTHERS=>occupy_count<=100;
ENDCASE;
ENDIF;
ENDPROCESSintensity_choose;
div_clk_lightness:
PROCESS(clk,occupy_count)--单字调节亮度
VARIABLEcount:
INTEGERRANGE0TO25000000;
BEGIN
IFclk'EVENTANDclk='1'THEN
IFcount=99THEN
count:
=0;
ELSE
count:
=count+1;
ENDIF;
IFcountclk_lightness<="00000000";
ELSE
clk_lightness<="11111111";
ENDIF;
ENDIF;
ENDPROCESSdiv_clk_lightness;
load_data:
PROCESS(clk_move,state)--设置显示状态
VARIABLEcount:
INTEGERRANGE0TO31;
VARIABLEcount1:
INTEGERRANGE0TO3;
BEGIN
IFclk_move'EVENTANDclk_move='1'THEN
IFcount1=3THEN
count1:
=0;
ELSE
count1:
=count1+1;
ENDIF;
IFcount=31THEN
count:
=0;
ELSE
count:
=count+1;
ENDIF;
ENDIF;
CASEstateIS
WHENS0=>
data0<="01100110";
data1<="11111111";
data2<="11111111";
data3<="01111110";
data4<="00111100";
data5<="00011000";
data6<="00011000";
data7<="00011000";
WHENS1=>
data0<="01100110";
data1<="11111111";
data2<="11111111";
data3<="01111110";
data4<="00111100";
data5<="00011000";
data6<="00011000";
data7<="00011000";
WHENS2=>
CASEcount1IS
WHEN0=>
data0<="11111110";
data1<="10000001";
data2<="10000001";
data3<="11111110";
data4<="11111110";
data5<="10000001";
data6<="10000001";
data7<="11111110";
WHEN1=>
data0<="11000011";
data1<="11000011";
data2<="11000011";
data3<="11000011";
data4<="11000011";
data5<="01100110";
data6<="00111100";
data7<="00011000";
WHEN2=>
data0<="11111100";
data1<="10000010";
data2<="10000001";
data3<="10000010";
data4<="11111100";
data5<="10000000";
data6<="10000000";
data7<="10000000";
WHEN3=>
data0<="11111111";
data1<="11111111";
data2<="00011000";
data3<="00011000";
data4<="00011000";
data5<="00011000";
data6<="00011000";
data7<="00011000";
ENDCASE;
WHENS3=>
CASEcountIS
WHEN0=>
data0<="11111110";
data1<="10000001";
data2<="10000001";
data3<="11111110";
data4<="11111110";
data5<="10000001";
data6<="10000001";
data7<="11111110";
WHEN1=>
data0<="11111101";
data1<="00000011";
data2<="00000011";
data3<="11111101";
data4<="11111101";
data5<="00000010";
data6<="00000010";
data7<="11111100";
WHEN2=>
data0<="11111011";
data1<="00000111";
data2<="00000111";
data3<="11111011";
data4<="11111011";
data5<="00000101";
data6<="00000100";
data7<="11111000";
WHEN3=>
data0<="11110110";
data1<="00001110";
data2<="00001110";
data3<="11110110";
data4<="11110110";
data5<="00001011";
data6<="00001001";
data7<="11110000";
WHEN4=>
data0<="11101100";
data1<="00011100";
data2<="00011100";
data3<="11101100";
data4<="11101100";
data5<="00010110";
data6<="00010011";
data7<="11100001";
WHEN5=>
data0<="11011000";
data1<="00111000";
data2<="00111000";
data3<="11011000";
data4<="11011000";
data5<="00101100";
data6<="00100111";
data7<="11000011";
WHEN6=>
data0<="10110000";
data1<="01110000";
data2<="01110000";
data3<="10110000";
data4<="10110000";
data5<="01011001";
data6<="01001111";
data7<="10000110";
WHEN7=>
data0<="01100001";
data1<="11100001";
data2<="11100001";
data3<="01100001";
data4<="01100001";
data5<="10110011";
data6<="10011110";
data7<="00001100";
WHEN8=>
data0<="11000011";
data1<="11000011";
data2<="11000011";
data3<="11000011";
data4<="11000011";
data5<="01100110";
data6<="00111100";
data7<="00011000";
WHEN9=>
data0<="10000111";
data1<="10000111";
data2<="10000111";
data3<="10000111";
data4<="10000111";
data5<="11001101";
data6<="01111001";
data7<="00110001";
WHEN10=>
data0<="00001111";
data1<="00001110";
data2<="00001110";
data3<="00001110";
data4<="00001111";
data5<="10011010";
data6<="11110010";
data7<="01100010";
WHEN11=>
data0<="00011111";
data1<="00011100";
data2<="00011100";
data3<="00011100";
data4<="00011111";
data5<="00110100";
data6<="11100100";
data7<="11000100";
WHEN12=>
data0<="00111111";
data1<="00111000";
data2<="00111000";
data3<="00111000";
data4<="00111111";
data5<="01101000";
data6<="11001000";
data7<="10001000";
WHEN13=>
data0<="01111111";
data1<="01110000";
data2<="01110000";
data3<="01110000";
data4<="01111111";
data5<="11010000";
data6<="10010000";
data7<="00010000";
WHEN14=>
data0<="11111111";
data1<="11100000";
data2<="11100000";
data3<="11100000";
data4<="11111111";
data5<="10100000";
data6<="0010