Verilog VGA 信号实现:"stretched horizontal"
Verilog VGA signal implementation: "stretched horizontal"
我正在使用 Altera FPGA 实现 XGA (1024x768) 视频协议。我显示的图像具有正确的颜色和清晰的垂直显示(即,将每第 n 个垂直像素设置为黑色会导致明显的水平线 w/o 混叠)。然而,水平显示(垂直线)非常倾斜,1 像素宽的线在 3 到 4 像素宽度上 "smeared"。此外,显示信号的宽度太宽。尝试创建均匀高度和宽度的网格会导致单元格宽度大于高度。
我已经通过逻辑分析仪对照 these values 检查了我所有的时序,它们非常准确,精度在百分之一以内。
根据这个问题描述,有什么关于去哪里寻找调试的想法吗?考虑到垂直是正确的,我认为它与我的水平同步有关? VGA信号生成代码:
module vga_sig_gen
(
clk,
reset_n,
vga_BLANK_N,
vga_SYNC_N,
vga_HS,
vga_VS,
vga_R,
vga_G,
vga_B
);
// XGA signals
input clk;
input reset_n;
output reg vga_BLANK_N;
output reg vga_SYNC_N;
output reg vga_HS;
output reg vga_VS;
output reg [7:0] vga_R;
output reg [7:0] vga_G;
output reg [7:0] vga_B;
// Frame/line position
reg [11:0] hor_pos;
reg [9:0] vert_pos;
always @ (posedge clk) begin
if(!reset_n) begin
{vga_R, vga_G, vga_B} <= 24'h000000;
hor_pos <= 12'd0;
vert_pos <= 10'd0;
end
else begin
// Update RGB values
{vga_R, vga_G, vga_B} <= (hor_pos % 48 == 0) || (vert_pos % 48 == 0) ? 24'd0 : 24'hB93E06;
// Update line/fram position
hor_pos <= (hor_pos == 12'd1343) ? 12'd0 : hor_pos + 12'd1;
if(hor_pos == 12'd1343) begin
if(vert_pos == 10'd805) begin
vert_pos <= 10'd0;
end
else begin
vert_pos <= vert_pos + 10'd1;
end
end
end
// Generate VGA signals
vga_BLANK_N <= ((hor_pos > 12'd319) && (vert_pos > 10'd37)) ? 1'b1 : 1'b0;
vga_HS <= ((hor_pos > 12'd23) && (hor_pos < 12'd160)) ? 1'b0 : 1'b1;
vga_VS <= ((vert_pos > 10'd2) && (vert_pos < 10'd9)) ? 1'b0 : 1'b1;
vga_SYNC_N <= 1'b0;
end
endmodule
您似乎正试图通过每 48 个像素发送一个黑色像素来制作网格。对吗?
根据您所说的,您的 vga_R/G/B 寄存器可能存在设置时间问题。这可能是因为如果您显式使用 %48,这不是一个简单的操作
一个更简单的解决方案可能是添加另一个从 0-47 计数的计数器,并在该计数器等于 47 时输出黑色像素。垂直和水平都需要此计数器
问题是我的 LCD 显示器的原始宽高比导致了拉伸。如果内部时钟太慢而无法处理,约翰的回答可能是原因,但是在 50 MHz 和 65 MHz PLL 倍频器下这不是问题(如示波器所示)。
我正在使用 Altera FPGA 实现 XGA (1024x768) 视频协议。我显示的图像具有正确的颜色和清晰的垂直显示(即,将每第 n 个垂直像素设置为黑色会导致明显的水平线 w/o 混叠)。然而,水平显示(垂直线)非常倾斜,1 像素宽的线在 3 到 4 像素宽度上 "smeared"。此外,显示信号的宽度太宽。尝试创建均匀高度和宽度的网格会导致单元格宽度大于高度。
我已经通过逻辑分析仪对照 these values 检查了我所有的时序,它们非常准确,精度在百分之一以内。
根据这个问题描述,有什么关于去哪里寻找调试的想法吗?考虑到垂直是正确的,我认为它与我的水平同步有关? VGA信号生成代码:
module vga_sig_gen
(
clk,
reset_n,
vga_BLANK_N,
vga_SYNC_N,
vga_HS,
vga_VS,
vga_R,
vga_G,
vga_B
);
// XGA signals
input clk;
input reset_n;
output reg vga_BLANK_N;
output reg vga_SYNC_N;
output reg vga_HS;
output reg vga_VS;
output reg [7:0] vga_R;
output reg [7:0] vga_G;
output reg [7:0] vga_B;
// Frame/line position
reg [11:0] hor_pos;
reg [9:0] vert_pos;
always @ (posedge clk) begin
if(!reset_n) begin
{vga_R, vga_G, vga_B} <= 24'h000000;
hor_pos <= 12'd0;
vert_pos <= 10'd0;
end
else begin
// Update RGB values
{vga_R, vga_G, vga_B} <= (hor_pos % 48 == 0) || (vert_pos % 48 == 0) ? 24'd0 : 24'hB93E06;
// Update line/fram position
hor_pos <= (hor_pos == 12'd1343) ? 12'd0 : hor_pos + 12'd1;
if(hor_pos == 12'd1343) begin
if(vert_pos == 10'd805) begin
vert_pos <= 10'd0;
end
else begin
vert_pos <= vert_pos + 10'd1;
end
end
end
// Generate VGA signals
vga_BLANK_N <= ((hor_pos > 12'd319) && (vert_pos > 10'd37)) ? 1'b1 : 1'b0;
vga_HS <= ((hor_pos > 12'd23) && (hor_pos < 12'd160)) ? 1'b0 : 1'b1;
vga_VS <= ((vert_pos > 10'd2) && (vert_pos < 10'd9)) ? 1'b0 : 1'b1;
vga_SYNC_N <= 1'b0;
end
endmodule
您似乎正试图通过每 48 个像素发送一个黑色像素来制作网格。对吗?
根据您所说的,您的 vga_R/G/B 寄存器可能存在设置时间问题。这可能是因为如果您显式使用 %48,这不是一个简单的操作
一个更简单的解决方案可能是添加另一个从 0-47 计数的计数器,并在该计数器等于 47 时输出黑色像素。垂直和水平都需要此计数器
问题是我的 LCD 显示器的原始宽高比导致了拉伸。如果内部时钟太慢而无法处理,约翰的回答可能是原因,但是在 50 MHz 和 65 MHz PLL 倍频器下这不是问题(如示波器所示)。