Powered by SmartDoc

例題による演習

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

本演習では, Verilog-HDLのRTL記述から, FPGA用の回路を論理合成するために, Altera社のQuartusIIを用いる. QuartusIIはFPGAベンダであるAltera社が開発しているツールである. Verilog-HDLのRTL(レジスタトランスファレベル)記述を入力とし,ターゲットとするFPGAの型番を入力し,ピン配置を指定すると,回路の合成からFPGAへの配置配線までを行うことができる.

過去の演習では, Synopsys社のFPGA Compiler IIや, Synplicity社のSynplify Pro等のFPGA向けの論理合成ツールを使用していたが, Quartus IIの論理合成機能の進化により, Quartus IIのみで十分となった.

ただし,大規模な回路の論理合成にはやはり,専用の論理合成ツールを使った方が性能が良くなることが多いのは事実である.

Verilog-HDLシミュレーション

  1. 本演習専用のディレクトリ(フォルダ)を作成する.以下では,すべてroulette以下に,ファイルを作成またはコピーする.
    % mkdir roulette
    % cd roulette
    
  2. シミュレーションと合成に用いるVerilog記述を用意する.下記のファイルをダウンロードする.
  3. 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
    

QuartusIIによる論理合成とFPGAの配置配線

  1. roulette.tclをダウンロードして, roulette/以下に置く.
  2. Quartus IIを立ち上げる(図2.3.3[Quartus起動後の画面]).
    % cd ~/roulette/
    % quartus
    
  3. 初回立ち上げ時には, 図2.3.1[初回起動時の選択画面]のウィンドウが表示されるので,そのまま, OKを押す.
    初回起動時の選択画面
  4. 次に, 図2.3.2[New Project]のウィンドウが表示されるので, "Yes"を選択する.間違って, Noを選択してしまった場合は, File→New Project Wizardを実行する.
    New Project
    Quartus起動後の画面
  5. Project Wizardウィンドウ(図2.3.4[Project Wizard 1])が表示されるので, Nextボタンを押す.
    Project Wizard 1
  6. 図2.3.5[Project Wizard 2]の通り,上から順番に表2.3.1[New Project Wizard: page 1 of 5 に入力する値]のように入力する.
    New Project Wizard: page 1 of 5 に入力する値
    フィールド名 入力値
    What is the working directory.. そのまま(ホームディレクトリ名/roulette)
    What is the name of the project roulette
    What is the name of the top-level design entity... roulette
    Project Wizard 2
  7. 図2.3.6[Project Wizard 3]の通り, roulette.vをFile Nameとして指定して, Finishボタンを押す.間違って途中で, Finishを押してしまった場合は, Project→Add/Remove Files in Projectを実行してroulette.vを指定する.
    Project Wizard 3
  8. Select Familyのウィンドウが表示された場合は, Cycloneを選択する. (表示されない場合はそのままで良い)
    Select Family
  9. Tools->Tcl Scriptsを実行し, Project内にあるroulette.tclを選択して, Runボタンを押す.これにより, FPGAデバイスの設定とボードに対応したピンのアサインが行なわれる.
    Tcl Scriptsを実行しても何も起こらない場合
    下記を実行する.
    1. roulette.tclがroulette以下のディレクトリにあるかを再度確認する.
    2. 存在しない場合は, roulette.tclを所定に場所に置く.
    3. Tools→OptionのInternet Connectivityを開き, Check the Altera web site for new Quartus II Informationのチェックをはずし, quartusを再起動する.
    4. Quartusを終了する
    5. 再度Quartusを立ち上げて, File->Open Projectで, rouletteを開き,再度Tools->Tcl Scriptsを実行する
    Select Family
  10. 紫の矢印(Start Compilation)を押す.
    Start Compilation

ボードへのダウンロード

  1. EthernetBlasterとFPGAボードに電源を入れる.
  2. Tools→Programmerを実行する.
  3. この手順は最初の書込の時だけ実行する.
    1. Hardware Setupボタンをクリックする. Add Hardwareボタンをクリックして, 図2.4.1[Add Hardware]の通り, EthernetBlasterに設定して"Auto Detect"ボタンを押す.
      Add Hardware
    2. 図2.4.2[Add Hardwareその2]の通り,指定されたServer NameのEthernetBlasterを選択して, Server Passwordに指定されたパスワードを入力する.
      Add Hardwareその2
    3. 図2.4.3[Hardware Setup]の通り, "Currently selected hardware"をEthernetBlasterに変更する.
      Hardware Setup
  4. Program/Configureのところにチェックが入っているか確認し,入っていなければチェックを入れる. (図2.4.4[roulette.sofの選択]).
    roulette.sofの選択
  5. Startボタンを押すと, FPGAへの書込が始まる.
  6. 書込が終了すると, 7セグメントLEDの一つが回り始める.クロック周波数を変えるつまみを回して,回転する速度が変化することを確認せよ.