FC2カウンター FPGAの部屋 FPGAリテラシー及びチュートリアル

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

FPGAリテラシー およびチュートリアルのページを更新

FPGAリテラシー およびチュートリアルのページを久しぶりに更新しました。
Vivado の初心者用チュートリアルを自分で書こうと思ったのですが、Xilinx社のチュートリアルがよく出来ているので、その紹介を追加しました。
なお、Vivado_Tutorial/Tutorial_Created_Dataは演習1で作られるので、演習2からやる人は、Tutorial_Created_Dataフォルダを作製する必要があります。
チュートリアル・デザインファイルについての説明は、7ページの”チュートリアル デザイン ファイルのディレクトリ”にあります。
  1. 2013年09月10日 04:25 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:0

無償 ISE WebPACK と 無償 ModelSim Xilinx Edition III のインストール方法

無償 ISE WebPACK のインストール方法無償 ModelSim Xilinx Edition III のインストール方法 のPDFがXilinxのサイトにあったので、忘れないように覚書を書いておく。
  1. 2010年05月20日 17:17 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:0

ISE11.1iのチュートリアル8(Platform Flash PROMへの書きこみ)

”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 をダブルクリックする。
ISE11_1_tutorial_69_090516.png

Wanningダイアログが開く。OKボタンをクリックする。
ISE11_1_tutorial_70_090516.png

ISE iMPACTが起動する。PROM File Formatter をダブルクリックする。
ISE11_1_tutorial_71_090516.png

PROM File Formatter が開く。(こんな風になったんですね。びっくりしました)
Step 1. Select Storage Target を設定する。
Storage Device Type: はXilinx Flash/PROMを選択する。緑の矢印をクリックする。
ISE11_1_tutorial_72_090516.png

Step 2. Add Storage Device(s) を設定しよう。
PROM Family はPlatform Flashを選択して、Device (bits) はxcf02s [2M] を選択する。
Add Storage Device をクリックして、Storage Deviceに追加する。
その後、緑矢印をクリックする。
ISE11_1_tutorial_73_090516.png

Step 3. Enter Data を設定する。
File Name を設定する。今回はdice_top と入力する。
後は、デフォルトでOKかな? 今回はMCSファイルを生成する。EXOファイルでもOK。
最後のステップが終了したので、OKボタンをクリックする。
ISE11_1_tutorial_74_090516.png

Add Device ダイアログが開く。OKボタンをクリックする。
ISE11_1_tutorial_75_090516.png

Add Device のファイルを選択するダイアログが開く。dice_top.bit を選択して、開くボタンをクリックする。
ISE11_1_tutorial_76_090516.png

もう一度、Add Device ダイアログが開く。もう、コンフィグするFPGAはないので、NOボタンをクリックする。
ISE11_1_tutorial_77_090516.png

Add Device ダイアログが開く。やはり、コンフィグするFPGAはないので、OKボタンをクリックする。
ISE11_1_tutorial_78_090516.png

iMPACT Processes ペインのGenerate File... をダブルクリックすると、dice_top.mcs が生成される。
ISE11_1_tutorial_79_090516.png

Generate Succeeded と表示されたら成功だ。
ISE11_1_tutorial_80_090516.png

さて、dice_top.mcs ファイルが生成できたので、これをPlatform Flash PROM に書きこもう。
Spartan3 Starter Kitをダウンロードケーブルでパーソナルコンピュータ(PC)に接続し、Spartan3 Starter Kitの電源をONにする。
ISE iMPACT のiMPACT Flows ペインのBoundary Scan をダブルクリックする。
ISE11_1_tutorial_81_090516.png

後は、前回の”ISE11.1iのチュートリアル7(FPGAのコンフィギュレーション)”と同様の手順で進行するが、xc3s200 が選択され、緑色のときにはBypassボタンをクリックする。
ISE11_1_tutorial_82_090516.png

xcf02s が選択されているときには、dice_top.mcs を選択してOpenボタンをクリックする。
ISE11_1_tutorial_83_090516.png

Device Programming Properties - Device 2 Programming Properties ダイアログはこんな感じ。OKボタンをクリック。
ISE11_1_tutorial_84_090516.png

iMPACT ProcessesペインのAvailable Operations are: のProgram をダブルクリックする。
ISE11_1_tutorial_85_090516.png

FPGAのコンフィギュレーションが成功すれば、Program Succeeded が表示される。これでPlatform Flash PROMをコンフィギュレーションできた。
ISE11_1_tutorial_86_090516.png

これで電源ONで電子サイコロが動くコンフィグデータがそろった。
J8のM0、M1、M2をすべてショートすると(Master Serialモード)電源ONだけで電子サイコロが動作するようになる。
ISE11_1_tutorial_87_090517.jpg

これにて終了。。。終わって良かった。。。
#う~。マウスを操作していて、腕がつった。。。

  1. 2009年05月17日 07:54 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:0

ISE11.1iのチュートリアル7(FPGAのコンフィギュレーション)

”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) をダブルクリックする。
ISE11_1_tutorial_59_090516.png

そうしたらISE iMPACTが単独で立ち上がった。また、単独で上がるようになったんですね。。。びっくり。統合されていると思っていた。
iMPACT FlowsペインからBoundary Scan をダブルクリックする。
ISE11_1_tutorial_60_090516.png

Initialize Chain アイコンをクリックする。
ISE11_1_tutorial_61_090516.png

いろいろなダイアログが出て、Auto Assign Configuration Files Query Dialog が開く。ここでは.bit ファイルを割り当てる必要があるので、Yesボタンをクリックする。
ISE11_1_tutorial_62_090516.png

Assign New Configuration File ダイアログが開く。xc3s200 が選択され、緑色になっている。dice_top.bit を選択してOpen ボタンをクリックする。
ISE11_1_tutorial_63_090516.png

次は、xcf02s が選択されているはず。まだこのFLASH ROMに書くデータは生成していないので、Cancel All ボタンをクリックした。
ISE11_1_tutorial_64_090516.png

Device Programming Properties - Device 1 Programming Properties ダイアログが開くので、OKボタンをクリックする。
ISE11_1_tutorial_65_090516.png

iMPACT ProcessesペインのAvailable Operations are: のProgram をダブルクリックする。
ISE11_1_tutorial_66_090516.png

FPGAのコンフィギュレーションが成功すれば、Program Succeeded が表示される。これでFPGAをコンフィギュレーションできた。
ISE11_1_tutorial_67_090516.png

これで、FPGAが動作するようになった。最初はAN0の7セグメントLEDに1が表示されている。BTN0を押すと、サイコロが振られて、離すとサイコロの目が確定する。
ISE11_1_tutorial_68_090516.jpg

”ISE11.1iのチュートリアル8(Platform Flash PROMへの書きこみ)”に続く。

  1. 2009年05月16日 21:50 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:0

ISE11.1iのチュートリアル6(デザインのインプリメント)

”ISE11.1iのチュートリアル5(シミュレーション)”の続き。

さて、今度はインプリメントをしてみよう。まずは、前回のシミュレーションで直したreject_chatter.vhdの修正を元に戻す。

constant frequency_KHz : integer := 50000; -- KHz単位でのクロック周波数(インプリメント用)
--constant frequency_KHz : integer := 1; -- KHz単位でのクロック周波数(シミュレーション用)


上のように修正してセーブする。
Design のSources for: をImplementationに変更する。
ISE11_1_tutorial_51_090513.png

今回は一気に.bitファイルの生成までやってしまおう。
Hierarchyペインでdice_topが選択されていることを確認する。ProcessesペインでGenerate Programming File をダブルクリックする。そうすると、Synthsize(論理合成)、Translate、MAP、Place & Route、Generate Programming File を一気に実行する。
ISE11_1_tutorial_52_090513.png

オレンジの?が消えて、黄色の三角か緑のチェックマークがつく。エラーの場合は赤のXマークがつく。黄色の三角はウォーニングがある場合だ。これで、Generate Programming File までのプロセスが終了した。
ISE11_1_tutorial_53_090513.png

Design Summaryを見るとAll Constrains Met になっているので、period制約も満たしたことが分かる。
ISE11_1_tutorial_54_090513.png

次は、タイミングリポートを見てみよう。ProcessesペインのImplement Designを展開する。その中のPlace & Route を展開し、その中のGenerate Post-Place & Route Static Timingを展開すると、Analyze Post-Place & Route Static Timing があるので、それをダブルクリックする。
ISE11_1_tutorial_55_090516.png

Timing Report Tipsダイアログが開く。OKボタンをクリックしてダイアログを閉じる。
タイミングリーポートが見えて、タイミング制約が満足していることが分かる。
ISE11_1_tutorial_56_090516.png

せっかくなので、Place & Routeの出来上がりをPlanAhead で見てみよう。
同様に、Place & Route の下のAnalyze Timing / Floorplan Design (PlanAhead) をダブルクリックする。
ISE11_1_tutorial_57_090516.png

PlanAheadが立ち上がる。
FPGA内部の様子が見える。ほとんどリソースを使っていないので、すかすか。
ISE11_1_tutorial_58_090516.png

これでインプリメントは終了したので、次はいよいよFPGAをコンフィギュレーションしてみる。

”ISE11.1iのチュートリアル7(FPGAのコンフィギュレーション)”に続く。

  1. 2009年05月16日 05:38 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:0

ISE11.1iのチュートリアル5(シミュレーション)

ISE11.1iのチュートリアル4(テストベンチの作成)の続き。

前回テストベンチを作ったので、今度はシミュレーションをしてみよう。シミュレーターとしてはISimを使用する。
Project NavigatorのDesignのHierarchyペインからdice_top_tb を選択しする。ProcessesペインのISim Simulatorを展開して、Simlate Behavioral Model をダブルクリックする。
ISE11_1_tutorial_41_090513.png

ISimが起動して、シミュレーションを行った。
ISE11_1_tutorial_42_090513.png

Zoom to Full Viewアイコンをクリックして、波形全体を表示する。
ISE11_1_tutorial_43_090513.png

入力波形は予定した波形になっている。しかし、出力波形はb_nとc_n が0で、ほかのセグメントは1である。この7セグメントLEDは0で点灯するので、現在は1を表示している。リセットはちゃんとかかっているが、rollスイッチを押しているのに出力が変化しない。
ISE11_1_tutorial_44_090513.png

これは、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値が採用されて、セグメントの値が変化しているのが分かる。
ISE11_1_tutorial_45_090513.png

下位モジュールの信号も見てみよう。
左のInstance and Process... ペインのdice_top_tb の左の三角をクリックして展開する。その後、uut の左の三角もクリックして展開する。その中のinst_reject_chatterをクリックする。そうすると、太字で表示される。Objectsペインを見るとinst_reject_chatterの信号を表示する。その中からsw_cntとroll_cnt を右の波形ウインドウのあいているところにドラック&ドロップする。そうすると波形ウインドウに追加される。
ISE11_1_tutorial_46_090513.png

こうすると、下のように信号が追加されるが、波形はまだ表示されていない。
ISE11_1_tutorial_47_090513.png

同様に、inst_dice_smのcurrent_stateを波形ウインドウに追加する。さて、この追加した信号もシミュレーションしてみよう。
SimulationメニューからRestartを選択する。
ISE11_1_tutorial_48_090513.png

すべての波形が消える。SimulationメニューからRunを選択する。
ISE11_1_tutorial_49_090513.png

そうすると、先ほど波形ウインドウに登録した信号も波形が表示される。
ISE11_1_tutorial_50_090513.png

これでシミュレーションは一応完了。
私は、まだ、ISimの使い方が良く分かっていないので、チュートリアルなどをやってみようと思っている。感じとしては、なかなか使えそうな感じだ。たぶん下のConsoleにコマンドを入れても使えるのだろう。

#しかし、チュートリアルは前回もそうだったが、書いていると疲れる。。。皆さんのためになるのかな?

”ISE11.1iのチュートリアル6(デザインのインプリメント)”に続く。
  1. 2009年05月15日 04:53 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:4

ISE11.1iのチュートリアル4(テストベンチの作成)

”ISE11.1iのチュートリアル3(制約 (UCF) の作成)”の続き。

今回はシミュレーションの準備のためにテストベンチを作る。ISE10.1までは、テストベンチを生成するツールがついていて、それによって簡易的にテストベンチを作れたが、今回はテンプレートを見ながら自分で作れということなので、1回り面倒になってしまった。以前のツールをそのままにしたもらったほうが下位モジュールを簡易にシミュレーションしたいときには便利だったのだが。。。復活を望む。

それでは、シミュレーション用のテストベンチを作るところから始めよう。
Project NavigatorのDesignの下のSources for: でBehavioral Simulationを選択する。
ISE11_1_tutorial_34_090513.png

ProjectメニューからNew Source...を選択する。
ISE11_1_tutorial_35_090513.png

New Source WizardのSelect Source Typeダイアログが開く。VHDL Test Bench を選んでFile Name : にdice_top_tb と入力して、Next > ボタンをクリックする。
ISE11_1_tutorial_36_090513.png

Associate Sourceダイアログが開く。どのVHDLファイルのテストベンチかを指定する。ここでは、一番トップのdice_topを選択し、Next > ボタンをクリックする。
ISE11_1_tutorial_37_090513.png

Summaryダイアログが開く。Finishボタンをクリックする。
ISE11_1_tutorial_38_090513.png

そうすると、左のDesign、Hierarchyペインにはdice_top_tb.vhdが階層の一番上に作られる。
ISE11_1_tutorial_39_090513.png

そして、右の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テストベンチ生成スクリプトを使おうと思ってやってみたのだが、うまくスクリプトが動作しなかった。トラブル解析は後ですることにして、自分で入力波形を書いてみることにする。
下の図のタイミングチャート通りに波形を入力することにした。
ISE11_1_tutorial_40_090513.png

スティミュラスを書きこんで、上のタイミングチャート通りの波形を作る。下が書き換えた部分のスティミュラスプロセスだ。

    -- 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(シミュレーション)”続く。
  1. 2009年05月14日 05:38 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:0
»