《EDA技术课程设计报告键盘扫描与数码管及点阵显示设计 .doc》由会员分享,可在线阅读,更多相关《EDA技术课程设计报告键盘扫描与数码管及点阵显示设计 .doc(30页珍藏版)》请在三一办公上搜索。
1、 课 程 设 计课程名称 EDA技术 课题名称 键盘扫描与数码管及点阵显示设计 专 业 电子科学与技术 班 级 0802 学 号 * 姓 名 * 指导教师 * 2011年 6 月 20 日 湖南工程学院课程设计任务书课程名称: EDA技术 题 目:键盘扫描与数码管及点阵显示设计 专业班级:电科0802 学号: * 学生姓名: * 指导老师: * 审 批:任务书下达日期 2011 年 6 月 13 日设计完成日期 2011年 6 月 20 日设计内容与设计要求一 设计内容:1 设计并调试键盘扫描与数码管显示电路;2 键盘为3*4,数码管为7段8位;3 以数字形式显示键盘16个输入键的识别;4 外
2、设置控制开关和防抖动电路;5 功能扩展(自选):彩灯状态的转换以及点阵字符的显示 二 设计要求:1.设计思路清晰,整体设计给出框图,提供顶层电路图;2.应用vhdl完成各次级模块设计,绘出具体设计程序;3.完成设计仿真和程序下载; 4.写出设计报告主要设计条件1 提供所需元件及芯片;2 提供电源和调试设备;3 提供EWB设计软件说明书格式1 课程设计封面;2 设计仿真;3 编程下载;4 总结与体会;5 附录;6 参考文献。7 任务书;8 说明书目录;9 设计总体思路;10 单元电路设计程序;进 度 安 排月 日 日 课题电路设计。 月 日日 总体电路设计和子模块设计 月 日 日 软件仿真和联线
3、。 月 日 日 电路调试 月 日 写设计报告,打印相关图纸,月 日 答辩; 参 考 文 献一电子技术与EDA技术课程设计 郭照南 主编中南大学出版社目录第1章 总体方案设计分析11.1 基本设计思路11.2 总体框图1第2章 各级模块设计与分析22.1 键盘扫描程序设计及仿真22.2 点阵显示程序设计及仿真52.3 彩灯显示程序设计及仿真112.4 数码管扫描程序设计及仿真14第3章系统总电路设计与仿真163.1 系统总电路模块图163.2 总电路仿真波形163.3 系统总体电路图17第4章 软件的调试与下载184.1 引脚锁定184.2 引脚锁定后总电路图194.3 程序下载界面194.4
4、系统总体仿真结果20第5章 总结与体会21第6章 参考文献22第7章 附录237.1 点阵字符显示效果图237.2 彩灯显示结果23第1章 总体方案设计分析1.1 基本设计思路首先利用键盘扫描程序完成键盘扫描及按键输出值的输出,同时在其中加入按键消抖程序,以保证按键每次按下的键值都是有效准确的理想输出信号。同时通过按键扫描的输出定义两个控制信号量(程序中即xuanze和dz两信号)以通过按键的按下来达到控制彩灯状态切换以及点阵字符显示切换的目的。其中,定义了两个彩灯控制信号,以用来选择彩灯模块中两种彩灯显示状态的切换,而点阵控制信号则定义了五个状态以控制点阵显示的五个状态的切换。从而整个系统则
5、通过键盘扫描程序中的两个控制信号连接成了一个整体。最后就将键盘扫描的输出信号连接到数码管显示模块,彩灯模块连接到8个led灯,而点阵模块的输出则接入到点阵上。再在现有的基础上加入清零信号cr。综上,整个系统的功能即得以实现。1.2 总体框图图1.1 系统总体框图第2章 各级模块设计与分析2.1 键盘扫描程序设计及仿真2.1.1 基本设计思路本模块采用行输入,列输出,并定义一个五位的矢量信号count,此矢量通过时钟脉冲的输入计数,并且定义一个信号量sel并取其中间两位,以此两位构成的四个状态进行键盘列扫描,同时再在另外一个进程中通过三个条件语句的选择判断以确定三个行键中哪个按下,并结合列扫描中
6、sel所取的四个状态共同连接赋值给一个四位矢量knum,并由此确定了键盘的12个状态。最后利用另外一个进程中对knum值的判断从而确定对应的按键值的输出,以及其他各控制键值的信号输出(其中包括,控制彩灯状态的控制信号xuanze,以及控制点阵显示状态的控制信号dz)。2.1.2 键盘扫描模块图图2.1.1 键盘扫描模块图图中clk接时钟脉冲,cr是复位端,kin1,kin2,kin3为行扫描输入,xuanze为彩灯控制信号,dz为点阵控制信号,keyv为列输出,keycode为按键显示数值输出。2.1.3 键盘扫描程序library ieee; use ieee.std_logic_1164.
7、all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity keyscan is port(clk ,cr : in std_logic; -扫描时钟输入 kin1,kin2,kin3 : in std_logic; -按键行扫描输入 xuanze : out std_logic_vector(1 downto 0); dz:out std_logic_vector(2 downto 0); keyv: out std_logic_vector(3 downto 0);-按键列扫描 keycode : o
8、ut std_logic_vector(4 downto 0) ); -段码显示输出 end keyscan; architecture a of keyscan is signal sel : std_logic_vector(1 downto 0); signal knum : std_logic_vector(3 downto 0); signal count : std_logic_vector(4 downto 0); signal count0 : std_logic; begin sel=count(3 downto 2); count0=count(0); p1: proces
9、s(clk) -产生扫描信号 begin if clkevent and clk=1 then count keyv keyv keyv keyv keyv=1111; end case ; end process; p3: process(count0,count,kin1,kin2,kin3) -查键值 begin if (cr=0) then knum=1 & 1& count(3 downto 2); elsif count0event and count0=1 then if(kin3=0) and count(1)=0 then -第三行有键按下时 knum=1 & 0& coun
10、t(3 downto 2); elsif(kin2=0) and count(1)=0 then -第二行有键按下时 knum=0 & 1 & count(3 downto 2); elsif (kin1=0) and count(1)=0 then -第一行有键按下时 knum=0 & 0 & count(3 downto 2); end if; end if; end process; p4:process(knum) -键值译码显示输出 begin if cr=0 then xuanze=11;dz keycode=00000;xuanze=00;dz keycode=00001;xua
11、nze=00;dz keycode=00010;xuanze=00;dz keycode=00011;xuanze=00;dz keycode=00100;xuanze=00;dz keycode=00101;xuanze=00;dz keycode=00110;xuanze=00;dz keycode=00111;xuanze=00;dz keycode=01000;xuanze=00;dz keycode=01001;xuanze=00;dz keycode=01010;xuanze=01;dz keycode=01011;xuanze=10;dz keycode=01100;xuanze
12、=00;dz=000; end case ; end if; end process; end a;2.1.4 键盘扫描仿真波形图2.1.2 键盘扫描仿真波形2.2 点阵显示程序设计及仿真2.2.1 基本设计思路 程序通过键盘扫描程序中的点阵输出控制信号dz来控制点阵字符显示的状态,然后定义点阵的行列为输出类型,通过六个case语句以及16个显示状态的循环扫描来达到字符显示效果。最终结果,通过6个按键的控制分别输出“湖” ,“南” ,“工” ,“程” ,“学” ,“院”六个字符。2.2.2 点阵显示模块图图2.2.1 点阵显示模块图其中clk接时钟脉冲,cr接复位端,dz接从键盘扫描程序中输出
13、的点阵控制信号,hang,lie分别定义为点阵的行列的20个输入引脚。2.2.3 点阵显示程序library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity dianzheng isport( clk ,cr : in std_logic; -扫描时钟输入 dz : in std_logic_vector(2 downto 0); hang : out std_logic_vector(15 downto 0); lie : out
14、std_logic_vector(3 downto 0);end entity dianzheng;architecture behav of dianzheng issignal sel : std_logic_vector(3 downto 0);signal count : std_logic_vector(4 downto 0);type zhuangtai is (s0,s1,s2,s3,s4,s5); signal current_state, next_state: zhuangtai; beginsel=count(3 downto 0);p0: process(clk) -产
15、生扫描信号 begin if cr=0 then count=00000; elsif clkevent and clk=1 then count=count+1; if( count=10000) then count=00000;end if; current_state if(dz=001) then case sel is when 0000= lie=1111;hang lie=1110;hang lie=1101;hang lie=1100;hang lie=1011;hang lie=1010;hang lie=1001;hang lie=1000;hang lie=0111;h
16、ang lie=0110;hang lie=0101;hang lie=0100;hang lie=0011;hang lie=0010;hang lie=0001;hang lie=0000;hang count=00000;hang=0000000000000000; end case ; next_state=s0; elsif(dz=010) then next_state=s1; elsif(dz=011)then lie=1111;hang=0000000000000000;next_state=s2; elsif(dz=100)then lie=1111;hang=0000000
17、000000000;next_state=s3; elsif(dz=000)then lie=1111;hang=0000000000000000;next_state=s4; elsif(dz=111)then lie=1111;hang=0000000000000000;next_state case sel is when 0000= lie=1111;hang lie=1110;hang lie=1101;hang lie=1100;hang lie=1011;hang lie=1010;hang lie=1001;hang lie=1000;hang lie=0111;hang li
18、e=0110;hang lie=0101;hang lie=0100;hang lie=0011;hang lie=0010;hang lie=0001;hang lie=0000;hang count=00000;hang=0000000000000000; end case ; next_state case sel is when 0000= lie=1111;hang lie=1110;hang lie=1101;hang lie=1100;hang lie=1011;hang lie=1010;hang lie=1001;hang lie=1000;hang lie=0111;han
19、g lie=0110;hang lie=0101;hang lie=0100;hang lie=0011;hang lie=0010;hang lie=0001;hang lie=0000;hang count=00000;hang=0000000000000000; end case ; next_state case sel is when 0000= lie=1111;hang lie=1110;hang lie=1101;hang lie=1100;hang lie=1011;hang lie=1010;hang lie=1001;hang lie=1000;hang lie=0111
20、;hang lie=0110;hang lie=0101;hang lie=0100;hang lie=0011;hang lie=0010;hang lie=0001;hang lie=0000;hang count=00000;hang=0000000000000000; end case ; next_state case sel is when 0000= lie=1111;hang lie=1110;hang lie=1101;hang lie=1100;hang lie=1011;hang lie=1010;hang lie=1001;hang lie=1000;hang lie=
21、0111;hang lie=0110;hang lie=0101;hang lie=0100;hang lie=0011;hang lie=0010;hang lie=0001;hang lie=0000;hang count=00000;hang=0000000000000000; end case ; next_state case sel is when 0000= lie=1111;hang lie=1110;hang lie=1101;hang lie=1100;hang lie=1011;hang lie=1010;hang lie=1001;hang lie=1000;hang
22、lie=0111;hang lie=0110;hang lie=0101;hang lie=0100;hang lie=0011;hang lie=0010;hang lie=0001;hang lie=0000;hang count=00000;hang next_state=s0; end case; end process p1;end behav;2.2.4 点阵显示仿真波形图2.2.2 点阵显示仿真波形2.3 彩灯显示程序设计及仿真2.3.1 基本设计思路程序通过键盘扫描程序输出的彩灯控制信号xuanze的控制来保证两个彩灯在两个状态之间的顺利切换,其中一个状态为彩灯向左流水与向右流
23、水的循环显示,另一个状态为彩灯向中间流水。整体利用状态机来实现,并在第一个状态的时候就利用条件语句对xuanze值的判断从而控制状态机的循环路径,从而达到了控制两个彩灯状态的目的。2.3.2 彩灯显示模块图图2.3.1 彩灯显示模块图图中clk接时钟脉冲,cr接复位端,xuanze接键盘扫描程序的彩灯控制信号输出端,comb_outputs接8个led灯。2.3.3 彩灯显示程序library ieee;use ieee.std_logic_1164.all;entity leddeng isport( clk,cr : in std_logic; xuanze : in std_logic_
24、vector(1 downto 0); comb_outputs :out std_logic_vector(7 downto 0); keycode2:in std_logic_vector(4 downto 0) );end entity leddeng;architecture behav of leddeng is type zhuangtai is (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,s23); signal current_state, next_state: zhuangtai; beginp0: process(clk,cr) beginif cr=0 then current_state=s0;elsif (clk event and clk=1) then current_state if xuanze=01 then comb_outputs=01111111;next_state=s1; elsif xuanze=10 then next_state=s14; elsif xuanze=00 then next_state=s23;elsif xuanze=11then comb_outputs=