北邮数电实验报告 双色点阵显示控制器.docx

上传人:b****8 文档编号:10227413 上传时间:2023-02-09 格式:DOCX 页数:50 大小:277.21KB
下载 相关 举报
北邮数电实验报告 双色点阵显示控制器.docx_第1页
第1页 / 共50页
北邮数电实验报告 双色点阵显示控制器.docx_第2页
第2页 / 共50页
北邮数电实验报告 双色点阵显示控制器.docx_第3页
第3页 / 共50页
北邮数电实验报告 双色点阵显示控制器.docx_第4页
第4页 / 共50页
北邮数电实验报告 双色点阵显示控制器.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

北邮数电实验报告 双色点阵显示控制器.docx

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

北邮数电实验报告 双色点阵显示控制器.docx

北邮数电实验报告双色点阵显示控制器

数字电路与逻辑设计

实验设计方案

 

题目:

双色点阵显示控制器

 

一、设计思路

⏹基本要求:

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;

IFcount

clk_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

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

当前位置:首页 > 外语学习 > 日语学习

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

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