Chinaunix首页 | 论坛 | 博客
  • 博客访问: 411202
  • 博文数量: 101
  • 博客积分: 2324
  • 博客等级: 大尉
  • 技术积分: 887
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-19 19:28
文章分类

全部博文(101)

文章存档

2012年(3)

2011年(60)

2010年(38)

分类: 嵌入式

2011-06-10 09:26:13


如何控制TRDB-LTM輸出時某座標的顏色?

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

介绍
使用環境:Quartus II 8.1 + Nios II EDS 8.1 + DE2-70 (旋风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輸出時某座標的顏色? (集成电路设计) (DE2) (Quartus II)(原創)如何產生VGA的颜色模式生成程序? (SOC) (Verilog) (DE2) (DE2-70)兩篇曾經提過, TRDB-LTM應該也可以用這種方是去控制吧!!’

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

‘一起去請教無雙學長好了….’

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

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

touch_tcon.v/Verilog

  1模块touch_tcon (
  2输入了             iCLK,             // LCD显示时钟
  3输入了             iRST_n,           // systen重新设置
  4 // SDRAM边
  5输入了[15 0]      iREAD_DATA1,      // R和G上色数据表sdram    
  6输入了[15 0]      iREAD_DATA2,      // B颜色数据表sdram
  7输出了            oREAD_SDRAM_EN,   //读了sdram数据控制信号
  8 //LCD边
  9输出的reg       oHD,              // LCD水平的sync
10输出的reg       oVD,              // LCD垂直同步
11输出的reg       oDEN,             // LCD数据使能
12输出的reg [7 0] oLCD_R,           // LCD红颜色数据
13输出的reg [7 0] oLCD_G,           // LCD绿色数据
14输出的reg [7 0] oLCD_B            // LCD蓝色颜色数据
15);
16 
17参量H_LINE = 1056年;
18参量V_LINE = 525;
19参量Hsync_Blank = 216;
20参量Hsync_Front_Porch = 40;
21参量Vertical_Back_Porch = 35;
22参量Vertical_Front_Porch = 10;
23 
24 reg   [10 0] x_cnt; 
25 reg   [9 0]   y_cnt;
26导线[7 0]   read_red;
27导线[7 0]   read_green;
28导线[7 0]   read_blue;
29导线          display_area;
30 reg           mhd;
31 reg           mvd;
32 reg           mden;
33 
34 //这张信号控制读书数据表SDRAM,如果高读的颜色数据表sdram。
35分配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 //这个信号表明lcd显示区。
42分配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分配read_red    = display_area ? iREAD_DATA2 [9 2] : 8 ' b0;
49分配read_green = display_area ? {iREAD_DATA1 [14 10], iREAD_DATA2 [14 12]} : 8 ' b0;
50分配read_blue   = display_area ? iREAD_DATA1 [9 2] : 8 ' b0;
51 
52 ///////////////////////// X - Y的柜台和lcd hd发电器//////////////////
53 always@ (posedge iCLK或negedge iRST_n)开始
54,如果(! iRST_n)开始
55     x_cnt <= 11 ' d0;
56     mhd   <= 1 ' d0;
57末端
58,如果(x_cnt == (H_LINE-1)) 开始
59     x_cnt <= 11 ' d0;
60     mhd   <= 1 ' d0;
61末端
62开始
63     x_cnt <= x_cnt + 11 ' d1;
64     mhd <= 1 ' d1;
65末端
66末端
67 
68 always@ (posedge iCLK或negedge iRST_n)开始
69,如果(! iRST_n)
70     y_cnt <= 10 ' d0;
71,如果(x_cnt == (H_LINE-1)) 开始
72     如果(y_cnt == (V_LINE-1))
73       y_cnt <= 10 ' d0;
74    
75       y_cnt <= y_cnt + 10 ' d1;   
76末端
77末端
78 
79 //////////////////////////////接触控制板时间//////////////////
80 always@ (posedge iCLK或negedge iRST_n)开始
81,如果(! iRST_n)
82     mvd <= 1 ' b1;
83,如果(y_cnt == 10 ' d0)
84     mvd <= 1 ' b0;
85
86     mvd <= 1 ' b1;
87末端
88 
89 always@ (posedge iCLK或negedge iRST_n)开始
90,如果(! iRST_n)
91     mden <= 1 ' b0;
92,如果(display_area)
93     mden <= 1 ' b1;
94
95     mden <= 1 ' b0;
96末端
97 
98 always@ (posedge iCLK或negedge iRST_n)开始
99,如果(! iRST_n)开始
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末端
107开始
108     oHD     <= mhd;
109     oVD     <= mvd;
110     oDEN    <= mden;
111    
112     如果(coord_x > 200 && coord_x < 320 && 
113         coord_y > 200 && coord_y < 240)开始
114       oLCD_R = 10 ' h000;
115       oLCD_G = 10 ' h000;
116       oLCD_B = 10 ' h000;
117     末端
118     开始
119       oLCD_R <= read_red;
120       oLCD_G <= read_green;
121       oLCD_B <= read_blue;
122     末端 
123末端
124末端
125 
126 reg [9 0] coord_x;
127 reg [9 0] coord_y;
128 
129 always@ (posedge iCLK或negedge iRST_n)开始
130,如果(! iRST_n)开始
131     coord_x     <= 0;
132     coord_y     <= 0;
133末端
134开始
135     如果(display_area)开始
136       coord_x     <= x_cnt - (Hsync_Blank-1);
137       coord_y     <= y_cnt - (Vertical_Back_Porch-1);
138     末端
139末端
140末端
141 
142 endmodule


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

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

always@ (posedge iCLK或negedge iRST_n)开始
  如果(! iRST_n)开始
    coord_x     <= 0;
    coord_y     <= 0;
  末端
  开始
    如果(display_area)开始
      coord_x     <= x_cnt - (Hsync_Blank-1);
      coord_y     <= y_cnt - (Vertical_Back_Porch-1);
    末端
  末端
末端


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

‘對,但原理是一樣的,根據DE2-70 CD的TRDB_LTM UserGuide,只有在合法的数据區才會顯示影像,首先必須判斷出哪些是合法的数据區,才能再求出x、y座標’。

ltm01

ltm03

ltm02

ltm04


‘41行的display_area就是判斷是否在x_cnt與y_cnt是否在显示區’。

//这个信号表明lcd显示区。
分配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后沿, y_cnt必須減掉tvbp,也就是垂直的后沿後,才是真正的x、y座標’。

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

‘小美真是細心!! ’無雙學長不禁誇耀起小美。‘注意到thpw與tvpw嗎?這在VGA就是Hsync宽度與Vsync宽度,在TRDB-LTM很有趣,只有1而以,所以必須減1’。

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

如果(coord_x > 200 && coord_x < 320 && 
    coord_y > 200 && coord_y < 240)开始
  oLCD_R = 10 ' h000;
  oLCD_G = 10 ' h000;
  oLCD_B = 10 ' h000;
末端
开始
  oLCD_R <= read_red;
  oLCD_G <= read_green;
  oLCD_B <= read_blue;
末端 


執行結果

ltm00

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

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

阅读(7199) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~