利用按键控制点阵进行十进制数字显示_第1页
利用按键控制点阵进行十进制数字显示_第2页
利用按键控制点阵进行十进制数字显示_第3页
利用按键控制点阵进行十进制数字显示_第4页
利用按键控制点阵进行十进制数字显示_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、中北大学课 程 设 计 说 明 书  学生姓名:郭士西学 号:0906024147学 院:电子与计算机科学技术学院 专 业:微电子学 题 目:利用按键控制点阵进行十进制数字显示   指导教师: 崔永俊 职称: 副教授  2012 年 6 月 22 日目 录1.课程设计目的22.课程设计内容及要求2 2.1设计内容2 2.2设计要求23.设计方案及实现情况2 3.1设计思路2 3.2工作原理及框图3 3.3各模块程序代码及仿真结果4 3.4实验箱验证情况204课程设计总结245.参考文献251、课程设计目的 (1)学

2、习操作数字电路设计实验开发系统,掌握点阵显示模块的工作原理及应用。(2)掌握组合逻辑电路、时序逻辑电路的设计方法。(3)学习掌握可编程器件设计的全过程。2、课程设计内容和要求2.1、设计内容 (1)学习掌握按键开关控制模块、点阵显示模块的工作原理及应用; (2)熟练掌握VHDL编程语言,编写按键开关控制模块的控制逻辑; (3)仿真所编写的程序,模拟验证所编写的模块功能; (4)下载程序到芯片中,硬件验证所设置的功能,能够实现十进制数字的显示。 (5) 整理设计内容,编写设计说明书。2.2、设计要求 (1)本课程设计说明书; (2)VHDL源程序及内部原理图; (3)该设计可以在实验箱上正常工作

3、并演示。 3、设计方案及实现情况3.1、设计思路 根据题目设计要求,由于整个过程的实现比较繁琐,所以采用模块化设计思想会更好些,对于不同的功能用不同的程序模块实现。各个模块之间保持相对独立,最终将各个模块合在一块,这样有利于对不同的功能模块进行理解个、分析、调试、仿真。利用按键开关控制点阵进行十进制数字显示,我们可以采用单个按键计数递增的形式进行显示,也可以利用十个按键,每个对应一个十进制数字,进行随意显示。我更倾向于十个按键同时使用,这是我的初衷。 我把整个系统分成四个模块,包括分频模块、消抖模块、列控制模块和显示模块。分频模块,我通过查找资料和参考试验箱把它设为1000分频,偶数分频比较容

4、易实现。消抖要十个键同时消抖,并且具有保持功能,所以这里需要斟酌一下,否则点阵不能一直点亮,这样就省去了锁存模块,一箭双雕。列扫描模块就是利用时钟上升沿信号对点阵进行逐列循环扫描,把这个信号给sel3到sel0作为选择信号。显示模块就是通过sel端口和按键消抖后的信号进行选择,属于扫描行信号。到此就可以很好的做以下细致的工作了。3.2、工作原理及框图 (1)工作原理 16×16 LED点阵由四块8×8 LED 点阵组成,共256个LED灯,只需要让对应的LED灯点亮,就可以汉字数字显示,如图1、2,列选择信号如表1. 图1.点阵实物图 表1. 图2.点亮示意图 SEL3SE

5、L2SEL1SEL0点亮列号1111第1列1110第2列1101第3列1100第4列1011第5列1010第6列1001第7列1000第8列0111第9列0110第10列0101第11列0100第12列0011第13列0010第14列0001第15列0000第16列 (2)系统连接图, 输入1MHz的时钟,分频为1K,消抖6ms 图3. 系统连接总图3.3、各模块的程序代码及仿真结果 (1)分频模块 由于我的是一千分频,在仿真上很难观察,所以我的仿真图是十分频的。 一千分频程序library ieee;Use ieee.std_logic_1164.all;use ieee.std_logic

6、_unsigned.all;entity fenpin is port(clk:in std_logic; clk_out:out std_logic);end fenpin;architecture fenpin_1 of fenpin issignal cnt:integer range 0 to 999:=0;begin process(clk) begin if clk'event and clk='1' then -上升沿有效 if cnt=999 then -从0到999为一千 cnt <= 0; else cnt <= cnt+1; end i

7、f; end if; end process;process(cnt)beginif cnt<500 then clk_out<='0'-0到499为低电平else clk_out<='1'end if;end process;end fenpin_1;图4. 十分频仿真波形仿真图 (2)消抖模块 程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity xiaodou isport(clk,rst:in std_logic; key_in

8、:in std_logic_vector(0 to 9); -按键输入 key_out:out std_logic_vector(0 to 9);-经消抖按键输出end xiaodou;architecture rt1 of xiaodou issignal num:integer range 0 to 5; -计6次消抖,为6msbeginprocess(clk)beginif(rst='0') thenif(clk'event and clk='1') then if(key_in/="1111111111")then -说明有键

9、按下if (num=5)then num<=0;key_out<=key_in; -计满6次说明有效else num<=num+1;end if;elsenum<=0;-无键按下保持上次的值,计数清0end if;end if;elsenum<=0;key_out<="1111111111"end if;end process;end rt1; 从图5我们看到只要有键按下,那么就一直有一个输出低电平信号,这说明点阵可以保持点亮状态。并且key_in1持续六个周期,产生了低电平,而key_in2持续了5个周期,没产生低电平说明消抖确实是六次

10、即6ms,成功实现消抖。图5.按键消抖仿真图形 (3)列扫描模块 程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity lie isport(clk:in std_logic; sel:out std_logic_vector(3 downto 0);end lie; architecture control_1 of lie isbeginprocess(clk) variable tmp:std_logic_vector(3 downto 0);beginif clk'ev

11、ent and clk='1' then if tmp="1111" then-循环16进制计数 tmp:="0000" else tmp:=tmp+1; end if;end if;sel<=tmp-1;end process;end control_1; 仿真图6 列扫描仿真结果 (4)显示模块 程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity xianshi isport( key_out:in std_logi

12、c_vector(0 to 9);-按键信号 sel:in std_logic_vector(3 downto 0);-列扫描信号dout:out std_logic_vector(15 downto 0);-输出控制行,进行相应显示end xianshi; architecture xianshi_1 of xianshi isbegin process(key_out,sel)-把按键和列扫描信号作为敏感信号 begin case key_out is when "0111111111"=> case sel is when "0000"=&g

13、t;dout<="0000000000000000" when "0001"=>dout<="0000000000000000" when "0010"=>dout<="0000000000000000" when "1100"=>dout<="0000000000000000" when "1101"=>dout<="0000000000000000" when

14、 "1110"=>dout<="0000000000000000" when "1111"=>dout<="0000000000000000"-显示0 when others=>null; end case; when "1011111111"=> case sel is when "0000"=>dout<="0000000000000000" when "0001"=>dout&

15、lt;="0000000000000000" when "0010"=>dout<="0000000000000000" when "0011"=>dout<="0000000000000000" when "0100"=>dout<="0000000000000000" when "1001"=>dout<="0000000000000000" when "

16、1010"=>dout<="0000000000000000" when "1011"=>dout<="0000000000000000" when "1100"=>dout<="0000000000000000" when "1101"=>dout<="0000000000000000" when "1110"=>dout<="00000000000000

17、00" when "1111"=>dout<="0000000000000000"-显示1 when others=>null; end case; when "1101111111"=> case sel is when "0000"=>dout<="0000000000000000" when "0001"=>dout<="0000000000000000" when "0010&qu

18、ot;=>dout<="0000000000000000" when "0011"=>dout<="0000000000000000" when "1100"=>dout<="0000000000000000" when "1101"=>dout<="0000000000000000" when "1110"=>dout<="0000000000000000"

19、; when "1111"=>dout<="0000000000000000"-显示2 when others=>null; end case; when "1110111111"=> case sel is when "0000"=>dout<="0000000000000000" when "0001"=>dout<="0000000000000000" when "0010"=>

20、;dout<="0000000000000000" when "0011"=>dout<="0000000000000000" when "1100"=>dout<="0000000000000000" when "1101"=>dout<="0000000000000000" when "1110"=>dout<="0000000000000000" when

21、"1111"=>dout<="0000000000000000"-显示3 when others=>null; end case; when "1111011111"=> case sel is when "0000"=>dout<="0000000000000000" when "0001"=>dout<="0000000000000000" when "0010"=>dout&l

22、t;="0000000000000000" when "0011"=>dout<="0000000000000000" when "1101"=>dout<="0000000000000000" when "1110"=>dout<="0000000000000000" when "1111"=>dout<="0000000000000000"-显示4 when oth

23、ers=>null; end case; when "1111101111"=> case sel is when "0000"=>dout<="0000000000000000" when "0001"=>dout<="0000000000000000" when "0010"=>dout<="0000000000000000" when "0011"=>dout<=&quo

24、t;0000000000000000" when "1100"=>dout<="0000000000000000" when "1101"=>dout<="0000000000000000" when "1110"=>dout<="0000000000000000" when "1111"=>dout<="0000000000000000"-显示5 when others=>

25、;null; end case; when "1111110111"=> case sel is when "0000"=>dout<="0000000000000000" when "0001"=>dout<="0000000000000000" when "0010"=>dout<="0000000000000000" when "0011"=>dout<="00000

26、00000000000" when "1100"=>dout<="0000000000000000" when "1101"=>dout<="0000000000000000" when "1110"=>dout<="0000000000000000" when "1111"=>dout<="0000000000000000"-显示6 when others=>null;

27、end case; when "1111111011"=> case sel is when "0000"=>dout<="0000000000000000" when "0001"=>dout<="0000000000000000" when "0010"=>dout<="0000000000000000" when "0011"=>dout<="000000000000

28、0000" when "0100"=>dout<="0000000000011100" when "0101"=>dout<="0000000000111100" when "0110"=>dout<="0000000011101100" when "0111"=>dout<="0000001111001100" when "1010"=>dout<

29、;="0000000000001100" when "1011"=>dout<="0000000000011100" when "1100"=>dout<="0000000000000000" when "1101"=>dout<="0000000000000000" when "1110"=>dout<="0000000000000000" when "11

30、11"=>dout<="0000000000000000"-显示7 when others=>null; end case; when "1111111101"=> case sel is when "0000"=>dout<="0000000000000000" when "0001"=>dout<="0000000000000000" when "0010"=>dout<="

31、;0000000000000000" when "0011"=>dout<="0000000000000000" when "1100"=>dout<="0000000000000000" when "1101"=>dout<="0000000000000000" when "1110"=>dout<="0000000000000000" when "1111"

32、;=>dout<="0000000000000000"-显示8 when others=>null; end case; when "1111111110"=> case sel is when "0000"=>dout<="0000000000000000" when "0001"=>dout<="0000000000000000" when "0010"=>dout<="000000

33、0000000000" when "0011"=>dout<="0000000000000000" when "1100"=>dout<="0000000000000000" when "1101"=>dout<="0000000000000000" when "1110"=>dout<="0000000000000000" when "1111"=>dout<="0000000000000000"-显示9 when others=>null; en

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论