FPGA Lecture
for LUPO and GTO
Vol. 12010, 31 August (revised 2013, 19 November)
H. BabaContents
 FPGAの概要
 LUPOの基本的な使い方◦ New Project◦ Read and Write 基本的なBehavioral VHDL simulation
 Firmwareのダウンロード

FPGAとは Field Programmable Gate Array

CLB

IOB
外部IO

CLB

CLB

DCM
Clock Manager

CLB

CLB

CLB
SRAM

CLB

CLB

CLB

内部RAM

配線スイッチロジックの基本単位

CLBと配線
LUT

CLB0123In
Out0000 00001 10010 10011 10100 00101 10111 11000 0DFF

Clock

LUPOについて
 NIMはLVTTLに一回変換している◦ NIM->LVTTL->FPGA◦ FPGA->LVTTL->NIM
 LVDSはダイレクト

8LED
4NIM IN

16 LVDS IO
32 LVTTL IOに接続◦ IOBを2.5Vにしているので、2.5V系しか使えない

VME Interface(CPLD)

4NIM OUT

User FPGA(Spartan 3E)

New Project for LUPO
 DeviceとDesign flowは以下のとおり

Design property for GTO

入出力の定義 (LUPO)
LED : LED
 A
: CAMAC/VMEアドレス
 CLOCK : 50MHz clock INIT : CAMAC Z/C, VME Init?
 IP: NIM Input 0-3
◦ IP0 : GCLK接続のIP0

OP : NIM Output 0-3
 LVDSn/LVDSp : LVDS IO 0-15


◦ LVDS_CLKn/p : GCLK接続のLVDS

RD : Data Read
 WR : Data Write RD_STRB : Read strobe
 WR_STRB : Write strobe制約ファイル(UCF)をコピー
 vlupo.ucf
 gto.ucf
 IO等の制約を書く

AssociationをImplementationにしておかないとヒドイ目にあうCAMAC/VMEを使わない場合は (LUPO)
 これで十分

UCFに書いてあるNETはentityに書いておかないとエラー

vlupo.ucfを Edit Constraints(Text)で編集

簡単に書くと (LUPO)
 こんな感じ。

Synthesize -> Implement Design まで通ればたいていOK同期回路を作る場合
 if, elseを使うときは使うsignalに対しすべて明示的に値を入れておくのが吉◦ Warningで確認すべし

非同期的な回路で作られる

この場合はちゃんとelseの部分で明示的に値を代入してあげること

こういうのは大丈夫な場合が多い event同期にしてあげると、DFFを使ってくれるので期待通りに値が保持される

Clockのタイミングでしか値が変化しない基本的にすべての行は同時に動作する

IP(0)

ed

ループ回路は注意
 回路図的には以下でLatchが作れるが・・・ Combinational loopがあるよと言われる◦ パルス幅、伝達経路delay、ジッタ等々でうまくいかな
いこと多し明示的にDFFを使うと安心 process文でeventを使うと基本的にDFFにしてくれる
 回路要素としてFDCE(=DFF)を使うと期待通りの動作をしてくれるでしょうVME/CAMACバスとのやりとり(Read for LUPO)
 RD_STRBが’1’の時にRDにデータを保持しておくVME/CAMACバスとのやりとり (for LUPO) WE_STRBが’1’から’0’に遷移したタイミングでWDからデータを取り込む

実際に値を読み出す場合 (LUPO)
whenでVME Address (CAMAC AF)
を場合分け RD_STRB=‘1’の間だけRDに値を保持しておけばよい◦ RD <= val;

それ以外はRDは切り離しておく◦ RD <= (others => ‘z’);
elsif (WR_STRB = ‘1’) then

実際に値を書き込む場合 (LUPO)
WR_STRB=‘1’の時にフラグを立てておく

1.

◦ set <= ‘1’;

WR_STRB’event and WR_STRB=‘0’の時にフラグが立っていれば値を代入する

2.

◦ val <= WR;

WR_STRB=‘0’になった時でもsetの値は保持しておく3.

◦set <= set;

setがDFFのCE(clock enable)に接続される

WRset
WR_STRB

elsif (WR_STRB = ‘1’) thenval

スケーラ（カウンタ）を作るeventを使って同期回路を作ればよい◦ cnt <= cnt + 1



データを読み出したい場合
はRD_STRB時に値をラッチしてあげないと時々不正な値を返す◦ 読み出し中にcntの値が変わるとアウト◦ 各ビット間で必ずskew（～20ps）があるスケーラ（カウンタ）値をラッチする

読み出し用のvectorを作ってあげる

iq <= cnt; ではない。
こうすると cnt - 1 を読み出すことになる。

使うライブラリを書いておく library IEEE; use IEEE.STD_LOGIC_1164.ALL;
 use IEEE.STD_LOGIC_ARITH.ALL;
 use IEEE.STD_LOGIC_UNSIGNED.ALL;◦ これらARITH等が無いと cnt <= cnt + 1 等ができない
ちなみにFDCE等組み込みライブラリを使ったものをシミュレーションする場合は下記のようにコメントアウトしておくシミュレーションする テストベンチをつくる初期値を設定
Implementation
Simulation切り替えこんな感じで書く clock部分は自動的に生成してくれる wait for 100ns; で100ns時間を進める

ダブルクリックでシミュレーション開始

ISimの画面全体を表示

1ステップ進める

LUPO/GTOにダウンロードする Generate Programming File◦ bitファイルができる

 Configure Target Device◦ iMPACTを起動◦ bitファイルからFlash memory用のファイルを作る◦ FPGAに書き込む

まずはPROM ＝ Flash Memory用ファイル

PROM用ファイル設定
GTOの場合はxcf02s

xcf04sを選んでAdd

Xilinx Flash/PROMを選んで押すPROMファイルを作る

ウィザード形式で１．デバイスを追加するか聞かれるのでYes
２．bitファイルを選ぶ
３．さらに用意するか聞かれるのでNo
ここをダブルクリックでファイルができる
MCSという拡張子

Download firmware

For FPGA, 電源切
ると中身が消える(bit file)

For Flash ROM,
不揮発性(mcs file)

Load FPGAをつけておくと、FlashROMを書いた時にFPGAにもロードしてくれる

やらかした例 conv_std_logic_vector
 5000000という数字を24bitのベクターに変換したい。
 conv_std_logic_vector(5000000, 24)◦ 正しい。

 conv_std_logic_vector(24, 5000000)◦ 24という数字を5000000bitのvectorに変換しようとする。
◦ Synthesizeがいっこうに終わらなくなる・・・（いつかは終わる）

downto （降順）と to（昇順）signal a : std_logic_vector(3 downto 0) := “3210”◦ vectorを使う時はdowntoが一般的◦ bitで初期値を書く時は一番右が0bit目なのが馴染み

type ARINT is array(3 downto 0) of integer;◦ constant b : ARINT := (0,1,2,3);◦ b(0)=3, b(1)=2, b(2)=1,b(3)=0 になるので注意type ARINT is array(0 to 3) of integer;◦ constant b : ARINT := (0,1,2,3);◦ b(0)=0, b(1)=1, b(2)=2,b(3)=3◦ 習慣の問題ですが・・・arrayの時はtoの方が馴染みやすいblack boxと言われる場合
attribute box_type : string; attribute box_type of FDCE : component is “black_box”;
 と書いておけばWarningが出なくなるまたは、Xilinx標準のライブラリを使う場合はCOMPONENTの宣言をせずに、下記をコメントアウトするだけでもよいLVDSを使う


IBUFDS入力◦ 入力の場合はUCFファイルのDIFF_TERMをTRUEにしておく◦ これでターミネータが入る

OBUFDS

出力GCLKとBUFGGCLKにアサインされているものはClock（配線時にSkew,Delayが少ない）として使える◦ IP0とLVDSClockp/n



それ以外でClock（多数の回路のClockとなるもの）として使いたい場合はBUFGにつなげる◦ Place & Route時に必要に応じて自動でつなげてくれる◦ UCFで以下の記述が必要



回路規模が大きくなってきた
らPlace & Route Reportは要チェック◦ BUFGMUXではなくLocalになっていて、Skewが大きい場合はPlanAheadを使って配線調整