FPGAリテラシー およびチュートリアル のページを久しぶりに更新しました。
Vivado の初心者用チュートリアルを自分で書こうと思ったのですが、Xilinx社のチュートリアルがよく出来ているので、その紹介を追加しました。
なお、Vivado_Tutorial/Tutorial_Created_Dataは演習1で作られるので、演習2からやる人は、Tutorial_Created_Dataフォルダを作製する必要があります。
チュートリアル・デザインファイルについての説明は、7ページの”チュートリアル デザイン ファイルのディレクトリ”にあります。
2013年09月10日 04:25 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:2
”ISE11.1iのチュートリアル7(FPGAのコンフィギュレーション)” の続き。
前回はJTAG経由でFPGAをコンフィギュレーションして、電子サイコロを動作させた。FPGAはパーソナルコンピュータと接続してコンフィグしなくても、電源ONでPlatform Flash PROMからコンフィグデータをダウンロードして自動的に回路が動作する仕組みがある。そのような仕組みがないとスタンドアロンで動作しないわけだけど。。。ちなみにFPGAは電源をOFFすると回路データを忘れてしまうのだ。(忘れないのもあるけど。。。)
それでは、Xilinx専用のPlatform Flash PROMに書きこむためのファイルを用意しよう。
前回のProject Navigatorの画面で、Processesペイン内のConfigure Target Device の下のGenerate Target PROM/ACE File をダブルクリックする。
Wanningダイアログが開く。OKボタンをクリックする。
ISE iMPACTが起動する。PROM File Formatter をダブルクリックする。
PROM File Formatter が開く。(こんな風になったんですね。びっくりしました)
Step 1. Select Storage Target を設定する。
Storage Device Type: はXilinx Flash/PROMを選択する。緑の矢印をクリックする。
Step 2. Add Storage Device(s) を設定しよう。
PROM Family はPlatform Flashを選択して、Device (bits) はxcf02s [2M] を選択する。
Add Storage Device をクリックして、Storage Deviceに追加する。
その後、緑矢印をクリックする。
Step 3. Enter Data を設定する。
File Name を設定する。今回はdice_top と入力する。
後は、デフォルトでOKかな? 今回はMCSファイルを生成する。EXOファイルでもOK。
最後のステップが終了したので、OKボタンをクリックする。
Add Device ダイアログが開く。OKボタンをクリックする。
Add Device のファイルを選択するダイアログが開く。dice_top.bit を選択して、開くボタンをクリックする。
もう一度、Add Device ダイアログが開く。もう、コンフィグするFPGAはないので、NOボタンをクリックする。
Add Device ダイアログが開く。やはり、コンフィグするFPGAはないので、OKボタンをクリックする。
iMPACT Processes ペインのGenerate File... をダブルクリックすると、dice_top.mcs が生成される。
Generate Succeeded と表示されたら成功だ。
さて、dice_top.mcs ファイルが生成できたので、これをPlatform Flash PROM に書きこもう。
Spartan3 Starter Kitをダウンロードケーブルでパーソナルコンピュータ(PC)に接続し、Spartan3 Starter Kitの電源をONにする。
ISE iMPACT のiMPACT Flows ペインのBoundary Scan をダブルクリックする。
後は、前回の
”ISE11.1iのチュートリアル7(FPGAのコンフィギュレーション)” と同様の手順で進行するが、xc3s200 が選択され、緑色のときにはBypassボタンをクリックする。
xcf02s が選択されているときには、dice_top.mcs を選択してOpenボタンをクリックする。
Device Programming Properties - Device 2 Programming Properties ダイアログはこんな感じ。OKボタンをクリック。
iMPACT ProcessesペインのAvailable Operations are: のProgram をダブルクリックする。
FPGAのコンフィギュレーションが成功すれば、Program Succeeded が表示される。これでPlatform Flash PROMをコンフィギュレーションできた。
これで電源ONで電子サイコロが動くコンフィグデータがそろった。
J8のM0、M1、M2をすべてショートすると(Master Serialモード)電源ONだけで電子サイコロが動作するようになる。
これにて終了。。。終わって良かった。。。
#う~。マウスを操作していて、腕がつった。。。
2009年05月17日 07:54 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:0
”ISE11.1iのチュートリアル6(デザインのインプリメント)” の続き。
インプリメント編はだいぶあっさり立ったような気がするが、一応初心者のためのチュートリアルという設定なので、この辺で良いだろうと思う。
次は、FPGAのJTAGからのコンフィギュレーションだ。それでは始めよう。
これからは、Spartan3 Starter Kitをダウンロードケーブルでパーソナルコンピュータ(PC)に接続する。Spartan3 Starter Kitに付属のダウンロードケーブルはパラレル接続だが、私のPCには、パラレルポートがないので、USB接続のダウンロードケーブルを使用した。これは、トラ技2009年6月号別冊の写真に載っている。
さて、Project NavigatorのProcessesペイン内のConfigure Target Device を展開し、Manage Configuration Project(iMPACT) をダブルクリックする。
そうしたらISE iMPACTが単独で立ち上がった。また、単独で上がるようになったんですね。。。びっくり。統合されていると思っていた。
iMPACT FlowsペインからBoundary Scan をダブルクリックする。
Initialize Chain アイコンをクリックする。
いろいろなダイアログが出て、Auto Assign Configuration Files Query Dialog が開く。ここでは.bit ファイルを割り当てる必要があるので、Yesボタンをクリックする。
Assign New Configuration File ダイアログが開く。xc3s200 が選択され、緑色になっている。dice_top.bit を選択してOpen ボタンをクリックする。
次は、xcf02s が選択されているはず。まだこのFLASH ROMに書くデータは生成していないので、Cancel All ボタンをクリックした。
Device Programming Properties - Device 1 Programming Properties ダイアログが開くので、OKボタンをクリックする。
iMPACT ProcessesペインのAvailable Operations are: のProgram をダブルクリックする。
FPGAのコンフィギュレーションが成功すれば、Program Succeeded が表示される。これでFPGAをコンフィギュレーションできた。
これで、FPGAが動作するようになった。最初はAN0の7セグメントLEDに1が表示されている。BTN0を押すと、サイコロが振られて、離すとサイコロの目が確定する。
”ISE11.1iのチュートリアル8(Platform Flash PROMへの書きこみ)” に続く。
2009年05月16日 21:50 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:0
”ISE11.1iのチュートリアル5(シミュレーション)” の続き。
さて、今度はインプリメントをしてみよう。まずは、前回のシミュレーションで直したreject_chatter.vhdの修正を元に戻す。
constant frequency_KHz : integer := 50000; -- KHz単位でのクロック周波数(インプリメント用) --constant frequency_KHz : integer := 1; -- KHz単位でのクロック周波数(シミュレーション用)
上のように修正してセーブする。
Design のSources for: をImplementationに変更する。
今回は一気に.bitファイルの生成までやってしまおう。
Hierarchyペインでdice_topが選択されていることを確認する。ProcessesペインでGenerate Programming File をダブルクリックする。そうすると、Synthsize(論理合成)、Translate、MAP、Place & Route、Generate Programming File を一気に実行する。
オレンジの?が消えて、黄色の三角か緑のチェックマークがつく。エラーの場合は赤のXマークがつく。黄色の三角はウォーニングがある場合だ。これで、Generate Programming File までのプロセスが終了した。
Design Summaryを見るとAll Constrains Met になっているので、period制約も満たしたことが分かる。
次は、タイミングリポートを見てみよう。ProcessesペインのImplement Designを展開する。その中のPlace & Route を展開し、その中のGenerate Post-Place & Route Static Timingを展開すると、Analyze Post-Place & Route Static Timing があるので、それをダブルクリックする。
Timing Report Tipsダイアログが開く。OKボタンをクリックしてダイアログを閉じる。
タイミングリーポートが見えて、タイミング制約が満足していることが分かる。
せっかくなので、Place & Routeの出来上がりをPlanAhead で見てみよう。
同様に、Place & Route の下のAnalyze Timing / Floorplan Design (PlanAhead) をダブルクリックする。
PlanAheadが立ち上がる。
FPGA内部の様子が見える。ほとんどリソースを使っていないので、すかすか。
これでインプリメントは終了したので、次はいよいよFPGAをコンフィギュレーションしてみる。
”ISE11.1iのチュートリアル7(FPGAのコンフィギュレーション)” に続く。
2009年05月16日 05:38 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:0
ISE11.1iのチュートリアル4(テストベンチの作成) の続き。
前回テストベンチを作ったので、今度はシミュレーションをしてみよう。シミュレーターとしてはISimを使用する。
Project NavigatorのDesignのHierarchyペインからdice_top_tb を選択しする。ProcessesペインのISim Simulatorを展開して、Simlate Behavioral Model をダブルクリックする。
ISimが起動して、シミュレーションを行った。
Zoom to Full Viewアイコンをクリックして、波形全体を表示する。
入力波形は予定した波形になっている。しかし、出力波形はb_nとc_n が0で、ほかのセグメントは1である。この7セグメントLEDは0で点灯するので、現在は1を表示している。リセットはちゃんとかかっているが、rollスイッチを押しているのに出力が変化しない。
これは、reject_chatter.vhdでスイッチのチャタリングを除去するために、クロックの25万回に1回サンプルことになっている。さらに、目で遷移しているのが見えるようにするために、その4倍の100万回クロックを数えないとステートマシンのステートが変わらないためだ。これを解消するには、少なくとも20万クロック以上シミュレーションしないとならないが時間もディスクも使用するため、シミュレーションするのは大変だ。そのようなときのために、50MHzはKHz単位にすると50,000である。これをconstantで定義してい置いて、シミュレーションのときには1に切り替える。(もっと良いと自分では思っている方法がある。それはpragmaとgenericを使う方法だ。詳しくは
”スパルタン3スタータキットでのISE8.1iのチュートリアル4(シミュレーション編)” を見てほしい)
--constant frequency_KHz : integer := 50000; -- KHz単位でのクロック周波数(インプリメント用) constant frequency_KHz : integer := 1; -- KHz単位でのクロック周波数(シミュレーション用)
これで、もう一度シミュレーションを行う。とりあえずISimをクローズしよう。その際にDefault.wcfg をセーブするかと聞いてくるので、Noボタンをクリックしておく。
もう一度、Project NavigatorのDesignのHierarchyペインからdice_top_tb を選択しする。ProcessesペインのISim Simulatorを展開して、Simlate Behavioral Model をダブルクリックして、ISim を立ち上げる。そうすると、修正したconstant値が採用されて、セグメントの値が変化しているのが分かる。
下位モジュールの信号も見てみよう。
左のInstance and Process... ペインのdice_top_tb の左の三角をクリックして展開する。その後、uut の左の三角もクリックして展開する。その中のinst_reject_chatterをクリックする。そうすると、太字で表示される。Objectsペインを見るとinst_reject_chatterの信号を表示する。その中からsw_cntとroll_cnt を右の波形ウインドウのあいているところにドラック&ドロップする。そうすると波形ウインドウに追加される。
こうすると、下のように信号が追加されるが、波形はまだ表示されていない。
同様に、inst_dice_smのcurrent_stateを波形ウインドウに追加する。さて、この追加した信号もシミュレーションしてみよう。
SimulationメニューからRestartを選択する。
すべての波形が消える。SimulationメニューからRunを選択する。
そうすると、先ほど波形ウインドウに登録した信号も波形が表示される。
これでシミュレーションは一応完了。
私は、まだ、ISimの使い方が良く分かっていないので、チュートリアルなどをやってみようと思っている。感じとしては、なかなか使えそうな感じだ。たぶん下のConsoleにコマンドを入れても使えるのだろう。
#しかし、チュートリアルは前回もそうだったが、書いていると疲れる。。。皆さんのためになるのかな?
”ISE11.1iのチュートリアル6(デザインのインプリメント)” に続く。
2009年05月15日 04:53 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:4
”ISE11.1iのチュートリアル3(制約 (UCF) の作成)” の続き。
今回はシミュレーションの準備のためにテストベンチを作る。ISE10.1までは、テストベンチを生成するツールがついていて、それによって簡易的にテストベンチを作れたが、今回はテンプレートを見ながら自分で作れということなので、1回り面倒になってしまった。以前のツールをそのままにしたもらったほうが下位モジュールを簡易にシミュレーションしたいときには便利だったのだが。。。復活を望む。
それでは、シミュレーション用のテストベンチを作るところから始めよう。
Project NavigatorのDesignの下のSources for: でBehavioral Simulationを選択する。
ProjectメニューからNew Source...を選択する。
New Source WizardのSelect Source Typeダイアログが開く。VHDL Test Bench を選んでFile Name : にdice_top_tb と入力して、Next > ボタンをクリックする。
Associate Sourceダイアログが開く。どのVHDLファイルのテストベンチかを指定する。ここでは、一番トップのdice_topを選択し、Next > ボタンをクリックする。
Summaryダイアログが開く。Finishボタンをクリックする。
そうすると、左のDesign、Hierarchyペインにはdice_top_tb.vhdが階層の一番上に作られる。
そして、右のWorkspaceペインには、生成されたdice_top_tb.vhd が表示される。一番前のコメント分を除いて、生成されたコードを下に示す。
LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; ENTITY dice_top_tb IS END dice_top_tb; ARCHITECTURE behavior OF dice_top_tb IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT dice_top PORT( reset_sw : IN std_logic; clk : IN std_logic; roll : IN std_logic; an_n : OUT std_logic_vector(3 downto 0); a_n : OUT std_logic; b_n : OUT std_logic; c_n : OUT std_logic; d_n : OUT std_logic; e_n : OUT std_logic; f_n : OUT std_logic; g_n : OUT std_logic; dp_n : OUT std_logic ); END COMPONENT; --Inputs signal reset_sw : std_logic := '0'; signal clk : std_logic := '0'; signal roll : std_logic := '0'; --Outputs signal an_n : std_logic_vector(3 downto 0); signal a_n : std_logic; signal b_n : std_logic; signal c_n : std_logic; signal d_n : std_logic; signal e_n : std_logic; signal f_n : std_logic; signal g_n : std_logic; signal dp_n : std_logic; -- Clock period definitions constant clk_period : time := 1us; BEGIN -- Instantiate the Unit Under Test (UUT) uut: dice_top PORT MAP ( reset_sw => reset_sw, clk => clk, roll => roll, an_n => an_n, a_n => a_n, b_n => b_n, c_n => c_n, d_n => d_n, e_n => e_n, f_n => f_n, g_n => g_n, dp_n => dp_n ); -- Clock process definitions clk_process :process begin clk <= '0'; wait for clk_period/2; clk <= '1'; wait for clk_period/2; end process; -- Stimulus process stim_proc: process begin -- hold reset state for 100ms. wait for 100ms; wait for clk_period*10; -- insert stimulus here wait; end process; END;
かなりのコードがテンプレートとして用意される。これだと出力の検証を入れなければ、入力のスティミュラスを生成すればよいことになる。
そこで、以前このブログで紹介した
タイミングチャートお絵かきツールTimingAnalyzer のVHDLテストベンチ生成スクリプトを使おうと思ってやってみたのだが、うまくスクリプトが動作しなかった。トラブル解析は後ですることにして、自分で入力波形を書いてみることにする。
下の図のタイミングチャート通りに波形を入力することにした。
スティミュラスを書きこんで、上のタイミングチャート通りの波形を作る。下が書き換えた部分のスティミュラスプロセスだ。
-- Stimulus process stim_proc: process begin -- クロックは0から始まっているので、1クロック期間waitしても0から0までのwaitなので、レースが起こる心配はない。 reset_sw <= '1'; roll <= '0'; -- hold reset state for clk_period. wait for clk_period; reset_sw <= '0'; wait for clk_period; -- 1クロック期間空けてからrollを1にする roll <= '1'; wait for clk_period*42; -- 42クロック期間空けてrollを0に戻す roll <= '0'; wait; end process;
最後に75行目のclk_periodが1usになっているので、これを動作周波数50MHzの周期20nsに変更する。
-- Clock period definitions constant clk_period : time := 20ns;
テストベンチを作ってみて、かなりの部分をツールが書いてくれるので、だいぶ楽だった。惜しいのは、今回はだいぶ簡単なスティミュラスだったので良いのだが、複雑になってくると、waitを入れるのが大変なのでTimingAnalyzerでテストベンチを生成できると良いと思った。それともあきらめて
procedureを使って書く とかしたほうが良いかも?
”ISE11.1iのチュートリアル5(シミュレーション)” 続く。
2009年05月14日 05:38 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:0