




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中北大学课 程 设 计 说 明 书 学生姓名:杨润江学 号:0706024151 学 院: 电子与计算机科学技术学院专 业:微电子学题 目:利用键盘控制点阵进行十进制加法计算显示 指导教师: 王红亮 职称: 讲师 2010 年 6 月 25 日目 录1、 课程设计目的22、 课程设计内容和要求 22.1、设计内容 22.2、设计要求 23、设计方案及实现情况 23.1、设计思路 23.2、工作原理及框图 33.3、各模块功能描述 43.4、仿真结果 233.5、试验箱验证情况 244
2、、课程设计总结 265、参考文献 261、课程设计目的: (1)学习操作数字电路设计实验开发系统,掌握点阵显示模块的工作原理及应用。(2)掌握组合逻辑电路、时序逻辑电路的设计方法。(3)学习掌握可编程器件设计的全过程。2、课程设计内容和要求:2.1、设计内容: 用VHDL语言编写程序,编写键盘控制模块的控制逻辑,仿真所编写的程序,模拟验证所编写的模块功能,下载程序到芯片中,实现键盘控制点阵进行十进制加法计算显示。2.2、设计要求:(1)学习掌握键盘控制模块、点阵显示模块的工作原理及应用;(2)熟练掌握VHDL编程语言,编写键盘控制模块的控制逻辑;(3)仿真所编写的程序,模拟验证所编写的模块功能
3、;(4)下载程序到芯片中,硬件验证所设置的功能,能够实现十进制数字的显示;(5)整理设计内容,编写设计说明书。3、 设计方案及实现情况:3.1、设计思路:分三个模块编写程序,首先实现键盘对点阵的控制,然后设计加法计算功能模块,由于点阵显示的局限性,当有进位时设置CO为高电平在数码管上显示出来,在最后一个模块编写显示的1到9以及加号的列字符扫描信号,从而实现键盘控制点阵十进制加法计算的显示。3.2、工作原理及框图: 系统的输入信号有:开关(允许输入及显示)信号RST,系统时钟信号CLK,按键信号(KEYIN3.0)。系统的输出信号有:点阵行驱动输出信号(LEDOUT0.15),点阵列选
4、信号(SEL3.0),进位输出信号CO。系统的工作过程为:在开关信号RST(低电平有效)为低电平时,矩阵键盘不工作,16×16点阵没有显示;当开关信号RST为高电平时,整个系统工作,当在矩阵键盘上按下按键后,16×16点阵会显示出一个1位十进制数,在进行功能操作时,当按下NEXT键时,点阵上显示“+”号,然后再按下一个十进制数在点阵上显示,最后按下ENTER键进行加法计算,如果结果大于9,则进位输出CO输出高电平,点亮发光二极管,点阵显示个位,否则直接输出结果。LED点阵显示原理:LED点阵式显示器不仅可以显示数字,也可显示所有西文字母和符号,与由单个发光二极管连成的显示器
5、相比,具有焊点少、连线少,所有点在同平面、亮度均匀、外形美观以及具有显示信息丰富、功耗低、体积小、重量轻、超薄等许多其他显示器无法比拟的优点,可以代替数码管、符号管和米字管。如果将多块组合可以构成大屏幕显示屏用于汉字、图形、图表等等的显示,因此被泛用于机场、车站、码头、银行及许多公共场所的指示、说明、广告等场合。16×16的LED点阵显示器,是由256个LED组成,共阳极的16×16的LED点阵显示器的典型连接方式是:每一行的16个阳极连在一起,由行扫描码锁存器和驱动器的一位控制,总共16行阳极连线由16位分别控制;每一列的16个阴极连在一起,由列扫描码锁存器和驱动器的一位
6、控制,总共16列阴极连线由16位分别控制。 点阵字符的驱动过程:点阵式LED显示器采用逐行扫描式工作。要使点阵显示出一个字符的编程方法是:首先选通第一行;接着,向行码锁存器写入该行的字型码(即列数据)。然后,按相同的方式选通第二行,写第二行的字型码由此类推,直到写完所有行的字型码,完成一个字符的显示。16×16点阵显示驱动的行选通信号为一4-16译码器的输出,所以我们在设计点阵控制接口时,其行选通信号输出必须经4-16编码。矩阵式键盘的工作原理:矩阵式键盘又叫行列式键盘,是用I/O口线组成的行、列矩阵结构,在每根行线与列线的交叉处,二线不直接相通而是通过一个按键跨接接通。采用这种矩阵
7、结构只需M根行输出线和N根列输入线,就可连接M×N个按键。通过键盘扫描程序的行输出与列输入就可确认按键的状态,再通过键盘处理程序便可识别键值。矩阵式键盘的按键识别方法为行扫描法又称为逐行扫描查询法,是一种最常用的按键识别方法,介绍过程如下:1)判断键盘中有无键按下:将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与行线相交叉的按键之中。若所有列线均为高电平,则键盘中无键按下。 2)判断闭合键所在的位置:在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
8、在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与低电平的行线交叉处的按键就是闭合的按键。 键盘中的按键可分为数字键和功能键。数字键主要用来输入数字,但从上述内容发现,键盘所产生的输出KIN3KIN0无法拿来直接使用;另外不同的数字按键也担负不同的功能,因此必须由键盘译码电路来规划某个按键的输出形式,以便执行相应的动作。图1 总体框图3.3 、各模块功能描述:键盘扫描模块:实验箱中4×8矩阵键盘的电路原理图如图2所示图2 矩阵键盘的电路原理图该矩阵键盘的工作原理为:扫描信号为BCOM8.1,在BCOM8.1前已接有一个3-8译码器,3-8译码器的输入为S
9、EL0SEL2。当3-8译码器的输入为000时,即BCOM1为0,其他位为1,我们按下第一排第一键,此时KIN0输出0,KIN1KIN3输出全为1,按下第二排第二键时,KIN1输出0,其他输出1;当3-8译码器输入为001时,即BCOM2为0,我们按下第一排第一键,此时KIN0输出0,KIN1KIN3输出全为1,同理其他键依此类推。键盘上的每个按键就是一个开关,当某键被按下时,该按键的接点会呈现0状态,反之为1。扫描信号为SEL2.0进入3-8译码器,再从译码器输出到键盘,所以第一次只能扫描一排,依此周而复始。若从KIN3.0输出的皆为1时,表示没有按键按下,代表该列没有按键被按下,则不进行按
10、键编码的操作,反之,如果有被按下时,则应将KIN3.0读出的值送到译码电路进行编码。按键位置与数码的关系如下表1所示:表1 按键位置与数码关系表SEL2SEL0KIN3KIN0对应的按键按键功能00011100数字011016数字61011LAST功能键0111CTRL功能键00111101数字111017数字71011STEP功能键0111EMPTY1扩展101011102数字21101REG功能键1011C字母C0111EMPTY2扩展201111103数字31101EXEC功能键1011D字母D0111EMPTY3扩展31001110MEM功能键11018数字81011E字母E0111E
11、MPTY4扩展41011110ESC功能键11019数字91011F字母F0111SHIFT功能键11011104数字41101A字母A1011NEXT功能键0111NONE无定义11111105数字51101B字母B1011ENTER功能键0111NONE无定义在设计该模块时,因为要实现十六进制数的显示,所以在KEYBOARD的模块中的p3进程依据上表描述了按键位置与数码的关系,实现了键盘输入输出的功能。KOUT4.0为键盘扫描后的对应的译码输出;CP为时钟CLK的四分频后的输出;Q1.0对按下的键值进行标志:“00”表示按下09之间的键值、“01”表示按下NEXT按键、“10”表示按下EN
12、TER按键、“11”表示按下其它按键。键盘控制模块如图3所示。图3 键盘控制模块图源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity keyboard isport ( clk ,rst : in std_logic; kin : in std_logic_vector (3 downto 0); cp : out std_logic;q : out std_logic_vector (1 downto 0); sel : out std_logic_vector (3 down
13、to 0); kout : out std_logic_vector (4 downto 0) );end keyboard; architecture keyboard_arc of keyboard is signal counter : std_logic_vector(3 downto 0);signal counter1 : std_logic_vector(1 downto 0); signal counter2 : std_logic_vector(4 downto 0); signal colsel,Y : std_logic_vector(4 downto 0); signa
14、l clk1,ktest,kdown: std_logic; signal a : std_logic_vector(3 downto 0); signal b : std_logic_vector(2 downto 0);beginktest<=kin(3) and kin(2) and kin(1) and kin(0);p1: process(rst,clk) begin if(rst='0') then counter1<="00" elsif(clk'event and clk='1') then counter
15、1<=counter1+1; end if; end process p1; clk1<='0' when counter1<="01" else '1' cp<=clk1;p2: process(rst,clk1,ktest) begin if(rst='0') then counter<="0000" elsif(clk1'event and clk1='1') then if(ktest='0') or (kdown='0&
16、#39;) then counter<=counter; else counter<=counter+1; end if; end if; end process p2; sel<=counter; p3:process(clk,ktest) begin a<=kin; b<=counter(2) & counter(1) & counter(0); case b is when "000"=> case a is when "1110"=>Y<="00000" when
17、 "1101"=>Y<="00110" when "1011"=>Y<="11111" when "0111"=>Y<="11111" when others=>null; end case; when "001"=> case a is when "1110"=>Y<="00001" when "1101"=>Y<=&quo
18、t;00111" when "1011"=>Y<="11111" when "0111"=>Y<="11111" when others=>null; end case; when "010"=> case a is when "1110"=>Y<="00010" when "1101"=>Y<="11111" when "1011&qu
19、ot;=>Y<="11111" when "0111"=>Y<="11111" when others=>null; end case; when "011"=> case a is when "1110"=>Y<="00011" when "1101"=>Y<="11111" when "1011"=>Y<="11111"
20、when "0111"=>Y<="11111" when others=>null; end case; when "100"=> case a is when "1110"=>Y<="11111" when "1101"=>Y<="01000" when "1011"=>Y<="11111" when "0111"=>Y<=
21、"11111" when others=>null; end case; when "101"=> case a is when "1110"=>Y<="11111" when "1101"=>Y<="01001" when "1011"=>Y<="11111" when "0111"=>Y<="11111" when others=&g
22、t;null; end case; when "110"=> case a is when "1110"=>Y<="00100" when "1101"=>Y<="11111" when "1011"=>Y<="10000" when others=>null; end case; when "111"=> case a is when "1110"=>Y&
23、lt;="00101" when "1101"=>Y<="11111" when "1011"=>Y<="10001" when others=>null; end case; when others=>null; end case; end process p3;p4: process(ktest,clk,rst) begin if(rst='0') then counter2<="00000" kdown<=
24、'1' elsif(clk'event and clk='1') then if(ktest='0') then counter2<="00000" kdown<='0' elsif(counter2<"11110") then counter2<=counter2+1; if(counter2="11100") then kdown<='1' end if; end if; end if; end process p
25、4;p5: process(kdown,rst) begin if(rst='0') then colsel<="00000" elsif(kdown'event and kdown='1') thenif(Y<"10000")thenq<="00"colsel<=Y;elsif(Y="10000")thenq<="01"elsif(Y="10001")thenq<="10"els
26、if(Y="11111")thenq<="11"end if; end if; end process p5; kout<=colsel;end keyboard_arc;点阵显示模块:16×16点阵显示,各驱动接口为:第一行到第十六行对应的为L0L15,第一列到第十六列驱动采用4-16译码,对应的接口为SEL0SEL3。具体对应关系见下表:点阵显示接口对应关系表如下表2:表2 点阵显示接口对应关系表SEL3SEL2SEL1SEL0点亮列号1111第1列1110第2列1101第3列1100第4列1011第5列1010第6列1001第
27、7列1000第8列0111第9列0110第10列0101第11列0100第12列0011第13列0010第14列0001第15列0000第16列图4 点阵显示模块控制器的引脚功能图如图4所示,其中:CH4.0为显示十进制数模式选择,高电平有效;LEDOUT15.0为行驱动信号输出;SEL 3.0为列选信号输出。16×16点阵工作原理为:当CHAR输入是“00000”时,要实现16×16点阵显示数字“0”, 行驱动信号SEGOUT15.0根据实现数字图形的要求,事先已编写好各列相应的代码,列选信号SEL 3.0按如下形式依次循环:00000001001011101111,通过
28、416译码器译码后对点阵的各列进行扫描,当某点列和行都为“1”时,该点被点亮。同理其他数字图形显示依此类推。源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity leddisp isport( sel :in std_logic_vector(3 downto 0); ch :in std_logic_vector(4 downto 0); ledout :out std_logic_vector(15 downto 0) );end leddisp;architecture le
29、ddisp_arc of leddisp isbegin process(ch,sel) begin case ch is when "00000"=> case sel is when "0000" => ledout<="0000000000000000" -0 when "0001" => ledout<="0000011111100000" when "0010" => ledout<="00001111111100
30、00" when "0011" => ledout<="0001111111111000" when "0100" => ledout<="0011000000001100" when "0101" => ledout<="0011000000001100" when "0110" => ledout<="0011000000001100" when "0111&quo
31、t; => ledout<="0011000000001100" when "1000" => ledout<="0011000000001100" when "1001" => ledout<="0011000000001100"when "1010" => ledout<="0011000000001100" when "1011" => ledout<="000
32、1111111111000" when "1100" => ledout<="0000111111110000" when "1101" => ledout<="0000011111100000" when "1110" => ledout<="0000000000000000" when "1111" => ledout<="0000000000000000" when oth
33、ers => null; end case; when "00001" => case sel iswhen "0000" => ledout<="0000000000000000" -1 when "0001" => ledout<="0000000000000000" when "0010" => ledout<="0000000000000100" when "0011" =>
34、 ledout<="0000000000000100" when "0100" => ledout<="0000000000000100" when "0101" => ledout<="0000000000000100" when "0110" => ledout<="0001111111111100" when "0111" => ledout<="0001111111
35、111100" when "1000" => ledout<="0001111111111100" when "1001" => ledout<="0000100000000100" when "1010" => ledout<="0000100000000100" when "1011" => ledout<="0000100000000100" when "1100
36、" => ledout<="0000000000000100" when "1101" => ledout<="0000000000000000" when "1110" => ledout<="0000000000000000" when "1111" => ledout<="0000000000000000" when others => null; end case; when &quo
37、t;00010" => case sel is when "0000" => ledout<="0000000000000000" -2 when "0001" => ledout<="0000000000010000" when "0010" => ledout<="0000111000011100" when "0011" => ledout<="0001111100001100
38、" when "0100" => ledout<="0001111110001100" when "0101" => ledout<="0001000110001100" when "0110" => ledout<="0001000011001100" when "0111" => ledout<="0001000001001100" when "1000"
39、 => ledout<="0001000001101100" when "1001" => ledout<="0001000000101100" when "1010" => ledout<="0001000000111100" when "1011" => ledout<="0001111000011100" when "1100" => ledout<="0000
40、111000001100" when "1101" => ledout<="0000010000001100" when "1110" => ledout<="0000000000000000" when "1111" => ledout<="0000000000000000" when others => null; end case; when "00011" => case sel is wh
41、en "0000" => ledout<="0000000000000000" -3 when "0001" => ledout<="0000000000100000" when "0010" => ledout<="0000010001111000" when "0011" => ledout<="0000111001111000" when "0100" =>
42、 ledout<="0001111111011100" when "0101" => ledout<="0001101110000100" when "0110" => ledout<="0001000110000100" when "0111" => ledout<="0001000110000100" when "1000" => ledout<="0001000110
43、000100" when "1001" => ledout<="0001000110000100" when "1010" => ledout<="0001000000000100" when "1011" => ledout<="0001110000011100" when "1100" => ledout<="0000110000011100" when "1101
44、" => ledout<="0000110000011000" when "1110" => ledout<="0000000000000000" when "1111" => ledout<="0000000000000000" when others => null; end case; when "00100" => case sel is when "0000" => ledout&l
45、t;="0000000000000000" -4 when "0001" => ledout<="0000000000100100" when "0010" => ledout<="0000000000100100" when "0011" => ledout<="0000000000100100" when "0100" => ledout<="0001111111111100
46、" when "0101" => ledout<="0001111111111100" when "0110" => ledout<="0001111111111100" when "0111" => ledout<="0000110000100100" when "1000" => ledout<="0000011000100100" when "1001"
47、 => ledout<="0000001000100100" when "1010" => ledout<="0000000100100000" when "1011" => ledout<="0000000110100000" when "1100" => ledout<="0000000011100000" when "1101" => ledout<="0000
48、000001100000" when "1110" => ledout<="0000000000000000" when "1111" => ledout<="0000000000000000" when others => null; end case; when "00101" => case sel is when "0000" => ledout<="0000000000000000" -5
49、 when "0001" => ledout<="0000000001100000" when "0010" => ledout<="0001000011110000" when "0011" => ledout<="0001000111111000" when "0100" => ledout<="0001001111011100" when "0101" =>
50、 ledout<="0001001100000100" when "0110" => ledout<="0001001100000100" when "0111" => ledout<="0001001100000100" when "1000" => ledout<="0001001100000100" when "1001" => ledout<="0001001100
51、000100" when "1010" => ledout<="0001001100000100" when "1011" => ledout<="0001111110011100" when "1100" => ledout<="0001111110111000" when "1101" => ledout<="0000000000011000" when "1110
52、" => ledout<="0000000000000000" when "1111" => ledout<="0000000000000000" when others => null; end case; when "00110" => case sel is when "0000" => ledout<="0000000000000000" -6 when "0001" => ledou
53、t<="0000000001110000" when "0010" => ledout<="0000100011111000" when "0011" => ledout<="0001110111111000" when "0100" => ledout<="0001100110001100" when "0101" => ledout<="0001100100000100
54、" when "0110" => ledout<="0001000100000100" when "0111" => ledout<="0001000100000100" when "1000" => ledout<="0001000100000100" when "1001" => ledout<="0001000100000100" when "1010"
55、 => ledout<="0001100110001100" when "1011" => ledout<="0000111111111000" when "1100" => ledout<="0000011111111000" when "1101" => ledout<="0000001111110000" when "1110" => ledout<="0000
56、000011000000" when "1111" => ledout<="0000000000000000" when others => null; end case; when "00111" => case sel is when "0000" => ledout<="0000000000000000" -7 when "0001" => ledout<="0001000000000000"
57、 when "0010" => ledout<="0001100000000000" when "0011" => ledout<="0001110000000000" when "0100" => ledout<="0001011000000000" when "0101" => ledout<="0001001100000000" when "0110" => ledout<="0001000111000000" w
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 计算机二级MySQL触发器应用案例试题及答案
- 计算机网络安全风险评估试题及答案
- 如何进行嵌入式技术创新试题及答案
- 前沿嵌入式技术试题及答案
- 华能电厂缺陷管理制度
- 医院智慧门诊管理制度
- 单位合并人员管理制度
- 化工园区蒸汽管理制度
- 了解公路工程招投标中的法律风险试题及答案
- 公司医疗器械管理制度
- 高速公路工程投标文件施工组织设计(技术标)
- DB11T 1846-2021 施工现场装配式路面技术规程
- 四川省成都市2020年中考英语真题(含答案)
- 上海市幼儿园幼小衔接活动指导意见(修订稿)
- 2024年中国新就业形态劳动纠纷解决研究报告+Resolution+of+Labour+Disputes+Involving+New+Forms+of+Employment+in+China
- 卡西欧手表EFA-120中文使用说明书
- 《十万个为什么》整本书阅读-课件-四年级下册语文(统编版)
- 2024年山东省济南市中考化学试卷( 含答案)
- 广东省江门市2023-2024学年高一下学期7月期末考试语文试题(解析版)
- 超市经营服务方案投标方案(技术标)
- 新质生产力视角下高校产教融合人才培养模式研究
评论
0/150
提交评论