**这是本文档旧的修订版!**
基于STEP FPGA的SPI RGB液晶屏显示驱动
本节将和大家一起使用FPGA驱动底板上的1.8寸RGB液晶屏实现图片显示功能。
====硬件说明====
我们的STEP-BaseBoard底板上集成了1.8寸彩色液晶屏TFTLCD模块,大家可以驱动LCD显示文字、图片或动态的波形。
首先了解一下液晶屏模块,相关资料下载:https://pan.baidu.com/s/1bp6AYsR
框图如下:
原理图如下:
原理图中的器件U1为液晶屏,液晶屏为1.8寸,128RGB160像素,串行总线(SPI),液晶屏集成了ST7735S的驱动器,处理器与ST7735S通信完成液晶屏的显示控制
ST7735S为132RGB x 162像素点 262K 控制器/驱动器,芯片可以直接跟外部处理器连接,支持串行SPI通信和8/9/16/18位并行通信(本液晶屏集成ST7735S时没有留并行接口,所以只能使用串行通信),详细参数请参考数据手册:st7735s_datasheet.pdf
====Verilog代码====
——
<code verilog>
——————————————————————–
»»»»»»»»»»»»> COPYRIGHT NOTICE ««««««««««««<
——————————————————————–
Module: Paramdefine
Author: Step
Description: Param_define
Web: www.stepfpga.com
——————————————————————–
Code Revision History :
——————————————————————–
Version: |Mod. Date: |Changes Made:
V1.1 |2016/10/30 |Initial ver
——————————————————————–
timescale 1ns / 1ns
//VGA显示器驱动只需要5个信号即可(行同步、场同步、红色、绿色、蓝色信号)
//红绿蓝三色信号为模拟信号,输入电压范围为0.0V~0.7V
//VGA时序中行同步和场同步都分为四个阶段(同步脉冲、后廊、有效线数、前廊)
//VGA显示有很多模式,每种模式都是有固定的时钟和时序参数,需要根据要求控制
ifdef VGA800X60060Hz 不同VGA显示模式相应的参数
—————————————————————————
– Horizonal timing information
define HSYNC_A 16'd128 // 128
define HSYNCB 16'd216 128 + 88
define HSYNC_C 16'd1016 // 128 + 88 + 800
define HSYNCD 16'd1056 128 + 88 + 800 + 40 行同步脉冲+后廊+有效线数+前廊
– Vertical timing information
define VSYNC_O 16'd4 // 4
define VSYNCP 16'd27 4 + 23
define VSYNC_Q 16'd627 // 4 + 23 + 600
define VSYNC_R 16'd628 4 + 23 + 600 + 1 场同步脉冲+后廊+有效线数+前廊
—————————————————————————
endif
ifdef VGA640X48085Hz 不同VGA显示模式相应的参数
—————————————————————————
– Horizonal timing information
define HSYNC_A 16'd48 // 48
define HSYNCB 16'd160 48 + 112
define HSYNC_C 16'd800 // 48 + 112 + 640
define HSYNCD 16'd832 48 + 112 + 640 + 32 行同步脉冲+后廊+有效线数+前廊
– Vertical timing information
define VSYNC_O 16'd3 // 3
define VSYNCP 16'd28 3 + 25
define VSYNC_Q 16'd508 // 3 + 25 + 480
define VSYNC_R 16'd509 3 + 25 + 480 + 1 场同步脉冲+后廊+有效线数+前廊
—————————————————————————
endif
</code>
<code verilog>
// --------------------------------------------------------------------
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// --------------------------------------------------------------------
// Module: Vga_Module
//
// Author: Step
//
// Description: Vga_Module
//
// Web: www.stepfpga.com
//
// --------------------------------------------------------------------
// Code Revision History :
// --------------------------------------------------------------------
// Version: |Mod. Date: |Changes Made:
// V1.1 |2016/10/30 |Initial ver
// --------------------------------------------------------------------
define VGA800X600_60Hz 定义使用的VGA显示模式
ifdef VGA_800X600_60Hz //根据VGA显示模式的定义调用相应的参数
include “Paramdefine.v” 调用Paramdefine.v文件中的全局定义
endif
module Vga_Module
(
input clk_in, //40MHz系统时钟
input rst_n_in, //系统复位,低有效
output reg sync_v, //VGA场同步sync_v
output reg sync_h, //VGA行同步sync_h
output reg [2:0] vga_data //VGA数据MSB~LSB = {R,G,B}
);
reg [15:0] x_cnt;
reg [15:0] y_cnt;
reg vga_valid;
//对时钟计数标识VGA一次行扫描需要的时间
always @ (posedge clk_in or negedge rst_n_in)
if(!rst_n_in) x_cnt <= 16'd0; //复位时初始值
else if(x_cnt >=
HSYNCD) xcnt ⇐ 16'd0; 一次行扫描需要1056个时钟(128+88+800+40)
else xcnt ⇐ x_cnt + 1'b1;
对行扫描计数标识VGA一次场扫描需要的时间
always @ (posedge clkin or negedge rstnin)
if(!rstnin) ycnt ⇐ 16'd0; 复位时初始值
else if(xcnt == HSYNC_D) begin //每次行扫描时
if(y_cnt >=
VSYNCR) ycnt ⇐ 16'd0; 每次场扫描包含628次行扫描
else ycnt ⇐ ycnt + 1'b1;
end else ycnt ⇐ ycnt; 在每次行扫描过程中场扫描计数器保持不变
按照显示模式的参数产生行同步扫描的脉冲
always @ (posedge clkin or negedge rstnin)
if(!rstnin) synch ⇐ 1'b1;
else if(xcnt < HSYNC_A) sync_h <= 1'b0;
else sync_h <= 1'b1;
//按照显示模式的参数产生场同步扫描的脉冲
always @ (posedge clk_in or negedge rst_n_in)
if(!rst_n_in) sync_v <= 1'b1;
else if(y_cnt <
VSYNCO) syncv ⇐ 1'b0;
else syncv ⇐ 1'b1;
根据行场同步信号的有效线数确定有效显示区域
always @ (posedge clkin or negedge rstnin)
if(!rstnin)
vgavalid ⇐ 1'b0;
else if1)
vgavalid ⇐ 1'b1; 有效显示区域中vgavalid标志为1
else
vga_valid ⇐ 1'b0;
在VGA有效显示区域不同的段显示不同的颜色
always @ (posedge clkin or negedge rstnin)
begin
if(!rst_n_in) vga_data = 3'b111; else if(vga_valid)begin //在有效显示区域内 if((x_cnt > `HSYNC_B) && (x_cnt <= `HSYNC_B + 10'd100)) vga_data = 3'b100; //红色 else if((x_cnt > `HSYNC_B + 10'd100) && (x_cnt <= `HSYNC_B + 10'd200)) vga_data = 3'b010; //绿色 else if((x_cnt > `HSYNC_B + 10'd200) && (x_cnt <= `HSYNC_B + 10'd300)) vga_data = 3'b001; //蓝色 else if((x_cnt > `HSYNC_B + 10'd300) && (x_cnt <= `HSYNC_B + 10'd400)) vga_data = 3'b110; //黄色 else if((x_cnt > `HSYNC_B + 10'd400) && (x_cnt <= `HSYNC_B + 10'd500)) vga_data = 3'b101; //紫色 else if((x_cnt > `HSYNC_B + 10'd500) && (x_cnt <= `HSYNC_B + 10'd600)) vga_data = 3'b011; //青色 else if((x_cnt > `HSYNC_B + 10'd600) && (x_cnt <= `HSYNC_B + 10'd700)) vga_data = 3'b111; //白色 else if((x_cnt > `HSYNC_B + 10'd700) && (x_cnt <= `HSYNC_B + 10'd800)) vga_data = 3'b000; //黑色 else vga_data = 3'b111; //白色 end else vga_data = 3'b111; //白色
end
endmodule </code>
====小结====
本节主要为大家讲解了VGA显示的原理、时序及软件设计,需要大家掌握的同时自己创建工程,通过整个设计流程,生成FPGA配置文件加载测试。
如果你对Diamond软件的使用不了解,请参考这里:Diamond的使用。
====相关资料====
使用STEP-MXO2第二代的VGA显示驱动程序: 后续会有下载连接 待更新
使用STEP-MAX10的VGA显示驱动程序: 后续会有下载连接 待更新