FPGA开发 - LCD驱动

161 阅读1分钟

1. LCD时序图

lcd_sequence.png

2. fpga代码

module LCDTest(
	input clk,
	output lcd_clk,
	output lcd_de,
	output lcd_vs,
	output lcd_hs,
	output [15:0] lcd_data
);
`define	H_FRONT	11'd40
`define	H_SYNC 	11'd48 
`define	H_BACK 	11'd40 
`define	H_DISP	11'd800 
`define	H_TOTAL	11'd928	
 					
`define	V_FRONT	11'd13 
`define	V_SYNC 	11'd3   
`define	V_BACK 	11'd29 
`define	V_DISP 	11'd480   
`define	V_TOTAL	11'd525

reg [31:0] h_counter;
reg [31:0] v_counter;

reg [4:0] red;
reg [5:0] green;
reg [4:0] blue;

reg rgb_ready;

assign lcd_clk = clk;

always@(posedge clk)
begin
	
	if((h_counter >= `H_SYNC + `H_BACK && h_counter < `H_SYNC + `H_BACK + `H_DISP) && (v_counter >= `V_SYNC + `V_BACK && v_counter < `V_SYNC + `V_BACK + `V_DISP))
	begin
		red = 5'b11111;
		green = 6'b000000;
		blue = 5'b00000;
		rgb_ready = 1'b1;
	end
	else
	begin
		red = 5'b11111;
		green = 6'b111111;
		blue = 5'b11111;
		rgb_ready = 1'b0;
	end
	
end

always@(posedge clk)
begin
	if(h_counter < `H_TOTAL - 1)
		h_counter = h_counter + 1;
	else
	begin
		
		if(h_counter == `H_TOTAL - 1)
		begin
			if(v_counter < `V_TOTAL - 1)
				v_counter = v_counter + 1;
			else
				v_counter = 0;
		end
		h_counter = 0;
	end
end

assign lcd_hs = (h_counter < `H_SYNC) ? 1'b0 : 1'b1;
assign lcd_vs = (v_counter < `V_SYNC) ? 1'b0 : 1'b1;

assign lcd_data = rgb_ready ? {red, green, blue} : 16'h0000;
assign lcd_de =   rgb_ready ? 1'b1 : 1'b0;
endmodule