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

📄 touch_init.v

📁 开发板原理图 需要做开发板的可以参考参考
💻 V
字号:
`define CLEAR 25'hffffff
//`define CLEAR 25'hff
module touch_init(
					CLOCK_50,
					SW,
					nRST,
					iTDCLK,
					data,
					TCH_DCLK,
					TCH_CS,
					TCH_DIN,
					TCH_BUSY,
					TCH_DOUT,
					TCH_PENIRQ,
					X,
					Y,
					PEN_tr,
					X_Y,
					XYout,
					Display_mode	
				  );
input			CLOCK_50;
input	[6:0]	SW;
input 			nRST;
input 			iTDCLK;
input 	[7:0]	data;
input 			TCH_BUSY;
input 			TCH_DOUT;
input 			TCH_PENIRQ;

output 			TCH_DCLK;
output 			TCH_CS;
output  		TCH_DIN;
output	[11:0]	X;
output	[11:0]	Y;
output 			PEN_tr;
output 			X_Y;
output 			XYout;
output			Display_mode;

reg 			TCH_DCLK;
reg 			TCH_CS;
reg 			TCH_DIN;
reg		[11:0]	X;
reg		[11:0]	Y;
reg 			PEN_tr;
reg 			X_Y;
reg 	[7:0]	st;
reg 	[7:0]	ck_cnt;
reg 	[7:0]	odata;
reg				Touch_en;
reg				Touch_en_clr;
reg 	[24:0] 	Touch_delay_cnt;
reg 	[1:0] 	Display_mode;

always @(negedge nRST  or posedge iTDCLK ) begin
if (!nRST) begin //nRST
	st       <= 0 ;
	ck_cnt   <= 0 ;
	TCH_DCLK <= 0 ;
	odata    <= data;
	TCH_CS   <= 1;
	X_Y      <= 0;//data[6];
end
else
if (ck_cnt < 32 ) 
case (st)
0: begin
	TCH_CS  <= 0;
	TCH_DIN <= odata[7] ;
	st      <= st+1 ;
	end
1: begin
	TCH_CS <= 0;
	st <= st+1 ;
	end

2: begin
	TCH_DCLK  <= 1;
	st <= st+1 ;
	end

3: begin
	TCH_DCLK  <= 0;
	odata[7:0] <= {odata[6:0],1'b0 } ;
	ck_cnt <= ck_cnt+1;
//	X_Y     = ~X_Y;	
	st <= 0 ;
   end
endcase
else  begin
	X_Y     <= ~X_Y;
	ck_cnt  <= 0 ;
	
    TCH_CS   <= 1;
	odata   <= { data[7], X_Y , data[ 5 : 0] };
end	
end	


// X Input //

reg[11:0] X_rec;
reg[11:0] X_o;

always @( posedge TCH_DCLK ) begin
if ( (X_Y) && (TCH_BUSY) )
	
	X_rec<=0;
	
else if (X_rec < 12) begin

	X_o[11:0] <= {X_o[10:0] ,TCH_DOUT };
	
	X_rec <= X_rec+1;
	
end
end

////

reg [7:0]X_cnt;

wire [7:0]X_num = 10;

always @(posedge TCH_PENIRQ ) 
if (X_cnt < X_num) 
X_cnt <= X_cnt+1; 
else 
X_cnt<=0;

	


// Y Input //

reg[11:0] Y_rec;
reg[11:0] Y_o;

always @( posedge TCH_DCLK ) begin

if ( (!X_Y) && (TCH_BUSY) )
	
	Y_rec<=0;
	
else if ( Y_rec < 12 ) begin

	Y_o[11:0] <= {Y_o[10:0] ,TCH_DOUT };
	
	Y_rec <= Y_rec+1;
	
end
end


////
reg [7:0]Y_cnt;

wire [7:0]Y_num = 10;

always @(negedge TCH_PENIRQ) 
if (Y_cnt < Y_num) 
Y_cnt <= Y_cnt+1; 
else 
Y_cnt<=0;

reg [11:0]XX;
reg [11:0]YY;


always @(negedge TCH_PENIRQ) begin

	if ( (Y_o!=12'hfff) &&(( ( Y  +  SW)  <   Y_o)  || ( Y  >= (Y_o + SW) ) ))  //150
	begin
		Y = Y_o;
		PEN_tr <= 0;
	end
	else
		PEN_tr <= 1;
		
end
		
always @(negedge TCH_PENIRQ) begin

	if ( (X_o!=12'hfff) && (( ( X  +  SW)  <   X_o)  || ( X  >= (X_o + SW) ) ))  //100
	begin	
		X <= X_o;
//		PEN_tr = 0;
	end
	//else
//		PEN_tr = 1;
end

reg [9:0]tr_acc;

always @( TCH_PENIRQ ) begin

if  (  ( !TCH_PENIRQ ) && (tr_acc < 200)) tr_acc = tr_acc + 20;
else if ((TCH_PENIRQ) &&  (tr_acc  >  100)) tr_acc=tr_acc - 10;
end

assign  XYout = ( tr_acc > 150 )?1:0;

/*
always@(negedge TCH_PENIRQ or posedge Touch_en_clr)
begin
	if (Touch_en_clr)
		Touch_en <= 0;
	else if(!Touch_en)
		Touch_en <= 1;
end
*/
always@(posedge CLOCK_50 or posedge Touch_en_clr)
begin
	if (Touch_en_clr)
		Touch_en <= 0;
	else if (!TCH_PENIRQ)	
	begin
		if(Touch_en == 0)
			Touch_en <= 1;
	end			
end

always@(posedge CLOCK_50 or negedge nRST)
begin	
	if (!nRST)
		Touch_delay_cnt <= 0;
	else if (Touch_delay_cnt == `CLEAR)
		Touch_delay_cnt <= 0;
	else if (Touch_en)
		Touch_delay_cnt <= Touch_delay_cnt + 1;
end		
			
always@(posedge CLOCK_50 or negedge nRST)
begin	
	if (!nRST)
		Touch_en_clr <= 0;
	else if (Touch_delay_cnt == `CLEAR)
		Touch_en_clr <= 1;
	else
		Touch_en_clr <= 0;
end		

always@(posedge Touch_en or negedge nRST)
begin
	if (!nRST)
		Display_mode <= 0;
	else 
		Display_mode <= Display_mode + 1;	
end	


endmodule

⌨️ 快捷键说明

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