【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十九:LCD模块

简介: 实验二十九:LCD模块 据说Alinx 301支持 7”TFT,好奇的朋友一定疑惑道,它们3.2”TFT以及7”TFT等两者之间究竟有何区别呢?答案很简单,前者自带控制器也有图像内存。换之,后者好似缩小版台式的液晶,它除了接口以外什么也没有。

实验二十九:LCD模块

据说Alinx 301支持 7”TFT,好奇的朋友一定疑惑道,它们3.2”TFT以及7”TFT等两者之间究竟有何区别呢?答案很简单,前者自带控制器也有图像内存。换之,后者好似缩小版台式的液晶,它除了接口以外什么也没有。

clip_image002

图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

自左向右,由下至上

根据手册,它支持两种模式,MODE拉低表示传统的VGA模式,MODE拉高则是DE模式。老实说,什么是DE模式,笔者真有点搞不懂,手册也没有详细注明,所以MODE信号必须拉低。这只7”TFT自带背光,我们可以经由PWM信号调节背光的亮度,具体内容请浏览手册,我们一般都是常年拉高。

clip_image004

clip_image005

图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

笔者曾前面说过,折尺7”TFT应用VGA接口,驱动方法与实验二十六差不多。所以说,懒惰的笔者就直接沿用实验二十六的资源。

clip_image007

图29.3 128×96大小的小可爱。

图29.3是我们要显示的小可爱 ... 啊,不管怎么看,比卡丘最可爱了!完后,我们让我们建模去吧。

clip_image009

图29.4 LCD基础模块的建模图。

图29.4是LCD基础模块的建模图,内容包括储存模块以及的功能模块。相对PLL模块将时间分频为25Mhz,因为像素时钟是任意的。

lcd_funcmod.v

clip_image011

图29.5 LCD 功能模块。

图29.5是LCD功能模块的建模图,读者可能很好奇控制模块去哪儿了?非呀,控制模块已经被整合进去了。

1.    module lcd_funcmod 
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.        

以上内容为相关的出入端声明以及常量声明。

17.         reg [10:0]CH;
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.                  

以上内容为列计数与行计数的周边操作。

35.         reg H;
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.         

以上内容为列控制以及行控制的周边操作。

53.         parameter XSIZE = 8'd128, YSIZE = 8'd96, XOFF = 10'd0, YOFF = 10'd0; 
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.         

以上内容为图像信息的常量声明,有效行列,以及地址转换等即时声明。

62.         reg [31:0]D1;
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

以上内容为相关的寄存器声明以及复位操作。D1暂存图像的地址信息,D2暂存图像信息。

71.                else
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.                    

以上内容为核心操作。它是流水操作,步骤1转换图像信息地址至D1,步骤2等待图像信息反馈,步骤3暂存图像信息至D2。

88.         reg [1:0]B1,B2,B3;
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.        

以上内容为对此行列延迟的周边操作。

100.        assign LCD_CLOCK = CLOCK;
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

以上内容为相关的输出驱动声。注意LCD_RED/BLUE 都是舍弃最低位,LCD_LR/UD为2’b10,LCD_MODE拉低,LCD_DE常年拉高。

lcd_savemod.v

内容基本上与实验二十六一样。

lcd_basemod.v

连线部署请参考图29.5。

1.    module lcd_basemod
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.    );

以上内容为相关出入端声明。

13.        wire CLOCK_25M;
14.         
15.        pll_module U1  
16.        (
17.            .inclk0 ( CLOCK ),
18.            .c0 ( CLOCK_25M ) 
19.         );
20.         

以上内容为PLL的实例化。注意,7”TFT除了最大像素时钟是50Mhz以外,余下可以任意设置。

21.         wire [13:0]AddrU2; 
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.         

以上内容为功能模块的实例化。

42.         wire [15:0]DataU3;
43.         
44.         lcd_savemod U3
45.         (
46.             .CLOCK( CLOCK_25M ),
47.             .RESET( RESET ),
48.             .iAddr( AddrU2 ),
49.             .oData ( DataU3 )
50.        );
51.         
52.    endmodule

以上内容为储存模块的实例化。

clip_image013

图29.6 显示效果。

完后,综合程序并且下载进去,如果7”TFT的左上角出现一群小可爱,结果如图29.6,那么表示实验成功。

细节一:完整的个体模块

本实验的LCD基础模块只是演示7”TFT如何驱动而已。

目录
相关文章
|
9月前
|
数据采集 移动开发 算法
【硬件测试】基于FPGA的QPSK调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现QPSK调制与软解调系统,包含Testbench、高斯信道、误码率统计模块,并支持不同SNR设置。硬件版本新增ILA在线数据采集和VIO在线SNR设置功能,提供无水印完整代码及测试结果。通过VIO分别设置SNR为6dB和12dB,验证系统性能。配套操作视频便于用户快速上手。 理论部分详细解析QPSK调制原理及其软解调实现过程,涵盖信号采样、相位估计、判决与解调等关键步骤。软解调通过概率估计(如最大似然法)提高抗噪能力,核心公式为*d = d_hat / P(d_hat|r[n])*,需考虑噪声对信号点分布的影响。 附Verilog核心程序代码及注释,助力理解与开发。
306 5
|
10月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的MSK调制解调系统系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现MSK调制解调系统,采用Verilog开发,包含同步模块、高斯信道模拟、误码率统计等功能。相比仿真版本,新增ILA数据采集与VIO在线SNR设置模块。通过硬件测试验证,展示不同SNR(如10dB和16dB)下的性能表现。研究聚焦软件无线电领域,优化算法复杂度以适应硬件限制,利用MSK恒定包络、相位连续等特性提升频谱效率。核心代码实现信号生成、调制解调、滤波及误码统计,提供完整的硬件设计与分析方案。
366 19
|
10月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前开发的16QAM调制与软解调系统,增加了硬件测试功能。该系统包含FPGA实现的16QAM调制、软解调、高斯信道、误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置模块。通过硬件测试,验证了不同SNR条件下的系统性能。16QAM软解调通过比较接收信号采样值与16个调制点的距离,选择最近的调制点来恢复原始数据。核心Verilog代码实现了整个系统的功能,包括SNR设置、信号处理及误码率统计。硬件测试结果表明系统在不同SNR下表现良好,详细操作步骤可参考配套视频。
279 13
|
算法 数据安全/隐私保护 异构计算
基于FPGA的变步长LMS自适应滤波器verilog实现,包括testbench
### 自适应滤波器仿真与实现简介 本项目基于Vivado2022a实现了变步长LMS自适应滤波器的FPGA设计。通过动态调整步长因子,该滤波器在收敛速度和稳态误差之间取得良好平衡,适用于信道均衡、噪声消除等信号处理应用。Verilog代码展示了关键模块如延迟单元和LMS更新逻辑。仿真结果验证了算法的有效性,具体操作可参考配套视频。
429 74
|
9月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于FPGA的SNN脉冲神经网络之LIF神经元verilog实现,包含testbench
本项目展示了 LIF(Leaky Integrate-and-Fire)神经元算法的实现与应用,含无水印运行效果预览。基于 Vivado2019.2 开发,完整代码配有中文注释及操作视频。LIF 模型模拟生物神经元特性,通过积分输入信号并判断膜电位是否达阈值产生脉冲,相较于 Hodgkin-Huxley 模型更简化,适合大规模神经网络模拟。核心程序片段示例,助您快速上手。
|
10月前
|
算法 数据安全/隐私保护 异构计算
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
|
10月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的2ASK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
本内容展示了基于Vivado2019.2的算法仿真效果,包括设置不同信噪比(SNR=8db和20db)下的结果及整体波形。同时,详细介绍了2ASK调制解调技术的原理与实现,即通过改变载波振幅传输二进制信号,并提供数学公式支持。此外,还涉及帧同步理论,用于确定数据帧起始位置。最后,给出了Verilog核心程序代码,实现了2ASK解调与帧同步功能,结合DDS模块生成载波信号,完成信号处理流程。
199 0
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现了16QAM基带通信系统,包括调制、信道仿真、解调及误码率统计模块。通过Vivado2019.2仿真,设置不同SNR(如8dB、12dB),验证了软解调相较于传统16QAM系统的优越性,误码率显著降低。系统采用Verilog语言编写,详细介绍了16QAM软解调的原理及实现步骤,适用于高性能数据传输场景。
572 69
|
10月前
|
编解码 算法 数据安全/隐私保护
基于FPGA的信号DM编解码实现,包含testbench和matlab对比仿真
本项目展示了DM编解码算法的实现与测试结果。FPGA测试结果显示为T1,Matlab仿真结果为T2。使用软件版本为Matlab 2022a和Vivado 2019.2。核心程序包含详细中文注释和操作视频。DM编解码通过比较信号样本差值进行编码,适用于音频等低频信号处理。硬件结构包括编码器(采样器、减法器、比较器)和解码器(解码器、积分器)。
|
移动开发 算法 数据安全/隐私保护
基于FPGA的QPSK调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的QPSK调制解调系统,通过Vivado 2019.2进行仿真,展示了在不同信噪比(SNR=1dB, 5dB, 10dB)下的仿真效果。与普通QPSK系统相比,该系统的软解调技术显著降低了误码率。文章还详细阐述了QPSK调制的基本原理、信号采样、判决、解调及软解调的实现过程,并提供了Verilog核心程序代码。
474 26

热门文章

最新文章