[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-29基于FPGA实现触摸屏实验

news2024/12/25 0:39:07

软件版本:VIVADO2021.1

操作系统:WIN10 64bit

硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA

实验平台:米联客-MLK-H3-CZ08-7100开发板

板卡获取平台:https://milianke.tmall.com/

登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

目录

1概述

2 GT9X系列触摸芯片使用

2.1接口说明

2.2寄存器写时序

2.3寄存器读时序

2.4重要寄存器

2.5上电时序

2.6坐标读取

2.7工作模式

3硬件电路分析

4系统框图

5触摸控制FPGA实现

5.1 gt9xx_config.v程序源码

5.2代码分析

6实现三点触控图形绘制

7硬件接线

8测试结果

8.1VIO显示坐标值

8.2触摸演示


1概述

常规情况下我们会使用CPU通过I2C接口实现触控液晶触摸方案的实现,也可以上LINUX,一般LINUX下也有对于各大厂家触摸液晶屏的方案支持。但是如果我们在一些情况下不方便使用CPU或者我们压根不会使用CPU的方式或者也不会LINUX的方式,我们要实现一些简单的触摸控制,用FPGA实现是不是没有办法吗?答案当然是“NO”。因为通过对触摸液晶的硬件分析和驱动代码分析,笔者发现只要通过I2C接口实现对触摸液晶寄存器的控制和访问一样可以实现液晶屏的触控。笔者前面已经编写了非常好的I2C控制器,实现了EEPROM和RTC时钟芯片的读取,那么在本文中,我们也可以利用这个控制器实现和液晶屏触控芯片的通信。

关于I2C总线的细节笔者就不再介绍了,读者如果没有掌握好,请学习我们前面相关课程。

2 GT9X系列触摸芯片使用

2.1接口说明

GT9 非单层多点系列(以下简称GT9 系列)与主机接口共有6 PIN,分别为:VDD、GND、SCL、SDA、INT、RESET。

主控的INT 口线需具有上升沿或下降沿中断触发功能,并且当其在输入状态时,主控端必需设为悬浮态, 取消内部上下拉功能;主机通过输出高、低来控制GT9 系列的RESET口为高或低。为保证可靠复位,建议RESET 脚输出低100μ s 以上。

GT9 系列与主机通信采用标准I2C 通信,最高速率可以支持至400K bps。当主机采用200K 以上的通信速率时,需要特别注意I2C 口的外部上拉电阻阻值,以保证SCL、SDA 边沿足够陡峭。GT9 系列在通信中始终作为从设备,其I2C 设备地址由7 位设备地址加1 位读写控制位组成,高7 位为地址,bit 0 为读写控制位。GT9 系列有两个从设备地址可供选择,如下表:

模式

7 位地址

8 位写地址

8 位读地址

1

0x5D

0XBA

0XBB

2

0x14

0X28

0X29

这里大家可能奇怪有2套地址,这个地址触摸芯片会根据硬件电路对于INT脚的配置采用那一套地址。当INT在上电期间是低电平则使用模式1;当INT在上电期间是高电平则使用模式2;

2.2寄存器写时序

S:起始信号。

Address_W:带写控制位的从设备地址。

ACK:应答信号。

Register_H、Register_L:待写入的16 位寄存器首地址。

Data_1 至Data_n:数据字节1-n。

E:停止信号。

设定了写操作寄存器首地址后,可以只写1 字节数据,也可以一次性写入多个字节数据,GT9 系列自动将其往高地址顺序存储。

2.3寄存器读时序

先通过前述写操作时序设定需要读取的寄存器首地址,重新发送起始信号进行读寻址,读取寄存器数据。

Address_R:带读控制位的从设备地址。

NACK:最后1 字节读完主控回NACK。

设定了读操作寄存器地址后,主控可以一次读取1 字节,也可以一次性读取多个字节数据,GT91XX 自动递增寄存器地址,将后续数据顺序发送。

设定完读操作寄存器地址后的停止信号(上图中的第一个E 信号)可发可不发,但是重新开始I2C 通信的起始信号必须再次发送。

2.4重要寄存器

我们这里只对使用到的寄存器进行说明,没有使用到的,可以看我整理的资料里面有一个“GT9非单层多点系列编程指南文件.pdf”的文档比较详细描述了GT9X的触摸芯片如何使用。

寄存器

命令

描述

0X8040

Command

0:读坐标状态           1:差值原始值           2:软件复位

3:基准更新(内部测试) 4:基准校准(内部测试) 5:关屏

其余值无效

0X8047

Config_ Version

配置起始地址寄存器,配置文件的版本号(新下发的配置版本号大于原版本,或等于原版本号但配置内容有变化时保存,版本号版本正常范围:'A'~'Z',发送0x00则将版本号初始化为'A')

0X80FF

Config_Chksum

校验和寄存器,配置信息校验(0x8047到0x80FE之字节和的补码)

0X8140

Product ID

产品ID寄存器

0X814E

触摸状态寄存器

Bit7: Buffer status,1表示坐标(或按键)已经准备好,主控可以读取;0表示未就绪,数据无效。当主控读取完坐标后,必须通过I2C将此标志(或整个字节)写为0。

Bit4: HaveKey, 1表示有按键,0表示无按键(已经松键)。

Bit3~0: Number of touch points, 屏上的坐标点个数

0X8150

第1个触摸点X

X坐标低字节

0X8151

第1个触摸点X

X坐标低字节

0X8152

第1个触摸点Y

Y坐标低字节

0X8153

第1个触摸点Y

Y坐标高字节

0X8158

第2个触摸点X

X坐标低字节

0X8159

第2个触摸点X

X坐标低字节

0X815A

第2个触摸点Y

Y坐标低字节

0X815B

第2个触摸点Y

Y坐标高字节

0X8160

第3个触摸点X

X坐标低字节

0X8161

第3个触摸点X

X坐标低字节

0X8162

第3个触摸点Y

Y坐标低字节

0X8163

第3个触摸点Y

Y坐标高字节

以上就是我们主要用到的寄存器,由于我们默认采用1024X600分辨率,所以0X8047,0X80FF ,0X8140寄存器也是无需考虑的。

2.5上电时序

主机上电后,需要控制GT9X的AVDD、VDDIO、INT、Reset等脚位,控制时序请遵从如下时序图:

1)、INT T2 时间后,主控是要输出高,还是低,取决于主机要用何I2C 从设备地址与GT9 芯片通信,若用地址0x28/0x29,则输出高;若用地址0xBA/0xBB,则输出低。

2)、主机控制GT9上电过程中,当主控将自身INT 转化为悬浮输入态后,需要延时50ms 再发送配置信息。

2.6坐标读取

本文的设计方案采用轮询的方式读取触控液晶的坐标寄存器,当然也可以采用更高效的中断方式。读者可以去尝试下。以下是关于中断方式和轮询方式的方法介绍。

主控可以采取轮询或INT 中断触发方式来读取坐标,采用轮询方式时可采取如下步骤读取:

1、按第二节时序,先读取寄存器0x814E,若当前buffer(buffer status 为1)数据准备好,则依据手指个数读按键状态取相应个数的坐标、按键信息。

2、若在1中发现buffer 数据(buffer status 为0)未准备好,则等待1ms 再进行读取。

采用中断读取方式,触发中断后按上述轮询过程读取坐标。

GT9 中断信号输出时序为(以输出上升沿为例,下降沿与此时序类同):

1、 待机时INT 脚输出低。

2、 有坐标更新时,输出上升沿。

3、2 中输出上升沿后,INT 脚会保持高直到下一个周期(该周期可由配置Refresh_Rate 决定)。请在一个周期内将坐标读走并将buffer status(0x814E)写为0。

4、2 中输出上升沿后,若主控未在一个周期内读走坐标,下次GT9 即使检测到坐标更新会再输出一个INT 脉冲但不更新坐标。

5、若主控一直未读走坐标,则GT9会一直打INT 脉冲。

2.7工作模式

关于GT9芯片的工作模式,本文中使用的是Normal模式,下面是关于各种模式的介绍。

GT9 工作模式分为Normal、Low Power(Green)、Sleep 三种,各种工作状态间相互转换关系如下图所示:

默认情况下,GT9 工作自动切换Normal 和Low Power 工作模式,按键时及松键后的一段时间(这段时间由配置参数Low_Power_Control 设定,0~15 秒可设)工作在Normal mode,若该段时间后还处于无按键状态,则进入Low Power 工作模式(低速扫描)

Normal 模式

GT9 在Normal mode 时,最快的坐标刷新周期为5ms-20ms 间(依赖于配置信息的设定,配置信息可控周期步进长度为1ms)。

Normal mode 下,一段时间无触摸事件发生,GT9将自动转入Low Power mode,以降低功耗。GT9无触摸自动进入Low Power mode 的时间可通过配置信息设置,范围为0~15s,步进为1s。

Low Power(Green) mode

在LowPower mode 下,GT9扫描周期固定为40ms,若检测到有触摸动作发生,自动进入Normal mode。

Sleep mode及唤醒

主CPU通过I2C命令,使GT9进入Sleep mode(需要先将INT脚输出低电平)。当需要GT9退出Sleep mode时,主机可采用INT高电平唤醒或reset唤醒。若采用INT高电平唤醒,操作时序为:输出高电平到INT脚(主机打高INT脚2~5ms,然后转悬浮输入态),唤醒后GT9将进入Normal mode;当采用reset脚唤醒时,需要按前述上电初始化过程控制INT脚和reset脚。

3硬件电路分析

硬件接口和子卡模块请阅读“附录 1”

配套工程的 FPGA PIN 脚定义路径为 fpga_prj/uisrc/04_pin/ fpga_pin.xdc。

4系统框图

5触摸控制FPGA实现

5.1 gt9xx_config.v程序源码

/************************gt9xx_config 触控驱动控制器*********************
--1.上电后通过控制IO_t_ini和O_t_rst对触控芯片的工作模式进行设置,设置器件地址为0XBA
--2.状态机中,通过轮询方式,不断访问触控芯片,读取坐标,这里读取3组坐标信息
*********************************************************************/

`timescale 1ns / 1ns

module gt9xx_config
(
input              I_clk,   //系统时钟输入
input              I_rstn,  //系统复位
output             O_t_rst,   //触控屏中断信号,也用于上电初始化
inout              IO_t_ini,   //触控屏复位信号,也用于上电初始化
output reg         O_iic_req, //I2C总线读写请求
output reg [31:0]  O_wr_data, //I2C写数据
output reg  [7:0]  O_wr_cnt,  //I2C写数据长度 
input      [31:0]  I_rd_data, //I2C读数据
output reg  [7:0]  O_rd_cnt,  //I2C读数据长度
input              I_iic_busy,//I2C总线忙
output  [15:0]     O_tp1_x,   //触控坐标1 X轴坐标
output  [15:0]     O_tp1_y,   //触控坐标1 y轴坐标
output  [15:0]     O_tp2_x,   //触控坐标2 X轴坐标
output  [15:0]     O_tp2_y,   //触控坐标2 y轴坐标
output  [15:0]     O_tp3_x,   //触控坐标3 X轴坐标
output  [15:0]     O_tp3_y    //触控坐标3 y轴坐标
);

`define GT_CTRL_REG     16'h4080    //GT9xx控制寄存器
`define GT_CFGS_REG     16'h4780    //GT9xx配置起始地址寄存器    
`define GT_CHECK_REG    16'hFF80    //GT9xx校验和寄存器
`define GT_PID_REG      16'h4081    //GT9xx产品ID寄存器

`define GT_GSTID_REG    16'h4E81    //GT9xx当前检测到的触摸状态寄存器
`define GT_TP1_REG      16'h5081    //第一个触摸点数据地址  
`define GT_TP2_REG      16'h5881    //第二个触摸点数据地址
`define GT_TP3_REG      16'h6081    //第三个触摸点数据地址
//`define GT_TP4_REG    16'h6881    //第四个触摸点数据地址
//`define GT_TP5_REG    16'h7081    //第五个触摸点数据地址

//reset counter for delay time

reg         t_ini_r=0 ;
reg [24:0]  rst_cnt = 25'd0;

assign  O_t_rst = (rst_cnt[24] | rst_cnt[23]); // 触控芯片的复位,上电期间用于设置工作模式

assign  IO_t_ini = (t_ini_r == 1'b0) ?  1'b0 : 1'bz; //中断信号上电期间用于设置工作模式

//上电后复位计数器
always@(posedge I_clk or negedge I_rstn) begin
    if(I_rstn == 1'b0)
        rst_cnt <= 0;
    else if(!rst_cnt[24]) 
        rst_cnt <= rst_cnt + 1'b1;
    else 
        rst_cnt <= rst_cnt;
end

//触控芯片上电复位计数器
always@(posedge I_clk  or negedge I_rstn) begin
    if(I_rstn == 1'b0 || rst_cnt[24] == 1'b0)
        t_ini_r <= 1'b0;    
    else  if(rst_cnt[24])
        t_ini_r <= 1'b1;
    else 
        t_ini_r <= t_ini_r;
end

reg [3:0]TS_S; //状态机寄存器
reg [7:0]i;    //计数器寄存器
reg [47:0] touch_x; //X坐标寄存器,保存3组X坐标数据,每组16bits
reg [47:0] touch_y; //X坐标寄存器,保存3组y坐标数据,每组16bits

//把坐标分离开,方便观察和使用
wire [15:0]touch_x1 = touch_x[15:0];  
wire [15:0]touch_x2 = touch_x[31:16];
wire [15:0]touch_x3 = touch_x[47:32];
wire [15:0]touch_y1 = touch_y[15:0];
wire [15:0]touch_y2 = touch_y[31:16];
wire [15:0]touch_y3 = touch_y[47:32];

assign O_tp1_x = touch_x1;
assign O_tp1_y = touch_y1;
assign O_tp2_x = touch_x2;
assign O_tp2_y = touch_y2;
assign O_tp3_x = touch_x3;
assign O_tp3_y = touch_y3;

reg [7 :0] ctstate; //坐标状态寄存器
wire [47:0] GT9XX_TPX_TBL = {`GT_TP3_REG,`GT_TP2_REG,`GT_TP1_REG};//触控芯片相关寄存器初始化

//vio 观察坐标
vio_0 vio_dg (.clk(I_clk), .probe_in0(touch_x1), .probe_in1(touch_y1), .probe_in2(touch_x2), .probe_in3(touch_y2), .probe_in4(touch_x3), .probe_in5(touch_y3)); 
//ila 在线逻辑分析仪观察状内部信号和状态机
ila_0 ila_dg (.clk(I_clk),.probe0({TS_S,O_t_rst,O_iic_req,ctstate}));

//状态机
always@(posedge I_clk) begin
    if(!rst_cnt[24])begin //复位初始化信号和寄存器
        i         <= 8'd0;
        O_iic_req   <= 1'b0;
        O_rd_cnt    <= 8'd0;
        O_wr_data[31:0] <= {24'd0,8'hba};//8'hba为芯片的器件地址
        touch_x   <= 48'd0;
        touch_y   <= 48'd0;
        ctstate   <= 8'd0;
        TS_S      <= 4'd0;    
    end
    else begin
        case(TS_S)
        0:begin//设置触控芯片的软件复位
            O_iic_req  <= 1'b1; //发送I2C总线操作请求
            O_wr_cnt   <= 8'd4; //写入4个数据
            O_wr_data[23 :8] <= `GT_CTRL_REG; //GT9xx控制寄存器地址  
            O_wr_data[31:24] <= 8'd2; //软件复位值
            if(I_iic_busy)     //等在总线忙
            TS_S    <= 4'd1; //下一个状态
        end
        1:begin //等待I2C总线空闲
            O_iic_req  <= 1'b0;
            if(!I_iic_busy)begin //等待I2C总线空闲,代表I2C操作完成,软件复位完成
            TS_S    <= 4'd2;//下一个状态
            end
        end
        2:begin//重置触控屏芯片的控制寄存器
           O_iic_req  <= 1'b1;//发送I2C总线操作请求
           O_wr_cnt  <= 8'd4;//写入4个数据
           O_wr_data[23 :8] <= `GT_CTRL_REG;  //GT9xx控制寄存器地址    
           O_wr_data[31:24] <= 8'd0; //重置控制寄存器为0
           if(I_iic_busy)   //等在总线忙
           TS_S    <= 4'd3; //下一个状态    
        end        
        3:begin //等待I2C总线空闲
            O_iic_req  <= 1'b0;
            if(!I_iic_busy)//等待I2C总线空闲,代表I2C操作完成,软件复位完成
            TS_S    <= 4'd4;//下一个状态
        end
        4:begin//读取坐标值
           O_iic_req  <= 1'b1;
           O_wr_data[23 :8] <= `GT_GSTID_REG;  //GT9xx触摸状态寄存器
           O_wr_cnt <= 8'd3;  //写入3个数据,器件地址,寄存器地址
           O_rd_cnt <= 8'd1;  //读出1个数据,状态寄存器
           i      <= 8'd0;  //i用于计数
           if(I_iic_busy)     //等在总线忙
           TS_S   <= 4'd5;  //下一个状态
        end 
        5:begin //等待I2C总线空闲
            O_iic_req  <= 1'b0;
            if(!I_iic_busy)//等待I2C总线空闲,代表I2C操作完成,已经读到`GT_GSTID_REG状态寄存器
            TS_S  <= 4'd6;//下一个状态
        end
        6:begin //判断状态寄存器
            if(I_rd_data[7:0]&8'h80)begin //确认状态寄存器是否有触控事件发生
            ctstate <= I_rd_data[7:0]&8'h07;//触控状态,有多少触控点事件发生
            TS_S  <= 4'd7; //下一个状态
            end
            else 
            TS_S  <= 4'd4; //如果没有触控事件发生,继续回到前一个状态,继续读状态寄存器   
        end        
        7:begin//重置触控状态寄存器
           O_iic_req  <= 1'b1;
           O_wr_data[23 :8] <= `GT_GSTID_REG; //GT9xx触摸状态寄存器 
           O_wr_data[31:24] <= 8'd0; //设置寄存器值为0
           O_wr_cnt <= 8'd4;  //I2C写入4BYTES
           O_rd_cnt <= 8'd0;  //I2C不需要读数据
           i      <= 8'd0;  //i计数器清零
           if(I_iic_busy)     //等待总线忙 ,代表I2C控制器开始工作     
           TS_S   <= 4'd8;
        end 
        8:begin //等待I2C总线空闲
            O_iic_req  <= 1'b0;
            if(!I_iic_busy) //等待I2C总线空闲,代表I2C完成 `GT_GSTID_REG的重置
            TS_S    <= 4'd9;
        end        
        9:begin //读取1个坐标
            O_iic_req  <= 1'b1;
            O_wr_data[23 :8] <= GT9XX_TPX_TBL[i*16 +: 16]; //坐标的寄存器地址  
            O_wr_cnt <= 8'd3; //I2C 写3BYTES
            O_rd_cnt <= 8'd4; //i2c 读4BYTES 
            if(I_iic_busy)//等待总线忙 ,代表I2C控制器开始工作     
            TS_S    <= 4'd10;           
        end
        10:begin//等待I2C总线空闲
            O_iic_req  <= 1'b0;
            if(!I_iic_busy)//等待I2C总线空闲,代表I2C完成 GT9XX_TPX_TBL中对应的坐标寄存器读
            TS_S    <= 4'd11;
        end     
        11:begin //保存坐标值
            touch_x[i*16 +: 16] <= I_rd_data[15: 0];
            touch_y[i*16 +: 16] <= I_rd_data[31:16];
            i <= i + 1'b1;  //i计数器+1    
            if(i<8'd2)      //判断本次是否读完3组坐标
            TS_S <= 4'd9;   //如果没读完,继续读
            else
            TS_S <= 4'd4;   //如果读完了,回到状态4
        end
        default:TS_S <= 4'd0;   
        endcase
   end
end

endmodule

5.2代码分析

以上代码中关键是利用了米联客开发的I2C控制器,然后结合我们前面对GT9X系列触控芯片寄存器的以及如何使用的认识,来通过I2C总线对GT9X系列芯片配置,和读取触控的坐标值。

状态0~3:是对控制寄存器配置,首先配置GT_CTRL_RE(0X8040)为2,对GT9X触控芯片软件复位,然后再配置GT_CTRL_REG为0,表示进入读坐标状态。

状态4~6:进入读坐标状态后,先读取GT_GSTID_REG(0X8047)寄存器的值,这个寄存器是保持了触控状态,当触摸液晶感知到已经被触控了,相关的寄存器位会被置位。

状态7~11:当我们通过4~6读取到了有触控行为发生,那么就读取相关坐标寄存器的值,我们这里只读取3组触控寄存器的值,这样就实现了3点触控

6实现三点触控图形绘制

/************************uitpg 测试数据发生器*********************
--1.该方案用于演示触控坐标读取方案
--2.通过输入的坐标信息,产生RED BLUE GREEN 方格,当在触摸屏上移动手指,方格会跟随移动
*********************************************************************/
`timescale 1ns / 1ns //仿真时间间隔/精度

module uitpg
(
input            I_tpg_clk, //系统时钟
//input            tpg_rstn_i,//系统复位输入
input            I_tpg_vs,  //场同步输入
input            I_tpg_hs,  //行同步输入
input            I_tpg_de,  //视频数据有效输入  
output           O_tpg_vs,  //场同步输出
output           O_tpg_hs,  //行同步输出
output           O_tpg_de,  //视频数据有效输出   
output [23:0]    O_tpg_data, //有效测试数据
input  [11:0]    I_tp1_x,     //坐标1的X轴坐标
input  [11:0]    I_tp1_y,     //坐标1的y轴坐标
input  [11:0]    I_tp2_x,     //坐标2的X轴坐标
input  [11:0]    I_tp2_y,     //坐标2的y轴坐标
input  [11:0]    I_tp3_x,     //坐标3的X轴坐标
input  [11:0]    I_tp3_y      //坐标3的y轴坐标
);

reg[7:0]r_reg = 8'd0; // red 颜色寄存器
reg[7:0]g_reg = 8'd0; // green 颜色寄存器
reg[7:0]b_reg = 8'd0; // blue 颜色寄存器

reg tpg_vs_r = 1'b0;//对vs信号寄存
reg tpg_hs_r = 1'b0;//对hs信号寄存

reg [11:0]v_cnt = 12'd0; //场像素计数器
reg [11:0]h_cnt = 12'd0; //行像素计数器

always @(posedge I_tpg_clk)begin
    tpg_vs_r <= I_tpg_vs; //对vs信号寄存一次
    tpg_hs_r <= I_tpg_hs; //对hs信号寄存一次
end

//h_cnt计数器模块
always @(posedge I_tpg_clk)
    h_cnt <= I_tpg_de ? h_cnt + 1'b1 : 12'd0; //计数行有效像素,//当de无效,重置 h_cnt=0

//v_cnt计数器模块
always @(posedge I_tpg_clk)
  if(I_tpg_vs) //通过vs产生同步复位
    v_cnt <= 12'd0; //重置v_cnt=0
  else 
    v_cnt <= ((!tpg_hs_r)&&I_tpg_hs) ? v_cnt + 1'b1 : v_cnt; //hs信号的上升沿,v_cnt计数,这种方式可以不管hs有效是高电平还是低电平的情况,v_cnt 场像素计数器,计数行数量

    
//以触控坐标的中心绘制,第1个触控点的方格,大小为200*200像素
wire[11:0] box1_x1 =  I_tp1_x - 100;
wire[11:0] box1_x2 =  I_tp1_x + 100;
wire[11:0] box1_y1 =  I_tp1_y - 100;
wire[11:0] box1_y2 =  I_tp1_y + 100;

//以触控坐标的中心绘制,第2个触控点的方格,大小为200*200像素
wire[11:0] box2_x1 =  I_tp2_x - 100;
wire[11:0] box2_x2 =  I_tp2_x + 100;
wire[11:0] box2_y1 =  I_tp2_y - 100;
wire[11:0] box2_y2 =  I_tp2_y + 100;

//以触控坐标的中心绘制,第3个触控点的方格,大小为200*200像素
wire[11:0] box3_x1 =  I_tp3_x - 100;
wire[11:0] box3_x2 =  I_tp3_x + 100;
wire[11:0] box3_y1 =  I_tp3_y - 100;
wire[11:0] box3_y2 =  I_tp3_y + 100;

wire box1_en=(h_cnt>box1_x1)&&(h_cnt<box1_x2)&&(v_cnt>box1_y1)&&(v_cnt<box1_y2);// 屏幕上,方格1的数据绘制使能
wire box2_en=(h_cnt>box2_x1)&&(h_cnt<box2_x2)&&(v_cnt>box2_y1)&&(v_cnt<box2_y2);// 屏幕上,方格2的数据绘制使能
wire box3_en=(h_cnt>box3_x1)&&(h_cnt<box3_x2)&&(v_cnt>box3_y1)&&(v_cnt<box3_y2);// 屏幕上,方格3的数据绘制使能

//显示颜色
always @(posedge I_tpg_clk)begin
    if(box1_en)begin
        r_reg   <=8'b11111111;      //显示区域为红色
        g_reg   <=0;
        b_reg   <=0;    
    end 
    if(box2_en)begin
        r_reg   <=0;                
        g_reg   <=8'b11111111;     //显示区域为绿色
        b_reg   <=0;    
    end 
    if(box3_en)begin
        r_reg   <=0;                
        g_reg   <=0;
        b_reg   <=8'b11111111;     //显示区域为蓝色
    end         
    if(!(box1_en||box2_en||box3_en))begin //背景为白色
        r_reg   <=8'b11111111;     
        g_reg   <=8'b11111111; 
        b_reg   <=8'b11111111;        
    end
end


assign O_tpg_data = {r_reg,g_reg,b_reg};
assign O_tpg_vs = I_tpg_vs;
assign O_tpg_hs = I_tpg_hs;
assign O_tpg_de = I_tpg_de;  

endmodule

当我们读取到了触控的坐标后,根据坐标的参数信息绘制矩形框,分别绘制红绿蓝三个矩形,这样我们就可以非常方便的测试触摸液晶屏是否可以正常工作。

7硬件接线

(该教程为通用型教程,教程中仅展示一款示例开发板的连接方式,具体连接方式以所购买的开发板型号以及结合配套代码管脚约束为准。)

本实验注意采我们的cep跳线帽跳线1.8V,子卡采用1.8V BASE卡,接口使用的是我们液晶屏的LVDS口。下图是LVDS接线方式。请确保下载器和开发板已经正确连接,另外需要把核心板上的2P模式开关设置到JTAG模式,即ON ON,并且开发板已经上电。(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)

7寸液晶屏的接口使用的是LVDS接口

8测试结果

8.1VIO显示坐标值

未来观察方便,添加了VIO(虚拟IO)观察读取到的触控坐标值

8.2触摸演示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FFmpeg开发笔记(五十四)使用EasyPusher实现移动端的RTSP直播

之前的文章《利用RTMP协议构建电脑与手机的直播Demo》介绍了如何使用RTMP Streamer实现完整的RTMP直播流程&#xff0c;另一篇文章《利用SRT协议构建手机APP的直播Demo》介绍了如何使用SRT Streamer实现完整的SRT直播流程&#xff0c;接下来介绍如何使用EasyPusher-Android实现…

golang学习笔记03——gin框架的核心数据结构

文章目录 1.核心数据结构1.1 gin.Context1.2 前缀树&#xff08;1&#xff09;前缀树&#xff08;2&#xff09;压缩前缀树&#xff08;3&#xff09;代码实现 上期文章我们讲到了golang中gin框架的基本原理和底层请求、渲染的流程&#xff0c;还不知道的小伙伴查看golang学习笔…

Docker 部署 Redis (图文并茂超详细)

部署 Redis ( Docker ) [Step 1] : 拉取 Redis 镜像, 推荐使用 7 的 Redis 版本 docker pull redis:7.0.12[Step 2] : 创建 Redis 相关目录 ➡️ 启动 Redis 容器 ➡️ 拷贝文件 ➡️ 授权文件夹 ➡️ 删除容器 # 创建 Redis 相关目录 mkdir -p /data/redis/{conf,data,log…

页面小组件-搜索栏(一)

样例展示 效果示例-折叠状态 效果示例-展开状态 代码示例 <custom-search-wrapper><!--showFoldBtn 需要展示折叠按钮时传值--><template slotleft><el-form:model"searchFormData"inlinesize"small"><el-form-item><e…

Linux 虚拟网络三大基石:Namespace、Veth pair 与 Bridge

引言 在 Linux 的世界里&#xff0c;虚拟网络技术是系统管理、云计算和容器化不可或缺的一部分。今天&#xff0c;我们将深入探讨构建这些虚拟网络的三大基石&#xff1a;Namespace、Veth 对和 Bridge&#xff0c;揭示它们如何在背后默默支撑起你的网络环境。 Namespace&…

PNP与NPN型传感器

PNP与NPN型传感器 一、磁性开关1、==磁性开关分类及原理==:2、==磁性开关配线==3、磁性开关串连和并联(不重要)4、磁性开关选型(不重要)二、PNP型与NPN型的选用1、PNP型传感器(高电平输出)1.1、对于`PNP-NO`(常开)型1.2、对于`PNP-NC`(常闭)型:2、NPN型传感器(低电…

Navicat 17 新特性 | 新增 Redis 哨兵部署模式

随着 Navicat 17 的发布&#xff0c;在业界引起了广泛的共鸣与热议。我们曾深入剖析其众多革新特性&#xff0c;包括新增 PolarDB 与 Garnet、模型设计创新与优化、增强的商业智能 BI 能力、高效的查询与配置、用户界面交互体验再升级&#xff0c;以及原生适配国产平台和操作系…

商品信息的标准化

销售环节的数字化见效最快 现在&#xff0c;企业的数字化是非常热的话题&#xff0c;工业&#xff14;.&#xff10;&#xff0c;人工智能&#xff0c;物联网&#xff0c;机器人都是企业数字化转型的主要方向&#xff0c;但是某些时候&#xff0c;我们走的太远&#xff0c;却忘…

双向链表的学习

双向链表是一种数据结构&#xff0c;它由节点组成&#xff0c;每个节点包含两个指针&#xff1a;一个指向前一个节点&#xff0c;另一个指向后一个节点。这种结构允许数据元素在两个方向上进行遍历&#xff0c;即既可以从前到后&#xff08;顺序&#xff09;&#xff0c;也可以…

【微处理器系统原理和应用设计第六讲】片上微处理器系统系统架构

一、概念辨析 首先来厘清以下概念&#xff1a;微处理器&#xff0c;微控制器&#xff0c;单片机&#xff0c;片上微处理器系统 &#xff08;1&#xff09;微处理器&#xff1a;即MPU&#xff08;Microprocessor Unit&#xff09;&#xff0c;微处理器是一种计算机的中央处理单…

Vue封装的过度与动画(transition-group、animate.css)

目录 1. Vue封装的过度与动画1.1 动画效果11.2 动态效果21.3 使用第三方动画库animate.css 1. Vue封装的过度与动画 作用&#xff1a;在插入、更新或移除DOM元素时&#xff0c;在合适的时候给元素添加样式类名 1.1 动画效果1 Test1.vue: transition内部只能包含一个子标签。…

电脑知识:如何恢复 Word、媒体和存档文件?

如果您是 Word 用户&#xff0c;那么您一定对无法打开 Word 文档的问题很熟悉。当文档包含大量关键信息时&#xff0c;情况会变得更加复杂。如果您遇到这种情况&#xff0c;那么您将如何处理&#xff1f; 我们再怎么强调在外部存储位置&#xff08;如外部硬盘、网络位置&#…

Ubuntu设置

1.查看版本:lsb_release -a 2.配置相关参数 配置root用户 设置 root 用户的登录密码&#xff0c;然后 su 登录。 1.改root密码&#xff1a;sudo passwd root 2.切换登录root用户&#xff1a; su root 3.root主目录在&#xff1a;cd ~ 4.开启 root 用户SSH远程登录权限 …

学习记录——day43 C++ 异常处理

一、异常处理的格式 1、在可能产生异常的地方使用关键字&#xff1a;throw 抛出异常 2、try { 可能会抛出异常的语句 }catch(接收异常的形参) { 处理异常 } 任何函数在定义时&#xff0c;可以指定能抛出的异常格式如下 返回值类型 函数…

前端:HTML、CSS、JS、Vue

1 前端 内容概要 了解前端三件套(HTML、CSS、JS)在前端所起的作用掌握HTML标签的功能&#xff0c;掌握重要标签(a标签&#xff0c;form标签)了解CSS了解JS的基础语法掌握Vue的基础语法重点掌握Vue项目怎么启动项目掌握前后端分离是什么。前端做什么事情&#xff0c;后端做什么…

统信UOS:快速修改主机名和计算机名

统信UOS&#xff1a;快速修改主机名和计算机名 1、修改主机名2、更改计算机显示名称 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、修改主机名 打开终端并获取root权限&#xff1a; 右键桌面空白处&#xff0c;选择“在终端中打开”。输…

制造业疲软引震荡,就业数据成市场焦点

周二&#xff0c;标普全球制造业PMI终值数据揭示了制造业的疲软态势&#xff0c;这一消息迅速在金融市场引发连锁反应&#xff0c;各类资产价格大幅跳水&#xff0c;交易员对经济前景的担忧情绪显著升温。在此背景下&#xff0c;即将于周五发布的美国非农就业数据无疑成为了本周…

软考 -- 软件设计师 -- 二轮复习(2) -- 程序设计语言(持续更新)

软考 – 软件设计师 – 二轮复习(2) – 程序设计语言(持续更新) 文章目录 软考 -- 软件设计师 -- 二轮复习(2) -- 程序设计语言(持续更新)前言一、编译、解释、基本控制结构二、数据类型三、变量和常量、逻辑表达式(短路&#xff1a;&&、||、&#xff01;)四、传值调用…

shell脚本编写之test命令

test命令用于测试某个条件是否成立&#xff0c;它可以进行数值、字符和文件三个方面的测试。 在shell文件中输入命令&#xff0c;通过特定的参数可以对数值、字符串进行比较&#xff0c;如下参数及示例。 1、数值比较参数 举例&#xff0c;在myshell.sh脚本中加入如下内容&am…

Github 2024-09-01 开源项目月报 Top16

根据Github Trendings的统计,本月(2024-09-01统计)共有16个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目9TypeScript项目5Dart项目2C项目1Jupyter Notebook项目1Rust项目1开发者职业成长指南 创建周期:2670 天开发语言:TypeScript协议类…