2016-04-01 13 views
0

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 

Antwort

0

Das Problem war, dass das native Seitenverhältnis meines LCD-Monitors die Dehnung verursachte. Johns Antwort könnte die Ursache sein, wenn die interne Uhr zu langsam ist, um damit umzugehen, aber bei 50 MHz mit einem 65 MHz PLL-Multiplikator war dies kein Problem (wie durch das Oszilloskop offenbart).

2

Es sieht aus wie Sie alle 48 Pixel ein schwarzes Pixel durch Aussenden eines Gitters zu machen versuchen. Ist das korrekt?

Je nachdem, was Sie sagen, haben Sie möglicherweise ein Setup-Zeitproblem in Ihren vga_R/G/B-Registern. Dies ist wahrscheinlich, weil Ihre explizite Verwendung von% 48, die keine einfache Operation

ist Eine einfachere Lösung kann ein weiterer Zähler, der von 0-47 zählt, und ein schwarzes Pixel ausgeben, wenn dieser Zähler gleich 47 ist Sie benötigen diesen Zähler sowohl für die vertikale als auch die horizontale

+0

Danke für die Idee, aber es endete damit, dass die native Auflösung des LCD-Monitors es tat. – Answoquest