实验目的:先简单熟悉LCD灯的驱动和时序图的代码实现。设计功能是让LCD显示红绿蓝三种颜色,即三个彩带。本次实验比较容易实现,主要是对LCD驱动时序图的理解和时序参数的配置。

实验条件:1.LCD原理图2020-12-17-HXH_ESP32_E1。

2.所用开发板用户手册:GW1NSR-LV4CQN48PC7I6_V1.1开发板用户手册

3.LCD的数据手册:SC7283(确定LCD驱动设计的引脚和时序控制)

注释:第一项和第二项结合是为了,分配LCD和FPGA的引脚。一般用PDF软件Adobe Acrobat DC进行查找引脚编号,再粘贴复制找到引脚的位置,在用一个EXCEL表格记下引脚名字,引脚的位置或编号,引脚的电压类型(LVCMOS33或LVCMOS18等)

实验原理:

LCD的分辨率为480RGB * 272  ,理解为有480列和272行,分别对应行同步计数器h_cnt 和场同步计数器v_cnt ,LCD有三种模式,SYNC, SYNC-DE and DE mode,本次选用的是第二种,和VGA的驱动很相似,先是行同步信号HSYNC,然后是场同步信号VSYNC(行同步信号(一个像素点)可以理解为把一行的所有列扫描完则就是场同步信号,即场同步信号比行同步信号大。)再是有效区域DE。由于对于行同步信号或者场同步信号的时许控制来讲,都是由行同步信号或场同步信号周期,前沿,有效区域,后沿等四个部分参数组成

时许图如下:

下图红框的是LCD分辨率为480RGB * 272时,对应时序图中的配置参数。

三  代码设计:

本设计代码分成两部分,一是顶层模块,二是LCD驱动控制模块。

1.LCD顶层模块:

module lcd_top#
(
parameter ROW_NUM = 272
,parameter COL_NUM = 480
,parameter DATA_LENGTH = 24 //传输数据位宽,RGB888是24位

,parameter CMD_SPACE = 43 //每次使能信号间隔
,parameter BURST_NUM = 32
)
(
//////// SYSTEM ////////////////
input sys_clk
///////// SPI //////////////////
// ,input i_cs
// ,input i_sclk
// ,input i_mosi
// ,input i_dcx

//////// RGB ///////////////////
,output fv
,output lv
,output de
,output [DATA_LENGTH-1:0] pixdata//,output [15:0] pixdata
,output pixclk
);

////////////// 延时复位 ///////////
reg [29:0] init_delay = 0;
always@(posedge sys_clk)begin
if(init_delay >= 50000000)
init_delay <= init_delay;
else
init_delay <= init_delay + 1'b1;
end

wire FPGA_RST_N;
assign FPGA_RST_N = (init_delay >= 50000000)?1:0;

LCD_CTRL #
(
.WORD_WIDTH (DATA_LENGTH)

,.H_FRONT_PORCH(8)
,.H_BACK_PORCH (43)
,.H_SYNC (4)

,.V_FRONT_PORCH(8) //V_TOTAL = VFP +VBP +V_SYNC + V_ACTIVE,V_TOTAL = 929
,.V_BACK_PORCH (12)
,.V_SYNC (4)

,.H_ACTIVE (COL_NUM)
,.V_ACTIVE (ROW_NUM)// 120//
)
u_RGB_CTRL
(
.rst_n(FPGA_RST_N)
,.sysclk(sys_clk)

,.lcd_A_vs(fv)
,.lcd_A_hs(lv)
,.lcd_A_de(de)

,.lcd_A_clk(pixclk)
,.lcd_A_rgb (pixdata)
);

endmodule

2.LCD驱动模块

module LCD_CTRL #
(parameter WORD_WIDTH = 24

,parameter H_FRONT_PORCH = 8
,parameter H_BACK_PORCH = 43
,parameter H_SYNC = 4
//H——TOTAL=HFP +HBP +H_SYNC + H_ACTIVE=531
,parameter V_FRONT_PORCH = 8 //V_TOTAL = VFP +VBP +V_SYNC + V_ACTIVE,V_TOTAL = 292
,parameter V_BACK_PORCH = 12
,parameter V_SYNC = 4

,parameter H_ACTIVE = 480
,parameter V_ACTIVE = 272// 120//
)
(//input rst_n
input sysclk
,input wire rst_n

,output lcd_A_vs
,output lcd_A_hs
,output lcd_A_de
,output lcd_A_clk
,output [WORD_WIDTH-1:0] lcd_A_rgb
///////////init
,output wire rgb_en
,output wire lcd_disp
// ,output wire o_mosi
// ,output wire o_mclk
// ,output wire o_cs
);
parameter BLACK = 24'h000000; //红色
parameter RED = 24'hFF0000; //红色
parameter GREEN = 24'h00FF00; //绿色
parameter BLUE = 24'h0000FF; //蓝色
//场同步信号的参数
parameter RED_CNT = 16'd90; //红色
parameter GREEN_CNT = 16'd180; //绿色
parameter BLUE_CNT = 16'd270; //蓝色
//行同步信号的参数
parameter H_RED_CNT = 16'd160; //红色
parameter H_GREEN_CNT = 16'd320; //绿色
parameter H_BLUE_CNT = 16'd479; //蓝色
//------------------------HSYNC的时间计数 begin
reg[15:0] h_cnt;
wire clk_9m;
reg [WORD_WIDTH-1:0] pixel_data;
Gowin_CLKDIV CLKDIV_9m (
.clkout(clk_9m), //output clkout
.hclkin(sysclk), //input hclkin
.resetn(1) //input resetn
);

always @ (posedge clk_9m or negedge rst_n) begin
if(!rst_n)
h_cnt <= 'd0;
else if(h_cnt >= H_SYNC+H_BACK_PORCH+H_ACTIVE+H_FRONT_PORCH-1)
h_cnt <= 'd0;
else
h_cnt <= h_cnt + 'd1;
end
//------------------------HSYNC的时间计数 end

//------------------------VSYNC的时间计数 begin
reg[15:0] v_cnt;

always @ (posedge clk_9m or negedge rst_n) begin
if(!rst_n)
v_cnt <= 'd0;
else if(h_cnt == H_SYNC+H_BACK_PORCH+H_ACTIVE+H_FRONT_PORCH-1) begin//H_SYNC-2)
if(v_cnt >= V_SYNC+V_BACK_PORCH+V_ACTIVE+V_FRONT_PORCH-1)
v_cnt <= 'd0;
else
v_cnt <= v_cnt + 'd1;
end
else
v_cnt <= v_cnt;
end
//------------------------VSYNC的时间计数 end

//------------------------生成VSYNC信号 begin
//vsync_r
reg vsync_r;
always @ (posedge clk_9m or negedge rst_n) begin
if(!rst_n)
vsync_r <= 'd1;
else if((v_cnt >= 'd0) && (v_cnt <= V_SYNC-1)) //Negative
vsync_r <= 'd0;
else
vsync_r <= 'd1;
end
//------------------------生成VSYNC信号 end

//------------------------生成HSYNC信号 begin
//hs
reg hsync_r;
always @ (posedge clk_9m or negedge rst_n) begin
if(!rst_n)
hsync_r <= 'd1;
else if((h_cnt >= 'd0) && (h_cnt <= H_SYNC-1)) //Negative
hsync_r <= 'd0;
else
hsync_r <= 'd1;
end
//------------------------生成HSYNC信号 end

//------------------------生成DE信号 begin
//de
reg de_r;
always @ (posedge clk_9m or negedge rst_n) begin
if(!rst_n) begin
de_r <= 0;
end
else if((h_cnt >= H_SYNC+H_BACK_PORCH) && (h_cnt <= H_SYNC+H_BACK_PORCH+H_ACTIVE-1)
&& (v_cnt >= V_SYNC+V_BACK_PORCH)&&(v_cnt <= V_SYNC+V_BACK_PORCH+V_ACTIVE-1)) begin
de_r <= 1;
end
else begin
de_r <= 'd0;
end
end
//------------------------生成DE信号 end

//------------------------把控制信号和FIFO读取的数据进行同步 begin
reg de_r1,de_r2,de_r3;

always @ (posedge clk_9m or negedge rst_n) begin
if(!rst_n) begin
de_r1 <= 0;
de_r2 <= 0;
de_r3 <= 0;
end
else begin
de_r1 <= de_r;
de_r2 <= de_r1;
de_r3 <= de_r2;
end
end
//------------------------把控制信号和FIFO读取的数据进行同步 end

//------------------------将同步后的RGB数据按照协议进行映射输出 begin
reg [WORD_WIDTH-1:0] lcd_rgb1_d;

always @ (posedge clk_9m or negedge rst_n) begin
if(!rst_n) begin
lcd_rgb1_d <= 0;
end
else if(!de_r1)
lcd_rgb1_d <= 0;
else if(de_r1) begin
lcd_rgb1_d <= pixel_data;
end
end

//显示彩条红绿蓝
always @(posedge clk_9m or negedge rst_n) begin
if(!rst_n)
pixel_data <= BLACK;
else begin
if((v_cnt >= 0) && (v_cnt < RED_CNT)&de_r)
pixel_data <= RED;
else if ((v_cnt >= RED_CNT) && (v_cnt < GREEN_CNT)&de_r)
pixel_data <= GREEN;
else
pixel_data <= BLUE;
end
end

assign lcd_A_rgb = lcd_rgb1_d;//16'hf0;//

assign lcd_A_vs = vsync_r;
assign lcd_A_hs = hsync_r;
assign lcd_A_de = de_r2;
assign lcd_A_clk = ~clk_9m;

endmodule

四实验中的问题:

注意1:今天出现了FPGA设计软件布局布线时提示引脚错误,说这几个引脚已经有专用引脚了。其实,是同一个引脚复用,即LCD_PIXCLK,PIXDATA[16], PIXDATA[23],DE,LV引脚提示和MSPI引脚冲突,最后通过钩选引脚复用解决,如下所示:

注意2:实验现象即开发板只亮了一半,开发板分辨率:480*272,马上想到是行或列的参数错误。

parameter       ROW_NUM     = 480

,parameter      COL_NUM       = 272(H_ACTIVE),即列对应行同步信号。列应该是480=COL_NUM ,行是对应着场同步信号,即行是272=ROW_NUM

五下板实验效果

 

FPGA驱动LCD显示红绿蓝彩条的更多相关文章

  1. 阶段小项目1:循环间隔1秒lcd显示红绿蓝

    #include<stdlib.h>#include<stdio.h>#include<string.h>#include<error.h>#inclu ...

  2. FPGA驱动VGA显示静态图片

    一 .前言 本文设计思想采用明德扬至简设计法.VGA是最常见的视频显示接口,时序也较为简单.本文从利用显示屏通过VGA方式显示测试图案及静态图片着手带大家接触图像显示应用,算是为后续VGA显示摄像头采 ...

  3. 基于FPGA驱动VGA显示图片的小问题

    学习VGA显示图片的过程中,遇到了一个小问题,我在显示屏上开了一个60x60的框,放了一张图片进去显示,但是最终的结果如下图所示. 出现了一个竖黑边,看了看代码,分析了一下逻辑没问题,然而看这个显示那 ...

  4. Hierarchical clustering:利用层次聚类算法来把100张图片自动分成红绿蓝三种色调—Jaosn niu

    #!/usr/bin/python # coding:utf-8 from PIL import Image, ImageDraw from HierarchicalClustering import ...

  5. [LeetCode] Similar RGB Color 相似的红绿蓝颜色

    In the following, every capital letter represents some hexadecimal digit from 0 to f. The red-green- ...

  6. [LeetCode] 800. Similar RGB Color 相似的红绿蓝颜色

    In the following, every capital letter represents some hexadecimal digit from 0 to f. The red-green- ...

  7. 痞子衡嵌入式:记录i.MXRT1060驱动LCD屏显示横向渐变色有亮点问题解决全过程(提问篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060上LCD横向渐变色显示出亮点问题的分析解决经验. 痞子衡前段时间在支持一个i.MXRT1060客户项目时遇到了LCD ...

  8. MSP430常见问题之LCD 显示驱动类

    Q1:晶体一般都是接32768,然后使用液晶很正常.我打算将晶体接6M的替换32768,那么液晶还能正常显示吗A1:看你所用的LCM 模块时序极限是多少HZ,然后看6M情况下,MSP430去驱动LCM ...

  9. linux驱动开发:用户空间操作LCD显示简单的图片【转】

    转自:http://blog.csdn.net/changliang7731/article/details/53074616 上一章我们简单介绍了LCD的一些基本原理.当然更深奥的还有,比如gamm ...

随机推荐

  1. opencv笔记--HOGDescriptor

    特征描述提取图像区域上有用信息而忽略无用信息,不同目标下有用信息与无用信息定义不同.这里提取的有用信息用于分类器输入并期望产生正确的分类. HOG(Histogram of Oriented Grad ...

  2. 5.Flink实时项目之业务数据准备

    1. 流程介绍 在上一篇文章中,我们已经把客户端的页面日志,启动日志,曝光日志分别发送到kafka对应的主题中.在本文中,我们将把业务数据也发送到对应的kafka主题中. 通过maxwell采集业务数 ...

  3. python 2048游戏控制器

    2048游戏控制器 1 evaluate 要用程序来处理就得对现实的问题进行量化,用数字来表示.在2048游戏中,我们的输入是一个棋局,让我们输出一个移动方向,这样我们需要对棋局进行量化,即我们要评估 ...

  4. LinuxCPU性能工具总结

    一.根据性能指标找工具 二.根据工具查性能指标

  5. CPU使用率过高怎么办

    实际上前文中关于CPU使用率过高如何通过各种工具获得相关的热点进程.那么进程有了,那得疑惑到底哪个哪段代码导致了这个进程成为热点呢? 如果在调试阶段,可以使用gdb中断运行,但是在生产环境肯定不行.L ...

  6. spring IOC的理解,原理与底层实现?

    从总体到局部 总 控制反转:理论思想,原来的对象是由使用者来进行控制,有了spring之后,可以把整个对象交给spring来帮我们进行管理                DI(依赖注入):把对应的属性 ...

  7. 公司正在开发BI系统?这些设计要素请了解一下!

    ​1. 数据源 第一个要素数据源.企业中的BI工具可能承接上游数据中台或者其他产品输出的结果,作为输入的数据源,每个业务方用的数据库都可能是不一样的,所以可接入数据源的种类决定的一个BI工具的可用性, ...

  8. 【C# 线程】编译器代码优化技术 循环提升:Loop Hoisting

    转载自:https://gandalfliang.github.io/2019/01/15/loop-hoisting/ Loop Hoisting 在上篇文章中,提到 Loop Hoisting , ...

  9. 【windows 操作系统】文件保护:文件访问类型和访问控制

    文件保护:文件访问类型和访问控制 为了防止文件共享可能会导致文件被破坏或未经核准的用户修改文件,文件系统必须控制用户对文件的存取,即解决对文件的读.写.执行的许可问题. 为此,必须在文件系统中建立相应 ...

  10. docker ——从docker容器的内部,连接本机的mysql

    所以我有一个Nginx运行在一个docker容器,我有一个mysql运行在localhost,我想连接到我的Nginx内的MySql. MySql在localhost上运行,并且不将端口暴露给外部世界 ...