今日もFPGA。さあ、今日は適当に回路を作ってシミュレーションしてみよう。
DE0についてきたModel Sim-Alteraを使ってシミュレーションする。
まず、Model Simでソースファイルを書く。
module notclk(clk,a,q);
input clk,a;
reg r;
output q;
always @(posedge clk) begin
r <= !a;
end
assign q = r;
endmodule
順序回路を使うときはreg型を使うらしい。(
※8/31追記 reg q;というのを最初の方に入れとけばreg rを使わなくてもよいらしい)
入力端子clkにはクロックを入れ、クロックの立ち上がりでレジスタに入力端子aを反転したものを入れ、それを出力する、という回路になっている。
では、シミュレーション用のモジュールsimを定義する。
module notclk(clk,a,q);
input clk,a;
reg r;
output q;
always @(posedge clk) begin
r <= !a;
end
assign q = r;
endmodule
`timescale 1ps/1ps
module sim;//シミュレーション用のモジュール
reg a,clk;//入力はreg型
wire q;//出力はwire型
parameter STEP = 100000;//1STEP = 100ns C言語でいう#defineか。
notclk notclk0(.clk(clk),.a(a),.q(q));
initial begin
a = 0;
#STEP a = 1;//#STEP => #100000って書いてもok。
end
always begin//クロックの生成
clk = 0;
#(STEP/100);
clk = 1;
#(STEP/100);
end
endmodule
では、コンパイルしよう。
コンパイルできたらいよいよシミュレーション開始。
出てきたダイアログでシミュレーションしたいモジュールを選択します。
View→Waveで波形を見ていきます。Objectsウィンドウから見たい変数をドラッグアンドドロップします。
Runします。ここらへんを適当にいじろう。右から3番目を押してすぐに一番右を押せば大分時間が進みます。
波形が出てきた。
赤いのは出力が不定ということだと思う。-(マイナス)を押すとズームアウトします。+はズームイン。マイナスを適当に押してやるとそれっぽい波形が見えます。
入力が0から1に変化していて、その次のクロックの立ち上がりでちゃんと出力が反転していることが見えます。よかったよかった。