2016-04-01 18 views
0

私はアルテラFPGAでXGA(1024x768)ビデオプロトコルを実装しています。正しい色と鮮明な垂直表示(つまり、n番目の垂直ピクセルごとに黒に設定すると、エイリアシングなしの鮮明な水平線になります)の画像が表示されます。しかし、水平表示(垂直線)は非常に歪曲しており、1ピクセル幅の線は3〜4ピクセル幅にわたって「塗りつぶされている」。さらに、表示信号の幅が広すぎる。高さと幅の均一なグリッドを作成しようとすると、セルの高さが幅よりも広くなります。Verilog VGA信号実装: "水平に伸ばした"

ロジックアナライザーですべてのタイミングをthese valuesに対してチェックしましたが、精度は100分の1です。

この問題の説明に基づいて、デバッグを探すためのアイデアはありますか?垂直がスポット・オンであることを考慮すると、水平同期とは何か関係があると思いますか? 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 

答えて

0

問題は、液晶モニターのネイティブのアスペクト比がストレッチを引き起こしていたことでした。内部クロックがそれを処理するには遅すぎる場合、ジョンの答えが原因である可能性がありますが、65MHzのPLL乗算器を備えた50MHzでは、これは問題ではありませんでした(オシロスコープによって明らかにされました)。

2

48ピクセルごとに黒いピクセルを送信してグリッドを作成しようとしているようです。あれは正しいですか?

あなたの言っていることに基づいて、vga_R/G/Bレジスタにセットアップ時の問題がある可能性があります。これはおそらく、単純な操作ではない%48を明示的に使用した場合です。

より簡単な解決法は、0〜47から数える別のカウンタを追加し、そのカウンタが47このカウンターは垂直と水平の両方に必要です

+0

考えてくれてありがとうございましたが、LCDモニターのネイティブ解像度になってしまいました。 – Answoquest

関連する問題