Powered by SmartDoc

例題による演習

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

本演習では, Verilog-HDLのRTL記述から, FPGA用の回路を論理合成するために, Synopsys社のFPGA Compiler II(以下FCIIと略す)を用いる. FCIIはVerilog-HDLのRTL(レジスタトランスファレベル)記述を入力とし,ターゲットとするFPGAのベンダ名,型番を入力するだけで,面倒な設定なしにFPGA用の回路の合成を行うことができる.

FCIIは, circuitというモジュール名に対して, circuit.edfというEDIFフォーマットのネットリストファイルと,使用するFPGAの名前等を記述したcircuit.acfという2個のファイルを出力する.

FPGAの配置配線に使用するのは,今回使用するFPGAのベンダであるALTERA社のMAX+PLUSII(以下, MPII)である. MPIIは, FCIIから出力された.edfファイルとと.acfをもとに, FPGAの配置配線を行う.出力は,配置配線結果を格納した. acfファイルとFPGA内部のコンフィグレーションSRAMデータを格納したファイルである. FPGAのコンフィギュレーションデータは各種のフォーマットがあるが,標準ではsof, ttf, pofといったファイルが出力される. MPIIは,シリアルもしくはパラレルインタフェースを通じてこのSRAMオブジェクトファイルをデバイスにダウンロードする機能も有する. acfファイルはSynplifyから出力されるが, MPIIで一度FPGAの配置配線を実行すれば上書きされる.

Verilog-HDLシミュレーション

  1. シミュレーションと合成に用いるVerilog記述を用意する.下記のファイルをダウンロードする.
  2. verilogコマンドによりVerilog-XLシミュレータを実行する.

    % verilog roulettesim.v roulette.v
    

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

         0: xxxxxx
        10: 000001
        30: 000010
     40990: 000100
     81950: 001000
    122910: 010000
    163870: 100000
    

    ここで用いるVerilog記述は, 7セグメントLEDをルーレット状に光らせる回路である.シミュレーション結果ではルーレットで点灯するLEDに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)
        begin
          if(!RST)
            begin
              out<=1;divide<=0;
            end
          else
            begin
              if(divide==0)// 2048回数えたら, ルーレットを一つ進める. 
                begin
                  out[0]<=out[5];
                  out[1]<=out[0];
                  out[2]<=out[1];
                  out[3]<=out[2];
                  out[4]<=out[3];
                  out[5]<=out[4];
                end
              divide<=divide+1; // クロック毎に1カウントアップ. 
            end
        end
    endmodule
    
    テストフィクスチャ roulettesim.v
    `timescale 1ns/100ps 
      // シミュレーションの単位を1nsにして, 100psの精度で出力を表示します. 
    module roulettesim;
      reg CLK,RST;
      wire [5:0] out;
    `ifdef MAX
        roulette I0(.out5(out[5]),.out4(out[4]),.out3(out[3]),.out2(out[2]),
          .out1(out[1]),.out0(out[0]),.CLK(CLK),.RST(RST));
         // この書式については, 後程説明する. 
    `else
      roulette I0(.out(out),.CLK(CLK),.RST(RST));
    `endif
      initial begin 
        CLK=0;RST=1;
        #10 RST=0;
        #10 RST=1;// 10nsリセットを入れる. 
        #200000 $finish;// その後, 200usec動作させる. 
      end
      always #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の読み込み
        
    `endif
    endmodule
    

FGPA CompilerIIによる論理合成

  1. FPGA Compiler IIを立ち上げる. (図[FPGA CompilerIIの起動画面])最初に, 図[最初に表示されるが, Cancelボタンを押す]のウィンドウが表示されるが, Cancelボタンを押す.
    % fc2
    
    最初に表示されるが, Cancelボタンを押す
    FPGA CompilerIIの起動画面
  2. File→New Projectを選択して,プロジェクトの名前を入力する.これは,任意の名前にして良いが,通常は,最上位のmodule名と同じにする.入力した後は, Createのボタンを押す.ここでは,プロジェクトの名前(Name欄)はrouletteとする. (図[新規プロジェクトの作成])
    新規プロジェクトの作成
  3. Identify Sourcesというウインドウが出てくるので,必要なソースファイル(roulette.v)を選択する.なお,このあとの演習等で複数のファイルを選択したいときは, Ctrlキーを押しながらマウスをクリックする. (図[ソースファイルの指定])
    ソースファイルの指定
    削除するとき
    削除するソース上で右クリックし,「Remove」を実行する.そのファイル自体が消えてしまうわけではない.
    追加するとき
    Design Sourcesウィンドウの, WORK上で「右クリック+Add sources in WORK」を実行すると, Identify Sourcesウィンドウが現れる.
  4. ウインドウの左側に,ソースが,表示される.最上位階層が含まれるソース(roulette.v)をダブルクリックすると, module名(roulette)が見える. (図[ソースの設定完了後の画面(roulette.vをダブルクリックする)])
    ソースの設定完了後の画面(roulette.vをダブルクリックする)
  5. module名のところ(図の一番下のrouletteの部分)でマウスを右クリックし, Create Implementationを選択する. (図[初期合成(Create Implementation)])

    deviceは表[デバイスの指定]のように指定する.

    初期合成(Create Implementation)
    デバイスの指定
    Vendor Altera Device EPF10K40RC208
    Family FLEX10K Speed Grade -4
  6. 右側のChipsウィンドウに作成されたデバイス(roulette)および,それを最適化したもの(roulette-optimized)が表示される. (図[最適化後の画面])
    最適化後の画面
  7. 次に右のChipsウィンドウの上部のmodule(ここではroulette)でマウスを右クリックして, Edit Constraintsを実行する. Portsのところを最前面に出して, Pad Locに,ピンの番号を入力して,入出力ピンを表[ピン番号の指定]に示す通りの位置に割り当てる. (図[ピン配置の指定])入力が終わったら, OKボタンを押して,このウィンドウを閉じる.
    ピン配置の指定
    ピン番号の指定
    ピン名 Pad Loc
    out5 206
    out4 205
    out3 204
    out2 203
    out1 202
    out0 200
    CLK 183
    RST 180
  8. ここで, roulette-Optimizedのチップアイコンに?マークが表示されていることを確認する. ?マークがない場合は, Edit Contstraintsのウィンドウがまだアイコン化されているか,開いているはずである.
  9. 次に,上記のピン配置にしたがって,再度論理合成を行う.以下のどちらかを実行する.

    うまく行くと, roulette-Optimizedのチップアイコンの?マークが消えるはずである.必ず消えていることを確認すること. (図[最適化結果の確認])

    最適化結果の確認
  10. ピンのアサインがうまくいっているかを,確かめるために, roulette-Optimizedの黄色いチップアイコンで右クリックして, View Resultsを実行する. Edit Constraintsと同様に, Portsのところを最前面に持ってきて, Edit Constraintsで入力したピンアサインが正しく反映されていることを確認せよ.ここで, Pad Locが空欄になっている場合は, Edit Contstraintsか, View Schematicのウィンドウがまだアイコン化されているか,開いているはずである.そのウィンドウを閉じて,もう一度Optimize ChipもしくはUpdate Chipを実行する.
  11. Optimizedの黄色いチップアイコンで右クリックして, Export Netlistを実行する. EDIFフォーマットで,ネットリストを出力する. (図[ネットリストの出力])
    ネットリストの出力

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

MAX+PLUS2による配置配線

  1. ボードが接続されているマシンにrloginによりログインする
    % rlogin マシン名
    
  2. ディスプレイ環境変数を設定する
    % setenv DISPLAY 自分のマシン名:0
    
  3. MAX+plusIIを立ち上げる.
    % max2win
    
  4. 最初に図[フォントの警告]のメッセージが出るがOKを押して,次に進む.
    フォントの警告
  5. はじめて立ち上げるときだけ, 図[ライセンスの確認]のウィンドウが表示される.文面を確認の上, Yesを押す.
    ライセンスの確認
  6. File→Project→Nameで,先ほど作成したデザインの名前のディレクトリ(フォルダ)の``デザイン名.edf''というファイルを指定する. (図[デザインの指定])

    デザインの指定

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

  7. MAX+plus II→Compilerで,コンパイラウィンドウを開く. (図[コンパイラウィンドウ])
    コンパイラウィンドウ
  8. 今回演習に使用するMAX+PLUSII 10.1は,バグがあるためか,下記の処理を実行しないと正しく配置配線できない.この処理は各設計(project)毎に行うこと.ただし各設計毎に一度実行しておけば良い.

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

    Fitter Setting

    ここで,もっとも上の``Use Quartus Fitter for FLEX 10K and ACEX 1K Devices''のチェックをはずす.

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

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

ボードへのダウンロード

  1. ワークステーションのシリアルポートおよびボードにケーブルを接続して,電源を入れる.ケーブルの向きは図図[FPGAボードの構成]を参照する.
  2. MAX+plusII→Programmerを実行する.
    Programmer
  3. 最初の書込の時だけ, Options→Hardware Setupを実行して, Hardwareを, MasterBlaster(COM)に変更する. (図[Hardware Setup])
    Hardware Setup
  4. ProgrammerウィンドウのConfigureを実行する.

ボードのリセットスイッチを押すと, LEDの点灯部分が廻り出す.またリセットスイッチを押してルーレットが止ることを確かめよ.