製品情報>Spartan-6評価ボード>開発チュートリアル>最初のデザイン

最初のデザイン

最初のデザイン

それでは、XILINX ISEを使って開発を行うことにします。

最初に作るのは、LEDチカチカです。

本ボードには8個のLEDが搭載されているので、これをチカチカさせてみることにしましょう。

そして、基板上のプッシュスイッチが押されたら、チカチカの点滅方法を変えるようなデザインにします。

 

開発の流れは、

という手順で行います。

 

ISEにおけるプロジェクト作成方法

XILINX ISEを起動したら、Fileメニューの中のNewProjectを選択します。

 

図1 ISEプロジェクトの新規作成

 

プロジェクト名とフォルダの指定

New Project Wizardというダイアログが開くので、

Nameのところにプロジェクトの名前(ここではledchika)を、LocationとWorking Directoryのところにプロジェクトの格納されるフォルダ名(ここではc:¥naitou¥tutorial¥ledchika)を入力します。

 

図2 プロジェクト名とフォルダの指定

 

デバイスの選択

次に開くダイアログで、以下の設定をします。

  • FamilyをSpartan6にします。
  • Deviceはご利用のボードに合わせたもの(TKDN-SP6-ESとTKDN-SP6-16ならXC6SLX16を、TKDN-SP6-45ならXC6SLX45を選択)します。
  • PackageはCSG324を選択します。
  • Speedは-2か-3を選択します。
  • Preferred Languageは、好みに合わせてVHDLまたはVerilogを選択します。

図3 デバイスの選択

 

確認画面が出るので、Finishを押して完了です。

図4 プロジェクトの確認

 

出来上がったプロジェクトの確認

ISEの左上のところに、下の図のようなツリー(中身はまだ空)が出来ているはずです。

図5 出来上がったプロジェクトの確認

 

ソースファイルの作成

新規のソースファイル(VHDLまたはVerilogファイルのこと)を作成するには、プロジェクトツリーのデバイス名のところで右クリックをし、New Sourceを実行します。

 

図6 ソースファイルの新規作成

 

New Source Wizardというダイアログが開くので、「VHDL Module」を選択します。File nameの欄には、メインとなるモジュールのファイル名を入力します。ここではledchika.vhdとしました。

(Verilog派の方はVerilog Moduleを選択し、ファイルの拡張子は.vとなります)

図7 VHDLファイルの新規作成

 

入出力ポートの定義

次の画面では、VHDLファイルで記述するモジュールの入出力ポートを定義します。

 

このサンプルデザインでは、水晶発振器からのクロックを受け取るポート、プッシュスイッチの状態を見るポート、LEDへ値を出力するポートの3種類のポートを定義します。

ポートの名前は、入出力がわかるように、末尾に_ip、_op、_bpをつけておくとよいでしょう。(_bpは双方向)

こうしておくと、回路内部の信号と外部のポートとの区別がしやすくなり、方向もわかるので便利です。

New Source Wizardの画面であ、Port Nameのところにxtalclk_ipと、pushsw_ipと、led_opの3種類のポートを定義してください。led_opは出力ポートなのでDirectionをoutに変更し、BusのチェックボックスをONにし、MSBに7、LSBに0と記述してください。

これでNextを押します。

 

図8 入出力ポートの定義

 

確認画面が出たら、Finishを押します。

図9 入出力ポートの定義の確認

 

すると、VHDLファイルの雛型が出来上がり、ISEの中で開かれます。

図10 VHDLファイルが作成されたISEプロジェクト

 

ISEのうれしいところは、この時点でVHDLの雛型が出来ていて、しかも、library IEEE・・などのおまじない構文が自動的に書かれていることです。

 

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

 

-- Uncomment the following library declaration if using

-- arithmetic functions with Signed or Unsigned values

--use IEEE.NUMERIC_STD.ALL;

 

-- Uncomment the following library declaration if instantiating

-- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

 

entity ledchika is

    Port ( xtalclk_ip : in  STD_LOGIC;

           pushsw_ip : in  STD_LOGIC;

           led_op : out  STD_LOGIC_VECTOR (7 downto 0));

end ledchika;

 

architecture Behavioral of ledchika is

 

begin

 

 

end Behavioral;

 

 

リスト1 新規に作成されたVHDLファイル

ここで、先頭の

use IEEE.STD_LOGIC_1164.ALL;

に加えて、

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

を追加することをお勧めします。

 

また、FPGAに用意されたプリミティブを使いたい場合は、

--library UNISIM;

--use UNISIM.VComponents.all;

のコメントを外してください。

 

VHDLはarchitecture〜begin〜endという構造をしていて、architectureとbegin間では信号や定数の宣言を行い、beginとendの間では論理式の記述を行います。

architecture

 

 信号や定数の宣言

 

begin

 

 論理式の記述

 

end

リスト2 VHDLの構造

 

ソースファイルの記述(信号の宣言)

入出力ポートとおまじない構文が出来たら、つぎは内部で使う信号名を宣言します。

このデザインではxtalclk_ip、pushsw_ip、led_opというポートを宣言しましたが、それに対応する信号をつくってやることにします。

したがって、architectureとbeginとの間に、次の信号を宣言します。

signal xtalclk : std_logic;

signal pushsw  : std_logic;

signal led     : std_logic_vector(7 downto 0);

signal count   : std_logic_vector(19 downto 0);

リスト3 VHDLでの信号の宣言

ここで、std_logicというのは普通の信号であることを、std_logic_vectorというのはバスであることを示します。

 

※std_logicの他には、integerやboolean、realなどがありますが、std_logic_vectorとinteger以外は使わないようにします。それ以外のはシミュレーション用や、定数の宣言用と思っておいたほうがよいでしょう。

※downto構文をつかってバス幅を指定します。to構文もありますが、使わないほうがよいでしょう。

 

ソースファイルの記述(論理式の記述)

先ほど作った信号のうち、xtalclk、pushsw、ledをポートにつなぎます。

信号とポートをつなぐには<=演算子を使います。<=演算子は、右にある信号(やポート)を左の信号(やポート)につなぐというものです。

 

xtalclk <= xtalclk_ip;

pushsw <= pushsw_ip;

led_op <= led;

リスト4 ポートと信号の接続

 

つまり、外部のポートから来たxtalclk_ipを内部のxtalclk信号につなぎ、外部のポートから来たpushsw_ipを内部のpushsw信号につなぎ、内部のled信号をled_opポートから出力するということです。

 

本当はポート名のxtalclk_ipなどを信号と同じように使うことができるので、内部の信号に一回渡す上記の方法は面倒くさいです。ですが、この手順をきちんと行っておくと、回路の規模が大きくなってきたときにわかりやすくなりますので、できるだけこのようにしてください。

 

クロックに同期した回路の記述

次に、クロックに同期した部分を記述します。

VHDLではクロックを扱うには、

    process(クロック名) begin

        if(クロック名'event and クロック名='1') then

 

           記述したいクロック同期の論理式

 

        end if;

    end process;

という構文を使います。

 

この式の中心にある「記述したいクロック同期の論理式」の部分は、クロックが入るたびに1回だけ動きます。

 

このサンプルデザインではクロックが入ると内部のcountという信号をカウントアップさせます。coutは20ビットなので0〜1048576まで数えることができます。クロックは50MHzなので約0.02秒でオーバーフローします。

バイナリカウンタはオーバーフローすると0に戻るので、このカウンタの値が0ならば、オーバーフローがおきたことがわかります。これをトリガにして、ledという名の新たなカウンタをカウントアップすることにします。

すると、ledというカウンタは、0.02秒の周期で0〜255までカウントアップすることになります。

 

process (xtalclk) begin

    if (xtalclk'event and xtalclk='1') then

        count <= count + 1; -- 50MHzでカウントアップ

        if (count = 0) then -- 約0.02秒でcountは0に戻る

            led <= led + 1; -- そのときledをカウントアップ

        end if;

    end if;

end process;

リスト5 LEDチカチカの論理回路

 

led信号は、led_opにつながっているので、カウントアップするのがLEDの光り方で見えるはずです。

 

入力信号を使う

LEDをチカチカするだけでは面白くないので、プッシュスイッチが押されたらLEDの動作を変えるようにしてみましょう。ここでは、LEDが押されたら、

○○○○○●○●

○○○○●○●○

○○○●○●○○

○○●○●○○○

というふうな動作、いわゆるシフト動作を行います。

 

VHDLでは、std_logic_vectorで定義されたバスの一部分を切り出すには(数字 downto 数字)構文を使います。バスに、他のバスや信号をくっつけるには&演算子を使います。

したがって、左シフト動作は以下のように記述できます。

led <= led(6 downto 0) & led(7);

 

トリガが入るたびに、現在のledの値が左にシフトするようになります。

 

できあがったソースファイルのすべて

こうしてできあがったソースファイルのすべてを記載します。

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

-- Uncomment the following library declaration if using

-- arithmetic functions with Signed or Unsigned values

--use IEEE.NUMERIC_STD.ALL;

 

-- Uncomment the following library declaration if instantiating

-- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

 

entity ledchika is

    Port ( xtalclk_ip : in  STD_LOGIC;

           pushsw_ip : in  STD_LOGIC;

           led_op : out  STD_LOGIC_VECTOR (7 downto 0));

end ledchika;

 

architecture Behavioral of ledchika is

    signal xtalclk : std_logic;

    signal pushsw  : std_logic;

    signal led     : std_logic_vector(7 downto 0);

    signal count   : std_logic_vector(19 downto 0);

 

begin

 

    --信号とポートをつなぐ

    xtalclk <= xtalclk_ip;

    pushsw <= pushsw_ip;

    led_op <= led;

 

    process (xtalclk) begin

        if (xtalclk'event and xtalclk='1') then

            count <= count + 1; -- 50MHzでカウントアップ

            if (count = 0) then -- 約0.02秒でcountは0に戻る

              if (pushsw = '0') then -- スイッチが押されてなければ

                  led <= led + 1; -- ledをカウントアップ

              else

                  led <= led(6 downto 0) & led(7); -- シフト

              end if;

            end if;

        end if;

    end process;

end Behavioral;

 

リスト6 LEDチカチカの論理回路

 

UCFファイルの作成

次に、UCFファイルを作ります。

UCFファイルとは、User Constraint Fileの意味で、Constraintは「制約」と訳します。

 

FPGAは、どのピンにどの信号をつなぐこともできるので、どのピンに何の信号をつなぐかをユーザが指定してやらないといけません。このようなピン配置の定義は制約の一種です。

 

UCFファイルに書くことができるものには、

  • ピン配置
  • ピンのI/O規格(LVCMOS18とかLVTTL33とか)や速度
  • 内蔵プルアップのON/OFFなど
  • クロック速度やタイミングの指定
  • 使用するプリミティブの位置の指定
  • 回路を配置するだいたいの位置

など、たくさんありますが、最低限必要なのは「ピン配置」のみです。

 

UCFファイルを作成するには、プロジェクトツリーのトップの部分で、New Sourceを実行します。

図11 プロジェクトに新規ファイルを追加

 

New Source Wizardが起動したら、File nameのところにledchika.ucfと入力してNextを押します。

図12 UCFファイルの作成

 

空のファイルが出来てISEエディタで開かれます。

お使いのボードが、TKDN-SP6-ESならば、次のように入力します。

# for TKDN-SP6-ES

NET "xtalclk_ip" LOC = "D11";

NET "pushsw_ip"  LOC = "D6";

NET "led_op<0>"  LOC = "B11";

NET "led_op<1>"  LOC = "A10";

NET "led_op<2>"  LOC = "C9";

NET "led_op<3>"  LOC = "A9";

NET "led_op<4>"  LOC = "B9";

NET "led_op<5>"  LOC = "A8";

NET "led_op<6>"  LOC = "B8";

NET "led_op<7>"  LOC = "A7";

リスト7 UCFファイルの記述(TKDN-SP6-ES用)

 

お使いのボードが、TKDN-SP6-16か45ならば、次のように入力します。

# for TKDN-SP6-ES

NET "xtalclk_ip" LOC = "D11";

NET "pushsw_ip"  LOC = "D6";

NET "led_op<0>"  LOC = "F13"; # ここが異なる

NET "led_op<1>"  LOC = "C11"; # ここが異なる

NET "led_op<2>"  LOC = "C9";

NET "led_op<3>"  LOC = "A9";

NET "led_op<4>"  LOC = "B9";

NET "led_op<5>"  LOC = "A8";

NET "led_op<6>"  LOC = "B8";

NET "led_op<7>"  LOC = "A7";

リスト8 UCFファイルの記述(TKDN-SP6-16/45用)

 

これで、UCFファイルの生成は完了です。

 

論理合成

いよいよ論理合成です。

論理合成を行うには、ISEの画面でメインのソースファイルを指定し、Generate Program Fileを右クリックし、RunまたはRerun Allを実行します。

 

図13 論理合成の実行

 

 

しかし、ISE12でこれを実行する前に、いくつかの重要なオプションを変更しなければなりません。

 

I/Oのレジスタを使う宣言(推奨)

このサンプルデザインでは関係がありませんが、将来的に複雑なデザインを設計した際に、IOのタイミングを向上させるためのオプションがあります。このオプションを設定変更しないと、I/Oのタイミングが正確になりません。

 

Imprement Designを右クリックし、Process Propertiesを開きます。

図14 インプリメントのプロパティ

 

その前にオプションの変更

Process Propertiesというダイアログが開くので、Map Propertiesを開きます。

この中にあるPack I/O Registers/Latches into IOBsを「For Inputs and Outpus」に変更します。

図15 I/Oレジスタのパッキングを有効にする(クリックで拡大)

 

 

次に、Generate Programing Fileのところでも右クリックし、Process Propertiesを開きます。

図16 Generate Programing Fileのプロパティ

 

Confituraion Optionsを開き、Configuration Rateを22MHzくらい、Unused IOB PinsをPull UPに変更します。

Unused IOB PinsをPull UPに変更するのは必須です。これを変更しないと、すべての未使用ピンがプルダウンされてしまいます。特電Spartan-6ボードではUSBのインタフェースチップが接続されていますが、このUSBチップにリセットがかかりっぱなしになり、USB-JTAGなどのデバッグ機能が動かなくなります。

 

図17 コンフィギュレーション・オプションの変更(クリックで拡大)

 

以上のオプションは忘れずに変更するようにしてください。

そうして、図13で説明したGenerate Progaramming Fileを実行してください。

下の図のようにエラーなく最後まで通れば成功です。

 

図18 エラーなく論理合成が終了した場合

 

Warningがある場合も、とりあえず成功です。未使用のポート(内部の回路にどこにもつながっていないなど)がある場合にはWarningが出ます。動作する場合もあれば動作しない場合もあるので、原因を突き止めてください。

 

図19 Warningが出て論理合成が終了した場合

 

FPGAデータのダウンロード

論理合成して、生成されたFPGAの回路はBitStreamファイルと呼ばれています。拡張子は.bitです。

これがプロジェクトのディレクトリにあるはずなので、調べてみてください。

 

図20 出来上がったビットストリームファイル

 

このBitStreamをFPGAに書き込むことを、コンフィギュレーションやプログラミングなどと呼びます。

 

FPGAをコンフィギュレーションするには、2つの方法があります。

  • JTAGを通じてパソコンからデータを送りこむ方法。
  • コンフィギュレーションデータを基板上のROMに書き込んでおいて、電源ONで起動する方法。

 

FPGAは電源をOFFにすると回路が消えてしまいますので、使用する前に?か?のどちらかの方法でコンフィギュレーションしなければなりません。

特電Spartan-6ボードには、SP6JTAGというツールが用意されていて、このツールを使うと基板上のUSBを通じてFPGAにJTAGコマンドを送り、コンフィギュレーションを行うことができます。

そのやりかたを紹介します。

 

FPGAに直接書き込む場合

まず、Spartan-6ボードとパソコンをUSBで接続します。

図21 USBで接続する

 

そして、MS-DOSプロンプトを立ち上げ、本ボード付属のユーティリティ SP6JTAG を起動します。

書き込みを行う場合のオプションは以下のとおりです。

 

sp6jtag.exe -auto ビットストリームファイル名.bit

 

図22 SP6JTAGツールによる書き込み

 

約3.2秒で書き込みが完了します。

書き込みが完了したら、FPGAは動作を開始するはずです。

 

SPI ROMに書き込む場合

基板上のSPI ROMに書き込む場合は、以下のように入力します。

(※MCSファイルに変換する必要はありません。bitを指定してください。)

 

sp6jtag.exe -spi -auto ビットストリームファイル名.bit

 

図23 SP6JTAGツールによるSPI ROM書き込み

 

書き込みが完了してもすぐにはFPGAは動作を開始しません。基板上の赤いボタンを押すか、USBを抜き差ししてください。新しいデザインで動作を開始するはずです。

 

動作の確認

それではLEDチカチカをお楽しみください。

図24 動作の確認

 

なお、今回の設計データはこちらからダウンロードできます。

 

 


© 2017 TokushuDenshiKairo Inc. All rights reserved