📄 touch_init.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 + -