液晶显示原理以及FPGA驱动

注:文中代码来源于网络,只用于学习和理解。
液晶显示(LCD)是英文Liquid Crystal Display 的简写,一般与液晶显示器连接的接口为VGA和HDMI。
高清多媒体接口(High Definition Multimedia Interface,HDMI)是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。VGA(Video Graphics Array)是显卡上输出模拟信号的接口。
下面主要说明VGA接口的显示原理:
一般的16位高彩色VGA显示是用RGB565数据输出,其中红色占5位,绿色占6位,蓝色占5位。电路上通常用匹配电阻进行数字信号到模拟信号间转换。而24位的高彩色VGA显示红色、绿色、蓝色各占8位。
VGA显示器扫描方式从屏幕左上角一点开始,从左向右逐点扫描,每扫完一行后回到左边下面一行的起始位置,每行结束时用行同步信号进行行同步。当扫描完所有行时,形成一帧,用场同步信号进行场同步。并使扫描回到屏幕左上方开始位置。完成一行扫描的时间为水平扫描时间,其倒数为行频率;完成一整屏(帧)扫描的时间为垂直扫描时间,其倒数称为场频率。显示时的时钟频率:以[email protected](60HZ)为例,每场对于806个行周期,其中768为显示行,每行包括1344点时钟,其中1024点为有效显示区。由此可知,需要点的时钟频率为806134460约为65MHZ。
代码如下:
//扫描一行计数
always@(posedge clk or posedge rst)
begin
if(rst == 1’b1)
h_cnt <= 12’d0;
else if(h_cnt == H_TOTAL - 1)//horizontal counter maximum value
h_cnt <= 12’d0;
else
h_cnt <= h_cnt + 12’d1;
end

//显示点位
always@(posedge clk or posedge rst)
begin
if(rst == 1’b1)
active_x <= 12’d0;
else if(h_cnt >= H_FP + H_SYNC + H_BP - 1)//horizontal video active
active_x <= h_cnt - (H_FP + H_SYNC + H_BP - 1);
else
active_x <= active_x;
end

//场计数
always@(posedge clk or posedge rst)
begin
if(rst == 1’b1)
v_cnt <= 12’d0;
else if(h_cnt == H_FP - 1)//horizontal sync time
if(v_cnt == V_TOTAL - 1)//vertical counter maximum value
v_cnt <= 12’d0;
else
v_cnt <= v_cnt + 12’d1;
else
v_cnt <= v_cnt;
end

//产生行同步信号
always@(posedge clk or posedge rst)
begin
if(rst == 1’b1)
hs_reg <= 1’b0;
else if(h_cnt == H_FP - 1)//horizontal sync begin
hs_reg <= HS_POL;
else if(h_cnt == H_FP + H_SYNC - 1)//horizontal sync end
hs_reg <= ~hs_reg;
else
hs_reg <= hs_reg;
end

//行使能
always@(posedge clk or posedge rst)
begin
if(rst == 1’b1)
h_active <= 1’b0;
else if(h_cnt == H_FP + H_SYNC + H_BP - 1)//horizontal active begin
h_active <= 1’b1;
else if(h_cnt == H_TOTAL - 1)//horizontal active end
h_active <= 1’b0;
else
h_active <= h_active;
end

/场使能
always@(posedge clk or posedge rst)
begin
if(rst == 1’b1)
v_active <= 1’d0;
else if((v_cnt == V_FP + V_SYNC + V_BP - 1) && (h_cnt == H_FP - 1))//vertical active begin
v_active <= 1’b1;
else if((v_cnt == V_TOTAL - 1) && (h_cnt == H_FP - 1)) //vertical active end
v_active <= 1’b0;
else
v_active <= v_active;
end

//产生场同步信号
always@(posedge clk or posedge rst)
begin
if(rst == 1’b1)
vs_reg <= 1’d0;
else if((v_cnt == V_FP - 1) && (h_cnt == H_FP - 1))//vertical sync begin
vs_reg <= HS_POL;
else if((v_cnt == V_FP + V_SYNC - 1) && (h_cnt == H_FP - 1))//vertical sync end
vs_reg <= ~vs_reg;
else
vs_reg <= vs_reg;
end

猜你喜欢

转载自blog.csdn.net/csdnqiang/article/details/107504828