目录
1.LCD控制器设计
LCD ( Liquid Crystal Display 的简称)液晶显示器。LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。按照背光源的不同,LCD可以分为CCFL显示器和LED显示器两种。LCD已经替代CRT成为主流,价格也已经下降了很多,并已充分普及。
LCD控制器的主要作用是产生LCD显示所需的时序信号和数据信号,以便正确地驱动LCD面板显示图像。基于FPGA的LCD控制器通常包括以下几个部分:
时序控制模块:负责生成同步信号,如水平同步信号(HSync)、垂直同步信号(VSync)等。
时序控制模块的核心在于产生正确的同步信号和像素时钟信号。这些信号决定了LCD的分辨率和刷新率。例如,对于一个分辨率为640×480的LCD面板,其水平同步信号的周期应该满足一定的要求,以确保每一行的像素数正确无误。
数据驱动模块:根据输入的数据产生RGB信号或其他格式的数据信号。
数据驱动模块负责将输入的图像数据转换成适合LCD面板的信号格式。这通常涉及到数据格式转换、色彩空间转换等操作。
接口控制模块:处理外部输入信号,如SPI、I2C、并行接口等。
接口控制模块处理与外部设备之间的通信,例如从微处理器读取图像数据。常见的接口类型包括SPI、I2C、并行接口等。
以一个简单的并行接口为例,LCD控制器的接口时序通常包括以下信号:
DIN0-DIN7:数据线,用于传输图像数据。
CLK:时钟信号,用于同步数据传输。
RS:寄存器选择信号,用于区分指令和数据。
WR:写使能信号,用于指示写操作。
RD:读使能信号,用于指示读操作。
CS:芯片选择信号,用于选择特定的LCD控制器。
2.VGA控制器概述
VGA (Video Graphics Array) 即视频图形阵列,是IBM于1987年随PS/2机(PersonalSystem 2)一起推出的使用模拟信号的一种视频传输标准。这个标准对于现今的个人电脑市场已经十分过时。但在当时具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域取得了广泛的应用,是众多制造商所共同支持的一个低标准。
VGA(Video Graphics Array)是一种模拟视频信号标准,主要用于计算机显示器。基于FPGA的VGA控制器设计通常包括以下几个部分:
时序控制模块:负责生成VGA信号的标准时序。
VGA信号的时序控制模块需要生成标准的水平同步信号(HSync)和垂直同步信号(VSync),以及像素时钟信号。这些信号共同决定了屏幕的分辨率和刷新率。
数据驱动模块:产生RGB颜色信号和亮度信号。
数据驱动模块负责产生RGB信号,以驱动CRT或LCD显示器。RGB信号通常采用模拟信号的形式,但在基于FPGA的设计中,通常是先产生数字信号,再通过DAC转换成模拟信号。
同步信号发生器:产生HSync和VSync信号。
同步信号发生器产生HSync和VSync信号,用于同步显示器和视频源。这两个信号决定了每一行和每一帧何时开始和结束。
//以下两个小节转载来自:
基于FPGA 的VGA 图形控制器的实现方法-AET-电子技术应用
VGA 时序控制模块是整个显示控制器的关键部分,最终的输出信号行、场同步信号必须严格按照VGA 时序标准产生相应的脉冲信号。对于普通的VGA 显示器, 其引出线共含5 个信号: G,R ,B (3 基色信号) ,HS(行同步信号) ,VS(场同步信号) 。在5个信号时序驱动时,VGA 显示器要严格遵循“VGA工业标准”, 即640 Hz ×480 Hz ×60Hz 模式。
对于VGA 显示器,每个像素点的输出频率为25. 175MHz ,因此采用50MHz 的时钟信号,经过二分频模块,得到25MHz 的输入时钟脉冲。依据VGA 时序标准,行同步信号HS ,行周期为31. 78μs ,每显示行包括800 点,其中640 点为有效显示区,160 点为行消隐区,每行有一个脉冲,该脉冲的低电平宽度为3. 81μs (即96 个脉冲) ; 场同步信号VS ,场周期为16.683ms ,每场有525 行,其中480 行为有效显示行,45 行为场消隐区,每场有一个脉冲,该脉冲的低电平宽度为63μs (2 行)。
依据这个标准,把输入的25MHz 时钟脉冲按照对应的像素点数和扫描行数进行分频处理,可以得到最后符合时序要求的行频率和刷新频率。
3.基于FPGA的VGA控制驱动
以驱动一个640x480分辨率、60Hz刷新率的显示器为例子。
// 定义模块,指定输入输出端口
module vga_controller(
input wire clk_25MHz, // 25MHz时钟输入
input wire rst_n, // 异步复位信号
output reg hsync, // 水平同步信号
output reg vsync, // 垂直同步信号
output reg [9:0] x, // 当前像素的X坐标
output reg [9:0] y, // 当前像素的Y坐标
output reg [7:0] red, // 红色分量
output reg [7:0] green, // 绿色分量
output reg [7:0] blue // 蓝色分量
);
// 定义内部信号
localparam PIXEL_CLK_FREQ = 25; // 25MHz像素时钟频率
localparam H_RES = 640; // 水平分辨率
localparam V_RES = 480; // 垂直分辨率
localparam H_SYNC_PULSE = 96; // 水平同步脉冲宽度
localparam H_FRONT_PORCH = 16; // 水平前同步
localparam H_BACK_PORCH = 48; // 水平后同步
localparam V_SYNC_PULSE = 2; // 垂直同步脉冲宽度
localparam V_FRONT_PORCH = 3; // 垂直前同步
localparam V_BACK_PORCH = 31; // 垂直后同步
localparam H_TOTAL = H_RES + H_FRONT_PORCH + H_BACK_PORCH + H_SYNC_PULSE;
localparam V_TOTAL = V_RES + V_FRONT_PORCH + V_BACK_PORCH + V_SYNC_PULSE;
// 内部计数器
reg [10:0] h_count;
reg [10:0] v_count;
// 像素时钟
reg pixel_clk;
// 像素时钟分频器
always @(posedge clk_25MHz or negedge rst_n) begin
if (!rst_n)
pixel_clk <= 0;
else
pixel_clk <= ~pixel_clk;
end
// 水平计数器
always @(posedge pixel_clk or negedge rst_n) begin
if (!rst_n)
h_count <= 0;
else if (h_count == H_TOTAL - 1)
h_count <= 0;
else
h_count <= h_count + 1;
end
// 垂直计数器
always @(posedge pixel_clk or negedge rst_n) begin
if (!rst_n)
v_count <= 0;
else if (v_count == V_TOTAL - 1)
v_count <= 0;
else if (h_count == H_TOTAL - 1)
v_count <= v_count + 1;
end
// 水平同步信号
assign hsync = (h_count >= H_FRONT_PORCH && h_count < (H_FRONT_PORCH + H_SYNC_PULSE)) ? 0 : 1;
// 垂直同步信号
assign vsync = (v_count >= V_FRONT_PORCH && v_count < (V_FRONT_PORCH + V_SYNC_PULSE)) ? 0 : 1;
// X 和 Y 坐标
always @(posedge pixel_clk or negedge rst_n) begin
if (!rst_n) begin
x <= 0;
y <= 0;
end else if (h_count < H_RES) begin
x <= h_count;
y <= (h_count < H_RES) ? v_count : y;
end
end
// 颜色生成
always @(posedge pixel_clk or negedge rst_n) begin
if (!rst_n) begin
red <= 0;
green <= 0;
blue <= 0;
end else if (h_count < H_RES && v_count < V_RES) begin
// 这里我们简单地使用交替的红色和绿色来生成一个简单的图案
if ((x + y) % 16 < 8)
red <= 255;
else
red <= 0;
if ((x + y) % 16 < 8)
green <= 255;
else
green <= 0;
blue <= 0;
end
end
endmodule