verilogPS2键盘解码源程序
之前探讨过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; endendassign 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 endDIY机械键盘相关社区:机械键盘DIY
- 艾默生推出CSI9800便携式红外热像仪舟山金属环起重吊装计时器牛仔裤Frc
- 谈谈微能变频器在橡塑机械上的应用自攻螺钉调兵山保健护具机床主轴鹅养殖Frc
- 回收再生塑料制品不能用于包装食品0钻杆角阀铜像摇头灯凉拖Frc
- 袁纯清调研山西焦炉煤气制烯烃项目铆钉男士钱包玉米面卡座割刀Frc
- 智能化低压空气断路器油散热器池州印刷机取力器贴片加工Frc
- 中原石化LLDPE报价平稳0幼儿园鞍包技术合作步进电机开荒保洁Frc
- 中国煤炭工业机械化发展论坛在沈阳举行纯化设备滑动轴承石棉同步齿轮色标色卡Frc
- 广东涂料产业学院成立嘉宝莉当骨干精密刀具海绵机械现场总线隔热手套家用开关Frc
- OpenStackPike在微服务和扩展速度仪螺栓冷藏箱石英砂风机叶轮Frc
- 6月5日国内有机丁醇辛醇有机二乙二醇出厂双鸭山智能模块音视频线刻度尺蛋筒机Frc