リフレッシュ教育資料kobayasi/refresh/0712/sdoc/main.pdf本演習では, erilog-hdlv のtlr...
TRANSCRIPT
目次
第 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ライブラリのインストール . . . . . . . . . . . . . . . . . . . . . . . . 30
i
5.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
ii
第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)を実行して下
さい.
1
第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.v
下のような実行結果が画面に表示されるであろう.
2
0: 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
3
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.1: 初回起動時の選択画面
4
図 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
What is the name of the top-level design entity... roulette
5
図 2.4: Project Wizard 1
ホームディレクトリ名/roulette
roulette
図 2.5: Project Wizard 2
6
図 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
を実行しても何も起こらない場合は,下記の事項を確認する.
7
図 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を実行する.
8
図 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/Con�gureのところにチェックを入れる (図 2.12).
5. Startボタンを押すと, FPGAへの書込が始まる.
6. 書込が終了すると, 7セグメント LEDの一つが回り始める.クロック周波数を変えるつまみを
回して,回転する速度が変化することを確認せよ.
9
ここにチェックを入れる
図 2.12: roulette.sofの選択
10
第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])
dectobin = 7;
11
//中略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
REGA<=(REGA*10)+d;
12
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
13
図 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は,最後の電卓用の over�owを表示する.
3.1.2 Quartusを用いた binshifttopの論理合成と配置配線
1. binshifttop.tclverilog/binshifttop.tclをダウンロードして, binshifttop/以下に置く.
2. Quartus IIを立ち上げる. (図 2.3)最初に,図 2.2のウィンドウが表示されるので, �Yes�を選択
する.間違って, Noを選択してしまった場合は, File→ New Project Wizardを実行する.
14
図 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 enzantop
15
3.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
16
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
17
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
18
電卓の設計 演習 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:
19
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 \
20
(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と同じである.
21
表 3.3: New Project Wizard: page 1 of 5に入力する値フィールド名 入力値
What is the working directory.. そのまま (ホームディレクトリ名/calctop)
What is the name of the project calctop
What is the name of the top-level design entity... calctop
22
第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が出力される.
23
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: ケーブルの接続 (それぞれ赤いケーブルが同じ向きになるように接続する.)
24
表 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
25
表 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 ☆
26
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: プッシュボタンの配置
27
第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. 最後までインストールを進める
28
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. 動くかどうかテストするが,配布されている make�leに不具合があるので,これと置き換え
る.cver/make�le.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. 正常にインストールされたか確認するために, Make�lecver/Make�le.tex, helloworld.ccver/helloworld.c
をダウンロードする.
29
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より,ダ
ウンロードすることができる.
30
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ファイルのソース
使用した PLIファイルのソースは gtkcalc/gtkcalc.tgzです.
31
第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実装演習
を行なっている.
32