【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十九:LCD模块
2015-06-24 10:49
417 查看
实验二十九:LCD模块
据说Alinx 301支持 7”TFT,好奇的朋友一定疑惑道,它们3.2”TFT以及7”TFT等两者之间究竟有何区别呢?答案很简单,前者自带控制器也有图像内存。换之,后者好似缩小版台式的液晶,它除了接口以外什么也没有。![](http://images0.cnblogs.com/blog/494276/201506/241048317671538.jpg)
图29.1 7”TFT的引脚。
如图29.1所示,这只7“TFT拥有840 * 480的分辨率,应用VGA接口,所以左边才有熟悉的 HSYNC以及 VYSNC信号。LCD_CLOCK是像素时钟,最大为50Mhz,并且没有下限。LCD_RED/GREEN/BLUE 为 18位RGB,颜色支持范围是 218 = 262K。右边的DE为Data Enable拉高表示数据输入有效,LR/UD为扫描次序,例如自左向右,由高至下就是 2’b10,结果如表29.1所示:
表29.1 TFT的扫描次序。
LR | UD | 扫描次序 |
0 | 0 | 自右向左,由上至下 |
0 | 1 | 自右向左,由下至上 |
1 | 0 | 自左向右,由上至下 |
1 | 1 | 自左向右,由下至上 |
![](http://images0.cnblogs.com/blog/494276/201506/241048333306494.jpg)
![](http://images0.cnblogs.com/blog/494276/201506/241048345955306.jpg)
图26.4 VGA时序。
如图29.2所示,HSYNC以及VSYNC均为五段,具体长度如表29.2所示:
表29.2 显示标准800 × 480。
信号 | A | B | C | D | E |
VGA_HSYNC | 48 | 40 | 800 | 40 | 928 |
信号 | O | P | Q | R | S |
VGA_VSYNC | 3 | 29 | 480 | 13 | 525 |
![](http://images0.cnblogs.com/blog/494276/201506/241048360337535.jpg)
图29.3 128×96大小的小可爱。
图29.3是我们要显示的小可爱 ... 啊,不管怎么看,比卡丘最可爱了!完后,我们让我们建模去吧。
![](http://images0.cnblogs.com/blog/494276/201506/241048377839733.jpg)
图29.4 LCD基础模块的建模图。
图29.4是LCD基础模块的建模图,内容包括储存模块以及的功能模块。相对PLL模块将时间分频为25Mhz,因为像素时钟是任意的。
lcd_funcmod.v
![](http://images0.cnblogs.com/blog/494276/201506/241048388612304.jpg)
图29.5 LCD 功能模块。
图29.5是LCD功能模块的建模图,读者可能很好奇控制模块去哪儿了?非呀,控制模块已经被整合进去了。
1. module lcd_funcmod
[code]2. (
3. input CLOCK, RESET,
4.output LCD_CLOCK,
5. output LCD_HSYNC, LCD_VSYNC,
6. output [5:0]LCD_RED,LCD_GREEN,LCD_BLUE,
7. output LCD_DE,
8. output LCD_UD, LCD_LR,
9. output LCD_MODE,
10. output LCD_PWM,
11. output [13:0]oAddr,
12. input [15:0]iData
13. );
14.parameter SA = 11'd48, SB = 11'd40, SC = 11'd800, SD = 11'd40, SE = 11'd928;
15. parameter SO = 11'd3, SP = 11'd29, SQ = 11'd480, SR = 11'd13, SS = 11'd525;
16.
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以上内容为相关的出入端声明以及常量声明。
17. reg [10:0]CH;
[code]18. always @ ( posedge CLOCK or negedge RESET )
19. if( !RESET )
20. CH <= 11'd0;
21. else if( CH == SE -1 )
22. CH <= 11'd0;
23. else
24. CH <= CH + 1'b1;
25.
26. reg [9:0]CV;
27. always @ ( posedge CLOCK or negedge RESET )
28. if( !RESET )
29. CV <= 10'd0;
30. else if( CV == SS -1 )
31. CV <= 10'd0;
32. else if( CH == SE -1 )
33. CV <= CV + 1'b1;
34.
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以上内容为列计数与行计数的周边操作。
35. reg H;
[code]36. always @ ( posedge CLOCK or negedge RESET )
37. if( !RESET )
38. H <= 1'b1;
39. else if( CH == SE -1 )
40. H <= 1'B0;
41. else if( CH == SA -1 )
42. H <= 1'b1;
43.
44.reg V;
45. always @ ( posedge CLOCK or negedge RESET )
46. if( !RESET )
47. V <= 1'b1;
48. else if( CV == SS -1 )
49. V <= 1'b0;
50. else if( CV == SO -1 )
51. V <= 1'b1;
52.
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以上内容为列控制以及行控制的周边操作。
53. parameter XSIZE = 8'd128, YSIZE = 8'd96, XOFF = 10'd0, YOFF = 10'd0;
[code]54.
55. wire isX = ( (CH >= SA + SB + XOFF -1 ) && ( CH <= SA + SB + XOFF + XSIZE -1) );
56. wire isY = ( (CV >= SO + SP + YOFF -1 ) && ( CV <= SO + SP + YOFF + YSIZE -1) );
57. wire isReady = isX & isY;
58.
59. wire [31:0] x = CH - XOFF - SA - SB -1;
60. wire [31:0] y = CV - YOFF - SO - SP -1;
61.
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以上内容为图像信息的常量声明,有效行列,以及地址转换等即时声明。
62. reg [31:0]D1;
[code]63. reg [15:0]D2;
64.
65. always @ ( posedge CLOCK or negedge RESET )
66. if( !RESET )
67. begin
68. D1 <= 18'd0;
69. D2 <= 16'd0;
70. end
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以上内容为相关的寄存器声明以及复位操作。D1暂存图像的地址信息,D2暂存图像信息。
71. else
[code]72. begin
73.
74. // step 1 : compute data address and index-n
75. if( isReady )
76. D1 <= (y << 7) + x;
77. else
78. D1 <= 14'd0;
79.
80. // step 2 : reading data from rom
81. // but do-nothing
82.
83. // step 3 : assign RGB_Sig
84. D2 <= isReady ? iData : 16'd0;
85.
86. end
87.
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以上内容为核心操作。它是流水操作,步骤1转换图像信息地址至D1,步骤2等待图像信息反馈,步骤3暂存图像信息至D2。
88. reg [1:0]B1,B2,B3;
[code]89.
90. always @ ( posedge CLOCK or negedge RESET )
91. if( !RESET )
92. { B3, B2, B1 } <= 6'b11_11_11;
93. else
94. begin
95. B1 <= { H,V };
96. B2 <= B1;
97. B3 <= B2;
98. end
99.
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以上内容为对此行列延迟的周边操作。
100. assign LCD_CLOCK = CLOCK;
[code]101. assign { LCD_HSYNC, LCD_VSYNC } = B3;
102. assign LCD_RED = { D2[15:11],1'b0};
103. assign LCD_GREEN = D2[10:5];
104. assign LCD_BLUE = { D2[4:0],1'b0};
105. assign LCD_DE = 1'b1;
106. assign {LCD_LR, LCD_UD} = 2'b10;
107. assign LCD_MODE = 1'b0;
108. assign LCD_PWM = 1'b1;
109. assign oAddr = D1[13:0];
110.
111. endmodule
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以上内容为相关的输出驱动声。注意LCD_RED/BLUE 都是舍弃最低位,LCD_LR/UD为2’b10,LCD_MODE拉低,LCD_DE常年拉高。
lcd_savemod.v
内容基本上与实验二十六一样。
lcd_basemod.v
连线部署请参考图29.5。
1. module lcd_basemod
[code]2. (
3. input CLOCK, RESET,
4.
5. output LCD_CLOCK,
6. output LCD_HSYNC, LCD_VSYNC,
7. output [5:0]LCD_RED,LCD_GREEN,LCD_BLUE,
8. output LCD_DE,
9. output LCD_UD, LCD_LR,
10. output LCD_MODE,
11. output LCD_PWM
12. );
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以上内容为相关出入端声明。
13. wire CLOCK_25M;
[code]14.
15. pll_module U1
16.(
17. .inclk0 ( CLOCK ),
18. .c0 ( CLOCK_25M )
19. );
20.
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以上内容为PLL的实例化。注意,7”TFT除了最大像素时钟是50Mhz以外,余下可以任意设置。
21. wire [13:0]AddrU2;
[code]22.
23. lcd_funcmod U2
24.(
25..CLOCK( CLOCK_25M ),
26. .RESET( RESET ),
27. .LCD_CLOCK( LCD_CLOCK ),
28. .LCD_HSYNC( LCD_HSYNC ),
29. .LCD_VSYNC( LCD_VSYNC ),
30. .LCD_RED( LCD_RED ),
31. .LCD_GREEN( LCD_GREEN ),
32. .LCD_BLUE( LCD_BLUE ),
33. .LCD_DE( LCD_DE ),
34. .LCD_LR( LCD_LR ),
35. .LCD_UD( LCD_UD ),
36. .LCD_MODE( LCD_MODE ),
37. .LCD_PWM( LCD_PWM ),
38. .oAddr( AddrU2 ),
39. .iData( DataU3 )
40. );
41.
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以上内容为功能模块的实例化。
42. wire [15:0]DataU3;
[code]43.
44.lcd_savemod U3
45. (
46. .CLOCK( CLOCK_25M ),
47. .RESET( RESET ),
48. .iAddr( AddrU2 ),
49. .oData ( DataU3 )
50. );
51.
52. endmodule
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以上内容为储存模块的实例化。
![](http://images0.cnblogs.com/blog/494276/201506/241048400334846.jpg)
图29.6 显示效果。
完后,综合程序并且下载进去,如果7”TFT的左上角出现一群小可爱,结果如图29.6,那么表示实验成功。
细节一:完整的个体模块
本实验的LCD基础模块只是演示7”TFT如何驱动而已。
相关文章推荐
- Sublime Text 2 注册码
- 《一个程序猿的生命周期》读后感
- CSS3 box-shadow 属性
- php-fpm配置笔记
- 算法练习之DP 求LCM (最长公共子序列)
- Windows Server 2012 R2 DirectAccess功能测试(5)―安装及配置Inter服务器
- Metaio in Unity3d 教程--- 四:再谈谈图片扫描之tracking配置文件
- linux常用命令
- 首字母获取
- C++primer 重点总结(important)
- ExtJs里表格自动显隐滚动条
- ExtJs里表格自动显隐滚动条
- matlab中 tic,toc函数的用法
- nagios监控-多用户管理
- Android笔记之获取视频、图片缩略图
- Metaio in Unity3d 教程--- 三. 使用ID Marker作为扫描目标
- Ubuntu下安装PHP的mongodb扩展
- Swift 2.0
- python模块 - re模块使用示例
- MongoDB 进程控制系列一:查看当前正在执行的进程