本演習では, Verilog-HDLのRTL記述から, FPGA用の回路を論理合成するために, Altera社のQuartusIIを用いる. QuartusIIはFPGAベンダであるAltera社が開発しているツールである. Verilog-HDLのRTL(レジスタトランスファレベル)記述を入力とし,ターゲットとするFPGAの型番を入力し,ピン配置を指定すると,回路の合成からFPGAへの配置配線までを行うことができる.
過去の演習では, Synopsys社のFPGA Compiler IIや, Synplicity社のSynplify Pro等のFPGA向けの論理合成ツールを使用していたが, Quartus IIの論理合成機能の進化により, Quartus IIのみで十分となった.
ただし,大規模な回路の論理合成にはやはり,専用の論理合成ツールを使った方が性能が良くなることが多いのは事実である.
本演習専用のディレクトリ(フォルダ)を作成する.
% mkdir roulette % cd roulette
以下では,すべてroulette以下に,ファイルを作成またはコピーする.
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
% cd ~/roulette/ % quartus