Abstract
很多人問到如何在TRDB-LTM控制某xy座標輸出的顏色,本文提出解決方法。

Introduction
使用環境:Quartus II 8.1 + Nios II EDS 8.1 + DE2-70 (Cyclone II EP2C70F896C6N)
+ TRDB-D5M + TRDB-LCM

小美與阿帥從DE2轉移到DE2-70後,一些原來DE2會發生的問題,在DE2-70也是會遇到。在DE2,大家都習慣用VGA輸出,不過既然有了DE2-70 + TRDB-D5M + TRDB-LTM這種三合一套件後,就不用再多找一個螢幕當VGA輸出了,直接用TRDB-LTM輸出即可。

『小美,你知道如何控制TRDB-LTM輸出時某座標的顏色嗎?』

『無雙學長在(原創) 如何控制DE2 VGA輸出時某座標的顏色? (IC Design) (DE2) (Quartus II)與(原創) 如何產生VGA的Color Pattern Generator? (SOC) (Verilog) (DE2) (DE2-70)兩篇曾經提過,TRDB-LTM應該也可以用這種方是去控制吧!!』

『理論上是這樣沒錯,就是加上coord_x與coord_y兩個register得到x,y座標就可以控制了,但就是改不出來啊~~~』阿帥花了很多天去改,但還是改不出來。

『一起去請教無雙學長好了....』

無雙學長最近比較忙,常常找不到人,連blog都很少更新了,小美與阿帥好不容易才找到無雙學長。

『很多人email問過我這個問題,我直覺以為應該與控制VGA類似,所以就沒再深入研究,今天連你們兩個也改不出來,看來TRDB-LTM與VGA應該有些差異,我就來改看看好了。』無雙學長最後還是決定親自下手。

touch_tcon.v / Verilog

  1 module touch_tcon (
  2   input             iCLK,             // LCD display clock
  3   input             iRST_n,           // systen reset
  4   // SDRAM SIDE
  5   input [15:0]      iREAD_DATA1,      // R and G  color data form sdram    
  6   input [15:0]      iREAD_DATA2,      // B color data form sdram
  7   output            oREAD_SDRAM_EN,   // read sdram data control signal
  8   //LCD SIDE
  9   output  reg       oHD,              // LCD Horizontal sync
10   output  reg       oVD,              // LCD Vertical sync
11   output  reg       oDEN,             // LCD Data Enable
12   output  reg [7:0] oLCD_R,           // LCD Red color data
13   output  reg [7:0] oLCD_G,           // LCD Green color data
14   output  reg [7:0] oLCD_B            // LCD Blue color data
15 );
16 
17 parameter H_LINE = 1056;
18 parameter V_LINE = 525;
19 parameter Hsync_Blank = 216;
20 parameter Hsync_Front_Porch = 40;
21 parameter Vertical_Back_Porch = 35;
22 parameter Vertical_Front_Porch = 10;
23 
24 reg   [10:0]  x_cnt; 
25 reg   [9:0]   y_cnt;
26 wire  [7:0]   read_red;
27 wire  [7:0]   read_green;
28 wire  [7:0]   read_blue;
29 wire          display_area;
30 reg           mhd;
31 reg           mvd;
32 reg           mden;
33 
34 // This signal control reading data form SDRAM , if high read color data form sdram  .
35 assign  oREAD_SDRAM_EN = ( (x_cnt>Hsync_Blank-2)&&
36                            (x_cnt<(H_LINE-Hsync_Front_Porch-1))&&
37                            (y_cnt>(Vertical_Back_Porch-1))&&
38                            (y_cnt<(V_LINE - Vertical_Front_Porch))
39                          )?  1'b1 : 1'b0;
40 
41 // This signal indicate the lcd display area .
42 assign  display_area = ((x_cnt>(Hsync_Blank-1)&& //>215
43                         (x_cnt<(H_LINE-Hsync_Front_Porch))&& //< 1016
44                         (y_cnt>(Vertical_Back_Porch-1))&& 
45                         (y_cnt<(V_LINE - Vertical_Front_Porch))
46                        ))  ? 1'b1 : 1'b0;
47 
48 assign  read_red    = display_area ? iREAD_DATA2[9:2] : 8'b0;
49 assign  read_green  = display_area ? {iREAD_DATA1[14:10],iREAD_DATA2[14:12]}: 8'b0;
50 assign  read_blue   = display_area ? iREAD_DATA1[9:2] : 8'b0;
51 
52 / x  y counter  and lcd hd generator //
53 always@(posedge iCLK or negedge iRST_n) begin
54   if (!iRST_n) begin
55     x_cnt <= 11'd0;
56     mhd   <= 1'd0;
57   end
58   else if (x_cnt == (H_LINE-1)) begin
59     x_cnt <= 11'd0;
60     mhd   <= 1'd0;
61   end
62   else begin
63     x_cnt <= x_cnt + 11'd1;
64     mhd  <= 1'd1;
65   end
66 end
67 
68 always@(posedge iCLK or negedge iRST_n) begin
69   if (!iRST_n)
70     y_cnt <= 10'd0;
71   else if (x_cnt == (H_LINE-1)) begin
72     if (y_cnt == (V_LINE-1))
73       y_cnt <= 10'd0;
74     else
75       y_cnt <= y_cnt + 10'd1;   
76   end
77 end
78 
79 // touch panel timing //
80 always@(posedge iCLK  or negedge iRST_n) begin
81   if (!iRST_n)
82     mvd  <= 1'b1;
83   else if (y_cnt == 10'd0)
84     mvd  <= 1'b0;
85   else
86     mvd  <= 1'b1;
87 end
88 
89 always@(posedge iCLK  or negedge iRST_n) begin
90   if (!iRST_n)
91     mden  <= 1'b0;
92   else if (display_area)
93     mden  <= 1'b1;
94   else
95     mden  <= 1'b0;
96 end
97 
98 always@(posedge iCLK or negedge iRST_n) begin
99   if (!iRST_n) begin
100     oHD     <= 1'd0;
101     oVD     <= 1'd0;
102     oDEN    <= 1'd0;
103     oLCD_R  <= 8'd0;
104     oLCD_G  <= 8'd0;
105     oLCD_B  <= 8'd0;
106   end
107   else begin
108     oHD     <= mhd;
109     oVD     <= mvd;
110     oDEN    <= mden;
111    
112     if (coord_x > 200 && coord_x < 320 && 
113         coord_y > 200 && coord_y < 240) begin
114       oLCD_R = 10'h000;
115       oLCD_G = 10'h000;
116       oLCD_B = 10'h000;
117     end
118     else begin
119       oLCD_R  <= read_red;
120       oLCD_G  <= read_green;
121       oLCD_B  <= read_blue;
122     end 
123   end
124 end
125 
126 reg [9:0] coord_x;
127 reg [9:0] coord_y;
128 
129 always@(posedge iCLK or negedge iRST_n) begin
130   if (!iRST_n) begin
131     coord_x     <= 0;
132     coord_y     <= 0;
133   end
134   else begin
135     if (display_area) begin
136       coord_x     <= x_cnt - (Hsync_Blank-1);
137       coord_y     <= y_cnt - (Vertical_Back_Porch-1);
138     end
139   end
140 end
141 
142 endmodule

『重點是要能先產生x、y座標的reg,129行到144行就是在產生x、y座標。』

reg [9:0] coord_x;
reg [9:0] coord_y;

always@(posedge iCLK or negedge iRST_n) begin
  if (!iRST_n) begin
    coord_x     <= 0;
    coord_y     <= 0;
  end
  else begin
    if (display_area) begin
      coord_x     <= x_cnt - (Hsync_Blank-1);
      coord_y     <= y_cnt - (Vertical_Back_Porch-1);
    end
  end
end

『看起來與VGA的改法不一樣耶,為什麼要這樣改呢?』用功的小美馬上看出兩者個差異。

『對,但原理是一樣的,根據DE2-70 CD的TRDB_LTM UserGuide,只有在Valid Data區才會顯示影像,首先必須判斷出哪些是valid data區,才能再求出x、y座標。』

『41行的display_area就是判斷是否在x_cnt與y_cnt是否在display區。』

// This signal indicate the lcd display area .
assign  display_area = ((x_cnt>(Hsync_Blank-1)&& //>215
                        (x_cnt<(H_LINE-Hsync_Front_Porch))&& //< 1016
                        (y_cnt>(Vertical_Back_Porch-1))&& 
                        (y_cnt<(V_LINE - Vertical_Front_Porch))
                       ))  ? 1'b1 : 1'b0;

『然後x_cnt必須減掉thbp,也就是Hync back porch,y_cnt必須減掉tvbp,也就是vertical back porch後,才是真正的x、y座標。』

『為什麼Hsync_Blank與Vertical_Back_Porch還要減掉1呢?』細心的小美馬上發現這個小問題。

『小美真是細心!!』無雙學長不禁誇耀起小美。『注意到thpw與tvpw嗎?這在VGA就是H-sync width與V-sync width,在TRDB-LTM很有趣,只有1而以,所以必須減1。』

『x、y座標出來後,接下來就簡單了,只要依你的需求去控制RGB顯示即可,112行到122行,依舊如VGA的範例一樣,控制顯示一個方形』

if (coord_x > 200 && coord_x < 320 && 
    coord_y > 200 && coord_y < 240) begin
  oLCD_R = 10'h000;
  oLCD_G = 10'h000;
  oLCD_B = 10'h000;
end
else begin
  oLCD_R  <= read_red;
  oLCD_G  <= read_green;
  oLCD_B  <= read_blue;
end 

執行結果

『沒想到VGA與TRDB-D5M還是有些差異,不能將VGA的code直接貼過來就好。』阿帥恍然大悟。

『這當然了,blog上的資料是希望大家舉一反三,確實了解code的原理之後,自己能改到其他的周邊上,畢竟在實務裡,一個嵌入式系統常常因為需求不同而替換不同的周邊,如現在就有很多同學用的就是TRDB-D5M + DE2 + TRDB-LTM,而不是DE2-70,只要原理了解,一樣能套用在DE2上。』無雙學長最後作了以上的結論。

完整程式碼下載
DE2_70_D5M_LTM_xy.7z

See Also
(原創) 如何控制DE2 VGA輸出時某座標的顏色? (IC Design) (DE2) (Quartus II)
(原創) 如何產生VGA的Color Pattern Generator? (SOC) (Verilog) (DE2) (DE2-70)

(原創) 如何控制TRDB-LTM輸出時某座標的顏色? (SOC) (DE2-70) (TRDB-LTM)相关推荐

  1. oracle Imdpd覆盖,zzw原創_expdp及impdp中的exclude及include參數的那點事

    zzw原創:轉載請注明出處 在oracle的expdp 及imdpd命令中,exclude及include參數還是有一些要注意的地方,特別是涉及選擇性條件時. 一.通用 1.exclude及inclu ...

  2. (原創) 將map輸出到cout,是否有更方便的方法? (C/C++) (STL)

    大家都體會過sequential container搭配copy() algorithm,只要一行程式就可以將所有值輸出到cout,map這種associative container就無法用這一招, ...

  3. (原創) 如何自行在ThinkPad X61安裝Windows XP Professional SP3? (NB) (ThinkPad) (X61) (OS) (Windows)...

    Abstract 新一代的ThinkPad X61都已經安裝了Windows Vista,或許你因為各種理由想自己重新安裝Windows XP,並且升上SP3,本文是我的安裝心得. Introduct ...

  4. (原創) Quartus II安裝新觀念:如何將Quartus II安裝在VirtualBox內? (SOC) (Quartus II) (VirtualBox)...

    Abstract VM並不是什麼新的觀念,透過VM我們可以在一個OS去執行其他OS,若我們將Quartus II也裝在VM中,將可解決一些長久以來Quartus II使用上所遇到的問題. Introd ...

  5. (原創) 如何讀取/寫入文字檔? (IC Design) (Verilog)

    Abstract Verilog雖然為硬體描述語言,亦提供讀取/寫入文字檔的功能. Introduction為什麼需要用Verilog讀取/寫入文字檔呢?主要用在寫Testbench,並且有兩個優點: ...

  6. (原創) 如何使用ModelSim-Altera對Nios II仿真? (SOC) (Nios II) (SOPC Builder) (ModelSim) (DE2)...

    Abstract 在剛學習Nios II時,每次在Run As Nios II Hardware下方,看到Run As Nios II ModelSim就覺得很好奇,Nios II明明是嵌入式系統,怎 ...

  7. 别人的紅警心得(原創)

    我的紅警心得(原創) 2007-03-25 22:44:55 大 中 小 RA95  -----   一个熟悉而又陌生的名词. 曾率领上大红警组横扫上海滩的我在时隔多年后终于鼓起勇气做一个了断!   ...

  8. (原創) 如何將DE2_70_TV範例加上Sobel Edge Detector? (SOC) (Verilog) (Image Processing) (DE2-70)...

    Abstract 本文將DE2-70平台的DE2_70_TV的範例加上Sobel Edge Detector. Introduction 使用環境:Quartus II 8.0 + DE2-70 (C ...

  9. 如何強迫 .Net 應用程式輸出英文的例外訊息

    转自:http://feeds.feedburner.com/~r/TheWillWillWeb/~3/358986630/post.aspx 因為常常需要跟國外 Blogger 交流,甚至回報某些國 ...

  10. (原創) 如何正確的使用迴圈(使用for_each)? (C/C++) (STL) (template)

    Abstract之前在(原創) 如何使用for_each() algorithm? (C/C++) (STL) 曾經討論過for_each(),不過當時功力尚淺,只談到了皮毛而已,這次看了effect ...

最新文章

  1. 【Python】百度翻译的爬虫实现(后篇)
  2. 智能产品AI服务智商的权重研究|未来研究
  3. 如何用TensorFlow训练聊天机器人(附github)
  4. 阿里云mysql服务器太贵_阿里云数据库,跟自己在服务器安装的有什么区别?有人说安装很简单,那为什么要花钱买?...
  5. 前端:CSS/09/行内框架,CSS简介,CSS选择器,组合选择器,CSS注释,CSS尺寸属性,CSS字体属性,CSS文本属性
  6. Docker的Hadoop-Hbase的 Docker Hub文档
  7. 【转载】使用缓存的9个误区(上)
  8. Linux配置防火墙
  9. 【Get Up&Move】MMD镜头+动作打包下载.zip
  10. Excel--认识Excel
  11. js拖拽(二)仿iGoogle自定义首页模块拖拽
  12. lvm 多个硬盘合成一个_linux使用LVM合并硬盘
  13. Python学习week4
  14. 开源的PHP DKP系统
  15. python 画三角形matli_Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
  16. 初步使用HTMLParser工具包【部分代码来自网络】
  17. 51Nod 2069 牛奶 c/c++题解
  18. 学习笔记:发布自己的python模块安装包
  19. 【TFS-CLUB社区 第7期赠书活动】〖从零开始利用Excel与Python进行数据分析 自动化办公实战宝典〗等你来拿,参与评论,即可有机获得
  20. 怎么看互联网反垄断下的大厂未来?

热门文章

  1. 一份优秀的前端开发工程师简历是怎样的?
  2. 《大型网站技术架构-核心原理与案例分析》(李智慧 著)第3章-大型网站核心架构要素
  3. jQuery cdn加速
  4. javascript中数据类型转换为Number
  5. Android中使用SVG矢量图打造多边形图形框架
  6. js保留2位小数(且四舍五入)
  7. 整理好心情,在春天里上路···
  8. 《线性代数:行列式》: 克拉默法则
  9. acwing 合唱队形
  10. 张云茹计算机,张云茹 - 重庆理工大学 - 药学与生物工程学院