FPGA驅動LCD顯示紅綠藍彩條

實驗目的:先簡單熟悉LCD燈的驅動和時序圖的代碼實現。設計功能是讓LCD顯示紅綠藍三種顏色,即三個綵帶。本次實驗比較容易實現,主要是對LCD驅動時序圖的理解和時序參數的配置。數組

實驗條件:1.LCD原理圖2020-12-17-HXH_ESP32_E1。佈局

         2.所用開發板用戶手冊:GW1NSR-LV4CQN48PC7I6_V1.1開發板用戶手冊設計

         3.LCD的數據手冊:SC7283(肯定LCD驅動設計的引腳和時序控制)3d

註釋:第一項和第二項結合是爲了,分配LCD和FPGA的引腳。通常用PDF軟件Adobe Acrobat DC進行查找引腳編號,再粘貼複製找到引腳的位置,在用一個EXCEL表格記下引腳名字,引腳的位置或編號,引腳的電壓類型(LVCMOS33或LVCMOS18等)blog

 

實驗原理:開發

         LCD的分辨率爲480RGB * 272  ,理解爲有480列和272行,分別對應行同步計數器h_cnt 和場同步計數器v_cnt ,LCD有三種模式,SYNC, SYNC-DE and DE mode,本次選用的是第二種,和VGA的驅動很類似,先是行同步信號HSYNC,而後是場同步信號VSYNC(行同步信號(一個像素點)能夠理解爲把一行的全部列掃描完則就是場同步信號,即場同步信號比行同步信號大。)再是有效區域DE。因爲對於行同步信號或者場同步信號的時許控制來說,都是由行同步信號或場同步信號週期,前沿,有效區域,後沿等四個部分參數組成input

時許圖以下:同步

下圖紅框的是LCD分辨率爲480RGB * 272時,對應時序圖中的配置參數。it

 

三  代碼設計:io

       本設計代碼分紅兩部分,一是頂層模塊,二是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

五下板實驗效果

相關文章
相關標籤/搜索