差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
book_excise_lcd_touch [2021/08/24 14:02]
zili
book_excise_lcd_touch [2021/08/24 14:14] (当前版本)
zili
行 222: 行 222:
  .c1(clk_sys));​  .c1(clk_sys));​
  
 +</​code>​
 +
 +#### 3.3 触摸屏touch模块(touch.v)
 +触摸屏touch模块检测触点坐标的基本原理是:等待触摸屏送出IRQ终端信号,在检测到终端信号后,向触摸屏控制芯片TSC2046写入控制字,在写入控制字后通过SSI接口读取相应触点的x、y坐标位置,并将坐标位置显示在7段数码管上。
 +
 +触摸屏主要有六个信号:CS、DCLK、DIN、BUSY、DOUT和IRQ,在检测到中断IRQ后,通过DOUT输出控制字,然后通过DIN接收坐标位置;CS为片选信号,DCLK为访问时钟;在输出控制字后,触摸屏置BUSY为高一个时钟周期,表示触摸屏正忙。
 +触摸屏模块touch的数据流如图20-6所示。
 +{{ ::​图20-6.png |图20-6 触摸屏程序框图}}
 +<WRAP centeralign>​
 +**图20-6 触摸屏程序框图**
 +</​WRAP>​
 +
 +Ping模块的接口分两部分:一部分是与触摸屏控制芯片的接口,一部分是与显示坐标数据的8段数码管接口。与触摸屏的接口如下:
 +<code verilog> ​
 +
 +input IRQ;  //​触摸屏产生的中断信号,有触摸时IRQ为低。
 +input iBusy; //​触摸屏工作中指示信号,为高时表示触摸屏忙。
 +input Din;  //​从触摸屏输入到FPGA的坐标位置数据。
 +output Dclk;​ //​接口时钟。
 +output Dout; //​FPGA向触摸屏发送的控制信号。
 +output oCs; //​触摸屏片选信号。
 +与显示坐标数据的7段数码管有关的引脚如下: ​                                                   ​
 +output [7:​0]HEX_sel;​ //​七段数码管片选信号线。
 +output [7:​0]HEX_seg;​ //​数码管显示的数据。
  
 </​code>​ </​code>​
-\\ 
-\\ 
-### 4. 仿真结果 
  
 +Touch模块主要受状态机State控制,其状态转移图如图 20-7所示。
  
 +{{ ::​图20-7.png |图20-7 触摸屏程序状态机}}
 +<WRAP centeralign>​
 +**图20-7 触摸屏程序状态机**
 +</​WRAP>​
  
 +State有X_CONFIG、X_DATA、Y_CONFIG和Y_DATA4个状态:
  
-\\ +X_CONFIG状态:对TSC2046进行设置,以测试X方向的坐标。
-\\ +
-### 5. 演示程序文件说明+
  
 +X_DATA状态:读取TSC2046送来的X方向坐标值。
  
 +Y_CONFIG状态:对TSC2046进行设置,以测试Y方向的坐标。
  
 +Y_DATA状态:读取TSC2046送来的Y方向坐标值。
 +
 +状态机的状态转移由计数器counter来进行控制。在初始时,State处于Y_DATA,而当IRQ被拉低期间,counter每个时钟自动增加,从而驱动状态机发生跳转以读取x、y坐标,并将坐标显示在八段数码管上。当触摸屏受到触发时IRQ信号被拉低,一般情况下拉低的周期足够完成状态机的跳转(因为FPGA运转很快,而人的操作则相对缓慢),完成坐标位置的读写。具体程序如下:
 +
 +<code verilog> ​
 +
 + reg [2:0] state;
 + reg [11:0] counter;
 + ​always@(negedge Dclk or negedge iRst) begin
 + ​ if(!iRst)
 +         ​counter <= 12'b0;
 +    else begin
 +if(IRQ==1'​b1)
 + counter <= 12'b0;
 + else //​在IRQ为低时,表示有触摸,counter开始工作。
 +         ​counter <= counter + 1'​b1;  ​
 + end
 + end
 +  ​
 +always@(posedge Dclk or negedge iRst) begin
 + if(!iRst) begin
 +         state <= Y_DATA;
 + end
 + else begin
 +       if((counter>​=3000) && (counter < 3008))
 +          state <= X_CONFIG; ​ //​发送命令:读取x坐标值
 +       else if((counter >=3008) && (counter <3024))
 +          state <= X_DATA; ​   //​读取x坐标值
 +       else if((counter >=3024) && (counter <3032))
 +          state <= Y_CONFIG; ​ //​发送命令:读取y坐标值
 +       else
 +          state <= Y_DATA; //​读取y坐标值
 + end
 +end
 +
 +</​code>​
 +
 +需要说明的是,因为该接口时钟为百K量级,所以触摸屏程序的时钟是通过内部触发器产生,没有统一到整个系统时钟域内。
 +
 +\\
 +\\
 +### 4. 运行结果
 +从SignalTap中观测触摸屏程序中读取坐标值的信号如图 20 8所示,其中在X_CONFIG、X_DATA、Y_CONFIG、和Y_DATA 有效期间,Din和Dout在Dclk时钟控制下对TSC2046进行配置和读取。其中在X_CONFIG有效期间程序向TSC2046发送的数据为8'​b0001_1011,而在Y_CONFIG有效时程序向TSC2046发送的数据为8'​ b0001_1001。
 +{{ ::​图20-8.jpg |图20-8 运行结果}}
 +<WRAP centeralign>​
 +**图20-8 运行结果**
 +</​WRAP>​
 +
 +\\
 +\\
 +### 5. 演示程序文件说明
 +|文件名|功能|
 +|TFT.v|顶层模块。|
 +|ping.v|液晶屏控制模块。|
 +|touch.v|控制和读取触摸屏上面的坐标值。|
 +|data_2_display.v|显示触点坐标。|
 +|displayData.hex|该文件存储液晶屏芯片ILI9326的配置数据, 16位宽,奇数地址存储ILI9326的寄存器地址,偶数地址存储待向该地址写入配置数据。|
  
 \\ \\
 \\ \\
 ### 6. 演示程序使用 ### 6. 演示程序使用
 +演示设备:核心板、扩展板。
 +
 +演示方法:首先需要用Nios将图像“tft屏显示图像.bmp”烧到Flash中,起始地址为0x0。然后把程序下载到开发板上之后,液晶屏上将显示烧入的图像。如果FLASH内没有烧入图像,液晶屏上将液晶花屏。用手指触摸液晶屏,可以看到在8段数码上显示当前触点的坐标值。