それではトップモジュールを追加…の前にやっておくことがあります。
せっかく作ったテストベンチですが、これはシミュレーション用のモノなので、FPGAを作成するには不要です。なので、テストベンチのプロパティを変更しておきます。
clk1000hz_test.vを右クリックしてPropertiesを開くと、どの段階でインクルードするかの指定ができます。
そこでSimulationのみを指定してやると、シミュレーションの時には使用され、Synthesis、つまり実際の論理合成では使用しないという設定ができます。
トップモジュールの追加
さてそれではトップモジュールの追加です。英語では"a top level module"というようですが。Diamondの左側のFile ListタブでInput Filesを右クリック、Add → New File...します。Verilogを選択してファイル名を入力します。ここではtwincle_ledとでもしましょう。
ファイルが追加されたら、Verilogを記述します。
// vim: set fenc=utf-8 filetype=verilog expandtab ts=4 sts=0 sw=4:
//
// twincle LED.
//
module Twincle(clk, reset, LED1);
input clk;
input reset;
output LED1;
wire out;
reg [15:0] count; // clk1mを数えるためのカウンタ
reg _out;
assign LED1 = _out;
CLK1000HZ clk(
.clk(clk),
.reset(reset),
.clk1m(out));
always @ (posedge out or negedge reset) begin
if (reset == 0)
begin
_out = 0;
count <= 0;
end else
if (count < 100 - 1)
begin
count <= count + 1;
end
else begin
count <= 0;
_out <= ~_out;
end
end
endmodule
LED1はボード上のLED1を制御するための出力です。それから1msecクロックを伝えるためのwire clk、1msecを数えるためのカウンタ、そしてLED1に直結するregの_outを定義します。 次に1msecクロックをインスタンス化し、最後にalwaysでリセット時の初期化とカウントループを作ってやります。 ここまでやったら一度コンパイルします。ここでコンパイルに通らないと、後のステップが通りません。
ピンを割り当てる
さて、無事コンパイルに通ったら、次は物理的なピンアサインです。
Brevia2ボードのピンアサインはBrevia2のユーザガイドに載ってますが、ここではSpreadsheet Viewから設定してみます。
ツールバーの左端、星形と鉛筆のアイコンをクリックするとSpreadsheet Viewが開きます。
親切なことに、この段階ですでにトップモジュールの入出力が表示されています。
Brevia2ボードはすでにできあがっているボードですから、ピンアサインはすでに決まっています。今回使用するピンは以下の通りです。
- clk : 21ピン
- reset : 19ピン
- LED1 : 46ピン
ここで先ほどのコンパイルが通っていないと、Spreadsheet Viewは編集できません。
入力が終われば次のようになります。
ちなみにピンアサインはlpfファイルを直接編集することでも指定できます。
プログラムしてRun!
それではいよいよ仕上げです。
左側のProcessペインで、一番下のJEDECファイルにチェックを入れます。その状態でRunボタンを押すと…
裏でごにょごにょやったあとで、ファイルが生成されます。ここで生成されたJEDECファイルをFPGAにプログラムすることで、ハードウェアを動かすことができるようになるのです。
さてそれではボードをminiUSBケーブルでPCに繋いで、いよいよプログラムボタンを押します。ちなみにProgrammerのボタンはツールバーの真ん中よりやや左にある、ICに下矢印のアイコンです。
このボタンを押すと、Programmerのケーブルを指定するダイアログが出ます。
OKを押すと、初回に限り次のようなダイアログが出ることがあります。
ここでは「アクセスを許可する」を押して先に進むとなにかを裏で始めてるようですが、少しすると戻ってきます。
そこであらためてProgrammerタブのプログラムボタンを押します。
Programmerの矢印がオレンジだったのに対して、プログラムボタンは緑です。
こんな感じのプログレスバーが出て、しばらくすると書き込み終了です。
すると自動的にLEDが点滅を始めます。
プログラムでは、100msec点灯したら100msec消灯、つまり1周期が200msecなので、1秒間に5回の点滅をしているはずです。
もしそうなっていなかったら…LEDが点きっぱなしに見えたら…。
clk1000hz.vのparameter CNTの値が10に変更したままになっていませんか。そうすると実際に点滅しているのに、あまりにも周期が速すぎて人間には点滅に見えません。
ということで、ながながと書いてきましたが、これでようやく第一歩が踏み出せた気がします。
Lチカ、終了~。
0 件のコメント:
コメントを投稿