PS2键盘编码Verilog源程序分享.doc

上传人:白大夫 文档编号:3271762 上传时间:2019-08-07 格式:DOC 页数:3 大小:18.50KB
返回 下载 相关 举报
PS2键盘编码Verilog源程序分享.doc_第1页
第1页 / 共3页
亲,该文档总共3页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《PS2键盘编码Verilog源程序分享.doc》由会员分享,可在线阅读,更多相关《PS2键盘编码Verilog源程序分享.doc(3页珍藏版)》请在三一文库上搜索。

1、PS2键盘编码Verilog源程序分享之前探讨过PS/2键盘编解码以及数据传输协议,这次自己动手实现了利用FPGA接收键盘编码,然后通过串口传输到PC。做的比较简单,只是通过FPGA把大写字母A-Z转换成相应的ASCII码,只要字母按键被按下,就能在串口调试助手里显示相应大写字母。下面就共享代码吧!除了顶层模块,三个底层模块分别为PS/2传输处理模块、串口传输模块以及串口波特率选择模块(下面只给出顶层模块和PS/2传输处理模块的Verilog代码)。Module Ps2_key(Clk,Rst_n,Ps2k_clk,Ps2k_data,Rs232_tx);Input Clk; /50M时钟信号

2、Input Rst_n; /复位信号Input Ps2k_clk; /PS2接口时钟信号Input Ps2k_data; /PS2接口数据信号Output Rs232_tx; / RS232发送数据信号Wire7:0 Ps2_byte; / 1byte键值Wire Ps2_state; /按键状态标志位Wire Bps_start; /接收到数据后,波特率时钟启动信号置位Wire Clk_bps; / Clk_bps的高电平为接收或者发送数据位的中间采样点Ps2scan Ps2scan( .Clk(Clk), /按键扫描模块.Rst_n(Rst_n),.Ps2k_clk(Ps2k_clk),.

3、Ps2k_data(Ps2k_data),.Ps2_byte(Ps2_byte),.Ps2_state(Ps2_state);Speed_select Speed_select( .Clk(Clk),.Rst_n(Rst_n),.Bps_start(Bps_start),.Clk_bps(Clk_bps);My_uart_tx My_uart_tx( .Clk(Clk),.Rst_n(Rst_n),.Clk_bps(Clk_bps),.Rx_data(Ps2_byte),.Rx_int(Ps2_state),.Rs232_tx(Rs232_tx),.Bps_start(Bps_start);E

4、ndmoduleModule Ps2scan(Clk,Rst_n,Ps2k_clk,Ps2k_data,Ps2_byte,Ps2_state);Input Clk; /50M时钟信号Input Rst_n; /复位信号Input Ps2k_clk; /PS2接口时钟信号Input Ps2k_data; /PS2接口数据信号Output7:0 Ps2_byte; / 1byte键值,只做简单的按键扫描Output Ps2_state; /键盘当前状态,Ps2_state=1表示有键被按下/-Reg Ps2k_clk_r0,Ps2k_clk_r1,Ps2k_clk_r2; /Ps2k_clk状态寄

5、存器/Wire Pos_ps2k_clk; / Ps2k_clk上升沿标志位Wire Neg_ps2k_clk; / Ps2k_clk下降沿标志位Always (Posedge Clk Or Negedge Rst_n) BeginIf(!Rst_n) BeginPs2k_clk_r0 锁存状态,进行滤波Ps2k_clk_r0 = Ps2k_clk;Ps2k_clk_r1 = Ps2k_clk_r0;Ps2k_clk_r2 = Ps2k_clk_r1;EndEndAssign Neg_ps2k_clk = Ps2k_clk_r1 /下降沿/-Reg7:0 Ps2_byte_r; /PC接收来自

6、PS2的一个字节数据存储器Reg7:0 Temp_data; /当前接收数据寄存器Reg3:0 Num; /计数寄存器Always (Posedge Clk Or Negedge Rst_n) BeginIf(!Rst_n) BeginNum = 4D0;Temp_data = 8D0;EndElse If(Neg_ps2k_clk) Begin /检测到Ps2k_clk的下降沿Case (Num)4D0: Num = Num+1B1;4D1: BeginNum = Num+1B1;Temp_data0 = Ps2k_data; /Bit0End4D2: BeginNum = Num+1B1;

7、Temp_data1 = Ps2k_data; /Bit1End4D3: BeginNum = Num+1B1;Temp_data2 = Ps2k_data; /Bit2End4D4: BeginNum = Num+1B1;Temp_data3 = Ps2k_data; /Bit3End4D5: BeginNum = Num+1B1;Temp_data4 = Ps2k_data; /Bit4End4D6: BeginNum = Num+1B1;Temp_data5 = Ps2k_data; /Bit5End4D7: BeginNum = Num+1B1;Temp_data6 = Ps2k_da

8、ta; /Bit6End4D8: BeginNum = Num+1B1;Temp_data7 = Ps2k_data; /Bit7End4D9: BeginNum = Num+1B1; /奇偶校验位,不做处理End4D10: BeginNum = 4D0; / Num清零EndDefault: ;EndcaseEndEndReg Key_f0; /松键标志位,置1表示接收到数据8Hf0,再接收到下一个数据后清零Reg Ps2_state_r; /键盘当前状态,Ps2_state_r=1表示有键被按下Always (Posedge Clk Or Negedge Rst_n) Begin /接收数

9、据的相应处理,这里只对1byte的键值进行处理If(!Rst_n) BeginKey_f0 = 1B0;Ps2_state_r = 1B0;EndElse If(Num=4D10) Begin /刚传送完一个字节数据If(Temp_data = 8Hf0) Key_f0 = 1B1;Else BeginIf(!Key_f0) Begin /说明有键按下Ps2_state_r = 1B1;Ps2_byte_r = Temp_data; /锁存当前键值EndElse BeginPs2_state_r = 1B0;Key_f0 = 1B0;EndEndEndEndReg7:0 Ps2_asci; /

10、接收数据的相应ASCII码Always (Ps2_byte_r) BeginCase (Ps2_byte_r) /键值转换为ASCII码,这里做的比较简单,只处理字母8H15: Ps2_asci = 8H51; /Q8H1d: Ps2_asci = 8H57; /W8H24: Ps2_asci = 8H45; /E8H2d: Ps2_asci = 8H52; /R8H2c: Ps2_asci = 8H54; /T8H35: Ps2_asci = 8H59; /Y8H3c: Ps2_asci = 8H55; /U8H43: Ps2_asci = 8H49; /I8H44: Ps2_asci =

11、8H4f; /O8H4d: Ps2_asci = 8H50; /P8H1c: Ps2_asci = 8H41; /A8H1b: Ps2_asci = 8H53; /S8H23: Ps2_asci = 8H44; /D8H2b: Ps2_asci = 8H46; /F8H34: Ps2_asci = 8H47; /G8H33: Ps2_asci = 8H48; /H8H3b: Ps2_asci = 8H4a; /J8H42: Ps2_asci = 8H4b; /K8H4b: Ps2_asci = 8H4c; /L8H1z: Ps2_asci = 8H5a; /Z8H22: Ps2_asci = 8H58; /X8H21: Ps2_asci = 8H43; /C8H2a: Ps2_asci = 8H56; /V8H32: Ps2_asci = 8H42; /B8H31: Ps2_asci = 8H4e; /N8H3a: Ps2_asci = 8H4d; /MDefault: ;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1