




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中北大学课 程 设 计 说 明 书 学生姓名:田晓春 学 号: 0606024114学院:电子与计算机科学技术学院 专业: 微电子学题目:利用键盘控制点阵进行 十六进制加法计数显示 指导教师:沈三民职称:讲师 2009 年 7 月 11 日目录目录21、课程设计目的32、课程设计内容和要求32.1、设计内容32.2、设计要求33、设计方案及实现情况33.1、设计思路33.2、工作原理及框图43.3、各模块功能描述43.4、仿真结果83.5、实验箱验证情况2
2、24、课程设计总结235、参考文献231、课程设计目的1.学习操作数字电路设计实验开发系统,掌握矩阵键盘输入模块和点阵显示模块的工作原理及应用。2.掌握组合逻辑电路、时序逻辑电路的设计方法。3.学习掌握可编程器件设计的全过程。2、课程设计内容和要求:2.1、设计内容利用键盘控制点阵实现十六进制加法计数,主要包括键盘控制模块、自动计数模块、功能控制模块和点阵显示模块。2.2、设计要求1学习掌握键盘控制模块、点阵显示模块的工作原理及应用;2. 熟练掌握VHDL编程语言,编写键盘控制模块的控制逻辑;3. 仿真所编写的程序,模拟验证所编写的模块功能;4. 下载程序到芯片中,硬件验证所设置的功能,能够实
3、现十六进制数字的显示;5. 整理设计内容,编写设计说明书。3、 设计方案及实现情况3.1、设计思路根据题目设计要求,本系统拟采用自顶向下设计方法,顶层采用原理图设计方法,将整个系统分为键盘控制(KEYBOARD)、自动计数(AUTO)、功能控制(CONTROL)、16×16点阵显示(LEDDISP)四个模块,通过对各模块编写程序实现模块功能,最后将四个模块进行综合实现整个系统的功能,通过键盘控制点阵进行十六进制加法计数显示。3.2、工作原理及框图图1 系统整体设计原理图系统的输入信号有:开关(允许输入及显示)信号RST,系统时钟信号CLK,按键信号(KININ3.0)。系统
4、的输出信号有:点阵行驱动输出信号(LEDOUT0.15),点阵列选信号(SEL3.0),进位输出信号CO。系统的工作过程为:在开关信号RST(低电平有效)为低电平时,矩阵键盘不工作,16×16点阵没有显示;当开关信号RST为高电平时,整个系统工作,当在矩阵键盘上按下按键后,16×16点阵会显示出一个1位十六进制数,在进行功能操作时,每按下一次NEXT键时,点阵上显示的键值加1,当加到F时,进位输出CO输出高电平,点亮发光二极管;当按下ENTER键时,点阵屏循环显示0F键值,显示F时,进位输出CO输出高电平,点亮发光二极管。3.3、各模块功能描述(1)矩阵键盘输入模块(KEY
5、BOARD)实验箱中4×8矩阵键盘的电路原理图如图2所示。图2 4×8矩阵键盘电路原理图该矩阵键盘的工作原理为:扫描信号为BCOM8.1,在BCOM8.1前已接有一个3-8译码器,3-8译码器的输入为SEL0SEL2。当3-8译码器的输入为000时,即BCOM1为0,其他位为1,我们按下第一排第一键,此时KIN0输出0,KIN1KIN3输出全为1,按下第二排第二键时,KIN1输出0,其他输出1;当3-8译码器输入为001时,即BCOM2为0,我们按下第一排第二键,此时KIN0输出0,KIN1KIN3输出全为1,同理其他键依此类推。键盘上的每个按键就是一个开关,当某键被按下时
6、,该按键的接点会呈现0状态,反之为1。扫描信号为SEL2.0进入3-8译码器,再从译码器输出到键盘,所以第一次只能扫描一排,依此周而复始。若从KIN3.0输出的皆为1时,表示没有按键按下,代表该列没有按键被按下,则不进行按键编码的操作,反之,如果有被按下时,则应将KIN3.0读出的值送到译码电路进行编码。按键位置与数码的关系如下表所示:SEL2SEL0KIN3KIN0对应的按键按键功能00011100数字011016数字61011LAST功能键0111CTRL功能键00111101数字111017数字71011STEP功能键0111EMPTY1扩展101011102数字21101REG功能键1
7、011C字母C0111EMPTY2扩展201111103数字31101EXEC功能键1011D字母D0111EMPTY3扩展31001110MEM功能键11018数字81011E字母E0111EMPTY4扩展41011110ESC功能键11019数字91011F字母F0111SHIFT功能键11011104数字41101A字母A1011NEXT功能键0111NONE无定义11111105数字51101B字母B1011ENTER功能键0111NONE无定义在设计该模块时,因为要实现十六进制数的显示,所以在KEYBOARD的模块中的p3进程依据上表描述了按键位置与数码的关系,实现了键盘输入输出的功
8、能。KOUT4.0为键盘扫描后的对应的译码输出;CP为时钟CLK的四分频后的输出;Q1.0对按下的键值进行标志:“00”表示按下0F之间的键值、“01”表示按下NEXT按键、“10”表示按下ENTER按键、“11”表示按下其它按键。键盘控制模块如图3所示。图3 4×8矩阵键盘控制模块引脚功能图(2)十六进制自动计数模块(AUTO)该模块在CLK脉冲作用下能够实现从“00000”“01111”之间循环加法计数,并通过DATAUTO4.0将计数值输出送CONTROL模块执行操作。十六进制自动计数模块如图4所示。图4 十六进制自动计数模块引脚功能图(3)功能控制模块(CONTROL)该模块
9、实现对点阵显示方式的控制,控制模块的引脚功能如图5所示,其中:CLK为时钟输入端;RST为复位端,低电平有效;Q1.0为功能方式输入端;DATAIN4.0接收来自KEYBOARD模块送来的键值;DATAUTO4.0接收自动计数模块AUTO送来的计数值;当按下键盘上0F之间的数值时,DATAOUT4.0输出键值码。每当在键盘上按下一次NEXT键时,输出的键值加1,当加到F时,再次按下NEXT键时,显示为0,进位输出CO为高电平,点亮一个发光二极管;当在键盘上按下ENTER键时,输出从0开始到F循环计数,当计数到F时,进位输出CO为高电平,点亮一个发光二极管。图5 功能控制模块引脚功能图(4)16
10、×16点阵显示模块(LEDISP)16×16点阵显示,各驱动接口为:第一行到第十六行对应的为L0L15,第一列到第十六列驱动采用4-16译码,对应的接口为SEL0SEL3。具体对应关系见下表:点阵显示接口对应关系表:SEL3SEL2SEL1SEL0点亮列号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列图6 16×16点阵控制接口引脚功能图控制器的引脚功能图如图6所示,其中:C
11、H4.0为显示十六进制数模式选择,高电平有效;LEDOUT15.0为行驱动信号输出;SEL 3.0为列选信号输出。16×16点阵工作原理为:当CHAR输入是“00000”时,要实现16×16点阵显示数字“0”, 行驱动信号SEGOUT15.0根据实现数字图形的要求,事先已编写好各列相应的代码,列选信号SEL 3.0按如下形式依次循环:00000001001011101111,通过416译码器译码后对点阵的各列进行扫描,当某点列和行都为“1”时,该点被点亮。同理其他数字图形显示依此类推。3.4、仿真结果1、VHDL语言源程序(1)键盘控制模块源程序(KEYBOARD.VHD)
12、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 downto 0); kout : out std_logic_vector (4 downto
13、 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,M : std_logic_vector(4 downto 0); signal clk1,ktest,kdown: std_logic; signal a : s
14、td_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 counter1<=counter1+1; end if; end process p1; c
15、lk1<='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') then counter<=counter; else counte
16、r<=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 "1101"=>Y<="00110"
17、;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<="00111"when "1011"=>Y<=&
18、quot;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"=>Y<="01100"when "0111&qu
19、ot;=>Y<="11111" when others=>null; end case; when "011"=> case a is when "1110"=>Y<="00011"when "1101"=>Y<="11111" when "1011"=>Y<="01101"when "0111"=>Y<="11111" wh
20、en others=>null; end case; when "100"=> case a iswhen "1110"=>Y<="11111" when "1101"=>Y<="01000" when "1011"=>Y<="01110"when "0111"=>Y<="11111" when others=>null; end case; when
21、 "101"=> case a iswhen "1110"=>Y<="11111" when "1101"=>Y<="01001" when "1011"=>Y<="01111"when "0111"=>Y<="11111" when others=>null; end case; when "110"=> case a is wh
22、en "1110"=>Y<="00100" when "1101"=>Y<="01010" when "1011"=>Y<="10000" when others=>null; end case; when "111"=> case a is when "1110"=>Y<="00101" when "1101"=>Y<=&q
23、uot;01011" 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<='1' elsif(clk'event and clk='1') the
24、n 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 p4;p5: process(kdown,rst) begin if(rst='0') then
25、colsel<="00000" elsif(kdown'event and kdown='1') thenif(Y<"10000")thenq<="00"colsel<=Y;M<=Y;elsif(Y="10000")thenq<="01"M<=M+1;colsel<=M;elsif(Y="10001")thenq<="10"elsif(Y="11111")th
26、enq<="11"end if; end if; end process p5; kout<=colsel;end keyboard_arc;(2) 自动计数模块源程序(AUTO.VHD)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity auto isport(clk,rst : in std_logic;datauto : out std_logic_vector(4 downto 0) );e
27、nd auto;architecture auto_arch of auto isbeginprocess(clk)variable cnt : integer ;variable tmp : std_logic_vector(4 downto 0) ;beginif(rst='0')thentmp:="00000"elsif( clk'event and clk='1')thenif cnt<10000 then cnt:=cnt+1;else cnt:=0;if tmp="01111" then tmp:
28、="00000" else tmp:=tmp+1; end if; end if; end if;datauto<=tmp;end process ;end auto_arch;(3)功能控制模块源程序(CONTROL.VHD)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity control isport(rst,clk : in std_logic;q : in std_logic_vector(1
29、downto 0); datain : in std_logic_vector(4 downto 0);datauto : in std_logic_vector(4 downto 0);dataout : out std_logic_vector(4 downto 0); co : out std_logic );end control;architecture control_arc of control issignal s : std_logic_vector(4 downto 0);beginprocess(q,rst,clk,datain) begin if(rst='0&
30、#39;)thendataout<="00000"co<='0' elsif (clk'event and clk='1') thenif (q="00") thendataout<=datain; elsif (q="01") then s<=datain;dataout<=s;if(s>"01111") thendataout<="00000"co<='1'end if;elsif (q=
31、"10")thendataout<=datauto;if(datauto="01111")thenco<='1'end if;elsif (q="11")thendataout<="11111"end if; end if;end process;end control_arc;(4)16×16点阵显示模块(LEDDISP.VHD)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.al
32、l;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 leddisp_arc of leddisp isbegin process(ch,sel) begin case ch is when "00000"=>case sel iswhen "0000" => l
33、edout<="0000000000000000" -0 when "1110" => ledout<="0000000000000000" when "1111" => ledout<="0000000000000000" when others => null; end case;when "00001" =>case sel iswhen "0000" => ledout<="00000
34、00000000000" -1 when "0001" => ledout<="0000000000000000" when "0010" => ledout<="0000000000000100" when "0011" => ledout<="0000000000000100" when "0100" => ledout<="0000000000000100" when &q
35、uot;0101" => ledout<="0000000000000100" when "1100" => ledout<="0000000000000100" when "1101" => ledout<="0000000000000000" when "1110" => ledout<="0000000000000000" when "1111" => ledout&
36、lt;="0000000000000000" when others => null; end case; when "00010" => case sel is when "0000" => ledout<="0000000000000000" -2 when "0001" => ledout<="0000000000010000" when "1110" => ledout<="00000000
37、00000000" when "1111" => ledout<="0000000000000000" when others => null; end case; when "00011" => case sel is when "0000" => ledout<="0000000000000000" -3 when "0001" => ledout<="0000000000100000" whe
38、n "1110" => ledout<="0000000000000000" when "1111" => ledout<="0000000000000000" when others => null; end case; when "00100" => case sel is when "0000" => ledout<="0000000000000000" -4 when "0001"
39、 => ledout<="0000000000100100" when "0010" => ledout<="0000000000100100" when "0011" => ledout<="0000000000100100" when "1001" => ledout<="0000001000100100" when "1010" => ledout<="0000
40、000100100000" when "1011" => ledout<="0000000110100000" when "1100" => ledout<="0000000011100000" when "1101" => ledout<="0000000001100000" when "1110" => ledout<="0000000000000000" when &quo
41、t;1111" => ledout<="0000000000000000" when others => null; end case; when "00101" => case sel is when "0000" => ledout<="0000000000000000" -5 when "0001" => ledout<="0000000001100000" when "1101" =>
42、 ledout<="0000000000011000" when "1110" => ledout<="0000000000000000" when "1111" => ledout<="0000000000000000" when others => null; end case; when "00110" => case sel is when "0000" => ledout<="000
43、0000000000000" -6 when "0001" => ledout<="0000000001110000" when "1101" => ledout<="0000001111110000" when "1110" => ledout<="0000000011000000" when "1111" => ledout<="0000000000000000" when
44、others => null; end case; when "00111" => case sel is when "0000" => ledout<="0000000000000000" -7 when "1110" => ledout<="0000000000000000" when "1111" => ledout<="0000000000000000" when others => null;
45、 end case; when "01000" => case sel is when "0000" => ledout<="0000000000000000" -8 when "1110" => ledout<="0000000000010000" when "1111" => ledout<="0000000000000000" when others => null; end case; when &q
46、uot;01001" => case sel is when "0000" => ledout<="0000000000000000" -9 when "0001" => ledout<="0000001111000000" when "1110" => ledout<="0000001000000000" when "1111" => ledout<="00000000000000
47、00" when others => null; end case; when "01010" => case sel is when "0000" => ledout<="0000000000000100" -A when "0001" => ledout<="0000000000000100" when "0010" => ledout<="0000000000011100" when &quo
48、t;0011" => ledout<="0000000001111100"when "0100" => ledout<="0000000111111100" when "1011" => ledout<="0000000111100100" when "1100" => ledout<="0000000000111100" when "1101" => ledout<
49、="0000000000001100" when "1110" => ledout<="0000000000000100" when "1111" => ledout<="0000000000000100" when others => null; end case; when "01011" => case sel is when "0000" => ledout<="00000000000000
50、00" -B when "1111" => ledout<="0000000000000100" when others => null; end case; when "01100" => -12 case sel is when "0000" => ledout<="0000000000000000" -C when "1110" => ledout<="0000001111100000" wh
51、en "1111" => ledout<="0000000000000000" when others => null; end case; when "01101" => -13 case sel is when "0000" => ledout<="0000000000000000" -D when "1111" => ledout<="0000000000000000" when others =>
52、; null; end case; when "01110" => -14 case sel is when "0000" => ledout<="0000000000010000" -E when "1110" => ledout<="0000000000000100" when "1111" => ledout<="0000000000000000" when others => null; end ca
53、se; when "01111" => -15 case sel is when "1111" => ledout<="0000000000000000" when others => null; end case; when "11111" => case sel is when "0000" => ledout<="0000000000000000" -NULL when "0001" => ledout<="0000000000000000" when "0010" => ledout<="00
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学趣配音活动方案
- 少年音乐比拼活动方案
- 小班防疫教育活动方案
- 小学预防感冒活动方案
- 帮扶支教活动方案
- 市场推广活动方案
- 小班元旦阅读节活动方案
- 小小画笔赞祖国活动方案
- 小学虎年迎新年活动方案
- 小组奖励活动方案
- 2024届湖北省鄂东南联盟数学高一下期末达标检测模拟试题含解析
- 城市公园物业管理费用收支预案
- 盐城市2023-2024学年三年级语文第二学期期末调研检测模拟卷
- 无人机飞行控制系统若干关键技术研究的开题报告
- 年产5万吨1,4-丁二醇的工艺流程设计
- 档案消防安全培训课件
- 小学生假期心理健康教育内容
- 拉刀设计计算说明书
- 《快递企业安全管理》课件
- 堤防波浪壅高、爬高计算表格
- 2024年医院肝胆胰外科护理带教计划
评论
0/150
提交评论