📄 ps2shortkey.v
字号:
`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company: // Engineer: // // Create Date: 20:28:42 08/01/2007 // Design Name: // Module Name: ps2shortkey // Project Name: // Target Devices: // Tool versions: // Description: //// Dependencies: //// Revision: // Revision 0.01 - File Created// Additional Comments: ////////////////////////////////////////////////////////////////////////////////////`define LEFT_SHIFT 8'h12//16'h12????`define RIGHT_SHIFT 8'h59`define RELEASE_CODE 8'hf0//`define EXTEND_CODE
module ps2shortkey(clk, rst_n, ps2c, ps2d, dout, ready); input clk; input rst_n; input ps2c; input ps2d; output [7:0] dout; output ready;reg ready;reg ps2c_delay;//reg ps2d_delay;wire ps2clk_l;//wire ps2data;wire clk10u;wire release_key;wire shift_on;reg pull_down;reg enstart;reg [8:0] cnt10u;//84reg [4 : 0] scan_count;always @ (posedge clk or negedge rst_n)if(!rst_n) cnt10u <= 0 ;else cnt10u <= cnt10u + 1;assign clk10u = (cnt10u == 9'b111111111) ;//wire clk10u_up ;//assign clk10u= (cnt10u == 5'b11111); always @ (posedge clk)if(clk10u) ps2c_delay <= ps2c; reg [15:0] delay1ms; //15//debounce delay (prevent error fall)always @ (posedge clk or negedge rst_n)if(!rst_n) delay1ms <= 0 ;else if(delay1ms == 16'hffff) delay1ms <=0;else if(enstart) delay1ms <= delay1ms + 1;always @ (posedge clk)if (!rst_n) enstart <= 0 ;else if(delay1ms == 16'hffff) enstart <= 0 ;else if(ps2clk_l&&(scan_count == 0)) enstart <= 1;assign ps2clk_l =~ps2c&&(ps2c_delay); //if ps2c down >>>ps2clk_1 set up always @ (posedge clk or negedge rst_n)if(!rst_n) scan_count <= 0 ;else if ((scan_count == 11)||(~enstart)) scan_count <= 0 ;else if (ps2clk_l&&clk10u) scan_count <= scan_count + 1;reg [10 :0 ] rxbuf ;/*reg [3:0] ready_delay; always @ (posedge clk or negedge rst_n)if(!rst_n) ready_delay <= 0 ;else if (scan_count == 11) ready_delay <= 0 ;else if ((scan_count == 10) && ready_delay <= 4'b1110) ready_delay <= ready_delay + 1 ;*/ always @ (posedge clk or negedge rst_n)if(!rst_n) rxbuf<=0 ;//else if (ps2clk_l) rxbuf[scan_count]<=ps2d;reg [7:0] keydata;reg [8:0] q;always @ (posedge clk or negedge rst_n)if (!rst_n) q <= 0 ;else q <= rxbuf [9:1] ;always @ (posedge clk or negedge rst_n)if(!rst_n) ready <= 0 ;else if( (q[0]^q[1]^q[2]^q[3]^q[4]^q[5]^q[6]^q[7]==(~q[8]))&& (scan_count == 10) &&// ~ready_delay[3]&& ps2clk_l && (~shift_on) && pull_down) ready <= 1 ;else ready <= 0 ;reg rx_shift_on;assign release_key =( q[7:0] == `RELEASE_CODE) ;assign shift_on =((q[7:0] ==`LEFT_SHIFT)||(q[7:0] ==`RIGHT_SHIFT));always @ (posedge clk or negedge rst_n)if(!rst_n) rx_shift_on <= 0 ;else if ((~pull_down)&&(shift_on)) rx_shift_on <= 0;//else if ()else if (shift_on&&(scan_count == 9)) rx_shift_on <= 1;always @ (posedge clk or negedge rst_n)if(!rst_n) pull_down <= 1;//1else if (release_key) pull_down <= 0 ;else begin if((scan_count == 11)&& (~release_key)) pull_down <= 1'b1 ; endalways @ (posedge clk or negedge rst_n)beginif(!rst_n) keydata <= 0;else if(pull_down && (~shift_on)) begin if ((scan_count == 10)) keydata <= q[7:0]; endend//assign ready = (scan_count == 10);wire [11:0] keycode;reg [7:0] ascii;//assign rx_shift_on = 0 ;assign keycode = {3'b0,rx_shift_on,keydata};always @(keycode)begin casez (keycode) // SHORT KEY 12'h079 : ascii <= 8'h2b; // + 12'h07c : ascii <= 8'h2a; // * 12'h070 : ascii <= 8'h30; // 0 12'h069 : ascii <= 8'h31; // 1 12'h072 : ascii <= 8'h32; // 2 12'h07a : ascii <= 8'h33; // 3 12'h06b : ascii <= 8'h34; // 4 12'h073 : ascii <= 8'h35; // 5 12'h074 : ascii <= 8'h36; // 6 12'h06c : ascii <= 8'h37; // 7 12'h075 : ascii <= 8'h38; // 8 12'h07d : ascii <= 8'h39; // 9 12'h07b : ascii <= 8'h2d; // - 12'h04a : ascii <= 8'h2f; // / 12'h066 : ascii <= 8'h08; // Backspace ("backspace" key) 12'h071 : ascii <= 8'h02;// (Delete OR DEL on numeric keypad) 12'h077 : ascii <= 8'h04;// numeric keypad) 12'h05a : ascii <= 8'h01; // Carriage return ("enter" key) //short key default : ascii <= 8'h2e; // '.' used for unlisted characters.
endcaseendassign dout = ascii ;endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -