⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2shortkey.v

📁 本实例是学习fpga的入门程序 希望大家喜欢
💻 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 + -