目 次
第1 章 はじめに 1 1.1 演習の進め方 . . . . 1 1.2 演習問題, 回答等の配布 . . . . 1 第2 章 例題による演習 2 2.1 FPGA の合成から配置配線までの流れ . . . . 2 2.2 Verilog-HDL シミュレーション . . . . 2 2.3 QuartusII による論理合成と FPGA の配置配線 . . . . 4 2.4 ボードへのダウンロード . . . . 8 第3 章 電卓設計演習 11 3.1 5.3 節 2 桁の BCD を入力して内部で 2 進数で保存する回路の設計 . . . . 11 3.1.1 シミュレーションの方法 . . . . 14 3.1.2 Quartus を用いた binshifttop の論理合成と配置配線 . . . . 14 3.2 5.4 節 演算回路 . . . . 15 3.2.1 シミュレーション . . . . 16 3.2.2 Quartus による合成と配置配線 . . . . 18 3.3 5.6 節 電卓の設計 . . . . 18 3.3.1 シミュレーション . . . . 21 3.3.2 Quartus による合成と配置配線 . . . . 21 第4 章 FPGA ボードの仕様 23 4.1 ボードの構成 . . . . 23 4.2 ボードピン接続表 . . . . 23 4.3 7 セグメント LED . . . . 23 4.4 クロック周波数 . . . . 23 4.5 プッシュスイッチ . . . . 23 4.6 注意点 . . . . 23 第5 章 シミュレーションを会社や学校で行うためには 28 5.1 はじめに . . . . 28 5.2 シミュレータ . . . . 28 5.3 Cver on Cygwin . . . . 28 5.3.1 Cygwin のインストール . . . . 28 5.3.2 GPL Cver のインストール . . . . 29 5.3.3 GTK のインストール . . . . 29 5.3.4 PLI ライブラリのインストール . . . . 305.4 Verilog-XL on Solaris . . . . 30 5.4.1 GTK+他のインストール . . . . 30 5.4.2 ライブラリのインストール . . . . 31 5.4.3 実行シェルスクリプト . . . . 31 5.5 Verilog-XL on Linux . . . . 31 5.5.1 ライブラリのインストール . . . . 31 5.5.2 実行シェルスクリプト . . . . 31 5.6 PLI ファイルのソース . . . . 31 第6 章 その他 32 6.1 FPGA ボード . . . . 32 6.2 その他の演習 . . . . 32
第
1
章 はじめに
本演習では, Verilog-HDL の文法の解説に引き続き, Verilog-HDL をつかった同期回路のハードウ エア設計手法を演習により学ぶ. Verilog-HDL から, 回路を実際に合成して, その回路を FPGA にダ ウンロードし, 実際にその動作を確かめることで, 記述した HDL が, 実際にどのように動作するか を自分の目と手を使って確認することができる.1.1
演習の進め方
本演習は, 次のような手順で進めていく 1. 簡単な記述済の回路を用いて (a) シミュレーション (b) 論理合成 (c) FPGA への配置配線 (d) ダウンロード までの一連の流れを実際に行う. 2. 簡単な 10 進入力回路からはじめて, 最終的には, 加減算電卓を Verilog-HDL により作成し, FPGA にダウンロード, 実際に動作させる.1.2
演習問題
,
回答等の配布
この他の, 講義資料, ならびに演習資料は, html により配布する. % netscape file:///home/users22/ref07/ref07294/sdoc/index.html (netref でも OK) # 最初は/が 3 ついるので注意 をターミナルのコマンドラインから実行します.文字化けが起る場合は, メニューより, View → Encoding → Japanese (Auto-Detect) を実行して下 さい.
第
2
章 例題による演習
2.1 FPGA
の合成から配置配線までの流れ
本演習では, 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 のみで 十分となった. ただし, 大規模な回路の論理合成にはやはり, 専用の論理合成ツールを使った方が性能が良くなる ことが多いのは事実である.
2.2 Verilog-HDL
シミュレーション
1. 本演習専用のディレクトリ (フォルダ) を作成する. 以下では, すべて roulette 以下に, ファイル を作成またはコピーする. % mkdir roulette % cd roulette 2. シミュレーションと合成に用いる Verilog 記述を用意する. 下記のファイルをダウンロード する. • verilog/roulette.v • verilog/roulettesim.v 3. verilog コマンドにより Verilog-XL シミュレータを実行する. % verilog roulettesim.v roulette.v0: xxxxxx 10: 000001 30: 000010 40990: 000100 81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメント LED をルーレット状に光らせる回路である. シミュ レーション結果ではルーレットで点灯するLED に 1 が表示される. リスト1: roulette.v 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 リスト2: テストフィクスチャ roulettesim.v `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
2.3 QuartusII
による論理合成と
FPGA
の配置配線
1. roulette.tclverilog/roulette.tcl をダウンロードして, roulette/以下に置く. 2. Quartus II を立ち上げる (図 2.3). % cd /roulette/ % quartus 3. 初回立ち上げ時には, 図 2.1 のウィンドウが表示されるので, そのまま, OK を押す. 4. 次に, 図 2.2 のウィンドウが表示されるので, Yesを選択する. 間違って, No を選択してしまっ た場合は, File → New Project Wizard を実行する.図2.2: New Project
図2.3: Quartus 起動後の画面
表2.1: New Project Wizard: page 1 of 5 に入力する値
フィールド名 入力値
What is the working directory.. そのまま(ホームディレクトリ名/roulette) What is the name of the project roulette
図2.4: Project Wizard 1
ホームディレクトリ名/roulette roulette
図2.6: Project Wizard 3
図2.7: Select Family
5. Project Wizard ウィンドウ (図 2.4) が表示されるので, Next ボタンを押す. 6. 図 2.5 の通り, 上から順番に表 2.1 のように入力する.
7. 図 2.6 の通り, roulette.v を File Name として指定して, Finish ボタンを押す. 間違って途中で, Finish を押してしまった場合は, Project → Add/Remove Files in Project を実行して roulette.v を指定する.
8. Select Family のウィンドウが表示された場合は, Cyclone を選択する. (表示されない場合はそ のままで良い)
9. Tools->Tcl Scripts を実行し, Project 内にある roulette.tcl を選択して, Run ボタンを押す. これ により, FPGA デバイスの設定とボードに対応したピンのアサインが行なわれる. Tcl Scripts を実行しても何も起こらない場合は, 下記の事項を確認する.
図2.8: Select Family
このボタン(Start Compilation)を押す
図2.9: Start Compilation
(a) roulette.tcl が roulette 以下のディレクトリにあるかを再度確認する. (b) 存在しない場合は, roulette.tcl を所定に場所に置く.
(c) Tools → Option の Internet Connectivity を開き, Check the ALtera web site for new Quartus II Information のチェックをはずし, quartus を再起動する.
(d) Quartus を終了する
(e) 再度 Quartus を立ち上げて, File->Open Project で, roulette を開き, 再度 Tools->Tcl Scripts を実行する 10. 紫の矢印 (Start Compilation) を押す.
2.4
ボードへのダウンロード
1. ワークステーションのシリアルポートおよびボードにケーブルを接続して, 電源を入れる. ケー ブルの向きは図4.2 を参照する. 2. Tools → Programmer を実行する.図2.10: Add Hardware
図2.11: Hardware Setup
3. この手順は最初の書込の時だけ実行する. Hardware Setup ボタンをクリックする. Add Hardware ボタンをクリックして, 図 2.10 の通り, Master Blaster, /dev/term/a, 115200 に設定して, OK ボ タンをクリックする.
図2.11 の通り, Currently selected hardware が, MasterBlaster /dev/term/a になっていれば OK で ある. Close ボタンを押す.
4. Program/Congure のところにチェックを入れる (図 2.12). 5. Start ボタンを押すと, FPGA への書込が始まる.
6. 書込が終了すると, 7 セグメント LED の一つが回り始める. クロック周波数を変えるつまみを 回して, 回転する速度が変化することを確認せよ.
ここにチェックを入れる
第
3
章 電卓設計演習
3.1 5.3
節
2
桁の
BCD
を入力して内部で
2
進数で保存する回路の設計
演習の前に, 本演習のファイルを格納するディレクトリを作成する. % cd % mkdir binshifttop 本演習で使用するファイルはすべて, binshifttop 内に作成または, コピーする. 演習5.1 binshiftreg の module,endmodule,入出力ピン定義部分を記述せよ。 解答例 verilog/binshiftreg1.v module binshiftreg(out,decimal,CLK,RST,CE); output [6:0] out; input [9:0] decimal; input CLK,RST,CE; // ↑ input, outputの定義はビット幅毎に endmodule 演習5.2 10 ビットの 10 キーからの入力を,4 ビットの 2 進数に変換する組合わせ回路を assign と, function 文により binshiftreg 内に記述せよ。ただし,function 文 dectobin を d に入力するも のとする。 解答例 verilog/binshiftreg2.v module binshiftreg(out,decimal,CLK,RST,CE); output [6:0] out; input [9:0] decimal; input CLK,RST,CE; wire [3:0] d; //← ビット幅が1以上の信号はwireで定義しておく.assign d=dectobin(decimal); //← function dectobinの出力をdに入力
function [3:0] dectobin; //← [3:0]は出力のビット幅を定義
input [9:0] in; //← function文の引数を定義
if(in[9]) //← functionの中には自由にif, caseが書ける
dectobin = 9; else if(in[8])
dectobin = 8; else if(in[7])
//中略 else if(in[0]) dectobin = 0; //↑最後のelseがなくても組み合わせ回路になる endfunction endmodule
演習5.3 10 キーが押された回数を数える count と,入力値を格納する REGA を,always ブロック でbinshiftreg 内に実現せよ。 演習5.4 出力ポート out に対応する assign 文を記述せよ. 解答例 verilog/binshiftreg.v module binshiftreg(out,decimal,CLK,RST,CE); output [6:0] out; input [9:0] decimal; input CLK,RST,CE; wire [3:0] d; reg [1:0] count; reg [6:0] REGA; assign d=dectobin(decimal); function [3:0] dectobin; input [9:0] in; if(in[9]) dectobin = 9; else if(in[8]) dectobin = 8; else if(in[7]) dectobin = 7; else if(in[6]) dectobin = 6; else if(in[5]) dectobin = 5; else if(in[4]) dectobin = 4; else if(in[3]) dectobin = 3; else if(in[2]) dectobin = 2; else if(in[1]) dectobin = 1; else if(in[0]) dectobin = 0; endfunction
always @(posedge CLK or negedge RST) begin if(!RST) begin REGA<=0; count<=0; end
else if((decimal != 0) && (count < 2)) begin
count<=count+1; end else if(CE) begin REGA<=0; count<=0; end end assign out=REGA; endmodule 演習5.6 binshifttop を設計せよ。 • binshifttop ひな型 verilog/skel/binshifttop.v
module binshifttop (push,ledl,ledh,CLK,CE,RST); input [9:0] push;
input CLK,RST,CE;
output [6:0] ledl, ledh; endmodule
• binshifttop 答え verilog/binshifttop.v
module binshifttop (push,ledl,ledh,CLK,CE,RST); input [9:0] push;// 10キー.
input CLK,RST,CE;
output [6:0] ledl, ledh; //rectbegin wire [6:0] out; wire [9:0] pushout; //←内部バスの信号定義 wire CEout; //rectend //rectend syncro #(1) I3(.in(CE), .out(CEout),.CLK(CLK),.RST(RST)); //rectbegin syncro #(10) I2(.in(push),.out(pushout), .CLK(CLK),.RST(RST)); // #(10)については, \ref{sec:asyncro}節を参照せよ. binled I1(.in(out),.ledl(ledl),.ledh(ledh)); //rectbegin binshiftreg I0(.decimal(pushout),.CLK(CLK), .RST(RST),.CE(CEout),.out(out));
// ↑binshiftregのdecimal入力に, syncroのout出力を
// pushoutを介して接続している.
//rectend endmodule
図3.1: GUI を用いた電卓
3.1.1 シミュレーションの方法
下記のシミュレーションに必要なファイルをbinshifttop 以下にダウンロードする. verilog/binshiftsimgtk.v GTK 版テストフィクスチャ. シミュレーションに必要 verilog/other.v その他必要なモジュールを含んだファイル. 電卓設計演習では, デバッグを用意にするために, X Window 上に構築された仮想的な電卓の GUI を用いてシミュレーションを行う. シミュレーションを行うには, この GUI は, verilog シミュレー タの持つPLI(Programming Language Interface) という C 言語との接続インタフェースにより記述さ れている. GUI はダイナミックライブラリとして構築されており, verilog 実行時に動的にライブラ リが読み込まれシミュレーションが行われる. gtksim.sh というコマンドの引数にすべての Verilog ファイルを与えることでシミュレーションが行われる. binshifttop のシミュレーションを行うには, 下記の通りにUNIX のコマンドプロンプトに入力する.% gtksim.sh binshiftsimgtk.v binshifttop.v binshiftreg.v other.v これにより, 電卓を模した GUI(図 3.1) が立ち上がる. Q により, シミュレーションが終了する以外は, それぞれのボタンが, 回路の入力ピンに対応して いる. ただし, binshifttop で有効なのは 10 キーと CE と RST のみである. 7 セグメント LED 上部の 小さなLED は, 最後の電卓用の overow を表示する.
3.1.2 Quartus を用いた binshifttop の論理合成と配置配線
1. binshifttop.tclverilog/binshifttop.tcl をダウンロードして, binshifttop/以下に置く. 2. Quartus II を立ち上げる. (図 2.3) 最初に, 図 2.2 のウィンドウが表示されるので, Yesを選択 する. 間違って, No を選択してしまった場合は, File → New Project Wizard を実行する.図3.2: Select Family
% cd /binshifttop % quartus
3. Project Wizard ウィンドウ (図 2.4) が表示されるので, Next ボタンを押す. Project Wizard が表 示されない場合は, File メニューから Project Wizard を実行する.
4. 表 3.1 の通り入力して, Next を押す.
表3.1: New Project Wizard: page 1 of 5 に入力する値
フィールド名 入力値
What is the working directory.. そのまま(ホームディレクトリ名/binshifttop) What is the name of the project binshifttop
What is the name of the top-level design entity... binshifttop
5. binshifttop.v, binshiftreg.v, other.v を File Name として指定して, Finish ボタンを押す. 間違って 途中で, Finish を押してしまった場合は, Project → Add/Remove Files in Project を実行して, 必 要なファイルを指定する.
6. Select Family のウィンドウが表示されたら, Cyclone を選択する.
7. Tools->Tcl Scripts を実行し, Project 内にある binshifttop.tcl を選択して, Run ボタンを押す. こ れにより, FPGA デバイスの設定とボードに対応したピンのアサインが行なわれる. 8. 紫の矢印 (Start Compilation) を押す.
3.2 5.4
節 演算回路
演習を始める前に, 専用のディレクトリを作成し, 以後のファイルはこの中に作成する. % cd / % mkdir enzantop3.2.1 シミュレーション
• 下記のファイルを先ほど作成した enzantop 内に保存する.
verilog/enzansimgtk.v GTK 版テストフィクスチャ. シミュレーションに必要 verilog/other.v その他必要なモジュールを含んだファイル.
• シミュレーションは下記の通り行なう.
% gtksim.sh enzansimgtk.v enzantop.v enzan.v other.v
演習5.7 enzan を Verilog-HDL により記述せよ verilog/enzan part1.v module のみ
verilog/enzan part2.v +キーに対する動作の追加 verilog/enzan part3.v =キーに対する動作の追加 verilog/enzan part4.v 出力 out の論理
verilog/enzan.v enzan.v の答え module enzan(decimal,plus,equal,CLK,RST,CE,out); input [9:0] decimal; input CLK,CE,RST,plus,equal; output [6:0] out; wire [3:0] d; reg [6:0] REGA,REGB; reg [1:0] count; reg equal_reg; function [3:0] dectobin; input [9:0] in; if(in[9]) dectobin = 9; else if(in[8]) dectobin = 8; else if(in[7]) dectobin = 7; else if(in[6]) dectobin = 6; else if(in[5]) dectobin = 5; else if(in[4]) dectobin = 4; else if(in[3]) dectobin = 3; else if(in[2]) dectobin = 2; else if(in[1]) dectobin = 1; else if(in[0]) dectobin = 0; endfunction
assign d=dectobin(decimal);
always @(posedge CLK or negedge RST) begin
if(!RST) begin
REGA<=0;REGB<=0;count<=0;equal_reg<=0; end
else if((decimal!=0) && (count < 2)) begin REGA<=REGA*10+d; count <= count + 1; end else if(plus) begin count<=0; REGA<=0; REGB<=REGA; end else if(equal) begin count<=0; REGB<=REGA+REGB; equal_reg<=1; end else if(CE) begin count<=0; REGA<=0; equal_reg<=0; end end assign out=(equal_reg==0)?REGA:REGB; endmodule 演習5.8 enzantop の設計 verilog/skel/enzantop.v module のみ verilog/enzantop.v enzantop 答え
module enzantop (push,plus,equal,ledl,ledh,CLK,CE,RST); input [9:0] push; input CLK,CE,RST,plus,equal; output [6:0] ledl,ledh; wire [6:0] out; wire [9:0] pushout; wire CEout,equalout,plusout;
enzan IO(.decimal(pushout), .plus(plusout),
.equal(equalout), .CLK(CLK), .CE(CEout), .RST(RST), .out(out)); binled I1(.in(out),.ledl(ledl),.ledh(ledh)); syncro #(10) I2(.in(push),.out(pushout),.CLK(CLK),.RST(RST)); syncro #(1) I3(.in(plus),.out(plusout),.CLK(CLK),.RST(RST)); syncro #(1) I4(.in(equal),.out(equalout),.CLK(CLK),.RST(RST)); syncro #(1) I5(.in(CE),.out(CEout),.CLK(CLK),.RST(RST)); endmodule
3.2.2 Quartus による合成と配置配線
1. enzantop.tclverilog/enzantop.tcl をダウンロードする. 2. enzantop に移動して, quartus を立ち上げる
% cd /enzantop % quartus
3. New Project Wizard にて, 表 3.2 の通り入力する
表3.2: New Project Wizard: page 1 of 5 に入力する値
フィールド名 入力値
What is the working directory.. そのまま(ホームディレクトリ名/enzantop) What is the name of the project enzantop
What is the name of the top-level design entity... enzantop
4. Tools->Tcl Scripts を実行し, Project 内にある enzantop.tcl を選択して, Run ボタンを押す. 5. あとは binshifttop と同じである.
3.3 5.6
節 電卓の設計
演習を始める前に, 専用のディレクトリを作成し, 以後のファイルはこの中に作成する. % cd / % mkdir calctop 演習5.9 負の数の取扱い • verilog/inversesigned.v(signed をつかった場合) module inverse;reg signed [4:0] A,B,C;//←5ビットのレジスタ
initial begin A=3;B=-2; $display("A=%d,%b, B=%d,%b",A,A,B,B); C=8-5; //←結果は3 #100 C=5-8; //←結果は-3 #100 C=-10-8; //←結果は-18(オーバーフロー) #100 C=10+10; //←結果は20(オーバーフロー) end initial $monitor("%d: ",$time,"C=%d, %b",C,C); //↑ Cの値を10進と2進で表示する. endmodule
電卓の設計 演習5.10∼5.17 verilog/skel/calc.v 電卓ひな型 verilog/calc.v 電卓答え (signed 版) `define DECIMAL 0 `define OPE 1 `define HALT 2 module calc(decimal,plus,minus,equal,CLK,RST,CE,sign,overflow,out); input [9:0] decimal; input CLK,CE,RST,plus,minus,equal; output sign,overflow; output [6:0] out; wire [3:0] d; reg [1:0] state;
reg signed [8:0] REGA, REGB; reg [1:0] count; reg add_or_sub; function [3:0] dectobin; input [9:0] in; if(in[9]) dectobin = 9; else if(in[8]) dectobin = 8; else if(in[7]) dectobin = 7; else if(in[6]) dectobin = 6; else if(in[5]) dectobin = 5; else if(in[4]) dectobin = 4; else if(in[3]) dectobin = 3; else if(in[2]) dectobin = 2; else if(in[1]) dectobin = 1; else if(in[0]) dectobin = 0; endfunction assign d=dectobin(decimal);
always @(posedge CLK or negedge RST) begin if(!RST) begin REGA<=0;REGB<=0;count<=0; add_or_sub<=0; state<=`DECIMAL; end else begin case(state) `DECIMAL:
begin
if((decimal!=0) && (count < 2)) begin count<=count+1; REGA<=REGA*10+d; end else if(CE) begin REGA<=0; count<=0; end
else if(plus || minus || equal) begin if(add_or_sub==0) REGB<=REGB+REGA; else REGB<=REGB-REGA; if(plus) add_or_sub<=0; else if(minus) add_or_sub<=1; state<=`OPE; end end `OPE: begin if((REGB>99)||(REGB<-99)) state<=`HALT; else if(decimal) begin REGA<=d; count <= 1; state<=`DECIMAL; end end `HALT: begin if(CE) begin REGA<=0; REGB<=0; add_or_sub<=0; count<=0; state<=`DECIMAL; end end endcase end end assign out=(state==`OPE)?((REGB[8]==0)?REGB[6:0]:REGB[6:0]+1):REGA; assign sign=(state==`OPE)?REGB[8]:0; assign overflow=(state==`HALT)?1:0; endmodule verilog/calctop.v 電卓最上位モジュール (calctop.v) 答え module calctop \
(push,plus,minus,equal,ledsign,overflow,ledl,ledh,CLK,CE,RST); input [9:0] push; input CLK,CE,RST,plus,minus,equal; output [6:0] ledl; output [6:0] ledh; output [6:0] ledsign; output overflow; wire [6:0] out; wire [9:0] pushout; assign ledsign[5:0]=0; calc \ I0(.decimal(pushout),.plus(plusout),.equal(equalout),.CLK(CLK),.CE(CEout),.RST(RST), \ .out(out),.minus(_minus),.sign(ledsign[6]),.overflow(overflow)); binled I1(.in(out),.ledl(ledl),.ledh(ledh)); syncro #(10) I2(.in(push),.out(pushout),.CLK(CLK),.RST(RST)); syncro #(1) I3(.in(plus),.out(plusout),.CLK(CLK),.RST(RST)); syncro #(1) I4(.in(equal),.out(equalout),.CLK(CLK),.RST(RST)); syncro #(1) I5(.in(CE),.out(CEout),.CLK(CLK),.RST(RST)); syncro #(1) I6(.in(minus),.out(_minus),.CLK(CLK),.RST(RST)); endmodule
3.3.1 シミュレーション
calctop 内にファイルを作成, ダウンロードする. verilog/other.v その他必要なモジュールを含んだファイル. verilog/calcsimgtk.v GTK 版テストフィクスチャ シミュレーションは下記の通り行なう.% gtksim.sh calcsimgtk.v calctop.v calc.v other.v
3.3.2 Quartus による合成と配置配線
1. calctop.tclverilog/calctop.tcl をダウンロードする. 2. calctop に移動して, quartus を立ち上げる
% cd /calctop % quartus
3. New Project Wizard にて, 表 3.3 の通り入力する
4. Tools->Tcl Scripts を実行し, Project 内にある calctop.tcl を選択して, Run ボタンを押す. 5. あとは binshifttop と同じである.
表3.3: New Project Wizard: page 1 of 5 に入力する値
フィールド名 入力値
What is the working directory.. そのまま(ホームディレクトリ名/calctop) What is the name of the project calctop
第
4
章
FPGA
ボードの仕様
4.1
ボードの構成
本演習で使うのは, 三菱電機マイコン機器ソフトウエア社 http://www.mms.co.jp/製の Power Medusa MU200-EC6S である. 配置は以下のようになっている.
FPGA としては, Altera 社の Cyclone が搭載されている. Cyclone は大規模であるが安価な FPGA で, デジタルビデオカメラやプラズマディスプレイ等の民生品にも多数搭載されている. 今回は, SUN のワークステーションを使用する関係上, ボードには, マスタブラスタと呼ばれるシ リアル, USB をサポートした書き込み器を用いるが, パソコンを用いる場合はパラレルケーブルを 接続すれば良い.
4.2
ボードピン接続表
各スイッチ, LED(発光ダイオード) は表 4.1, 表 4.2 の通りボードに接続されている. また, 今回演 習で使用するマスターブラスタからのケーブルは, ボード本体から延びているケーブルと図 4.2 の 通り, それぞれの赤いケーブルが同じ向きになるように接続する.4.3 7
セグメント
LED
7 セグメント LED の各セグメントは FPGA の出力に接続されている. 出力を 1 にすると LED が 点灯する. LED の各セグメントの英字による表示を図 4.3 に示す.
4.4
クロック周波数
左下のロータリースイッチでFPGA に供給するクロックを設定する. ロータリースイッチの設定 値によるクロック周波数は, 表 4.3 の通りである. ☆の場合には, SW26(1 クロックスイッチ) からク ロックを供給します.4.5
プッシュスイッチ
教科書の演習ではプッシュスイッチを電卓のキーとして用いる. その配置は図 4.4 のようにする.4.6
注意点
1. プッシュスイッチは押さないと 1 が, 押すと 0 が出力される.7セグメント LED
A B C D E F G H
EP1C6Q240C8クロック
分周
マスターブラスタ接続
プッシュ
スイッチ
押すと
0
になる
RST トグルSWロータリ
SW
LED ABCをONに 電源コネクタブザー
FPGA
トグル SW LED(上から2番目) を右に倒す 図4.1: FPGA ボードの構成 ボード側ケーブル 赤いケーブル (裏側) 赤いケーブル マスターブラスタ側 図4.2: ケーブルの接続 (それぞれ赤いケーブルが同じ向きになるように接続する.)表4.1: ボードピン接続表 (その 1) ピン番号 入力名 ピン番号 入力名 ピン番号 入力名 28 CLK 7 セグメント A 7 セグメント E 240 RST 133 A0 87 E0 プッシュスイッチ 134 A1 88 E1 2 A0 135 A2 93 E2 3 A1 136 A3 94 E3 4 A2 137 A4 95 E4 5 A3 138 A5 98 E5 6 A4 139 A6 99 E6 7 B0 140 A7 100 E7 8 B1 7 セグメント B 7 セグメント F 11 B2 123 B0 77 F0 12 B3 124 B1 78 F1 13 B4 125 B2 79 F2 14 C0 126 B3 82 F3 15 C1 127 B4 83 F4 16 C2 128 B5 84 F5 17 C3 131 B6 85 F6 18 C4 132 B7 86 F7 A7 A1 A4 A6 A5 A2 A3 A0 図4.3: 7 セグメント LED
表4.2: ボードピン接続表 (その 2) ピン番号 入力名 ピン番号 入力名 ピン番号 入力名 プッシュスイッチ 7 セグメント C 7 セグメント G 19 D0 115 C0 65 G0 20 D1 116 C1 66 G1 21 D2 117 C2 67 G2 23 D3 118 C3 68 G3 41 D4 119 C4 73 G4 LED 120 C5 74 G5 47 LED-0 121 C6 75 G6 48 LED-1 122 C7 76 G7 49 LED-2 7 セグメント D 7 セグメント H 50 LED-3 101 D0 57 H0 53 LED-4 104 D1 58 H1 54 LED-5 105 D2 59 H2 55 LED-6 106 D3 60 H3 56 LED-7 107 D4 61 H4 108 D5 62 H5 113 D6 63 H6 114 D7 64 H7 表4.3: ロータリスイッチ設定によるクロック周波数 0 1 2 3 4 5 6 7 周波数 40MHz 20MHz 10MHz 5MHz 1.25MHz 3125kHz 78.1kHz 19.5kHz 8 9 A B C D E F 周波数 9.8kHz 4.9kHz 2.44kHz 1.22kHz 610Hz 305Hz 1.0Hz ☆
A0 A1 A2 A3 A4 B0 B1 B2 B3 B4 C0 C1 C2 C3 C4 D0 D1 D2 D3 D4 7 8 9 + 4 5 6 -1 2 3 = 0 2 7 14 19 3 4 5 8 11 12 15 16 17 CE 23 10キー スイッチ 番号 FPGA ピン番号 6 13 18 20 21 41 図4.4: プッシュボタンの配置
第
5
章 シミュレーションを会社や学校で行う
ためには
5.1
はじめに
本演習の続きを, 会社や学校に帰って行うことができるように, 電卓の GUI を構築する PLI のソー スならびに, コンパイル済のライブラリを配布する. ここでは, シミュレータの情報やインストールの 方法を記載する. なお, 講習会の資料, PLI のソース等は, http://kazunoko.kuee.kyoto-u.ac.jp/kobayasi/ refresh よりダウンロード可能である.5.2
シミュレータ
Verilog シミュレータで, 今回使っている signed 拡張を実装しているものとして, 次のものがあげ られる.Verilg-XL, NC-verilog Cadence 社: Solaris, HP-UX, Windows VCS Synopsys 社: Solaris, HP-UX, Windows, Linux
modelsim Mentor Graphics 社: Solaris, HP-UX, Windows, Linux GPL Cver Antrim Design Systems 社
すべてPLI に対応しているので, 上記のシミュレータのライセンスを持っていれば, シミュレーショ ン可能である. 特に, GPL Cver は, GPL に従って配布されている Verilog Simulator である. Verilog 2001 もほとんどサポートしており, お勧めのシミュレータである.
以下では, このうち, Windows の Cygwin 上にインストールした GPL Cver について, 入手の方法 と電卓用PLI のインストールの方法を述べる.
また, Solaris, Linux で動く Verilog-XL シミュレータでの電卓用 PLI のインストール方法につい ても触れる.
5.3 Cver on Cygwin
5.3.1 Cygwin のインストール
1. cygwin をインストールする. www.cygwin.com にアクセスし, Install or update now!をクリッ クする.
2. Select Packages まで進んだら, Devel 内の, gcc と make を Skip から, Install に変更する. 3. 最後までインストールを進める
5.3.2 GPL Cver のインストール
1. GPL Cver のホームページ http://www.pragmatic-c.com/gpl-cver/index.htm より, gplcver-2.11a.src.tar.bz2http:/ /www.pragmatic-c.com/gpl-cver/downloads/gplcver-2.11a.src.tar.bz2 をダウンロードする. 2. cygwin 上で展開する. $ tar xfj gplcver-2.11a.src.tar.bz2 3. gplcver-2.11a.src/src ディレクトリに移り, make を実行する. $ cd gplcver-2.11a.src/src $ make -f makefile.cygwin
4. objs ディレクトリに移り, PLI 版の cver をコンパイルする. $ cd ../objs
$ make -f makefile.dll dll exe
5. 動くかどうかテストするが, 配布されている makele に不具合があるので, これと置き換え る.cver/makele.cygwin
$ cd ../tests_and_examples/examples.vpi/ # makefile.cygwin を, 上記のものと置き換える $ make -f makefile.cygwin dll run # うまく行くと最後に下記の通り表示される.
tmp_channel
5.3.3 GTK のインストール
次に, Cygwin で動作する GTK をインストールする.
1. こちら http://gladewin32.sourceforge.net/より, 最新の Gtk+ Win32 Development Environment を インストールする. インストール先は, C:\cygwin\GTK とする.
2. 正常にインストールされたか確認するために, Makelecver/Makele.tex, helloworld.ccver/helloworld.c をダウンロードする.
3. cygwin 上で make を行なう
# Makefile, helloworld.c をダウンロードしたディレクトリ内に移動 $ make
$ ./helloworld.exe
# windows 上に, hello world と表示されれば正常
5.3.4 PLI ライブラリのインストール
1. gtkcalc cver.tgzcver/gtkcalc cver.tgz をダウンロードする
2. gplcver-2.11a.src.tar.bz2 を展開したのと同じディレクトリに置く. 3. 展開する. # 必ず, gplcver-2.11a.src.tar.bz2 を展開したのと同じディレクトリに置くこと $ tar xfz gtkcalc_cver.tgz 4. すでにコンパイルされているので, そのまま動かすことができる $ cd gtkcalc $ ./gtksim.sh 5. うまく行かない場合は, 再コンパイルを行なう $ make clean $ make dll $ ./gtksim.sh
5.4 Verilog-XL on Solaris
5.4.1 GTK+他のインストール
実行に必要なライブラリをまとめたファイルを作成した. gtkcalc/gtklib.tgz をダウンロードして, 適当なところで展開する. なお, ソースからインストールしたい場合は, http://www.gimp.org より, ダ ウンロードすることができる.5.4.2 ライブラリのインストール
gtkcalc/solaris/libvpi.so をダウンロードする.5.4.3 実行シェルスクリプト
gtkcalc/solaris/gtksim.sh をダウンロードして, CALCLIB= GTKLIB=のCALCLIB=のあとに, libvpi.so を置いたディレクトリ, GTKLIB=のあとに GTK のライブラリ を置いたディレクトリを指定する. gtksim.sh をパスの通ったディレクトリに移して, chmod +x gtksim.sh とすれば良い.
5.5 Verilog-XL on Linux
Linux では, 標準またはオプションで, GTK+がインストールされていることが多いので, ここで は, GTK+はすでにインストールされているものとする.5.5.1 ライブラリのインストール
gtkcalc/linux/libvpi.so をダウンロードする.5.5.2 実行シェルスクリプト
gtkcalc/linux/gtksim.sh をダウンロードして, CALCLIB=のCALCLIB=のあとに, libvpi.so を置いたディレクトリを指定する. gtksim.sh をパスの通ったディ レクトリに移して,
chmod +x gtksim.sh
とすれば良い.
5.6 PLI
ファイルのソース
第
6
章 その他
6.1 FPGA
ボード
今回演習に用いたのは, Quartus II である. 今回使用した MU200-EC6S に搭載されている Cyclone デバイスファミリーは, Quartus II Web Edition という無償で使えるツールにより, Verilog HDL の合 成から配置配線を行なうことができる.
シミュレーションに, GPL Cver を用いて, FPGA ボードに, MU200-EC6S を使えば, ボードの実費 のみで, 本演習と同じことを行なうことができる.
6.2
その他の演習
FPGA を用いた大学生向けの演習は各地で行なわれている.
熊本大学/九州工業大学では, KITE というプロジェクト名で, FPGA ボード上にプロセッサを構築 する演習を古くから行なっている.
京都大学では, Power Medusa シリーズの MU200-AP に液晶キャラクタディスプレイを接続して, テトリスをVerilog-HDL で実装する演習を 3 回生向けに行なっている.
長崎大学では, SFL 言語を使って, ファミコン互換のハードウエアを FPGA 上に構築する実習に ついて, 準備を進めている.
東京大学では, Celoxica 社の DK-II シリーズのボードを用いて, C 言語ベースの FPGA 実装演習 を行なっている.