26
リフレ 1 Kazutoshi Kobayashi [email protected] 2002 12 10 -11

Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

リフレッシュ教育コース1講習会資料

Kazutoshi Kobayashi [email protected]

2002年 12月 10日-11日

Page 2: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

第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/users11/kobayasi/kobayasi/refresh/index.html

をターミナルのコマンドラインから実行します.

文字化けが起る場合は,メニューより, View→ Encoding→ Japanese (Auto-Detect)を実行して下

さい.

1

Page 3: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

第2章 例題による演習

2.1 FPGAの合成から配置配線までの流れ

本演習では, Verilog-HDLの RTL記述から, FPGA用の回路を論理合成するために, Synplicity社

の SynplifyPro(以下 Synplifyと略す)を用いる. Synplifyは Verilog-HDLの RTL(レジスタトランス

ファレベル)記述を入力とし,ターゲットとする FPGAのベンダ名,型番を入力するだけで,面倒な

設定なしに FPGA用の回路の合成を行うことができる.

Synplifyは, circuitというモジュール名に対して, circuit.edfという EDIFフォーマットのネット

リストファイルと,使用する FPGAの名前等を記述した circuit.acfという 2個のファイルが出力さ

れる.

FPGAの配置配線に使用するのは,今回使用するFPGAのベンダであるALTERA社のMAX+PLUSII(以

下, MPII) である. MPII は, Synplifyから出力された.edfファイルとと.acfをもとに, FPGAの配置

配線を行う.出力は,配置配線結果を格納した. acfファイルと FPGA内部のコンフィグレーション

SRAMデータを格納したファイルである. FPGAのコンフィギュレーションデータは各種のフォー

マットがあるが,標準では sof, ttf, pofといったファイルが出力される. MPIIは,シリアルもしくは

パラレルインタフェースを通じてこの SRAMオブジェクトファイルをデバイスにダウンロードす

る機能も有する. acfファイルは Synplifyから出力されるが, MPIIで一度 FPGAの配置配線を実行

すれば上書きされる.

2.2 Verilog-HDLシミュレーション

1. シミュレーションに用いる合成に用いるVerilog記述を用意する.下記のファイルをダウンロー

ドする.

• roulette.v

• roulettesim.v

2. verilogコマンドにより Verilog-XL シミュレータを実行する.

% verilog roulettesim.v roulette.v

下のような実行結果が画面に表示されるであろう.

0: xxxxxx10: 00000130: 000010

40990: 000100

2

Page 4: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

81950: 001000122910: 010000163870: 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)

beginif(!RST)

beginout<=1;divide<=0;

endelse

beginif(divide==0)// 2048 回数えたら, ルーレットを一つ進める.

beginout[0]<=out[5];out[1]<=out[0];out[2]<=out[1];out[3]<=out[2];out[4]<=out[3];out[5]<=out[4];

enddivide<=divide+1; // クロック毎に 1 カウントアップ.

endend

endmodule

リスト 2:テストフィクスチャ roulettesim.v

‘timescale 1ns/100ps// シミュレーションの単位を 1ns にして, 100ps の精度で出力を表示します.

module roulettesim;reg CLK,RST;wire [5:0] out;

‘ifdef MAXroulette I0(.out5(out[5]),.out4(out[4]),.out3(out[3]),.out2(out[2]),

.out1(out[1]),.out0(out[0]),.CLK(CLK),.RST(RST));// この書式については, 後程説明する.

‘elseroulette I0(.out(out),.CLK(CLK),.RST(RST));

‘endifinitial begin

CLK=0;RST=1;#10 RST=0;#10 RST=1;// 10ns リセットを入れる.

3

Page 5: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

#200000 $finish;// その後, 200usec 動作させる.endalways #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 の読み込み

‘endifendmodule

2.3 SynplifyProによる論理合成

1. SynplifyProでは, FPGAへのピンの配置をファイルに記述して,指定することができる.まず,

roulette用のファイルをダウンロードする. netscapeより, roulette.sdcをホームディレクトリ

に保存する.

2. SynplifyProを立ち上げる.

% synplify_pro

3. 初回立ち上げ時は, “Synplicity License Agreement”というウィンドウが表示される.文面を確

認の上, “YES” ボタンをクリックする.

4. さらに, “Tip of the Day”というウィンドウも表示されるが,左下の “Show Tips at Startup”の

左の四角をクリックして,非選択状態にして OKを押す.

5. 図 2.1のようなウィンドウが立ち上がる.

6. File→ Build Projectを選択して,合成を行う verilogファイルを指定する.ここでは, roulette.v

だけを選択して, “Add” ボタンを押す. (図 2.2)

7. 次に, “Files of type”を “Constraint Files(*.sdc)”にして, roulette.sdcを選択して, “Add” ボタン

を押す.さらに OKボタンを押し,このウィンドウを閉じる. (図 2.3)

合成を行うのは,テストフィクスチャをのぞいた Verilog-HDLファイルである.

ソースの選択に失敗したときは,後で追加することもできる.

追加するとき Add File...をクリックして,追加を行う.

4

Page 6: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

図 2.1: SynplifyPro

図 2.2:プロジェクトへのファイルの追加

5

Page 7: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

図 2.3:ピン配置ファイルの指定

図 2.4:プロジェクトウィンドウ

図 2.5: FPGAデバイスの選択

6

Page 8: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

図 2.6: Implementation Nameの指定

8. roulette.prjというタイトルのウィンドウに, roulette(project)という表示と verilog, constraintと

いうアイコン,さらにその下に rev 1(roulette)というアイコンが見える. (図 2.4)

9. “Impl Options...”をクリックする. (図 2.5)

Deviceタブの項目を,表 2.1のように指定する.

表 2.1: Deviceタブの設定項目項目 指定 項目 指定

Technology Altera Flex10K Part EPF10K40

Speed -4 Packege RC208

10. 次に, Implementation Resultsタブを開き, Implementation Nameを “roulette”とする. (図 2.6)

指定したら, OKを押す.

11. プロジェクトウィンドウ内 (図 2.4)の Runボタンを押す.この操作で, rouletteというディレク

トリ (フォルダ)が,ホームディレクトリに作成され,その中に, roulette.vを論理合成した結果

が EDIF形式のネットリスト roulette.edfが作成される.

12. File→ Exitで終了させる. “Save changes to project ”roulette””というダイアログが表示される

ので, “Yes”と答えて, “Save”を実行する.

2.4 MAX+plusII によるFPGAデバイスの配置配線

2.4.1 MAX+PLUS2による配置配線

1. MAX+plusIIを立ち上げる.

% max2win

7

Page 9: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

図 2.7:フォントの警告

図 2.8:ライセンスの確認

2. 最初に図 2.7のメッセージが出るが OKを押して,次に進む.

3. はじめて立ち上げるときだけ,図 2.8のウィンドウが表示される.文面を確認の上, Yesを押す.

4. File→ Project→ Nameで,先ほど作成したデザインの名前のディレクトリ (フォルダ)の “デ

ザイン名.edf”というファイルを指定する. (図 2.9)

ここでは, roulette/roulette.edfを選択する.

5. MAX+plus II→ Compilerで,コンパイラウィンドウを開く. (図 2.10)

6. 今回演習に使用するMAX+PLUSII 10.1は,バグがあるためか,下記の処理を実行しないと正

しく配置配線できない.この処理は各設計 (project)毎に行うこと.ただし各設計毎に一度実行

しておけば良い.

Processingメニューから Fitter Settingを選んで実行する. (図 2.11)

ここで,もっとも上の “Use Quartus Fitter for FLEX 10K and ACEX 1K Devices”のチェックを

はずす.

7. Startボタンを押して,配置配線を行う.

Warningが一つでるが,これは,ピンの配置をあらかじめ指定しているためである.

8

Page 10: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

図 2.9:デザインの指定

図 2.10:コンパイラウィンドウ

図 2.11: Fitter Setting

9

Page 11: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

図 2.12: Programmer

図 2.13: Hardware Setup

2.5 ボードへのダウンロード

1. ワークステーションのシリアルポートおよびボードにケーブルを接続して,電源を入れる.ケー

ブルの向きは図図 4.1を参照する.

2. MAX+plusII→ Programmerを実行する.

3. 最初の書込の時だけ, Options→Hardware Setupを実行して, Hardwareを, MasterBlaster(COM)

に変更する. (図 2.13)

4. Programmerウィンドウの Configureを実行する.

ボードのリセットスイッチを押すと, LEDの点灯部分が廻り出す.またリセットスイッチを押し

てルーレットが止ることを確かめよ.

10

Page 12: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

第3章 電卓設計演習

3.1 5.3節 2桁のBCDを入力して内部で2進数で保存する回路の設計

演習 5.1 binshiftregのmodule,endmodule,入出力ピン定義部分を記述せよ。

解答例 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と,

unction文により binshiftreg内に記述せよ。ただし,function文 dectobinを dに入力するもの

とする。

解答例 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;

// 中略else if(in[0])

dectobin = 0;// ↑最後の else がなくても組み合わせ回路になる

endfunctionendmodule

演習 5.3 10キーが押された回数を数える countと,入力値を格納する REGAを,alwaysブロック

で binshiftreg内に実現せよ。

11

Page 13: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

演習 5.4 出力ポート outに対応する assign文を記述せよ.

解答例 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;endfunctionalways @(posedge CLK or negedge RST)

beginif(!RST)

beginREGA<=0;count<=0;

endelse if((decimal != 0) && (count < 2))

beginREGA<=(REGA*10)+d;count<=count+1;

endelse if(CE)

beginREGA<=0;count<=0;

endend

assign out=REGA;endmodule

12

Page 14: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

演習 5.5 6章を参考にして,同期化回路 (syncro),2進数を BCDに変換しさらに 7セグメント LED

への出力信号を生成する回路 (binled)の設計を行え。ただし時間のない場合ここはとばして

解答のみダウンロードする.

解答例 syncro, ledout, bintobcdを含んだ verilogファイル (other.v)

module syncro(out,in,CLK,RST);parameter WIDTH = 1;input [WIDTH-1:0] in;output [WIDTH-1:0] out;input CLK,RST;reg [ WIDTH-1:0] q0,q1,q2;always @(posedge CLK or negedge RST)

beginif(!RST)

q0<=0;else

q0<=˜in;end

always @(posedge CLK or negedge RST)begin

if(!RST)q1<=0;

elseq1<=q0;

endalways @(posedge CLK or negedge RST)

beginif(!RST)

q2<=0;else

q2<=q1;end

assign out=q1&(˜q2);endmodulemodule binled(in,ledh,ledl);

input [6:0] in;output [6:0] ledh,ledl;wire [3:0] outh,outl;bintobcd I0(.in(in),.outl(outl),.outh(outh));ledout I1(.in(outl),.out(ledl));ledout I2(.in(outh),.out(ledh));

endmodulemodule bintobcd(in,outl,outh);

input [6:0] in;output [3:0] outl,outh;wire [6:0] tmp1,tmp2,tmp3;assign outh[3] = (in>=80) ? 1 : 0;assign tmp1 = (in>=80) ? in-80 : in;assign outh[2] = (tmp1>=40) ? 1 : 0;assign tmp2 = (tmp1>=40) ? tmp1-40 : tmp1;assign outh[1] = (tmp2>=20) ? 1 : 0;assign tmp3 = (tmp2>=20) ? tmp2-20 : tmp2;assign outh[0] = (tmp3>=10) ? 1 : 0;assign outl = (tmp3>=10) ? tmp3-10 : tmp3;

endmodule

13

Page 15: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

‘define SEG_OUT_0 7’b011_1111‘define SEG_OUT_1 7’b000_0110‘define SEG_OUT_2 7’b101_1011‘define SEG_OUT_3 7’b100_1111‘define SEG_OUT_4 7’b110_0110‘define SEG_OUT_5 7’b110_1101‘define SEG_OUT_6 7’b111_1101‘define SEG_OUT_7 7’b010_0111‘define SEG_OUT_8 7’b111_1111‘define SEG_OUT_9 7’b110_1111‘define SEG_OUT_ERR 7’b011_1001module ledout(out,in);

input [3:0] in;output [6:0] out;

function [6:0] convert;input [3:0] in ;

case (in)0: convert = ‘SEG_OUT_0;1: convert = ‘SEG_OUT_1;2: convert = ‘SEG_OUT_2;3: convert = ‘SEG_OUT_3;4: convert = ‘SEG_OUT_4;5: convert = ‘SEG_OUT_5;6: convert = ‘SEG_OUT_6;7: convert = ‘SEG_OUT_7;8: convert = ‘SEG_OUT_8;9: convert = ‘SEG_OUT_9;

default: convert = ‘SEG_OUT_ERR;// If the above line is omitted, A warning messsage is shown in Synplify Proendcase

endfunctionassign out=convert(in);

endmodule

演習 5.6 binshifttopを設計せよ。

• binshifttopひな型

• binshifttop答え

• GTK版テストフィクスチャ

• binshifttop.sdc:ピン定義ファイル

3.1.1 シミュレーションの方法

電卓設計演習では,デバッグを用意にするために, X Window上に構築された仮想的な電卓のGUI

を用いてシミュレーションを行う.シミュレーションを行うには,この GUIは, verilogシミュレー

タの持つ PLI(Programming Language Interface)というC言語との接続インタフェースにより記述さ

れている. GUIはダイナミックライブラリとして構築されており, verilog実行時に動的にライブラ

リが読み込まれシミュレーションが行われる. gtksim.shというコマンドの引数にすべての Verilog

ファイルを与えることでシミュレーションが行われる. binshifttopのシミュレーションを行うには,

下記の通りに UNIX のコマンドプロンプトに入力する.

14

Page 16: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

図 3.1: GUIを用いた電卓

% gtksim.sh binshiftsimgtk.v binshifttop.v binshiftreg.v other.v

これにより,電卓を模した GUI(図 3.1)が立ち上がる.

Qにより,シミュレーションが終了する以外は,それぞれのボタンが,回路の入力ピンに対応して

いる.ただし, binshifttopで有効なのは 10キーと CEと RSTのみである. 7セグメント LED上部の

小さな LEDは,最後の電卓用の overflowを表示する.

3.1.2 SynplifyProを用いた binshifttop の合成

ここでは, synplifyProを用いた binshifttopの合成の方法を述べる.なお,この先で FPGAに実装す

る, enzantop, calctopも全く同じように行えば良い.

1. シミュレーションにより正常に動作することを確認しておく.

2. binshifttop.sdcをダウンロードしておく.

3. SynplifyProが立ち上がっていない場合は,立ち上げる.

% synplify_pro

4. File→Build Projectを選択して,合成を行う verilogファイルを指定する.ここでは, binshifttop.v,

binshiftreg.v, other.vを選択して, “Add” ボタンを押す.

複数のファイルを選択したいときは, Ctrlキーを押しながらマウスをクリックする.

5. 次に, “Files of type”を “Constraint Files(*.sdc)”にして, binshifttop.sdcを選択して, “Add” ボタ

ンを押す.さらに OKボタンを押し,このウィンドウを閉じる.

6. 新たに, “任意の名前 (project)”というアイコンが作成される.このアイコンがハイライトされ

ていることを確認する.先ほど作成した roulette(project)のアイコンがハイライトされている

場合は,新たに作成したほうをクリックする.

15

Page 17: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

7. “Impl Options...”をクリックする.

• Deviceタブの項目を,表 3.1のように指定する.

表 3.1: Deviceタブの設定項目項目 指定 項目 指定

Technology Altera Flex10K Part EPF10K40

Speed Packege RC208 -4

• 次に, Implementation Resultsタブを開き, Implementation Nameを “binshifttop”とし, Re-

sult File Nameを “binshifttop.edf”とする.

• 指定したら, OKを押す.

8. Runを押す.この操作で, binshifttopというディレクトリ (フォルダ)が,ホームディレクトリに

作成され,その中に, binshifttopを論理合成した結果がEDIF形式のネットリスト binshifttop.edf

が作成される.

9. File→ Exitで終了させる. “Save changes to project ”binshifttop””というダイアログが表示さ

れるので, “Yes”と答えて, “Save”を実行する.

3.1.3 max+plus2を用いた配置配線とボードへのダウンロード

1. max+plus2を立ち上げる.

% max2win

2. File→ Project→ Nameで,先ほど FPGA CompilerIIで作成したデザインの名前のディレクト

リ (フォルダ)の “デザイン名.edf”というファイルを指定する.

ここでは, binshifttop/binshifttop.edfを選択する.

3. MAX+plus II→ Compilerで,コンパイラウィンドウを開く.

4. Processingメニューから Fitter Settingを選んで実行する.

ここで,もっとも上の “Use Quartus Fitter for FLEX 10K and ACEX 1K Devices”のチェックを

はずす.

5. Startボタンを押して,配置配線を行う.

6. 2.5節を参考にして,ボードにダウンロードする.

16

Page 18: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

3.2 5.4節演算回路

演習 5.7 enzanを Verilog-HDL により記述せよ • moduleのみ

• +キーに対する動作の追加

• =キーに対する動作の追加

• 出力 outの論理

• enzan.vの答え

演習 5.8 enzantopの設計 • enzantopひな型

• enzantop答え

• GTK版テストフィクスチャ

• enzantop.sdc:ピン定義ファイル

3.2.1 シミュレーションの方法

% gtksim.sh enzansimgtk.v enzantop.v enzan.v other.v

3.3 5.6節電卓の設計

演習 5.9負の数の取扱い • inverse.v

module inverse;reg [4:0] A,B,C;// ← 5 ビットのレジスタinitial

beginA=3;B=-2;

$display("A=%d,%b, B=%d,%b",A,A,B,B);C=8-5; // ←結果は 3

#100C=5-8; // ←結果は-3

#100C=-10-8; // ←結果は-18( オーバーフロー)

#100C=10+10; // ←結果は 20( オーバーフロー)

endinitial

$monitor("%d: ",$time,"C=%d, -%d, %b",C,˜C+5’b00001,C);// ↑˜C+1 では, 結果が 32 ビットになってしまうので注意する.

endmodule

• inversesigned.v(signedをつかった場合)

17

Page 19: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

module inverse;reg signed [4:0] A,B,C;// ← 5 ビットのレジスタinitial

beginA=3;B=-2;

$display("A=%d,%b, B=%d,%b",A,A,B,B);C=8-5; // ←結果は 3

#100C=5-8; // ←結果は-3

#100C=-10-8; // ←結果は-18( オーバーフロー)

#100C=10+10; // ←結果は 20( オーバーフロー)

endinitial

$monitor("%d: ",$time,"C=%d, %b",C,C);// ↑ Cの値を 10 進と 2 進で表示する.

endmodule

電卓の設計 演習 5.10~5.17

• 電卓ひな型• 電卓答え• 電卓答え (signed版)

• 電卓最上位モジュール (calctop.v)答え

• verilog/calcsimgtk.v

• calctop.sdc:ピン定義ファイル

3.3.1 シミュレーションの方法

% gtksim.sh calcsimgtk.v calctop.v calcsigned.v other.v

18

Page 20: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

第4章 FPGAボードの仕様

4.1 ボードの構成

本演習で使うのは,三菱電機マイコン機器ソフトウエア社http://www.mms.co.jp/製のPower Medusa

MU200-EA40である.配置は以下のようになっている.

4.2 ボードピン接続表

各スイッチ, LED(発光ダイオード)は次表の通りボードに接続されている.

表 4.1:ボードピン接続表

ピン番号 入力名 ピン番号 入力名 ピン番号 入力名

183 CLK 7セグメント A 7セグメント E

180 RST 208 h (7) 163 h (7)

プッシュスイッチ 207 g (6) 162 g (6)

86 SW19 206 f (5) 161 f (5)

89 SW20 205 e (4) 160 e (4)

93 SW21 204 d (3) 159 d (3)

94 SW22 203 c (2) 158 c (2)

85 SW23 202 b (1) 157 b (1)

88 SW24 200 a (0) 150 a (0)

92 SW25 7セグメント B 7セグメント F

75 SW26 199 h (7) 149 h (7)

83 SW27 198 g (6) 148 g (6)

87 SW28 197 f (5) 147 f (5)

90 SW29 196 e (4) 144 e (4)

74 SW30 195 d (3) 143 d (3)

65 SW31 193 c (2) 142 c (2)

68 SW32 192 b (1) 141 b (1)

70 SW33 191 a (0) 136 a (0)

73 SW34 7セグメント C 7セグメント G

64 SW35 190 h (7) 139 h (7)

67 SW36 189 g (6) 134 g (6)

69 SW37 187 f (5) 133 f (5)

continued on next page

19

Page 21: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

continued from previous page

ピン番号 入力名 ピン番号 入力名 ピン番号 入力名

71 SW38 179 e (4) 132 e (4)

LED 177 d (3) 131 d (3)

103 LED-A 176 c (2) 128 c (2)

102 LED-B 175 b (1) 127 b (1)

101 LED-C 174 a (0) 122 a (0)

100 LED-D 7セグメント D 7セグメント H

99 LED-E 173 h (7) 121 h (7)

97 LED-F 172 g (6) 120 g (6)

96 LED-G 170 f (5) 119 f (5)

95 LED-H 169 e (4) 116 e (4)

168 d (3) 115 d (3)

167 c (2) 112 c (2)

166 b (1) 111 b (1)

164 a (0) 104 a (0)

4.3 7セグメント LED

7セグメント LEDの各セグメントは FPGAの出力に接続されている.出力を 1にすると LEDが

点灯する. LEDの各セグメントの英字による表示を図 4.2に示す.

4.4 クロック周波数

左下のロータリースイッチで FPGAに供給するクロックの分周比を設定する.

分周されたクロック周波数は, 20MHz/2ˆ(スイッチの値)

となる.プッシュスイッチのチャタリングの関係上, 4以上に設定しておく.その場合の動作周波

数は, 1.25MHzになる.

4.5 プッシュスイッチ

プッシュスイッチにはチャタリング (スイッチの ON/OFFによるノイズのようなもの)を防止す

るために,容量がつけてある.しかし,クロックの周波数が早すぎると効果がないので,内部クロック

設定 4以上 (1.25MHz以下)で使用するようにする.プッシュスイッチは押さない状態が 1で,押す

と 0になる.

教科書の演習ではプッシュスイッチを電卓のキーとして用いる.その配置は図 4.3のようにする.

4.6 注意点

1. 上部のトグルスイッチは,ボード上部の中央のものを除き,すべて ONにしておく.

20

Page 22: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

トグルスイッチ

7セグメントLED

A B C D

E F G H

ロータリースイッチ

SW19 SW23 SW27 SW31 SW35

SW20 SW24 SW28 SW32 SW36

SW21 SW25 SW29 SW33 SW37

SW22 SW26 SW30 SW34 SW38

EPF10K40RC208-4

クロック分周

バイト/ビット/マスターブラスタ接続

電源スイッチ

プッシュスイッチ

押すと0になる4以上に

リセットスイッチ

RST

トグルスイッチ

LED-A LED-B LED-C LED-D

LED-E LED-F LED-G LED-H

LED

すべてON すべてON すべてON すべてON

すべてONすべてONすべてONすべてON すべてOFF

すべて

ON

すべて

ON

今回は使用しない

ケーブルの出っ張りはこちら側

図 4.1: FPGAボードの構成

h

a

b

c

d

e

f

g

図 4.2: 7セグメント LED

21

Page 23: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

SW19 SW23 SW27 SW31 SW35

SW20 SW24 SW28 SW32 SW36

SW21 SW25 SW29 SW33 SW37

SW22 SW26 SW30 SW34 SW38

7 8 9 +

4 5 6 -

1 2 3 =

0

86

89

93

94

85 83 65

88 87 68

92 90 70

CE

73

10キー

スイッチ番号

FPGAピン番号

図 4.3:プッシュボタンの配置

2. プッシュスイッチは押さないと 1が,押すと 0が出力される.

22

Page 24: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

第5章 シミュレーションを会社や学校で行うためには

5.1 はじめに

本演習の続きを,会社や学校に帰って行うことができるように,電卓のGUIを構築する PLIのソー

スならびに,コンパイル済のライブラリを配布する.ここでは,シミュレータの情報やインストー

ルの方法を記載する.なお,講習会の資料, PLIのソース等は, http://www-lab13.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

すべて PLIに対応しているので,上記のシミュレータのライセンスを持っていれば,シミュレー

ション可能である.

以下では,このうち, Windowsで動くModelsimについて,入手の方法と電卓用 PLIのインストー

ルの方法を述べる.

また, Solaris, Linuxで動く Verilog-XL シミュレータでの電卓用 PLIのインストール方法につい

ても触れる.

5.3 Modelsim on Windows

5.3.1 Modelsimの入手

Windowsで走る Verilogシミュレータで, Verilog 2001の signed拡張に対応しているものとして,

Mentor Graphics社 (http://www.mentorg.co.jpのModelsimがあげられる.

Modelsimは, Altera(http://www.altera.co.jp), Xilinx(http://www.xilinx.co.jp)ともに,推奨シミュレー

タとしており,両者のホームページから, Modelsimの Altera Edition, Xilinx Editionがダウンロード

できる.

ただし,ライセンスの扱いは両者で異なり, Alteraは, Max+PlusIIもしくは, Quartusの正規ライ

センスを持っていないと, Modelsimのライセンスを得ることはできない.一方, Xilinx は,インス

23

Page 25: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

トール後に申請すれば,無償で Modelsim XE Starterのライセンスを得ることができる.このライ

センスの制限の範囲内で,今回の演習を行うことができる.ダウンロードは, Xilinx 日本法人 http:/

/www.xilinx.co.jp/のホームページから,「製品」のところをクリックして,「ザイリンクス製品とソ

リューション」の下の選択肢から,「ModelSimザイリンクス版」を選べばよい.

インストール時には, MXE Starter - Limited Version of MXE(Free)を選ぶと良い.インストール後,

自動的にライセンス申請のためのWEBページが立ち上がるので,必要事項を記入する.

5.3.2 GTK+のインストール

GUIを走らせる前に, GTK+をインストールする.http://www.gimp.org/˜tml/gimp/win32/より,下記

のものをダウンロードする.

• libiconv-1.X.*.zip

• libintl-0.*.zip

• glib-2.*.zip

• gtk+-1.*.zip

これらの zipファイルを展開すると得られる下記の dllファイルを, C:\windows\system\ (NT, 2000

では C:\winnt\system32\)にコピーする.

マシンをリブート後, gtkcalc/modelsim/gtkcalc.exeをダウンロードして,実行し,正しく動作する

ことを確認する.

5.3.3 電卓用ライブラリのインストール

gtkcalc/modelsim/mtipli apps.dll,gtkcalc/modelsim/mtipli apps.lib,gtkcalc/modelsim/mtipli apps.exp,

をダウンロードして, ModelSimをインストールしたフォルダ内の win32xoemの下にコピーする.

modelsimをインストールしたフォルダの下の modelsim.iniの最後を下記のように変更する.なお,

標準状態では, modelsim.iniに書込権限がない.ファイルのプロパティで「読み取り専用」のチェッ

クをはずした上で,編集を行うこと.

; List of dynamically loaded objects for Verilog PLI applications; Veriuser = veriuser.slVeriuser = $MODEL_TECH/mti_pli_apps.dll[lmc]

なお,無料で使える modelsimは,わざと遅くしてあるので,シミュレーションに非常に時間がか

かる.

5.4 Verilog-XL on Solaris

5.4.1 GTK+他のインストール

実行に必要なライブラリをまとめたファイルを作成した.gtkcalc/gtklib.tgzをダウンロードして,

適当なところで展開する.なお,ソースからインストールしたい場合は, http://www.gimp.orgより,ダ

24

Page 26: Kazutoshi Kobayashi kobayasi@ieeekobayasi/refresh/0212/main.pdf81950: 001000 122910: 010000 163870: 100000 ここで用いるVerilog 記述は, 7 セグメントLED をルーレット状に光らせる回路である

ウンロードすることができる.

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+はすでにインストールされているものとする.下記で,配布する libvpi.soは,

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です.

25