FPGAでLEDを点滅させる

fpga_blink_led_01.gif
今回はFPGA内部のクロックを利用してLEDを点滅する。利用したFPGAは前回と同じくDesign Wave Magazine 2007年7月号付録基板。搭載されているのはSpartan3Eだ。

fpga_blink_led_02.gif
「ISE WebPack」を起動したらプロジェクトを作成する。「File」メニューの「New Project」を選択すればいい。

fpga_blink_led_03.gif
そしてプロジェクト名とプロジェクトの保存フォルダを指定する。今回はプロジェクト名を「BlinkLED」、保存場所を「c:\projects」とした。

fpga_blink_led_04.gif
次の画面ではデバイスの設定をする。
「Family」を「Spartan3E」に、
「Device」を「SC3S250E」に、
「Package」を「VQ100」に、
「Speed」を「-4」にする。

fpga_blink_led_05.gif
前回はプロジェクト作成後にソースファイルを追加した。今回はウイザード上からソースファイルを追加する。
デバイスの設定画面の次に現れる「Create New Source」画面で「New Source」ボタンを押す。

fpga_blink_led_06.gif
するとソースファイルの形式選択画面が開く。ここで「VHDL Module」を選択する。ファイル名は「BlinkLED」とした。

fpga_blink_led_07.gif
そして信号の設定をする。今回はクロックを利用してLEDを光らせるため、「CLK」と「LED」を用意し、それぞれ「in」と「out」に設定した。

fpga_blink_led_08.gif
これでソースコードの追加が終わる。「Finish」ボタンを押す。

fpga_blink_led_09.gif
画面上に作成したソースファイルの名前と形式が表示される。確認したら「Next」ボタンで次へ進む。

fpga_blink_led_10.gif
既存ソースファイルの追加画面が開く。ここではそのまま「Next」ボタンで進む。

fpga_blink_led_11.gif
これでプロジェクトの作成が終わりだ。「Finish」ボタンでウイザードを終える。

fpga_blink_led_12.gif
ウイザードによって自動的にソースコードが追加される。追加されたソースコード「BlinkLED.vhd」を開き、修正する。今回はクロックを23ビットのカウンターで周してLEDに出力することにした。
「signal TMP : STD_LOGIC_VECTOR(22 downto 0)」の行で内部で利用する23ビットの変数(?)をゼロで初期化して用意する。そしてクロックの立ち上がり(if CLK'event and CLK='1' then)をトリガーとして変数が22ビットの間(if TMP < "10000000000000000000000" then)はLEDを光らせ、それを超えたら消灯させる。
VHDLの作りは非常に簡単。PascalとVisual Basicが混じったような文法で記述できる。ただ信号値を16進数で指定する方法などは不明。できればいいのだが、できないとしたら、ゼロの数を書き間違えてタイミングが意図した通りに動かない!というケアレスミスが生じやすいだろうなぁ。


----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 21:15:47 07/02/2007
-- Design Name:
-- Module Name: BlinkLED - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
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 instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity BlinkLED is
Port ( CLK : in STD_LOGIC;
LED : out STD_LOGIC);
end BlinkLED;

architecture Behavioral of BlinkLED is

signal TMP : STD_LOGIC_VECTOR(22 downto 0) := "00000000000000000000000";
begin

process (CLK)
begin
if CLK'event and CLK='1' then
TMP <= TMP + "00000000000000000000001";

if TMP < "10000000000000000000000" then
LED <= '1';
else
LED <= '0';
end if;
end if;
end process;

end Behavioral;






fpga_blink_led_13.gif
ソースコードが書けたらピンの配置を決めるためユーザー制約ファイルを作る。前回は「Project」メニューの「New Source」から追加して作成した。しかし手順が多いと面倒なので今回は手順を省略していきなり「User Constraints」の「Assign Package Pins」を右クリックして現れたメニューから「Run」を選択して設定画面を開く。

fpga_blink_led_14.gif
すると、まだユーザー制約ファイル(UCFファイル)がプロジェクトに追加されていないため、自動的に作るかどうかが問われる。ここで「Yes」を選択する。

fpga_blink_led_15.gif
すると「Xilinx PACE」が起動してピン配置を指定できるようになる。
クロック端子(CLK)を「P88」に、LEDを「P98」にする。
88ピンをクロックに指定するのは、その端子が"クロック用だから"という単純な理由だ。DCMなどを利用するのでない限り(?)、この「P88」を指定するといいだろう。
指定が終わったら右上の「×」ボタンから閉じる。

fpga_blink_led_16.gif
これでソースコードの記述とピン配置の設定が終わった。次にビルド(論理合成など)をする。「Generate Programming File」を右クリックして現れたメニューから「Run」を選択すればいい。

fpga_blink_led_17.gif
しばらくするとビルドが終わる。次にFPGAの書き込みに必要なXSVFファイルを作成するため「Generate Programming File」にある「Configure Device (iMPACT)」を右クリックして現れるメニューから「Run」を選択する。

fpga_blink_led_18.gif
作業内容の選択画面が開いたら「Enter a boundary-Scan chain manually」を選択する。

fpga_blink_led_19.gif
これでiMPACTの画面が開いた。ここで右クリックをして現れたメニューから「Add Xillinx Device」を選択する。

fpga_blink_led_20.gif
するとファイル選択画面が開く。ここでビルドにより生成されたビットストリームファイル「blinkled.bit」を選択する。

fpga_blink_led_21.gif
すると画面にICのアイコンが追加される。確認したら「Output」メニューの「XSVF File」にある「Create XSVF File」を選択してXSVFファイルの作成を開始する。

fpga_blink_led_22.gif
保存するXSVFファイル名は「Test」とした。

fpga_blink_led_23.gif
XSVFファイルの作成が開始したらICを右クリックして現れたメニューから「Program」を選択する。

fpga_blink_led_24.gif
プロパティ選択画面が開いたらそのまま「OK」ボタンを押す。

fpga_blink_led_25.gif
これでXSVFファイルにビットストリームが書き込まれた。XSVFファイルの作成を終わらせるため「Output」メニューの「XSVF File」にある「Stop Writing to XSVF File」を選択する。

fpga_blink_led_26.gif
これでプロジェクトフォルダーに保存されたXSVFファイル「Test.xsvf」をJTAGライターでFPGAへ書き込む。


_DSC9171.JPG
すると基板上に用意されている緑色LEDが点滅した。CLK入力は基板に実装した水晶発振子が33MHzで、それをそのまま利用している。ソースコード上で利用している点滅周期は23ビット周期。23ビットは2進数で100000000000000000000000(0が23個)=10進数で8388608。つまり33MHz÷8388608≒3.94Hz。ということで一秒間に4回程度の点滅となる。

_DSC9178.JPG
LEDの点滅周期をオシロスコープで調べてみた。計測結果は3.92Hz(オシロスコープはかなり適当)。理論値が3.94Hzだからおおよそあっていた。



カテゴリー「電子工作」 のエントリー