**这是本文档旧的修订版!**

基于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: Param
define 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显示驱动程序: 后续会有下载连接 待更新

1) xcnt > HSYNC_B) && (x_cnt <HSYNCC) && (ycnt > VSYNC_P) && (y_cnt < VSYNCQ