双色点阵显示控制器数字电路实验报告

上传人:无*** 文档编号:78545054 上传时间:2022-04-22 格式:DOC 页数:25 大小:363.50KB
返回 下载 相关 举报
双色点阵显示控制器数字电路实验报告_第1页
第1页 / 共25页
双色点阵显示控制器数字电路实验报告_第2页
第2页 / 共25页
双色点阵显示控制器数字电路实验报告_第3页
第3页 / 共25页
点击查看更多>>
资源描述
数字电路实验报告双色点阵显示控制器 班级: 学号: 姓名: 2013年11月12号目录一、 设计任务要求二、 系统设计三、 仿真波形及分析四、 源程序五、 功能说明六、 元器件清单及资源利用情况七、故障及问题分析八、总结和结论一、设计任务要求1、基本要求:1.固定红色显示一个汉字或图形,显示亮度4级可调,用一个btn按钮实现亮度调节,亮度变化视觉效果要尽量明显。2.用从红到绿8级渐变色显示一个固定汉字或图形。3.分别用单字循环显示、左右滚动显示、上下滚动显示三种显示方式单色显示四个汉字或图形,显示过程中,显示方式用一个btn按键进行切换。4,。显示的图形或汉字要尽量饱满美观。 2、提高要求:1.滚动显示过程中实现四种显示颜色的自动变换,颜色变化视觉效果要尽量明显。2.自拟其它功能。二、系统设计1、设计框图1、 系统结构框图本系统主要由三个模块组成,其中控制器用于控制程序运行、储存当前状态并控制输出显示,点阵用于显示游戏界面,按钮输入用于输入控制信息。2、逻辑划分方框图3、系统流程图4、MDS图 游戏运行状态的具体状态转移图三、仿真波形及波形分析逐行扫描,并点亮红灯,改变红灯的占空比可以得到不同亮度的显示。逐行扫描,并点亮红绿灯,改变红绿灯的占空比可以得到不同颜色的显示。上下及左右滚动显示,因为显示变化时延过长,波形过密,不方便显示。按一次键,只产生一个脉冲,脉冲宽度为防抖动时钟的脉宽。四、源程序及注释library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity dianzhen isport( clk:in std_logic; dtn1:in std_logic; dtn2:in std_logic; dtn3:in std_logic;row:out std_logic_vector (7 downto 0); listr:out std_logic_vector (7 downto 0);listg:out std_logic_vector (7 downto 0);end dianzhen ;architecture a of dianzhen issignal temp:integer range 0 to 99:=0;signal temp1:integer range 0 to 9:=0;signal temp2:integer range 0 to 9:=0;signal temp3:integer range 0 to 49:=0;signal temp4:integer range 0 to 9:=0;signal temp5:integer range 0 to 99:=0;signal clk_500K:STD_LOGIC;signal clk_50K:STD_LOGIC;signal clk_5K:STD_LOGIC;signal clk_1K:STD_LOGIC;signal clk_100:STD_LOGIC;signal clk_1:STD_LOGIC;signal num:std_logic_vector (2 downto 0):=000; signal num1:integer range 0 to 1119;signal num2:integer range 0 to 31:=0;signal num3:std_logic_vector (2 downto 0):=000;signal count:integer range 0 to 499;signal count1:integer range 0 to 49; signal j:integer range 0 to 499;signal i:integer range 0 to 31:=0; signal kind:std_logic_vector (1 downto 0):=00;signal color:std_logic_vector (1 downto 0):=00;signal sel:std_logic_vector (2 downto 0); signal sel1:STD_LOGIC:=0;signal sel2:STD_LOGIC:=0;signal sel3:STD_LOGIC:=0;signal resetmp1,resetmp2:STD_LOGIC:=0;signal resetmp3,resetmp4:STD_LOGIC:=0;signal resetmp5,resetmp6:STD_LOGIC:=0;signal flag:STD_LOGIC:=0;signal flag2:STD_LOGIC:=0;signal flag3:STD_LOGIC:=0;type vol_type is array(38 downto 0)of std_logic_vector(7 downto 0);type sol_type is array(31 downto 0)of std_logic;signal vol:vol_type:=( -luck字库 01111110, 01000000,01000000, 01000000, 01000000,01000000,00000000, 00000000, 01001100,01010000,01100000,01100000,01010000,01001100,00000000,00000000,00111100,01000010,01000000,01000000,01000010, 00111100,00000000,00000000,00111100,01000010,01000010,01000010,01000010,01000010,00000000,00000000,01111110,01000000,01000000,01000000,01000000,01000000, 00000000);Signal sol0:sol_type:=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0); -good字库 用于水平滚动显示signal sol1:sol_type:=(0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0, 0,0,1,1,1,1,0,0, 0,0,1,1,1,0,0,0);signal sol2:sol_type:=(0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0, 0,1,0,0,0,0,1,0, 0,1,0,0,0,1,0,0);signal sol3:sol_type:=(0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0, 0,1,0,0,0,0,1,0, 0,1,0,0,0,0,0,0);signal sol4:sol_type:=(0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0, 0,1,0,0,0,0,1,0, 0,1,0,0,1,1,1,0);signal sol5:sol_type:=(0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0, 0,1,0,0,0,0,1,0, 0,1,0,0,0,1,0,0);Signal sol6:sol_type:=(0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0, 0,0,1,1,1,0,0,0);Signal sol7:sol_type:=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0);beginprocess(clk) -分频器 500K beginif clkevent and clk=1 then if temp=99 then temp=0; else temp=temp+1;end if; if temp50 then clk_500K=1; else clk_500K=0; end if;end if;end process;process(clk_500K) -分频器 50K beginif clk_500Kevent and clk_500K=1 then if temp1=9 then temp1=0; else temp1=temp1+1;end if; if temp15 then clk_50K=1; else clk_50K=0; end if;end if;end process;process(clk_50K) -分频器 5K beginif clk_50Kevent and clk_50K=1 then if temp2=9 then temp2=0; else temp2=temp2+1;end if; if temp25 then clk_5K=1; else clk_5K=0; end if;end if;end process;process(clk_50K) -分频器 1K beginif clk_50Kevent and clk_50K=1 then if temp3=49 then temp3=0; else temp3=temp3+1;end if; if temp325 then clk_1K=1; else clk_1K=0; end if;end if;end process;process(clk_1K) -分频器 100 beginif clk_1Kevent and clk_1K=1 then if temp4=9 then temp4=0; else temp4=temp4+1;end if; if temp45 then clk_100=1; else clk_100=0; end if;end if;end process;process(clk_100)-分频器 1 beginif clk_100event and clk_100=1 then if temp5=99 then temp5=0; else temp5=temp5+1;end if; if temp550 then clk_1=1; else clk_1=0; end if;end if;end process;process(clk_500K) -显示红字beginif clk_500Kevent and clk_500K=1 thenif sel3=1 then if count=499 then count=0; else count=count+1; end if; if num=111 then num=000; else num jjjjnull; end case; if countrow=01111111; listr=10011001;listgrow=10111111; listr=01011010;listgrow=11011111; listr=00111100;listgrow=11101111; listr=11111111;listgrow=11110111; listr=11111111;listgrow=11111011; listr=00111100;listgrow=11111101; listr=01011010;listgrow=11111110; listr=10011001;listgrow=11111111;listr=00000000;listg=00000000; end case; else row=11111111; end if; end if; if sel1=1 then -显示彩色字 if num1=1119 then num1=0; else num1row=01111111; listr=10011001;listgrow=10111111; listr=01011010;listglistglistrrow=11011111; listr=00111100;listglistglistrrow=11101111; listr=11111111;listglistglistrrow=11110111; listr=11111111;listglistrlistgrow=11111011; listr=00111100;listglistrlistgrow=11111101; listr=01011010;listglistrlistgrow=11111110; listr=00000000;listgnull; end case;end if; if sel2=1 then -三种循环显示模式 if count1=49 then if num3=111 then num3=000; else num3 = num3+1; end if; count1=0; else count1=count1+1;end if; if kind=00 then -分屏显示 if (0=num2)and(num2=5) then i=0; elsif (6=num2)and(num2=11) then i=8; elsif (12=num2)and(num2=17) then i=16; elsif (18=num2)and(num2=23) then irow=01111111; listr=vol(i);listgrow=10111111; listr=vol(i+1);listgrow=11011111; listr=vol(i+2);listgrow=11101111; listr=vol(i+3);listgrow=11110111; listr=vol(i+4);listgrow=11111011; listr=vol(i+5);listgrow=11111101; listr=vol(i+6);listgrow=11111110; listr=vol(i+7);listgrow=11111111;listr=00000000; end case; end if; if kind=01 then -上下滚动显示 i case num3 iswhen000=row=01111111; listr=vol(i);listgrow=10111111; listr=vol(i+1);listgrow=11011111; listr=vol(i+2);listgrow=11101111; listr=vol(i+3);listgrow=11110111; listr=vol(i+4);listgrow=11111011; listr=vol(i+5);listgrow=11111101; listr=vol(i+6);listgrow=11111110; listr=vol(i+7);listgrow=11111111;listr case num3 iswhen000=row=01111111; listr=vol(i);if count125 then listg=vol(i);else listgrow=10111111; listr=vol(i+1); if count125 then listg=vol(i+1);else listgrow=11011111; listr=vol(i+2); if count125 then listg=vol(i+2); else listgrow=11101111; listr=vol(i+3); if count125 then listg=vol(i+3); else listgrow=11110111; listr=vol(i+4); if count125 then listg=vol(i+4);else listgrow=11111011; listr=vol(i+5); if count125 then listg=vol(i+5); else listgrow=11111101; listr=vol(i+6); if count125 then listg=vol(i+6); else listgrow=11111110; listr=vol(i+7); if count125 then listg=vol(i+7); else listgrow=11111111;listr case num3 iswhen000=row=01111111; listg=vol(i);if count125 then listr=vol(i);else listrrow=10111111; listg=vol(i+1);if count125 then listr=vol(i+1);else listrrow=11011111; listg=vol(i+2);if count125 then listr=vol(i+2);else listrrow=11101111; listg=vol(i+3);if count125 then listr=vol(i+3); else listrrow=11110111; listg=vol(i+4);if count125 then listr=vol(i+4);else listrrow=11111011; listg=vol(i+5);if count125 then listr=vol(i+5); else listrrow=11111101; listg=vol(i+6);if count125 then listr=vol(i+6); else listrrow=11111110; listg=vol(i+7);if count125 then listr=vol(i+7); else listrrow=11111111;listg case num3 iswhen000=row=01111111; listgrow=10111111; listgrow=11011111; listgrow=11101111; listgrow=11110111; listgrow=11111011; listgrow=11111101; listgrow=11111110; listgrow=11111111;listgrow=11111111;listg=00000000;end case;end if; if kind=10 then -左右滚动显示 listg=00000000; irow=01111111; listr(0)=sol0(i);listr(1)=sol0(i+1);listr(2)=sol0(i+2);listr(3)=sol0(i+3); listr(4)=sol0(i+4);listr(5)=sol0(i+5);listr(6)=sol0(i+6);listr(7)row=10111111; listr(0)=sol1(i);listr(1)=sol1(i+1);listr(2)=sol1(i+2);listr(3)=sol1(i+3);listr(4)=sol1(i+4);listr(5)=sol1(i+5);listr(6)=sol1(i+6);listr(7)row=11011111; listr(0)=sol2(i);listr(1)=sol2(i+1);listr(2)=sol2(i+2);listr(3)=sol2(i+3);listr(4)=sol2(i+4);listr(5)=sol2(i+5);listr(6)=sol2(i+6);listr(7)row=11101111;listr(0)=sol3(i);listr(1)=sol3(i+1);listr(2)=sol3(i+2);listr(3)=sol3(i+3); listr(4)=sol3(i+4);listr(5)=sol3(i+5);listr(6)=sol3(i+6);listr(7)row=11110111;listr(0)=sol4(i);listr(1)=sol4(i+1);listr(2)=sol4(i+2);listr(3)=sol4(i+3);listr(4)=sol4(i+4);listr(5)=sol4(i+5);listr(6)=sol4(i+6);listr(7)row=11111011; listr(0)=sol5(i);listr(1)=sol5(i+1);listr(2)=sol5(i+2);listr(3)=sol5(i+3); listr(4)=sol5(i+4);listr(5)=sol5(i+5);listr(6)=sol5(i+6);listr(7)row=11111101; listr(0)=sol6(i);listr(1)=sol6(i+1);listr(2)=sol6(i+2);listr(3)=sol6(i+3);listr(4)=sol6(i+4);listr(5)=sol6(i+5);listr(6)=sol6(i+6);listr(7)row=11111110; listr(0)=sol7(i);listr(1)=sol7(i+1);listr(2)=sol7(i+2);listr(3)=sol7(i+3);listr(4)=sol7(i+4);listr(5)=sol7(i+5);listr(6)=sol7(i+6);listr(7)row=11111111;listr=00000000; end case; end if;end if;end if; end process;process(clk_1k) -按键防抖beginif clk_1kevent and clk_1k=1 then if flag=1 then flag=0;end if;if flag2=1 then flag2=0;end if;if flag3=1 then flag3=0;end if; resetmp2=resetmp1;resetmp1=dtn1;resetmp4=resetmp3;resetmp3=dtn2;resetmp6=resetmp5;resetmp5=dtn3;end if; flag=(not dtn1) and resetmp1 and resetmp2; flag2=(not dtn2) and resetmp3 and resetmp4; flag3=(not dtn3) and resetmp5 and resetmp6;end process;process(clk_1)beginif clk_1event and clk_1=1 then if color=11 then color=00; else color=color+1;end if; if num2=31 then num2=0; else num2=num2+1;end if;end if;end process;process(clk,flag,flag2,flag3) beginif clkevent and clk=1 thenif flag=1 then -调节亮度 if sel=011 then sel=000;else sel = sel+1;end if;sel1=0;sel2=0;sel3=1;end if;if flag2=1 then -彩色切换 sel=111; sel1=1; sel2=0;sel3=0;end if;if flag3=1 then -显示模式切换 if kind=10 then kind=00; else kind = kind+1; end if; sel=111; sel1=0; sel2=1;sel3=0;end if;end if;end process;end a;五、实现功能说明通过三个按键btn1,btn2,btn3 完成对双色点阵显示的操作。通电起始后,点阵不显示,随意按键后进入相对应的模式。Btn1对应切换亮度模式,按下后显示米字,再按下米字改变颜色,总共对应四种颜色。Btn2对应八色显示,按下后显示逐行不同色彩的米字。Btn3对应显示切换,一共有三种不同模式显示,分别是:1、 分屏显示,点阵中依次显示LUCK的英文字样。2、 上下滚动显示,点阵中自下而上滚动显示LUCK字样,同时每次变换后改变一次屏幕中显示的色彩。3、 左右滚动显示,点阵中自左往右滚动显示GOOD字样。六、元器件清单及资源利用情况1、使用的元器件芯片EPM1270T144C5按键3个Led点阵8*8个单元2、资源利用七、 故障及问题分析1、故障:防抖模块不灵敏,按下按键后可能发生了不止一次跳变。问题分析:设计防抖的时候按照老师给出的代码并经过了自己的修改,在前期使用的时候只注意了有效性,没注意灵敏的问题,到最后才发现灵敏上有问题。在排除故障时,发现对于不同的板子不同按键出现不同的效果,时好时坏,没有找出任何有价值的信息,经过个人感觉和推荐防抖扫描时延200ms左右,把防抖频率设在了100hz,最后只是很有限地提高一些按键防抖的效果。2、 故障:设计数组和管脚时没全面分析,导致出现以下上下颠倒的问题。问题分析:这是由于实验板的点阵设计不同导致的。在将点阵管脚的行与列相互对换之后,终于能够显示正常。但是在程序设计上就显的不友好,每次修改字符都需要仔细测试。3、 故障:波形仿真分频分析不好。4、 故障:功能分隔开运行时良好,组装时出现没显示的问题。问题分析:因为进程组合方法不合适,在最后调试的时候经常出现不运行或者错误显示的问题,经过一点一点不断修改程序,最后达成基本良好的运行成果。八、总结和结论在做实验前觉得这个实验无从下手,状态虽说是不复杂的,点阵的功能也看上去很相似,但是越分析才觉得自己需要知道的内容也不少。首先,要明白点阵的扫描显示方式,有些类似于数码管,一开始就按着数码管的原理去点亮点阵。等做到变色和彩色的时候才发现需要的不仅仅是点亮,必须协调好占空比,扫描,视觉残留之间的关系,这个发现导致前面的程序都作废了。再次是按键的防抖,防抖跟板子的关系太大了,三个按键做在同一个进程中,有的好用,有的就不灵敏,我觉得板子有关系,防抖的程序也不够好,这是我没有解决好的问题。此外,板子上的图案真正重要的是字符,真正能传递信息也是字符为主,所以我觉得相比其他图案还是把字符做好比较重要。这次实验给我的感触最深就是,课前一定要做好准备,比如把以前VDHL的知识复习一遍。再者,老师讲课的内容很重要,比如这次讲了状态机的设计。只有这样,才能在实验的过程中少走弯路。硬件编程语言不像软件轻松,它编译以及下载都需要比软件编译花的时间多,如果有些概念弄不清楚或者解决问题的方向不对,做实验摸索的时间就会大大增长,无形中也使实验过程变得繁琐,影响做实验的心态。这次实验我学到了不少实用的知识,更重要的是在做实验的过程中,思考问题的方法,以及分析,解决问题的能力。而且,这次实验还锻炼我在困难面前的耐性,让我学会了在一筹莫展时还能够冷静地分析问题。这次实验一波三折,从一开始认识不足到为了调试按键功能重写代码,在短短三周里很是锻炼了我的耐心,和分析设计硬件的显示和代码间的联系的能力。但是实验之后还是存在很多不懂的地方,比如没有细致的搞懂板子硬件间的联系,也不知道如何测试一个板子的好坏,程序可能也存在一些隐藏的bug,对排错还有很长的路要走,这些都是三周时间里没能完成的,感觉很遗憾,要是能够再给一些时间或者参考的内容或者老师能再给一些合适的案例和讲解或者推荐一些有参考价值的书籍,我觉得这次实验能够更顺利更圆满地完成。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 基础医学


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!