![]()
今回はFPGA内部のクロックを利用してLEDを点滅する。利用したFPGAは前回と同じくDesign Wave Magazine 2007年7月号付録基板。搭載されているのはSpartan3Eだ。
![]()
「ISE WebPack」を起動したらプロジェクトを作成する。「File」メニューの「New Project」を選択すればいい。
![]()
そしてプロジェクト名とプロジェクトの保存フォルダを指定する。今回はプロジェクト名を「BlinkLED」、保存場所を「c:\projects」とした。
![]()
次の画面ではデバイスの設定をする。
「Family」を「Spartan3E」に、
「Device」を「SC3S250E」に、
「Package」を「VQ100」に、
「Speed」を「-4」にする。
![]()
前回はプロジェクト作成後にソースファイルを追加した。今回はウイザード上からソースファイルを追加する。
デバイスの設定画面の次に現れる「Create New Source」画面で「New Source」ボタンを押す。
![]()
するとソースファイルの形式選択画面が開く。ここで「VHDL Module」を選択する。ファイル名は「BlinkLED」とした。
![]()
そして信号の設定をする。今回はクロックを利用してLEDを光らせるため、「CLK」と「LED」を用意し、それぞれ「in」と「out」に設定した。
![]()
これでソースコードの追加が終わる。「Finish」ボタンを押す。
![]()
画面上に作成したソースファイルの名前と形式が表示される。確認したら「Next」ボタンで次へ進む。
![]()
既存ソースファイルの追加画面が開く。ここではそのまま「Next」ボタンで進む。
![]()
これでプロジェクトの作成が終わりだ。「Finish」ボタンでウイザードを終える。
![]()
ウイザードによって自動的にソースコードが追加される。追加されたソースコード「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";
beginprocess (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;
![]()
ソースコードが書けたらピンの配置を決めるためユーザー制約ファイルを作る。前回は「Project」メニューの「New Source」から追加して作成した。しかし手順が多いと面倒なので今回は手順を省略していきなり「User Constraints」の「Assign Package Pins」を右クリックして現れたメニューから「Run」を選択して設定画面を開く。
![]()
すると、まだユーザー制約ファイル(UCFファイル)がプロジェクトに追加されていないため、自動的に作るかどうかが問われる。ここで「Yes」を選択する。
![]()
すると「Xilinx PACE」が起動してピン配置を指定できるようになる。
クロック端子(CLK)を「P88」に、LEDを「P98」にする。
88ピンをクロックに指定するのは、その端子が"クロック用だから"という単純な理由だ。DCMなどを利用するのでない限り(?)、この「P88」を指定するといいだろう。
指定が終わったら右上の「×」ボタンから閉じる。
![]()
これでソースコードの記述とピン配置の設定が終わった。次にビルド(論理合成など)をする。「Generate Programming File」を右クリックして現れたメニューから「Run」を選択すればいい。
![]()
しばらくするとビルドが終わる。次にFPGAの書き込みに必要なXSVFファイルを作成するため「Generate Programming File」にある「Configure Device (iMPACT)」を右クリックして現れるメニューから「Run」を選択する。
![]()
作業内容の選択画面が開いたら「Enter a boundary-Scan chain manually」を選択する。
![]()
これでiMPACTの画面が開いた。ここで右クリックをして現れたメニューから「Add Xillinx Device」を選択する。
![]()
するとファイル選択画面が開く。ここでビルドにより生成されたビットストリームファイル「blinkled.bit」を選択する。
![]()
すると画面にICのアイコンが追加される。確認したら「Output」メニューの「XSVF File」にある「Create XSVF File」を選択してXSVFファイルの作成を開始する。
![]()
XSVFファイルの作成が開始したらICを右クリックして現れたメニューから「Program」を選択する。
![]()
これでXSVFファイルにビットストリームが書き込まれた。XSVFファイルの作成を終わらせるため「Output」メニューの「XSVF File」にある「Stop Writing to XSVF File」を選択する。
![]()
これでプロジェクトフォルダーに保存されたXSVFファイル「Test.xsvf」をJTAGライターでFPGAへ書き込む。
すると基板上に用意されている緑色LEDが点滅した。CLK入力は基板に実装した水晶発振子が33MHzで、それをそのまま利用している。ソースコード上で利用している点滅周期は23ビット周期。23ビットは2進数で100000000000000000000000(0が23個)=10進数で8388608。つまり33MHz÷8388608≒3.94Hz。ということで一秒間に4回程度の点滅となる。
LEDの点滅周期をオシロスコープで調べてみた。計測結果は3.92Hz(オシロスコープはかなり適当)。理論値が3.94Hzだからおおよそあっていた。







