Ich implementiere das XGA (1024x768) Video Protokoll mit einem Altera FPGA. Ich habe Bilder mit korrekter Farbe und gestochen scharfer vertikaler Anzeige (d. H. Das Setzen jedes n-ten vertikalen Pixels auf schwarz ergibt eine scharfe horizontale Linie ohne Aliasing). Die horizontale Anzeige (vertikale Linien) ist jedoch sehr schief, wobei die 1 Pixel breiten Linien über eine Breite von 3 bis 4 Pixel "verschmiert" sind. Außerdem ist die Breite des Anzeigesignals zu groß. Der Versuch, ein Raster mit gleicher Höhe und Breite zu erstellen, führt dazu, dass die Zellen breiter als hoch sind.Verilog VGA Signal Implementierung: "gestreckt horizontal"
Ich habe alle meine Timings über Logikanalysator gegen these values überprüft, und sie sind extrem genau, innerhalb von Hundertsteln Präzision.
Basierend auf dieser Problembeschreibung, irgendwelche Ideen, wo für das Debuggen suchen? Wenn man bedenkt, dass die Vertikale genau richtig ist, denke ich, dass es etwas mit meiner horizontalen Synchronisation zu tun hat? VGA-Signalerzeugungscode:
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
Danke für die Idee, aber es endete damit, dass die native Auflösung des LCD-Monitors es tat. – Answoquest