VGAモジュールのシミュレーション方法


VGAモジュールについては、正しくカウンタが動作しているかシミュレーション により確認しておかないと、なかなか思い通りには動作しません。

VGAモジュール用のテストベンチ vram_test を作成します。
プロセッサインタフェースについては、ADDR、DATAI、RWについては、 適当な値を入力しておき、メモリアクセスが発生しないようにMREQ=0としてお きます。
VRAMメモリの初期値が "0" であるとRGB出力から何も出ませんから、 適当なキャラクタコードで初期化しておきます。 前ページでコピーしておいたVRAM20.memファイルには、 あらかじめ文字コードが書き込んであるので、 そのままテストに利用できます。
Verilog-XLシミュレータを用いる場合は、
initial
begin
  $shm_open("waves.shm");
  $shm_probe("as");
end
を書いておくことで、下位階層すべての信号変化をシミュレータで観測できます。


--- vram_test.v ---
`timescale 1ns/1ns
module vram_test;

reg         CLK, DCLK, RST;
reg  [11:0] ADDR;
reg  [ 7:0] DATAI;
reg         MREQ,
            RW;
wire [ 7:0] DATAO;
wire        ACK;
wire [ 7:0] R, G, B;
wire        HS, VS, DE;

initial
begin
  $shm_open("waves.shm");
  $shm_probe("as");
end

integer i;

initial
begin
  CLK = 0;
  for( i=0 ; i<3200000 ; i=i+1 )
     CLK = #10 ~CLK;
  $finish;
end

initial
begin
  DCLK = 0;
  while( 1 )
     DCLK = #20 ~DCLK;
end

initial
begin
  RST = 0;
  RST = #5 1;
  RST = #30 0;
end

initial
begin
  ADDR = 12'h000;
  DATAI= 16'h0000;
  MREQ = 1'b0;
  RW   = 1'b0;
end

vram v1 (CLK, DCLK, RST, ADDR, DATAI, DATAO, MREQ, RW, ACK, R, G, B, HS, VS, DE);

endmodule


シミュレーションの結果は以下のように観測できました。

TimeAのカーソル位置が,1行目の2ラスタ目が開始されたところであり,
DCLKの25MHzで8回カウントしたときに、1文字分の表示終了タイミング CEP が 出力されるため、これによりパイプラインレジスタとなる CADR に表示するキャラクタコー ドである 0x4B が記憶されています。

次に 0x4B に対応するドットデータを読み出すために CGADR を作成し、 CGROM メモリ内のデータである 0x41 を次の CEP タイミングを用いて シフトレジスタ SR に保存します。

この様に、文字のデータは2文字分タイミングが遅れて出力されることになる ため,表示タイミング信号であるDEが2文字分遅れて出力されています.



時間が進むと、水平同期クロック HS が負論理で出力されてくるのが分かります。



さらに時間が進むと、垂直同期クロック VS が負論理で出力されてくるのが分かります。




| Back |