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 |