0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PS2键盘编码Verilog源程序分享

电子工程师 来源:网络整理 作者:工程师曾暄茗 2018-07-15 09:55 次阅读

之前探讨过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时钟信号

Input Rst_n; //复位信号

Input Ps2k_clk; //PS2接口时钟信号

Input Ps2k_data; //PS2接口数据信号

Output Rs232_tx; // RS232发送数据信号

Wire[7: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),

.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)

);

Endmodule

Module 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接口数据信号

Output[7:0] Ps2_byte; // 1byte键值,只做简单的按键扫描

Output Ps2_state; //键盘当前状态,Ps2_state=1表示有键被按下

//------------------------------------------

Reg Ps2k_clk_r0,Ps2k_clk_r1,Ps2k_clk_r2; //Ps2k_clk状态寄存器

//Wire Pos_ps2k_clk; // Ps2k_clk上升沿标志位

Wire Neg_ps2k_clk; // Ps2k_clk下降沿标志位

Always @ (Posedge Clk Or Negedge Rst_n) Begin

If(!Rst_n) Begin

Ps2k_clk_r0 <= 1''B0;

Ps2k_clk_r1 <= 1''B0;

Ps2k_clk_r2 <= 1''B0;

End

Else Begin //锁存状态,进行滤波

Ps2k_clk_r0 <= Ps2k_clk;

Ps2k_clk_r1 <= Ps2k_clk_r0;

Ps2k_clk_r2 <= Ps2k_clk_r1;

End

End

Assign Neg_ps2k_clk = ~Ps2k_clk_r1 & Ps2k_clk_r2; //下降沿

//------------------------------------------

Reg[7:0] Ps2_byte_r; //PC接收来自PS2的一个字节数据存储器

Reg[7:0] Temp_data; //当前接收数据寄存器

Reg[3:0] Num; //计数寄存器

Always @ (Posedge Clk Or Negedge Rst_n) Begin

If(!Rst_n) Begin

Num <= 4''D0;

Temp_data <= 8''D0;

End

Else If(Neg_ps2k_clk) Begin //检测到Ps2k_clk的下降沿

Case (Num)

4''D0: Num <= Num+1''B1;

4''D1: Begin

Num <= Num+1''B1;

Temp_data[0] <= Ps2k_data; //Bit0

End

4''D2: Begin

Num <= Num+1''B1;

Temp_data[1] <= Ps2k_data; //Bit1

End

4''D3: Begin

Num <= Num+1''B1;

Temp_data[2] <= Ps2k_data; //Bit2

End

4''D4: Begin

Num <= Num+1''B1;

Temp_data[3] <= Ps2k_data; //Bit3

End

4''D5: Begin

Num <= Num+1''B1;

Temp_data[4] <= Ps2k_data; //Bit4

End

4''D6: Begin

Num <= Num+1''B1;

Temp_data[5] <= Ps2k_data; //Bit5

End

4''D7: Begin

Num <= Num+1''B1;

Temp_data[6] <= Ps2k_data; //Bit6

End

4''D8: Begin

Num <= Num+1''B1;

Temp_data[7] <= Ps2k_data; //Bit7

End

4''D9: Begin

Num <= Num+1''B1; //奇偶校验位,不做处理

End

4''D10: Begin

Num <= 4''D0; // Num清零

End

Default: ;

Endcase

End

End

Reg Key_f0; //松键标志位,置1表示接收到数据8''Hf0,再接收到下一个数据后清零

Reg Ps2_state_r; //键盘当前状态,Ps2_state_r=1表示有键被按下

Always @ (Posedge Clk Or Negedge Rst_n) Begin //接收数据的相应处理,这里只对1byte的键值进行处理

If(!Rst_n) Begin

Key_f0 <= 1''B0;

Ps2_state_r <= 1''B0;

End

Else If(Num==4''D10) Begin //刚传送完一个字节数据

If(Temp_data == 8''Hf0) Key_f0 <= 1''B1;

Else Begin

If(!Key_f0) Begin //说明有键按下

Ps2_state_r <= 1''B1;

Ps2_byte_r <= Temp_data; //锁存当前键值

End

Else Begin

Ps2_state_r <= 1''B0;

Key_f0 <= 1''B0;

End

End

End

End

Reg[7:0] Ps2_asci; //接收数据的相应ASCII码

Always @ (Ps2_byte_r) Begin

Case (Ps2_byte_r) //键值转换为ASCII码,这里做的比较简单,只处理字母

8''H15: Ps2_asci <= 8''H51; //Q

8''H1d: Ps2_asci <= 8''H57; //W

8''H24: Ps2_asci <= 8''H45; //E

8''H2d: Ps2_asci <= 8''H52; //R

8''H2c: Ps2_asci <= 8''H54; //T

8''H35: Ps2_asci <= 8''H59; //Y

8''H3c: Ps2_asci <= 8''H55; //U

8''H43: Ps2_asci <= 8''H49; //I

8''H44: Ps2_asci <= 8''H4f; //O

8''H4d: Ps2_asci <= 8''H50; //P 

8''H1c: Ps2_asci <= 8''H41; //A

8''H1b: Ps2_asci <= 8''H53; //S

8''H23: Ps2_asci <= 8''H44; //D

8''H2b: Ps2_asci <= 8''H46; //F

8''H34: Ps2_asci <= 8''H47; //G

8''H33: Ps2_asci <= 8''H48; //H

8''H3b: Ps2_asci <= 8''H4a; //J

8''H42: Ps2_asci <= 8''H4b; //K

8''H4b: Ps2_asci <= 8''H4c; //L

8''H1z: Ps2_asci <= 8''H5a; //Z

8''H22: Ps2_asci <= 8''H58; //X

8''H21: Ps2_asci <= 8''H43; //C

8''H2a: Ps2_asci <= 8''H56; //V

8''H32: Ps2_asci <= 8''H42; //B

8''H31: Ps2_asci <= 8''H4e; //N

8''H3a: Ps2_asci <= 8''H4d; //M

Default: ;

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1325

    浏览量

    109298
  • 源程序
    +关注

    关注

    63

    文章

    1693

    浏览量

    45165
  • PS2键盘
    +关注

    关注

    1

    文章

    9

    浏览量

    4272
收藏 人收藏

    评论

    相关推荐

    ps2鼠标/键盘接口定义

    ps2鼠标/键盘接口定义
    发表于 05-04 18:54

    PS2的FPGA解码模块

    PS2接口主要用到三根线,GROUND,DATA,CLOCK。DATA信号在下降沿的时候有效,CLOCK频率很低,大约10K。PS2一帧是11位:BIT0为开始位,BIT1-BIT8为数据位
    发表于 01-12 14:46

    简单解码PS2键盘

    简单的解码PS2键盘的W/A/S/D四个按键,用来控制H桥,从而控制小车行进的方向
    发表于 07-08 19:02

    PS2鼠标 verilog

    FPGA PS2鼠标verilog
    发表于 06-11 14:01

    PS2键盘时钟与系统时钟

    请问一下,在编写ps2键盘程序时,键盘的时钟和系统时钟是什么关系????
    发表于 07-26 10:22

    ps2键盘 协议

    我想请教下ps2协议如果键盘一直不按的话 ps2协议中时钟一直是高电平吗
    发表于 01-27 10:25

    使用FPGA驱动采用PS2接口的pc机键盘

    简单的介绍了PS2从机到主机的通信协议,我们知道了键盘是一个字节一个字节的往主机发送数据的,但是,每个字节代表了什么内容呢,我们还需要对照键盘编码对照表来查看。
    发表于 04-28 06:06

    Verilog模拟PS2协议的实现

    PS2协议读键盘值相当简单嘛,比模拟SPI、I2C简单多了...下面介绍一下具体过程.1.明确接线关系,只需接4根线,VCC要+5V,3.3我测试过不能用,时钟和数据线要用bidir双向口线,FPGA可以不用外接上拉电阻。另外,
    发表于 07-12 06:55

    PS2键盘接口引脚定义图

    PS2键盘接口引脚定义图 PS/2 键盘接口为 6 针母插,外观为: 
    发表于 11-27 12:36 4.1w次阅读
    <b class='flag-5'>PS2</b><b class='flag-5'>键盘</b>接口引脚定义图

    verilog PS2键盘解码程序

     之前探讨过PS/2键盘编解码以及数据传输协议,这次自己动手实现了利用FPGA接收键盘编码,然后通过串口传输到PC。做的比较
    发表于 06-05 12:31 1673次阅读

    PS2键盘控制程序

    Xilinx FPGA工程例子源码:PS2键盘控制程序
    发表于 06-07 14:45 16次下载

    VHDL例程_PS2键盘接口程序

    VHDL例程 PS2键盘接口程序,感兴趣的小伙伴们可以瞧一瞧。
    发表于 11-10 17:12 8次下载

    PS2键盘转USB键盘源码

    PS2键盘转USB键盘
    发表于 05-04 11:52 11次下载

    MCU驱动PS2键盘

    MCU驱动PS2键盘
    发表于 10-27 14:39 17次下载
    MCU驱动<b class='flag-5'>PS2</b><b class='flag-5'>键盘</b>

    PS2键盘在单片机系统中的应用

    PS2键盘在单片机系统中的应用
    发表于 10-27 14:41 17次下载
    <b class='flag-5'>PS2</b><b class='flag-5'>键盘</b>在单片机系统中的应用