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

📄 convert.v.bak

📁 FPGA的PS2口接口程序
💻 BAK
字号:
/*转换模块
用于将键盘码转换为ASCII码,并处理shift键和capslock键;
*/	 


module convert
  ( clk,
    scan,
	prepared,
	clr,
	data
  );
  
    input        clk;
	input  [7:0] scan;
	input        prepared;
	input        clr;
	output [7:0] data;
	
	reg    [7:0] tmpASCII;
	reg    [7:0] ASCII;
    reg    	     keypressed;
	reg          shifted;
	reg          capslocked;
	
	reg          pre_prepared;
	reg          now_prepared;
	reg          prepared_r;
	
always @(posedge clk)
begin
   pre_prepared <= prepared;
   now_prepared <= pre_prepared;
   if(now_prepared==pre_prepared)
	prepared_r <= now_prepared;
end

always @(posedge prepared_r or negedge clr)
 begin
	if(!clr) begin
	  shifted <= 0;
      capslocked <= 0;
      keypressed <= 0;
	  end
	else begin
	 keypressed <= (scan == 8'hF0)? 1'b1 : 1'b0;//有键按下keypressed=1,;
	 /*shift键按下*/
	 shifted <= ((scan == 8'h12 || scan == 8'h59) && keypressed == 1'b1)? !shifted : shifted;
	 /*capslock键按下*/
	 capslocked <= (scan == 8'h58 && keypressed == 1'b1)? !capslocked : capslocked;
	end
end

/*转换表*/
always @(scan or shifted or clr)
	begin
		if(!clr) begin
			tmpASCII <= 0;
		end
		else begin
			case (scan) /*synthesis full_case*/
			  8'b00001101 : tmpASCII <= 8'h09;
			  8'b00001110 : tmpASCII <= shifted ? 8'h7E : 8'h60;//~,`
			  8'b00010101 : tmpASCII <= 8'h51;//Q
			  8'b00010110 : tmpASCII <= shifted ? 8'h21 : 8'h31;//!,1
			  8'b00011010 : tmpASCII <= 8'h5A;//Z
			  8'b00011011 : tmpASCII <= 8'h53;//S
			  8'b00011100 : tmpASCII <= 8'h41;//A
			  8'b00011101 : tmpASCII <= 8'h57;//W
			  8'b00011110 : tmpASCII <= shifted ? 8'h40 : 8'h32;//@,2
			  8'b00100001 : tmpASCII <= 8'h43;//C
			  8'b00100010 : tmpASCII <= 8'h58;//X
			  8'b00100011 : tmpASCII <= 8'h44;//D
			  8'b00100100 : tmpASCII <= 8'h45;//E
			  8'b00100101 : tmpASCII <= shifted ? 8'h24 : 8'h34;//$,4
			  8'b00100110 : tmpASCII <= shifted ? 8'h23 : 8'h33;//#,3
			  8'b00101001 : tmpASCII <= 8'h20;//space
			  8'b00101010 : tmpASCII <= 8'h56;//V
			  8'b00101011 : tmpASCII <= 8'h46;//F
			  8'b00101100 : tmpASCII <= 8'h54;//T
			  8'b00101101 : tmpASCII <= 8'h52;//R
			  8'b00101110 : tmpASCII <= shifted ? 8'h25 : 8'h35;//%,5
			  8'b00110001 : tmpASCII <= 8'h4E;//N
			  8'b00110010 : tmpASCII <= 8'h42;//B
			  8'b00110011 : tmpASCII <= 8'h48;//H
			  8'b00110100 : tmpASCII <= 8'h47;//G
			  8'b00110101 : tmpASCII <= 8'h59;//Y
			  8'b00110110 : tmpASCII <= shifted ? 8'h5E : 8'h36;//^,6
			  8'b00111010 : tmpASCII <= 8'h4D;//M
			  8'b00111011 : tmpASCII <= 8'h4A;//J
			  8'b00111100 : tmpASCII <= 8'h55;//U
			  8'b00111101 : tmpASCII <= shifted ? 8'h26 : 8'h37;//&,7
			  8'b00111110 : tmpASCII <= shifted ? 8'h2A : 8'h38;//*,8
			  8'b01000001 : tmpASCII <= shifted ? 8'h3C : 8'h2C;//<,,
			  8'b01000010 : tmpASCII <= 8'h4B;//K
			  8'b01000011 : tmpASCII <= 8'h49;//I
			  8'b01000100 : tmpASCII <= 8'h4F;//O
			  8'b01000101 : tmpASCII <= shifted ? 8'h29 : 8'h30;//),0
			  8'b01000110 : tmpASCII <= shifted ? 8'h28 : 8'h39;//(,9
			  8'b01001001 : tmpASCII <= shifted ? 8'h3E : 8'h2E;//>,.
			  8'b01001010 : tmpASCII <= shifted ? 8'h3F : 8'h2F;//?,/
			  8'b01001011 : tmpASCII <= 8'h4C;//L
			  8'b01001100 : tmpASCII <= shifted ? 8'h3A : 8'h3B;//:,;
			  8'b01001101 : tmpASCII <= 8'h50;//P
			  8'b01001110 : tmpASCII <= shifted ? 8'h5F : 8'h2D;//_,-
			  8'b01010010 : tmpASCII <= shifted ? 8'h22 : 8'h27;//",'
			  8'b01010100 : tmpASCII <= shifted ? 8'h7B : 8'h5B;//{,[
			  8'b01010101 : tmpASCII <= shifted ? 8'h2B : 8'h3D;//+,=
			  8'b01011010 : tmpASCII <= 8'h0D;//CR
			  8'b01011011 : tmpASCII <= shifted ? 8'h7D : 8'h5D;//},]
			  8'b01011101 : tmpASCII <= shifted ? 8'h7C : 8'h5C;//|,\
			  8'b01100110 : tmpASCII <= 8'h08;//
			  8'b01110110 : tmpASCII <= 8'h1B;// ESC
			endcase
		end
	end
	
/*字母大小写转换*/
always @(tmpASCII or shifted or clr or keypressed or capslocked)
	begin
	  if(!clr) begin
	     ASCII <= 0;
	  end
	  else begin
	     if (keypressed) begin
	        if (((!shifted & !capslocked)|(shifted & capslocked)) && (tmpASCII > 8'h40) && (tmpASCII <= 8'h5A)) begin
	          ASCII <= tmpASCII + 8'h20;
	        end
	        else begin
	          ASCII <= tmpASCII;
	        end
	     end
	     else begin
	       ASCII <= 8'b1000_0000;
	     end
	  end    
	end

	assign data = ASCII;
endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -