本演習では, Verilog-HDLのRTL記述から, FPGA用の回路を論理合成するために, Synopsys社のFPGA Compiler II(以下FCIIと略す)を用いる. FCIIはVerilog-HDLのRTL(レジスタトランスファレベル)記述を入力とし,ターゲットとするFPGAのベンダ名,型番を入力するだけで,面倒な設定なしにFPGA用の回路の合成を行うことができる.
FCIIは, circuitというモジュール名に対して, circuit.edfというEDIFフォーマットのネットリストファイルと,使用するFPGAの名前等を記述したcircuit.acfという2個のファイルを出力する.
FPGAの配置配線に使用するのは,今回使用するFPGAのベンダであるALTERA社のMAX+PLUSII(以下, MPII)である. MPIIは, FCIIから出力された.edfファイルとと.acfをもとに, FPGAの配置配線を行う.出力は,配置配線結果を格納した. acfファイルとFPGA内部のコンフィグレーションSRAMデータを格納したファイルである. FPGAのコンフィギュレーションデータは各種のフォーマットがあるが,標準ではsof, ttf, pofといったファイルが出力される. MPIIは,シリアルもしくはパラレルインタフェースを通じてこのSRAMオブジェクトファイルをデバイスにダウンロードする機能も有する. acfファイルはSynplifyから出力されるが, MPIIで一度FPGAの配置配線を実行すれば上書きされる.
verilogコマンドによりVerilog-XLシミュレータを実行する.
% verilog roulettesim.v roulette.v
下のような実行結果が画面に表示されるであろう.
0: xxxxxx 10: 000001 30: 000010 40990: 000100 81950: 001000 122910: 010000 163870: 100000
ここで用いるVerilog記述は, 7セグメントLEDをルーレット状に光らせる回路である.シミュレーション結果ではルーレットで点灯するLEDに1が表示される.
module roulette(out,CLK,RST); input CLK,RST; output [5:0] out; reg [5:0] out; reg [10:0] divide; // 11ビット分のカウンタで, 2の11乗(2048回)数える. always @(posedge CLK or negedge RST) begin if(!RST) begin out<=1;divide<=0; end else begin if(divide==0)// 2048回数えたら, ルーレットを一つ進める. begin out[0]<=out[5]; out[1]<=out[0]; out[2]<=out[1]; out[3]<=out[2]; out[4]<=out[3]; out[5]<=out[4]; end divide<=divide+1; // クロック毎に1カウントアップ. end end endmodule
`timescale 1ns/100ps // シミュレーションの単位を1nsにして, 100psの精度で出力を表示します. module roulettesim; reg CLK,RST; wire [5:0] out; `ifdef MAX roulette I0(.out5(out[5]),.out4(out[4]),.out3(out[3]),.out2(out[2]), .out1(out[1]),.out0(out[0]),.CLK(CLK),.RST(RST)); // この書式については, 後程説明する. `else roulette I0(.out(out),.CLK(CLK),.RST(RST)); `endif initial begin CLK=0;RST=1; #10 RST=0; #10 RST=1;// 10nsリセットを入れる. #200000 $finish;// その後, 200usec動作させる. end always #10 // クロックは, 20ns毎にいれます. CLK=~CLK; initial $monitor("%d: ",$time,"%b",out); initial begin $dumpfile("roulette.vcd"); //出力ファイルの指定. $dumpvars;// すべての信号を保存する. end `ifdef SDF initial $sdf_annotate("roulette/roulette.sdo",I0,,"sdf.log", "TOOL_CONTROL", "1.000000:1.000000:1.000000","FROM_MTM" ); // SDFの読み込み `endif endmodule
% fc2
module名のところ(図の一番下のrouletteの部分)でマウスを右クリックし, Create Implementationを選択する. (図[初期合成(Create Implementation)])
deviceは表[デバイスの指定]のように指定する.
Vendor | Altera | Device | EPF10K40RC208 |
Family | FLEX10K | Speed Grade | -4 |
ピン名 | Pad Loc |
---|---|
out5 | 206 |
out4 | 205 |
out3 | 204 |
out2 | 203 |
out1 | 202 |
out0 | 200 |
CLK | 183 |
RST | 180 |
次に,上記のピン配置にしたがって,再度論理合成を行う.以下のどちらかを実行する.
うまく行くと, roulette-Optimizedのチップアイコンの?マークが消えるはずである.必ず消えていることを確認すること. (図[最適化結果の確認])
% rlogin マシン名
% setenv DISPLAY 自分のマシン名:0
% max2win
File→Project→Nameで,先ほど作成したデザインの名前のディレクトリ(フォルダ)の``デザイン名.edf''というファイルを指定する. (図[デザインの指定])
ここでは, roulette/roulette.edfを選択する.
今回演習に使用するMAX+PLUSII 10.1は,バグがあるためか,下記の処理を実行しないと正しく配置配線できない.この処理は各設計(project)毎に行うこと.ただし各設計毎に一度実行しておけば良い.
ProcessingメニューからFitter Settingを選んで実行する. (図[Fitter Setting])
ここで,もっとも上の``Use Quartus Fitter for FLEX 10K and ACEX 1K Devices''のチェックをはずす.
Startボタンを押して,配置配線を行う.
Warningが一つでるが,これは,ピンの配置をあらかじめ指定しているためである.
ボードのリセットスイッチを押すと, LEDの点灯部分が廻り出す.またリセットスイッチを押してルーレットが止ることを確かめよ.