VLD 講習会教育資料 Kazutoshi Kobayashi ([email protected]) 2005 年 8 月 26 日-29 日 第 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/refresh/index.html # 最初は/が 3 ついるので注意 をターミナルのコマンドラインから実行します. 文字化けが起る場合は, メニューより, View → Encoding → Japanese (Auto-Detect) を実行して下 さい. 1 第2章 2 第 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; 3 //中略 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; 4 count<=count+1; end else if(CE) begin REGA<=0; count<=0; end end assign out=REGA; endmodule 演習 5.5 6 章を参考にして,同期化回路 (syncro),2 進数を BCD に変換しさらに 7 セグメント LED への出力信号を生成する回路 (binled) の設計を行え。ただし時間のない場合ここはとばして 解答のみダウンロードする. 解答例 verilog/other.v: syncro, ledout, bintobcd を含んだ verilog ファイル 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) begin if(!RST) q0<=0; else q0<=˜in; end always @(posedge CLK or negedge RST) begin if(!RST) q1<=0; else q1<=q0; end always @(posedge CLK or negedge RST) begin if(!RST) q2<=0; else q2<=q1; end assign out=q1&(˜q2); endmodule module 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)); endmodule 5 module 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 : assign tmp1 = (in>=80) ? in-80 : assign outh[2] = (tmp1>=40) ? 1 : assign tmp2 = (tmp1>=40) ? tmp1-40 : assign outh[1] = (tmp2>=20) ? 1 : assign tmp3 = (tmp2>=20) ? tmp2-20 : assign outh[0] = (tmp3>=10) ? 1 : assign outl = (tmp3>=10) ? tmp3-10 : endmodule ‘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_1001 module 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, endcase endfunction assign out=convert(in); endmodule 演習 5.6 binshifttop を設計せよ。 verilog/skel/binshifttop.v binshifttop ひな型 verilog/binshifttop.v binshifttop 答え verilog/binshiftsimgtk.v GTK 版テストフィクスチャ 6 0; in; 0; tmp1; 0; tmp2; 0; tmp3; A warning messsage is shown in Synplify Pro 図 3.1: GUI を用いた電卓 3.1.1 シミュレーションの方法 電卓設計演習では, デバッグを用意にするために, 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 は, 最後の電卓用の overflow を表示する. 3.1.2 Quartus を用いた binshifttop の論理合成と配置配線 1. Quartus II を立ち上げる. (*unresolved reference*??) 最初に, *unresolved reference*??のウィン ドウが表示されるので, ”Yes”を選択する. 間違って, No を選択してしまった場合は, File → New Project Wizard を実行する. % cd ˜/binshifttop % quartus 2. Project Wizard ウィンドウ (*unresolved reference*??) が表示されるので, Next ボタンを押す. Project Wizard が表示されない場合は, File メニューから Project Wizard を実行する. 7 図 3.2: Select Family 3. Working Directory を, ”./”, What is the name of project に, ”binshifttop”, What is the name of top-level entry に, ”binshifttop”と入力して Next を押す. 4. binshifttop.v, binshiftreg.v, other.v を File Name として指定して, Finish ボタンを押す. 間違って 途中で, Finish を押してしまった場合は, Project → Add/Remove Files in Project を実行して, す べてのファイルを指定する. 5. Select Family のウィンドウが表示されたら, Cyclone を選択する. 6. binshifttop.tcl1 をダウンロードして, binshifttop/以下に置く. 7. Tools->Tcl Scripts を実行し, Project 内にある binshifttop.tcl を選択して, Run ボタンを押す. こ れにより, FPGA デバイスの設定とボードに対応したピンのアサインが行なわれる. 8. 紫の矢印 (Start Compilation) を押す. 3.2 5.4 節 演算回路 演習 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 の答え 演習 5.8 enzantop の設計 verilog/skel/enzantop.v enzantop ひな型 verilog/enzantop.v enzantop 答え verilog/enzansimgtk.v GTK 版テストフィクスチャ 表 3.1 ピン配置 1 verilog/binshifttop.tcl 8 表 3.1: enzantop のピン配置 ピン名 push[9:0] 3.2.1 ピン番号 4 3 2 11 8 7 16 15 14 19 CE 23 RST 240 CLK 28 plus 5 equal 17 ledl[6:0] 116 117 118 119 120 121 122 ledh[6:0] 124 125 126 127 128 131 132 シミュレーションの方法 % gtksim.sh enzansimgtk.v enzantop.v enzan.v other.v 3.3 5.6 節 電卓の設計 演習 5.9 負の数の取扱い • verilog/inverse.v module inverse; reg [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, -%d, %b",C,˜C+5’b00001,C); //↑˜C+1 では, 結果が 32 ビットになってしまうので注意する. endmodule • verilog/inversesigned.v(signed をつかった場合) module inverse; reg signed [4:0] A,B,C;//← 5 ビットのレジスタ initial begin A=3;B=-2; 9 $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 電卓答え verilog/calcsigned.v 電卓答え (signed 版) verilog/calctop.v 電卓最上位モジュール (calctop.v) 答え verilog/calcsimgtk.v GTK 版テストフィクスチャ 表 3.2 ピン配置 表 3.2: calctop のピン配置 ピン名 push[9:0] 4 3 2 11 8 7 16 15 14 19 CE 23 RST 240 CLK 28 plus 5 minus 12 equal 17 ledl[6:0] 116 117 118 119 120 121 122 ledh[6:0] 124 125 126 127 128 131 132 ledsign[6:0] 134 135 136 137 138 139 140 overflow 3.3.1 ピン番号 47 シミュレーションの方法 % gtksim.sh calcsimgtk.v calctop.v calcsigned.v other.v 10 第 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 が出力される. 11 ピン番号 表 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 12 入力名 ピン番号 表 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 120 C5 74 G5 LED 周波数 周波数 入力名 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 0 表 4.3: ロータリスイッチ設定によるクロック周波数 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 ☆ 13 電源コネクタ 7セグメント LED A B C D E F G H ブザー ABCをONに EP1C6Q240C8 ロータリSW トグルSW FPGA LED プッシュ スイッチ クロック 分周 RST 押すと0になる マスターブラスタ接続 図 4.1: FPGA ボードの構成 マスターブラスタ側 赤いケーブル 赤いケーブル (裏側) ボード側ケーブル 図 4.2: ケーブルの接続 (それぞれ赤いケーブルが同じ向きになるように接続する.) 14 A7 A6 A2 A1 A5 A3 A4 A0 図 4.3: 7 セグメント LED 7 8 9 + A0 2 A1 3 A2 4 A3 5 4 5 6 - B0 7 B1 8 B2 11 B3 12 A4 6 B4 13 10キー スイッチ 番号 FPGA ピン番号 1 2 3 = C0 14 C1 15 C2 16 C3 17 CE 0 D0 19 C4 18 D1 20 D2 21 D3 23 D4 41 図 4.4: プッシュボタンの配置 15 第 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 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 5.3.1 Cver on Cygwin Cygwin のインストール 1. cygwin をインストールする. www.cygwin.com にアクセスし, ”Install or update now!”をクリッ クする. 2. Select Packages まで進んだら, Devel 内の, gcc と make を Skip から, Install に変更する. 3. 最後までインストールを進める 16 5.3.2 GPL Cver のインストール 1. GPL Cver のホームページ1 より,gplcver-2.11a.src.tar.bz22 をダウンロードする. 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. 動くかどうかテストするが, 配布されている makefile に不具合があるので, これと置き換える.3 $ # $ # 5.3.3 cd ../tests_and_examples/examples.vpi/ makefile.cygwin を, 上記のものと置き換える make -f makefile.cygwin dll run うまく行くと最後に下記の通り表示される. tmp_channel GTK のインストール 次に, Cygwin で動作する GTK をインストールする. 1. こちら4 より, 最新の Gtk+ Win32 Development Environment をインストールする. インストー ル先は, C:\cygwin\GTK とする. 2. 正常にインストールされたか確認するために, Makefile5 , helloworld.c6 をダウンロードする. 1 http://www.pragmatic-c.com/gpl-cver/index.htm 2 http://www.pragmatic-c.com/gpl-cver/downloads/gplcver-2.11a.src.tar.bz2 3 cver/makefile.cygwin 4 http://gladewin32.sourceforge.net/ 5 cver/Makefile.tex 6 cver/helloworld.c 17 3. cygwin 上で make を行なう # $ $ # 5.3.4 Makefile, helloworld.c をダウンロードしたディレクトリ内に移動 make ./helloworld.exe windows 上に, hello world と表示されれば正常 PLI ライブラリのインストール 1. gtkcalc cver.tgz7 をダウンロードする 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 より, ダ ウンロードすることができる. 7 cver/gtkcalc cver.tgz 18 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 です. 19 第 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 実装演習 を行なっている. 20
© Copyright 2024 Paperzz