首页 VHDL课程设计S键盘

VHDL课程设计S键盘

举报
开通vip

VHDL课程设计S键盘目录一、课程设计的目的与任务 2二、课程设计题目 21、指定题目: 22、自选题目: 2三、课程设计的内容与要求 21、设计内容 22、设计要求 3四、实验仪器设备 3五、设计方案 31、PS2解码 32、设计思路 53、模块设计 64、各模块分析 7(1) PS2时钟检测模块 7(2) PS2解码模块 8(3) PS2组合模块 10(4) 控制LED模块 12(5) PS2总的组合模块 14六、综合与仿真 151、综合 152、仿真 16(1)电平检测模块仿真 16(2)LED灯控制模块仿真 17(3)PS2_m...

VHDL课程设计S键盘
目录一、课程设计的目的与任务 2二、课程设计题目 21、指定题目: 22、自选题目: 2三、课程设计的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 与要求 21、设计内容 22、设计要求 3四、实验仪器设备 3五、设计 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 31、PS2解码 32、设计思路 53、模块设计 64、各模块分析 7(1) PS2时钟检测模块 7(2) PS2解码模块 8(3) PS2组合模块 10(4) 控制LED模块 12(5) PS2总的组合模块 14六、综合与仿真 151、综合 152、仿真 16(1)电平检测模块仿真 16(2)LED灯控制模块仿真 17(3)PS2_module总模块仿真 17七、硬件下载 20八、心得体会 22九、参考文献 231、课程设计的目的与任务(1)熟练掌握EDA工具软件QuartusII的使用;(2)熟练用VHDL硬件描述语言描述数字电路;(3)学会使用VHDL进行大规模集成电路设计;(4)学会用CPLD\FPGA使用系统硬件验证电路设计的正确性;(5)初步掌握EDA技术并具备一定的可编程逻辑芯片的开发能力;2、课程设计题目1、指定题目:0:多功能计数器;1:数字秒表;2:简易数字钟;3:简易频率计;4:彩灯控制器;5:交通灯控制器;6:四路智力竞赛抢答器;7:简易微波炉控制器;8:表决器;9:数字密码锁;我的的学号尾数是2,所以我要做的题目是简易数字钟。由于我之前已经学过VerilogHDL和VHDL,所以简易数字钟相对于我比较简单,我完成了简易数字钟并验收后,再选择了另一个自选题目来完成。简易数字钟:设计一个以“秒”为基准信号的简易数字钟,显示时、分、秒,同时可实现整点报时和清零(我已经完成,而且已经验收了)。2、自选题目:在完成了数字钟的设计后,我选择了另一个设计的题目,那就是PS2键盘扫描。所以这次课程设计我的报告主要详细写的是PS2键盘扫描的程序,而不是简易数字钟。PS键盘扫描:设计一个PS键盘扫描程序,能接受键盘的输入时钟和数据,区别哪一个键输入,同时解译通码和断码,使用LED灯来显示收到的数据。3、课程设计的内容与要求1、设计内容(1)系统功能的分析;(2)实现系统功能的实际方案;(3)编写各功能模块的VHDL语言程序;(4)对各功能模块进行编译、综合、仿真、分析;(5)顶层文件设计(6)对整个系统进行编译、综合、仿真、分析;(7)在CPLD\FPGA实验开发系统试验箱上进行硬件验证;(8)写实验报告;2、设计要求(1)按所布置的题目要求,每一位学生独立完成全过程;(2)分模块层次化设计;(3)各功能模块的底层文件必须用VHDL语言设计,顶层文件可用VHDL语言设计,也可以用原理图设计。4、实验仪器设备(1)PC机;(2)QuartusII软件;(3)黑金FPGA实验开发系统,芯片为CycloneII的EP2C5Q208C8;5、设计方案1、PS2解码图1为PS2的接口图。我使用的的右边的PS2接口,即1脚为数据脚,5脚为时钟脚,同时我编写的VHDL代码只对1脚和5脚操作。图2PS2 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 时序图图2为PS2协议时序图。由图可以解读出,PS2协议对数据的读取时“CLK的下降沿”有效,而数据的放置时在“CLK的上升沿”。PS2频率比较慢,大概为10KHz。 第N位 属性 0 开始位 1~8 数据位 9 校验位 10 结束位表1PS2数据说明PS2的一帧数据时11位。对PS2进行解码,我们需要得到的是1~8位的数据位。其他的位,可以使用取巧的方法编写。键盘的编码有“通码(Make)”和“断码(Break)”之分。通码相当于某个按键按下了,断码相当于某个按键释放了。假设,我们按下了“Z”键不放,大约每秒有10个X“1A”的通码(10KHz),而当我们释放“Z”键,就会输出断码X“F0”和X“1A”。同时,键盘编码一次只能有一个输出,即多个按键同时按下时,只有一个有效。下表为第二套PC键盘扫描码。 键 名 通 码 断 码 - 键 名 通 码 断 码 - 键 名 通 码 断 码 A 1C F0,1C 9 46 F0,46 [ 54 FO,54 B 32 F0,32 ` 0E F0,0E INSERT E0,70 E0,F0,70 C 21 F0,21 - 4E F0,4E HOME E0,6C E0,F0,6C D 23 F0,23 = 55 FO,55 PGUP E0,7D E0,F0,7D E 24 F0,24 \ 5D F0,5D DELETE E0,71 E0,F0,71 F 2B F0,2B BKSP 66 F0,66 END E0,69 E0,F0,69 G 34 F0,34 SPACE 29 F0,29 PGDN E0,7A E0,F0,7A H 33 F0,33 TAB 0D F0,0D UARROW E0,75 E0,F0,75 I 43 F0,43 CAPS 58 F0,58 LARROW E0,6B E0,F0,6B J 3B F0,3B LSHFT 12 FO,12 DARROW E0,72 E0,F0,72 K 42 F0,42 LCTRL 14 FO,14 RARROW E0,74 E0,F0,74 L 4B F0,4B LGUI E0,1F E0,F0,1F NUM 77 F0,77 M 3A F0,3A LALT 11 F0,11 KP/ E0,4A E0,F0,4A N 31 F0,31 RSHFT 59 F0,59 KP* 7C F0,7C O 44 F0,44 RCTRL E0,14 E0,F0,14 KP- 7B F0,7B P 4D F0,4D RGUI E0,27 E0,F0,27 KP+ 79 F0,79 Q 15 F0,15 RALT E0,11 E0,F0,11 KPEN E0,5A E0,F0,5A R 2D F0,2D APPS E0,2F E0,F0,2F KP. 71 F0,71 S 1B F0,1B ENTER 5A F0,5A KP0 70 F0,70 T 2C F0,2C ESC 76 F0,76 KP1 69 F0,69 U 3C F0,3C F1 05 F0,05 KP2 72 F0,72 V 2A F0,2A F2 06 F0,06 KP3 7A F0,7A W 1D F0,1D F3 04 F0,04 KP4 6B F0,6B X 22 F0,22 F4 0C F0,0C KP5 73 F0,73 Y 35 F0,35 F5 03 F0,03 KP6 74 F0,74 Z 1A F0,1A F6 0B F0,0B KP7 6C F0,6C 0 45 F0,45 F7 83 F0,83 KP8 75 F0,75 1 16 F0,16 F8 0A F0,0A KP9 7D F0,7D 2 1E F0,1E F9 01 F0,01 ] 5B F0,5B 3 26 F0,26 F10 09 F0,09 ; 4C F0,4C 4 25 F0,25 F11 78 F0,78 ' 52 F0,52 5 2E F0,2E F12 07 F0,07 , 41 F0,41 6 36 F0,36 PRNTSCRN E0,12,E0,7C? E0,F0,7C,E0,F0,12? . 49 F0,49 7 3D F0,3D SCROLL 7E F0,7E / 4A F0,4A 8 3E F0,3E PAUSE E1,14,77,E1,F0,14,F0,77 -NONE- 表2PC键盘第二套扫描码2、设计思路(1)PS2时钟的检测;(2)PS2数据的接受并提取需要的8位数据;(3)对PS2提取的8位数据进行解码,确定按键;(4)通过LED灯显示按键的解码的结果;(5)设置多个按键,多种LED显示方式;对于PS2键盘扫描程序,我的设计思路是一个模块一个功能,这样能清晰分辨模块,同时易于修改代码。代码条理清晰,便于解读。而对于多个模块则使用层次化的形式来编写,顶层文件并不包含功能的设定,只包含各个子功能模块。3、模块设计PS2键盘扫描分为:电平检测,PS2解码,PS2组合,LED控制和总PS组合六个模块。下面为各个模块的简易模块图。(1)PS2时钟检测模块:PS2_CLK_Pin_InH_L_SigL_H_Sig电平检测模块PS2_detect_module图3电平检测模块图(2)PS2解码模块:PS2解码模块PS2_encode_modulePS2_Data_Pin_InPS2_DataH_L_SigPS2_Done_Sig图4PS2解码模块图(3)PS2组合模块:PS2解码模块PS2_encode_modulePS2_Data_Pin_InPS2_DataPS2_Done_SigPS2_CLK_Pin_InH_L_Sig电平检测模块PS2_detect_module图5PS2组合模块图(4)控制LED模块:PS2_DataData_Out电平检测模块PS2_control_modulePS2_Done_Sig图6LED控制模块图(5)PS2总的组合模块:PS2_Done_SigPS2_DataPS2_Data_Pin_InPS2_CLK_Pin_InData_Out电平检测模块PS2_control_module电平检测模块PS2_control_module图7PS2模块图4、各模块分析(1)PS2时钟检测模块PS2电平检测模块主要的作用是检测PS2接口键盘的时钟信号,因为PS2的协议规定数据是在时钟的下降沿读取的。所以电平检测模块要检测PS2时钟的下降沿,有下降沿来临时,要做相应的数据读取动作。下面是代码的分析。LIBRARYIEEE; --库USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;------------------------------------------------------------------------------------------------------------------------------------------ENTITYPS2_detect_moduleIS --实体声明 PORT( CLK,RSTn:INSTD_LOGIC; PS2_CLK_Pin_In:INSTD_LOGIC; H_L_Sig:OUTSTD_LOGIC; --电平由高变低,输出一个信号 L_H_Sig:OUTSTD_LOGIC --电平由低变高,输出一个信号 );ENDENTITYPS2_detect_module;------------------------------------------------------------------------------------------------------------------------------------------ARCHITECTUREPS2_detectOFPS2_detect_moduleIS --结构体声明 SIGNALH_L_F1:STD_LOGIC:='1'; --声明4个信号,用于电平输入的变化 SIGNALH_L_F2:STD_LOGIC:='1'; --4个信号都赋了初值 SIGNALL_H_F1:STD_LOGIC:='0'; SIGNALL_H_F2:STD_LOGIC:='0'; BEGIN PROCESS(CLK,RSTn) BEGIN IF(CLK'eventANDCLK='1')THEN --同步进行 IF(RSTn='0')THEN --同步复位动作 H_L_F1<='1';H_L_F2<='1';L_H_F1<='0';L_H_F2<='0'; ELSE H_L_F1<=PS2_CLK_Pin_In;H_L_F2<=H_L_F1; L_H_F1<=PS2_CLK_Pin_In;L_H_F2<=L_H_F1; ENDIF; ENDIF; ENDPROCESS; H_L_Sig<=H_L_F2AND(NOTH_L_F1); --输出信号 L_H_Sig<=L_H_F1AND(NOTL_H_F2); ENDARCHITECTUREPS2_detect; --结构体结束在结构体中声明了4个信号,用于电平的检测F2信号是接着F1信号的,如果F1信号变化了,F2信号还不会立即变化,F2还会保持F1的前一个状态,以两者的逻辑关系,可以判断输入的是上升沿还是下降沿。结果如表格3。 时间 H_L_F1 H_L_F2 H_L_Sig<=H_L_F2AND(NOTH_L_F1) Initial 1 1 0 T1 0 1 1 T2 0 0 0 时间 L_H_F1 L_H_F2 L_H_Sig<=L_H_F1AND(NOTL_H_F2); Initial 0 0 0 T1 1 0 1 T2 1 1 0表3电平检测变化表(2)PS2解码模块LIBRARYIEEE; --库USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;------------------------------------------------------------------------------------------------------------------------------------------ENTITYPS2_decode_moduleIS --实体声明 PORT( CLK,RSTn:INSTD_LOGIC; H_L_Sig:INSTD_LOGIC; PS2_Data_Pin_In:INSTD_LOGIC; PS2_Done_Sig:OUTSTD_LOGIC; PS2_Data:OUTSTD_LOGIC_VECTOR(7DOWNTO0) );ENDENTITYPS2_decode_module;------------------------------------------------------------------------------------------------------------------------------------------ARCHITECTUREPS2_decodeOFPS2_decode_moduleISSIGNALDone:STD_LOGIC:='0'; --声明一个完成信号SIGNALi:STD_LOGIC_VECTOR(4DOWNTO0):="00001"; --声明步骤iSIGNALData:STD_LOGIC_VECTOR(7DOWNTO0):=X"32";BEGINPROCESS(CLK,RSTn,i)BEGINIF(CLK'eventANDCLK='1')THENIF(RSTn='0')THEN i<="00001";Done<='0';Data<=X"00";ELSE CASEiISWHEN"00000"=>i<="00001"; WHEN"00001"=>IF(H_L_Sig='1')THENi<="00010";Data(0)<=PS2_Data_Pin_In;ENDIF; WHEN"00010"=>IF(H_L_Sig='1')THENi<="00011";Data(1)<=PS2_Data_Pin_In;ENDIF; WHEN"00011"=>IF(H_L_Sig='1')THENi<="00100";Data(2)<=PS2_Data_Pin_In;ENDIF; WHEN"00100"=>IF(H_L_Sig='1')THENi<="00101";Data(3)<=PS2_Data_Pin_In;ENDIF; WHEN"00101"=>IF(H_L_Sig='1')THENi<="00110";Data(4)<=PS2_Data_Pin_In;ENDIF; WHEN"00110"=>IF(H_L_Sig='1')THENi<="00111";Data(5)<=PS2_Data_Pin_In;ENDIF; WHEN"00111"=>IF(H_L_Sig='1')THENi<="01000";Data(6)<=PS2_Data_Pin_In;ENDIF; WHEN"01000"=>IF(H_L_Sig='1')THENi<="01001";Data(7)<=PS2_Data_Pin_In;ENDIF; WHEN"01001"=>IF(H_L_Sig='1')THENi<="01010";ENDIF; WHEN"01010"=>IF(H_L_Sig='1')THENi<="01011";ENDIF; WHEN"01011"=>IF(Data=X"F0")THENi<="01100";ELSEi<="10110";ENDIF; WHEN"01100"=>IF(H_L_Sig='1')THENi<="01101";ENDIF; WHEN"01101"=>IF(H_L_Sig='1')THENi<="01110";ENDIF; WHEN"01110"=>IF(H_L_Sig='1')THENi<="01111";ENDIF; WHEN"01111"=>IF(H_L_Sig='1')THENi<="10000";ENDIF; WHEN"10000"=>IF(H_L_Sig='1')THENi<="10001";ENDIF; WHEN"10001"=>IF(H_L_Sig='1')THENi<="10010";ENDIF; WHEN"10010"=>IF(H_L_Sig='1')THENi<="10011";ENDIF; WHEN"10011"=>IF(H_L_Sig='1')THENi<="10100";ENDIF; WHEN"10100"=>IF(H_L_Sig='1')THENi<="10101";ENDIF; WHEN"10101"=>IF(H_L_Sig='1')THENi<="10110";ENDIF; WHEN"10110"=>IF(H_L_Sig='1')THENi<="10111";Done<='1';ENDIF; WHEN"10111"=>IF(H_L_Sig='1')THENi<="00001";Done<='0';ENDIF; WHENOTHERS=>i<="00001"; ENDCASE; ENDIF; ENDIF;ENDPROCESS; PS2_Data<=Data; PS2_Done_Sig<=Done;ENDARCHITECTUREPS2_decode;这个模块我有点偷懒,只对键盘输入的8位有效数据进行了提取,其他位基本是忽略了,第一位开始位忽略了,然后是读取8位有效数据,第9步和第10步跳过了检测位和结束位,然后是判断。如果是0XF0,则证明是断码,断码的话后面的直接跳过,如果不是0XF0,则证明是有效的数据,立即跳到步骤22,向顶层的模块回馈一个完成信号,并将有效数据输出。(3)PS2组合模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;------------------------------------------------------------------------------------------------------------------------------------------ENTITYPS2IS PORT( CLK,RSTn:INSTD_LOGIC; PS2_Data_Pin_In:INSTD_LOGIC; PS2_CLK_Pin_In:INSTD_LOGIC; PS2_Done_Sig:BUFFERSTD_LOGIC; PS2_Data:OUTSTD_LOGIC_VECTOR(7DOWNTO0) );ENDENTITYPS2;------------------------------------------------------------------------------------------------------------------------------------------ARCHITECTUREPS2_behaveOFPS2IS COMPONENTPS2_detect_module PORT( CLK,RSTn:INSTD_LOGIC; PS2_CLK_Pin_In:INSTD_LOGIC; H_L_Sig:OUTSTD_LOGIC; L_H_Sig:OUTSTD_LOGIC ); ENDCOMPONENT; COMPONENTPS2_decode_module PORT( CLK,RSTn:INSTD_LOGIC; H_L_Sig:INSTD_LOGIC; PS2_Data_Pin_In:INSTD_LOGIC; PS2_Done_Sig:OUTSTD_LOGIC; PS2_Data:OUTSTD_LOGIC_VECTOR(7DOWNTO0) ); ENDCOMPONENT;-- COMPONENTPS2_code_module-- PORT(-- CLK,RSTn:INSTD_LOGIC;-- L_H_Sig:INSTD_LOGIC;-- PS2_Done_Sig:INSTD_LOGIC;-- PS2_Data_Pin_Out:OUTSTD_LOGIC-- );-- ENDCOMPONENT; SIGNALH_L:STD_LOGIC;-- SIGNALL_H:STD_LOGIC;-- SIGNALPS2_Data_Pin_Out:STD_LOGIC; BEGIN U1:PS2_detect_modulePORTMAP(CLK,RSTn,PS2_CLK_Pin_In,H_L,L_H); U2:PS2_decode_modulePORTMAP(CLK,RSTn,H_L,PS2_Data_Pin_In,PS2_Done_Sig,PS2_Data);-- U2:PS2_decode_modulePORTMAP(CLK,RSTn,H_L,PS2_Data_Pin_Out,PS2_Done_Sig,PS2_Data);-- U3:PS2_code_modulePORTMAP(CLK,RSTn,L_H,PS2_Done_Sig,PS2_Data_Pin_Out);ENDARCHITECTUREPS2_behave;这是一个组合例化的模块,是对PS2时钟电平检测和PS2解码的一个简单模块。这一个模块初步实现了PS2的解码功能。上面的是代码的方法实现例化功能,同时也可以使用原理图的方式来实现例化,下面为原理图例化的图。图8PS2例化原理图(4)控制LED模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;------------------------------------------------------------------------------------------------------------------------------------------ENTITYPS2_contorl_moduleIS PORT( CLK,RSTn:INSTD_LOGIC; PS2_Done_Sig:INSTD_LOGIC; PS2_Data:INSTD_LOGIC_VECTOR(7DOWNTO0); Data_Out:OUTSTD_LOGIC_VECTOR(3DOWNTO0) );ENDENTITYPS2_contorl_module;------------------------------------------------------------------------------------------------------------------------------------------ARCHITECTUREPS2_contorlOFPS2_contorl_moduleISSIGNALData:STD_LOGIC_VECTOR(3DOWNTO0); BEGIN PROCESS(CLK,RSTn) BEGIN IF(CLK'eventANDCLK='1')THEN IF(RSTn='0')THEN Data<="0001"; ELSIF(PS2_Done_Sig='1')THEN CASEPS2_DataIS WHENX"22"=>Data<=(Data(2DOWNTO0)&Data(3)); WHENX"1A"=>Data<=(Data(0)&Data(3DOWNTO1)); WHENX"14"=>Data<=(Data(0)&Data(1)&Data(2)&Data(3)); WHENX"21"=>Data<="1111";WHENX"2A"=>Data<="0000"; WHENX"5A"=>Data<="0001";WHENX"32"=>Data<="0001"; WHENX"31"=>Data<="0011";WHENX"3A"=>Data<="0111"; WHENOTHERS=>Data<=Data; ENDCASE; ENDIF; ENDIF; ENDPROCESS; Data_Out<=Data; ENDARCHITECTUREPS2_contorl;LED控制模块主要的作用是用于显示结果。在PS2键盘扫描后,得到的8位有效结果,使用4盏LED灯作为检查结果的输出,使用不用的LED闪亮方式来表示不同的按键按下了。本程序只做了11个按键,分别是“Z”,“X”,“C”,“V”,“B”,“N”,“M”,“Entet”和“Ctrl”。“Z”按下后,LED向左移一个单位,“X”是向右移一个单位,“Ctrl”是LED灯互换,“B”是点亮一盏LED,“N”是点亮两盏LED,“M”是点亮三盏LED,“Entet”是复原LED灯的情况。(5)PS2总的组合模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;------------------------------------------------------------------------------------------------------------------------------------------ENTITYPS2_moduleIS PORT( CLK,RSTn:INSTD_LOGIC; PS2_Data_Pin_In:INSTD_LOGIC; PS2_CLK_Pin_In:INSTD_LOGIC; Data_Out:OUTSTD_LOGIC_VECTOR(3DOWNTO0) );ENDENTITYPS2_module;------------------------------------------------------------------------------------------------------------------------------------------ARCHITECTUREPS2OFPS2_moduleIS COMPONENTPS2 PORT( CLK,RSTn:INSTD_LOGIC; PS2_Data_Pin_In:INSTD_LOGIC; PS2_CLK_Pin_In:INSTD_LOGIC; PS2_Done_Sig:OUTSTD_LOGIC; PS2_Data:OUTSTD_LOGIC_VECTOR(7DOWNTO0) ); ENDCOMPONENT;COMPONENTPS2_contorl_module PORT( CLK,RSTn:INSTD_LOGIC; PS2_Done_Sig:INSTD_LOGIC; PS2_Data:INSTD_LOGIC_VECTOR(7DOWNTO0); Data_Out:OUTSTD_LOGIC_VECTOR(3DOWNTO0) ); ENDCOMPONENT; SIGNALDone_Sig:STD_LOGIC; SIGNALData:STD_LOGIC_VECTOR(7DOWNTO0); BEGIN U1:PS2 PORTMAP(CLK,RSTn,PS2_Data_Pin_In,PS2_CLK_Pin_In,Done_Sig,Data);-- U1:PS2 PORTMAP(CLK,RSTn,PS2_CLK_Pin_In,Done_Sig,Data); U2:PS2_contorl_modulePORTMAP(CLK,RSTn,Done_Sig,Data,Data_Out); ENDARCHITECTUREPS2;这是一个组合例化的模块,是对PS2功能模块和LED控制的一个简单组合的模块。这一个模块是PS2键盘扫描的最顶层文件,只做例化作用,不包含其他功能代码。上面的是代码的方法实现例化功能,同时也可以使用原理图的方式来实现例化,下面为原理图例化的图。图9PS2_module总例化原理图6、综合与仿真1、综合对编写好的源程序进行综合,同时生成RTL电路图,RTL电路图如下。图10PS2_module模块RTL图2、仿真在本次设计中,仿真工作只对电平检测模块,LED灯控制模块和PS2_module总模块进行了仿真。对于前两个模块,采用的仿真方法是使用QuartusII自带的波形仿真软件进行仿真,而对于PS2_module总模块的仿真则使用了编写代码的方式进行仿真。因为PS2_module总模块对键盘按键的波形设置很麻烦,而且仿真效果不好,所以直接使用代码的方式产生一个键盘按键,同时观察波形来检测。(1)电平检测模块仿真电平检测模块原理图如下:图11电平检测原理图仿真波形如下:图12电平检测模块仿真波形系统时钟给了10ns,PS2_CLK_Pin_In给了100ns,RSTn复位一直为高电平,可以观察波形得到,在PS2_CLK_Pin_In时钟的上升沿发生后,L_H_Sig发出了一个高脉冲的信号,大概相隔两个系统时钟;在PS2_CLK_Pin_In时钟的下降沿发生后,H_L_Sig也发出了一个高脉冲,也是相隔两系统时钟,而高脉冲大概是两个系统时钟左右。(2)LED灯控制模块仿真LED灯控制模块原理图如下:图13LED灯控制模块原理图仿真波形如下:图14LED灯控制模块仿真波形系统时钟给了10ns,RSTn复位在一开始的时候给了‘0’,进行了一次复位,PS2 _Done_Sig完成信号则是100ns一次,PS2_Data给的是X“22”(即X被按下)。复位后Data_Out输出的是“0001”,第一盏LED灯点亮,然后在PS2_Done_Sig信号后,Data_Out输出变化了,变为了“0010”,LED第二盏给点亮了,LED灯移位了。因为一直是X被按下,所以信号不断移位,LED分别为1,2,4,8。在最后那里,由于PS2_Data给的是X“20”,并没有在控制那设置这个按键,所以LED没反应,一直保持在2(即第二盏灯点亮)。(3)PS2_module总模块仿真由于PS2总仿真的时候需要键盘的通码输入,但使用波形的改变来作为通码输入的方式太麻烦了,而且很容易出错,得不到想要的波形。所以为了克服这个问题,我使用了另外的一种方法来仿真,直接写键盘编码来给整个模块,然后开输出波形就可以观察。PS2_module总模块仿真点简单方框图如下:PS2_Done_SigPS2_Data_Pin_InPS2_DataPS2_CLK_Pin_InH_L_SigL_H_SigPS2解码模块PS2_encode_module电平检测模块PS2_detect_module键盘编码模块PS2_code_module图15PS2_module总模块方框图PS2_code_module键盘编码模块代码如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;------------------------------------------------------------------------------------------------------------------------------------------ENTITYPS2_code_moduleIS PORT( CLK,RSTn:INSTD_LOGIC; L_H_Sig:INSTD_LOGIC; PS2_Done_Sig:INSTD_LOGIC; PS2_Data_Pin_Out:OUTSTD_LOGIC );ENDENTITYPS2_code_module;------------------------------------------------------------------------------------------------------------------------------------------ARCHITECTUREPS2_codeOFPS2_code_moduleIS CONSTANTn_0:STD_LOGIC_VECTOR:=X"22";CONSTANTn_1:STD_LOGIC_VECTOR:=X"1A"; CONSTANTn_2:STD_LOGIC_VECTOR:=X"14";CONSTANTn_3:STD_LOGIC_VECTOR:=X"21"; CONSTANTn_4:STD_LOGIC_VECTOR:=X"2A";CONSTANTn_n:STD_LOGIC_VECTOR:=X"F0"; SIGNALdata:STD_LOGIC:='0'; SIGNALi:STD_LOGIC_VECTOR(4DOWNTO0):="00000"; BEGIN PROCESS(CLK,RSTn,i)BEGIN IF(CLK'eventANDCLK='1')THEN IF(RSTn='0')THEN i<="00000"; data<='0'; ELSE CASEiIS WHEN"00000"=>i<="00001"; WHEN"00001"=>IF(L_H_Sig='1')THENi<="00010";data<=n_1(0);ENDIF; WHEN"00010"=>IF(L_H_Sig='1')THENi<="00011";data<=n_1(1);ENDIF; WHEN"00011"=>IF(L_H_Sig='1')THENi<="00100";data<=n_1(2);ENDIF; WHEN"00100"=>IF(L_H_Sig='1')THENi<="00101";data<=n_1(3);ENDIF; WHEN"00101"=>IF(L_H_Sig='1')THENi<="00110";data<=n_1(4);ENDIF; WHEN"00110"=>IF(L_H_Sig='1')THENi<="00111";data<=n_1(5);ENDIF; WHEN"00111"=>IF(L_H_Sig='1')THENi<="01000";data<=n_1(6);ENDIF; WHEN"01000"=>IF(L_H_Sig='1')THENi<="01001";data<=n_1(7);ENDIF; WHEN"01001"=>IF(L_H_Sig='1')THENi<="01010";ENDIF; WHEN"01010"=>IF(L_H_Sig='1')THENi<="01011";ENDIF; WHEN"01011"=>IF(PS2_Done_Sig='1')THENi<="01100";ENDIF; WHEN"01100"=>IF(L_H_Sig='1')THENi<="01101";data<=n_n(0);ENDIF; WHEN"01101"=>IF(L_H_Sig='1')THENi<="01110";data<=n_n(1);ENDIF; WHEN"01110"=>IF(L_H_Sig='1')THENi<="01111";data<=n_n(2);ENDIF; WHEN"01111"=>IF(L_H_Sig='1')THENi<="10000";data<=n_n(3);ENDIF; WHEN"10000"=>IF(L_H_Sig='1')THENi<="10001";data<=n_n(4);ENDIF; WHEN"10001"=>IF(L_H_Sig='1')THENi<="10010";data<=n_n(5);ENDIF; WHEN"10010"=>IF(L_H_Sig='1')THENi<="10011";data<=n_n(6);ENDIF; WHEN"10011"=>IF(L_H_Sig='1')THENi<="10100";data<=n_n(7);ENDIF; WHEN"10100"=>IF(L_H_Sig='1')THENi<="10101";ENDIF; WHEN"10101"=>IF(L_H_Sig='1')THENi<="10110";ENDIF; WHEN"10110"=>IF(L_H_Sig='1')THENi<="10111";ENDIF; WHEN"10111"=>IF(L_H_Sig='1')THENi<="00000";ENDIF; WHENOTHERS=>i<="00000"; ENDCASE; ENDIF; ENDIF; ENDPROCESS; PS2_Data_Pin_Out<=data; ENDARCHITECTUREPS2_code;代码实现的功能就是每一个PS2_CLK_Pin_In的上升沿来临的时候,设置好数据给S2_CLK_Pin_In的下降沿时后面模块的读取,时间要与PS2_decode_module模块同步。仿真出来的波形图如下:图16输入为“Z”的波形图图17输入为“X”的波形图由图16和图17可以看出整个模块的仿真结果。“X”和“Z”按键的作用是一个向左移,一个向右移,在上图中能很清晰地看出他们的变化。7、硬件下载先设置好芯片类型,因为我是使用自己的FPGA开发板,所以我用的芯片是CycloneII的EP2C5Q208C8,如下图。图18设置芯片型号设置芯片后,接着的是设置不用到引脚位,将不用的引脚设置为三态输入,以防芯片烧坏,设置方式如下图:图19设置没有用到的引脚成功编译后,是引脚分配,将需要用到的端口分配到FPGA的引脚上关联起来,引脚分配如下图:图20引脚分配图最后的操作是硬件下载,在PROGRAMMER中进行,要设置好USB仿真口,FPGA下载方式是JTAG,下载图如下:图21文件下载图最后是在讲PC键盘接在FPGA开发板上,按下按键来试调观察结果。8、心得体会9、参考文献
本文档为【VHDL课程设计S键盘】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
烟雨
暂无简介~
格式:doc
大小:92KB
软件:Word
页数:0
分类:工学
上传时间:2020-06-23
浏览量:0