最初のデザイン
最初のデザイン
最初のデザイン
それでは、XILINX ISEを使って開発を行うことにします。
最初に作るのは、LEDチカチカです。
本ボードには8個のLEDが搭載されているので、これをチカチカさせてみることにしましょう。
そして、基板上のプッシュスイッチが押されたら、チカチカの点滅方法を変えるようなデザインにします。
開発の流れは、
�/p>
(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 日付Visual FoxProを検証する方法 信号や定数の宣言
begin
論理式の記述
end |
ソースファイルの記述(信号の宣言)
入出力ポートとおまじない構文が出来たら、つぎは内部で使う信号名を宣言します。
このデザインでは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); |
ここで、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は「制約」と訳します。
NBNSは何ですか
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を通じてパソコンからデータを送りこむ方法。
A コンフィギュレーションデータを基板上のROMに書き込んでおいて、電源ONで起動する方法。
FPGAは電源をOFFにすると回路が消えてしまいますので、使用する前�-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 動作の確認
なお、今回の設計データはこちらからダウンロードできます。
Copyright(C) 2009 TokushuDenshiKairo Inc. All rights reserved.
0 コメント:
コメントを投稿