版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计课程名称EDA课程设计课题名称键盘扫描与数码管显示电路设计专业电子科学与技术班级学号姓名指导教师PAGE4湖南工程学院课程设计任务书课程名称:EDA技术题目:键盘扫描与数码管显示电路设计专业班级:电子科学与技术学号:学生姓名:指导老师:审批:任务书下达日期设计完成日期设计内容与设计要求设计内容:设计并调试键盘扫描与数码管显示电路;键盘为3*4,数码管为7段8位;以数字形式显示键盘12个输入键的识别;外设置控制开关和防抖动电路;功能扩展(自选);完成加减运算或某外部硬件对象的控制设计要求:1.设计思路清晰,整体设计给出框图,提供顶层电路图;2.应用vhdl或verilog完成各次级模块设计,给出具体设计程序;3.完成设计仿真和程序下载;4.写出设计报告主要设计条件提供EDA实验室;提供EL实验箱和CPLD芯片提供ALTERA公司的quartusⅡ设计软件;说明书格式课程设计封面;任务书;说明书目录;设计总体思路;单元电路设计程序;设计仿真;编程下载;总结与体会;附录;参考文献。进度安排月日~日课题电路设计。月日~日总体电路设计和子模块设计月日~日软件仿真和联线。月日~日电路调试月日写设计报告,打印相关图纸,月日答辩;参考文献PAGE10目录引言 2第一章总体方案设计分析 21.1基本设计思路 21.2总体框图 3第二章子模块程序模块分析 32.1键盘扫描程序设计与分析 32.1.1基本设计思路 32.1.2键盘扫描、编码输出、消抖模块 42.2加减功能模块程序与分析 42.2.1功能模块基本设计思路 42.2.2加减功能模块 52.3数码管显示模块 52.3.1显示模块基本设计思路 52.3.2数码管显示模块 5第三章子模块仿真图 63.1键盘扫描模块仿真图 63.2防抖动电路仿真图 73.3加减法电路仿真图 73.4数码管电路仿真图 83.5总电路仿真波形图 8第四章程序下载 94.1程序下载 9第五章心得体会 10附录A:系统硬件原理图 11附录B:程序清单 12附录C:参考文献 21电气信息学院课程设计评分表 22引言随着电子技术在工业、医疗、商业等领域的发展,人们对数据传输率的要求越来越高,传统的单片机早已不能满足这种高速数据传输的要求。与此同时,可编程器件FPGA/CPLD以其强大的功能,开发过程投资小、周期短,可反复编程修改,开发工具智能化等特点,成为当今硬件设计的潮流;相比而言,FPGA即现场可编程门阵列,它的集成度高,可完成极其复杂的时序与组合逻辑电路功能,更适用于告诉、高密度的高端数字逻辑电路设计领域。近几十年来,可编程器件FPGA/CPLD成本大幅降低,且随着EDA技术的日益普及,FPGA/CPLD以其较好的集成度和稳定性、可编程实现与升级的特点,在电子设计领域得到了越来越多的应用。本设计使用altera的芯片,开发过程中采用quartusII实现设计。基本流程为:首先根据设计任务要求进行方案的设计,包括引脚的确定、时序关系、功能框图和模块划分、数据处理流程和方法等;然后依据模块设计进行仿真,确定结果无误后进行布局和布线,生成配置文件;在下载前进行时序分析;最后下载、测试,从而完成设计。第一章总体方案设计分析1.1基本设计思路本设计利用键盘扫描程序完成4*4键盘的扫描并编码输出按键值,然后对按键输出值进行消抖,以保证每次按键值都能准确无误的输出,同时利用加减功能模块对输入值进行简单的加法、减法操作,并将加减之后的结果转换成BCD码输出到显示控制模块,通过显示控制模块将加减后的结果显示在数码管上。本设计对时钟的利用充分,通过同一个时钟使各个模块之间协同工作,充分利用时钟的上下边沿,使整个系统处于一种高速工作状态,以提高整个系统工作效率。1.2总体框图键盘输入键盘输入键盘扫描及消抖加减功能模块数码管显示模块时钟脉冲第二章子模块程序模块分析2.1键盘扫描程序设计与分析2.1.1基本设计思路 本模块采用行输入,列输出,并定义一个4进制计数信号,在时钟脉冲的上升沿输入时计数,利用4进制提供行扫描信号,在没有按键按下时,行扫描的输出信号变化顺序为0001→0010→0100→1000→……依次周而复始。当有按键按下时,在时钟的下降沿延按键输出,同时将行扫描值与列输入值合并形成组合值作为按键的输入值,并对按键的输入值进行编码使其输出为4位二进制值。按键时通常会造成持续时间不大于10ms的信号抖动,这种抖动使系统无法正确识别按键的操作次数,本系统的抖动消除电路使用一个16进制计数器,当输入值在计数16次的过程中没有变化时,则认为该值为一个正确的可识别的数值,同时输出该值。2.1.2键盘扫描、编码输出、消抖模块图中clkin为时钟脉冲输入,在该模块中利用时钟的上下边沿,使该工作模块更高效,keyin为按键输入值,keyvalueout为编码,消抖输出值。2.2加减功能模块程序与分析2.2.1功能模块基本设计思路本模块能完成简单的加、减操作和清0显示操作,由于该模块从键盘得到的编码值每次只能输入一个按键值,所以在加减法中首先用一个信号保存第一次输入的值,当输入的是加号或减号时,将第一次的输入值与‘0’组成组合值,可以当再次按键时,用另一个信号保存一个新的输入值,最后当“=”按下时两个输入值根据加减号所对应的编码执行将相加或相减,从组合值最高位可以得到加减后的结果的进位或借位,并通过对最高位和低四位的判断的判断,将最后结果转换成BCD码并输出输出到数码管显示。2.2.2加减功能模块图中diavaluein[3..0]为按键输入值,disvalueout0[3..0]为计算结果的十位值,disvalueout1[3..0]为个位值2.3数码管显示模块2.3.1显示模块基本设计思路每个数码管有8个段:h、g、f、e、d、c、b、a(dp是小数点)都连在一起,8个数码管分别由8个选通信号k1~k8来选择。被选通的数码管显示数据。例如,在某一时刻,k3为高电平,其余选通信号为低电平,这时仅k3对应的数码管显示来自段信号端的数据,而其他7个数码管呈现关闭状态。根据这种电路状况,如果希望在8个数码管显示希望的数据,就必须使得8个选通信号k1~k8分别被单独选通,与此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫变,根据人眼的视觉暂留原理,就能实现动态扫描显示的目的2.3.2数码管显示模块本次课程设计只用到了其中两个数码管,所以在BT中只需选择高两位显示即可,其他的可以不接。第三章子模块仿真图3.1键盘扫描模块仿真图3.2防抖动电路仿真图3.3加减法电路仿真图3.4数码管电路仿真图3.5总电路仿真波形图第四章程序下载4.1程序下载首先启动软件quartusII,打开工程,配置引脚,按照配置好的引脚在试验箱上接线,然后下载。程序下载后,按对应的按键将会有与之对应的数字(0-7)显示在数码管上,当按下数字键并显示后,再按功能键“清0”对应的输入将会被清除,同时数码管显示0;当按下功能键“+”或“-”后,继续按数字键,最后按下“=”,计算结果将会以十进制显示在数码管上,该模块中为使数码管扫描显示稳定,时钟脉冲可选择300—600左右即可。4.2出现的问题及解决方法在本次课程设计中,下载到试验箱后,出现按键多次跳动问题,是由于矩阵键盘的使用过程中没有消抖的原因。在程序中添加一个防抖动程序即可防止类似情况的发生。时钟频率的选择,由于本次课程设计只采用了一个时钟脉冲,所以在选择时钟脉冲时应当考虑数码管扫描的情况。在做加减法操作时,无法显示正确的结果,是由于程序中的各种逻辑关系出现问题。第五章心得体会在这次EDA课程设计中,学到很多东西,不仅巩固了以前所学过的基础知识,而且对EDA硬件实验有了进一步的了解。在这次课程设计中,通过对键盘控制电路的设计,使我了解键盘设计的基本方法,学到更多有关于电路方面的知识,把我们所学的数字电路这门课程应用到实际过程中来了,真正的将理论和实践联系在一起。更重要的是学到了用电脑软件实现电路原理的知识,用电脑的仿真方法使得设计更为简便,对于我们电子专业来说,这个课程设计是很有必要的。也提高了我们对实践操作和理论研究的兴趣。通过这次课程设计使我懂得了理论知识与实际相结合的重要性,只有理论知识是远远不够的,只有两者相结合,才能提高自己的动手能力和独立思考的能力,才能发现在设计过程中所遇到的问题。同时也在实践与理论相结合的过程中,发现自身的不足之处,并加以学习和巩固。总的来说,这次课程设计还是比较成功的,虽然遇到了很多问题,最后还是在老师的指导下,一一解答完成,本次课程设计充分锻炼了自己的能力,使自己对以后的路有了更加清除的认识,同时也为明年的毕业设计做一定的准备。最后,对在本次课程设计中给过我帮助的陈老师表示感谢。附录A:系统硬件原理图附录B:程序清单键盘行扫描输入程序libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityscan_keyis Port(clkin:inSTD_LOGIC; --扫描时钟,周期20mskeydrv:outSTD_LOGIC_VECTOR(3downto0));--输出扫描信号endscan_key;architecturebehavioralofscan_keyissignalcount:std_logic_vector(1downto0):="00";--计数器信号begin process(clkin) begin ifrising_edge(clkin)then ifcount="11"then count<="00"; else count<=count+1; endif; endif; endprocess; process(count) begin casecountis when"00"=>keydrv<="1110"; when"01"=>keydrv<="1101"; when"10"=>keydrv<="1011"; when"11"=>keydrv<="0111"; whenothers=>keydrv<="0000"; endcase; endprocess;endbehavioral;键盘编码程序libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitykeydecoderisPort(clkin:instd_logic; keyin:inSTD_LOGIC_VECTOR(2downto0);keydrv:inSTD_LOGIC_VECTOR(3downto0); keycode:outSTD_LOGIC_VECTOR(3downto0));endkeydecoder;architectureRtlofkeydecoderissignaltemp:STD_LOGIC_VECTOR(6downto0);signalkeyvalue1:STD_LOGIC_VECTOR(3downto0):="0000";signalcount:std_logic_vector(1downto0):="00";--signalkeypressed:boolean:=false;--signalq1,q2,q3,q4:boolean;begin temp<=keydrv&keyin; process(clkin) begin iffalling_edge(clkin)then ifkeyin="1111"then ifcount="11"then keyvalue1<="1111"; count<="00"; else count<=count+1; endif; else count<="00"; casetempis when"1110011"=>keyvalue1<="0000"; when"1101011"=>keyvalue1<="0001"; when"1011011"=>keyvalue1<="0010"; when"0111011"=>keyvalue1<="0011"; when"1110101"=>keyvalue1<="0100"; when"1101101"=>keyvalue1<="0101"; when"1011101"=>keyvalue1<="0110"; when"0111101"=>keyvalue1<="0111"; when"1110110"=>keyvalue1<="1000"; when"1101110"=>keyvalue1<="1001"; when"1011110"=>keyvalue1<="1010"; when"0111110"=>keyvalue1<="1011"; whenothers=>keyvalue1<=keyvalue1; endcase; endif; endif; endprocess;keycode<=keyvalue1;endrtl;键盘消抖程序libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityAntiwitterisPort(clkin:inSTD_LOGIC;keyvaluein:inSTD_LOGIC_VECTOR(3downto0);keyvalueout:outSTD_LOGIC_VECTOR(3downto0));endAntiwitter;architectureBehavioralofAntiwitterissignalTempNum:std_logic_vector(3downto0);signalCounter:std_logic_vector(3downto0);signalStart:std_logic;begin process(clkin) begin ifrising_edge(clkin)then ifStart='0'then TempNum<="1111"; keyvalueout<="1111"; Start<='1'; elseifkeyvaluein/=TempNumthen TempNum<=Keyvaluein; Counter<="0000"; elseifCounter="1111"then keyvalueout<=keyvaluein; Counter<="0000"; else Counter<=Counter+1; endif; endif; endif; endif; endprocess;endBehavioral;加减功能模块程序libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityconvertisPort(CLK:inSTD_LOGIC;disvaluein:inSTD_LOGIC_VECTOR(3downto0);disvalueout0:outSTD_LOGIC_VECTOR(3downto0);disvalueout1:outSTD_LOGIC_VECTOR(3downto0));endconvert;architecturebenofconvertissignalA:std_logic_vector(3downto0):="0000";signalB0:std_logic_vector(4downto0):="00000";signalB1:std_logic_vector(4downto0):="00000";signalX:std_logic_vector(4downto0):="00000";begin process(CLK) variableflag:std_logic_vector(3downto0); begin IFCLK'EVENTANDCLK='1'THEN casedisvalueinis when"1000"=>X<="00000"; when"1001"=>B0<='0'&A;--"-" flag:="1001"; when"1010"=>B0<='0'&A;--"+" flag:="1010"; when"1011"=>B1<='0'&A; ifflag="1010"thenX<=B0+B1; else X<=B0-B1; endif; whenothers=>X<='0'&disvaluein; A<=disvaluein; endcase; ENDIF; endprocess;process(X)variablevalu:std_logic_vector(3downto0);begin valu:=X(3)&X(2)&X(1)&X(0); CASEX(4)IS WHEN'1'=>ifvalu>"1001"thendisvalueout0<="0110"+valu; disvalueout1<="0000"; elsedisvalueout0<=valu; disvalueout1<="0001"; endif; WHEN'0'=>ifvalu>"1001"thendisvalueout0<="0110"+valu; disvalueout1<="0001"; else disvalueout0<=valu; disvalueout1<="0000"; endif; WHENOTHERS=>null; ENDCASE;endprocess;endben;数码管显示程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYscan_ledISPORT(CLK:INSTD_LOGIC; d0,d1,d2,d3,d4,d5,d6,d7:instd_logic_vector(3downto0); SG:OUTSTD_LOGIC_VECTOR(6DOWNTO0);--段控制信号输出 BT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));--位控制信号输出ENDscan_led;ARCHITECTUREoneOFscan_ledISSIGNALCNT8:STD_LOGIC_VECTOR(2DOWNTO0);SIGNALA:STD_LOGIC_VECTOR(3DOWNTO0);BEGINP1:PROCESS(CNT8,d0,d1,d2,d3,d4,d5,d6,d7) BEGINCASECNT8ISWHEN"000"=>BT<="00000001";A<=d0;WHEN"001"=>BT<="00000010";A<=d1;WHEN"010"=>BT<="00000100";A<=d2;WHEN"011"=>BT<="00001000";A<=d3;WHEN"100"=>BT<="00010000";A<=d4;WHEN"101"=>BT<="00100000";A<=d5;WHEN"110"=>BT<="01000000";A<=d6;WHEN"111"=>BT<="10000000";A<=d7;WHENOTHERS=>NULL;ENDCASE;ENDPROCESSP1;P2:PROCESS(CLK) BEGINIFCLK'EVENTANDCLK='1'THENCNT8<=CNT8+1;ENDIF; ENDPROCESSP2;P3:PRO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年石材挂装施工合同2篇
- 2025版高级行政人员职业健康与安全协议3篇
- 二零二五年度可再生能源发电项目合作协议2篇
- 二零二五年度VI设计及品牌形象建设合同范本
- 学生期末考试总结范文
- 2025版公司应收账款质押贷款合同3篇
- 二零二五年度农产品运输买卖合同品质保障协议3篇
- 2025年度燃料油产品研发与市场拓展合同2篇
- 出纳的转正述职报告范文(5篇)
- 2025年学生宿舍安全责任追究及赔偿协议3篇
- 山东省济南市2023-2024学年高一上学期1月期末考试数学试题(解析版)
- 文字学概要完整版本
- 手术室抢救工作制度
- ce自我声明模板
- 钢闸门监理评估报告
- 高档养老社区项目计划书
- 蛇年销售年会发言稿范文
- 国管局住房制度改革相关政策解答
- 无缝钢管服务方案
- 排涝泵站养护方案范本
- XX医院临床医疗质量考核通用记录表
评论
0/150
提交评论