spartan3をスタートしよう
by K.I
2005/07/02
Index
- Spartan3スターターキットが、Xilinxの サイトで$99で売られている。
- これは、お買い得ということで買ったものの、うまく書込みが出来なかったので、放っておいた。
- Jさんが、LVDSのテスト用にSpartan3を使いたい1というので、再挑戦してみました。
1Spartan3でLVDSをサポートしているかどうかは未確認だけどね。
[top]
- スターターキットには、最初にテストプログラムが書き込まれているので、ACアダプタを繋ぐだけで、それが動く。
- 7セグのLEDは光るは、VGA表示されるはで、それはそれは素晴らしいデモなんだけど、このソースは無い。
- それじゃ、 リファレンスデザインを、動かしてみようとした。
- コンパイルして、bitファイルを作るところまでは、出来る。(?マークが付いてるんだけど。。)
- iMPACTというツールで、書き込むみたいだが、どうやってもエラーになる。うーん。。
- スターターキットには、立派な日本語解説が付いてるんだけど、CoolRunner(CPLD)の説明が詳しく載ってるけど、FPGAについては何かハッキリしない。
- スターターキットを買うような初心者には、絶対分かんないんじゃないかなぁ。。
- 少なくとも、僕は分かりませんでした。。。ということで、放り出した2んだけどね。
2数年前にもFPGAの書き込みで挫折したので、2回挫折してる。。。
[top]
- 検索してけど、スターターキットの情報は意外な程、無い。
- 有っても、古いWebPackの説明だったり、肝心のところが書いてなかったり。
- みんな、あれでスタート出来たの?
ここを参考に、もう一度やり直してみよう。
- あらためて、 リファレンスデザインの「多重化された 7 セグメント表示使用のデジタル クロック」というのをダウンロードしてみた。
- clockというフォルダの中の、clock.nplというプロジェクトファイルをダブルクリックすると、Xilinx Project Managerが起動する。
- Synthesizeをダブルクリックしてみるが、エラーは出ないものの?マークが付いてる。
- その中のCheckSyntaxだけダブルクリックしても、?マークが付いてる。→なんだこれ?
- いろいろ調べると、この?マークは無視できる場合があるらしい。。→じゃ良いか。。。
- Generate Programming Fileで、bitファイルというのが出来る。
- その前に、プロパティのStartupOptionタブのFPGA StartupClockをJTAGにしておく。
- で、iMPACTを起動、書けない。。。ここで挫折したんだよね。
[top]
直接FPGAに書くのが出来ないので、ROMに書き込んでみよう。
- iMPACTでは、ROMにはbitファイルを直接書き込むことが出来ないので、MCSファイルというものにしてから書き込みをしなければならないらしい。→面倒だなぁ。
- Ganerate PROM ACE,or JTAG Fileをダブルクリックして、
- PROM Fileを選択
- Parallel PROMを選択、PROM File FormatをMCS、PROM File Nameを指定
- Auto Select PROMを選択
- 何も指定せず、次へ
- Add Fileで、bitファイルを指定3
- 他のbitファイルを追加するか聞かれるので、いいえと答える。
- 完了
3ここで、FPGA StartupClockをJTAGにしている場合は、CCLKにしろというWarningが出る。
[top]
- ここで、XILINX JTAG書き込み手順を発見。ROMへの書き込み方法が、やっと分かりました。感謝。
- iMPACTを起動。
- Boundary-Scan Modeを選択
- Automatically connect ... を選択
- ここで、xc3s200と、xcf02sの2デバイスが見つかる。
- xc3s200をダブルクリックして、bypassボタンを押す
- xcf02sをダブルクリックして、mcsファイルを開く
- xcf02sを右クリックして、programすれば、書き込みを開始する
書き込み成功!
- 結局、不必要な方をBypassすれば良いだけでした。。あとは、?マークは無視すれば良いって事か。。4
4本当にそれで良いのかな〜?
[top]
- それじゃbitファイルも同じように書けるはず。で、やってみるとmskファイルが無いと言う。
それで、FPGAへの直接書き込み手順も分かりました。
- Generate Programming FileのプロパティのReadback OptionタブのCreate ReadBack Data Filesをチェックすると、Create Mask Fileが有効になるのでチェックしておく。
- bitファイルを再作成。
- iMPACTを起動。
- Boundary-Scan Modeを選択
- Automatically connect ... を選択
- ここで、xc3s200と、xcf02sの2デバイスが見つかる。
- xcf02sをダブルクリックして、bypassボタンを押す
- xc3s200をダブルクリックして、bitファイルを開く
- xc3s200を右クリックして、programすれば、書き込みを開始する
これで書き込み完了!
- Verifyでエラーが出るけど、MCSファイルの書き込みではエラーが出ないし、一応動作するみたいなので気にしないことにする。。。
- FPGAへの直接書き込みの場合は、電源切ると当然、回路も消えるので注意。
[top]
って言っても難しいのは嫌なので、入力をそのまま出すという超簡単プログラム。
トラ技2003年5月号の3章「スイッチONでLEDが点灯する回路を動作させてみよう!」というのがピッタリで、新しいWebPackの使い方が良く分かるので、参考にすると良い。
- スターターキットでは、以下のようなピン接続になってる。
- プッシュスイッチ SW0 → M13
- LED LD0 → K12
- まず、File→NewProjectで、新規プロジェクトを作成。とりあえず ledとする。
- Device Family → Spartan3
- Device → xc3s200
- Package → ft256
- Speed Grade → -4 (これは分からんので、適当)
- トラ技で使用してる言語はVerilogだが、自分はVHDLしか知らんのでVHDLにする
- Top-Level Module Type → HDL
- Synthesys Tool → XST(VHDL/Verilog)
- Simulator → Modelsim
- Generated Simulation Language → VHDL
- VHDL Module を作成。 とりあえず led.vhdにする。
- 回路モジュールの名前(とりあえず led)と、入出力の設定。
- button_ip input
- led_op output
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;
entity led is
Port ( button_ip : in std_logic;
led_op : out std_logic);
end led;
architecture Behavioral of led is
begin
led_op <= button_ip ; →これだけ追加。。。
end Behavioral;
- VHDLはうろ覚えだけど、そのまま非同期で出力するんなら、これで良かったんじゃなかったっけ?
- Synthesizeをダブルクリックして、論理合成。→エラー無しだからOKかな。。
- Sources in Projectのウィンドウを右クリックして、New Source
- Implementation Constraints File で、UCFファイルを作成。とりあえず、led.ucfとする。
- これで、UCFファイルがプロジェクトの追加される。
- UCFファイルをダブルクリックして編集する。
- 実際にどのピンに接続されるか指定する。→指定しないと適当なピンに割り当てられてしまう。
- I/O Std.で、インターフェースが選べる5みたいだ。とりあえずデフォルト。
I/O Name | I/O Direction | Loc | Bank | I/O Std. |
led_op | Output | K12 | BANK3 | BLVDS_25 |
button_ip | Input | M13 | BANK3 | BLVDS_25 |
NET "button_ip" LOC = "M13" | IOSTANDARD = BLVDS_25 ;
NET "led_op" LOC = "K12" | IOSTANDARD = BLVDS_25 ;
- Generate Programing Fileのプロパティで、
- StartupOptionタブのFPGA StartupClockをJTAGにしておく。
- Readback OptionタブのCreate ReadBack Data Filesをチェックすると、Create Mask Fileが有効になるのでチェックしておく。
- Generate Programing Fileをダブルクリックして、bitファイルを生成する。
とりあえず、FPGAに直接書き込みましょう。
- iMPACTを起動。
- Boundary-Scan Modeを選択
- Automatically connect ... を選択
- ここで、xc3s200と、xcf02sの2デバイスが見つかる。
- xcf02sをダブルクリックして、bypassボタンを押す
- xc3s200をダブルクリックして、bitファイルを開く
- xc3s200を右クリックして、programすれば、書き込みを開始する
一応、動くみたいだ。→7segのLEDが光ったままだけどね。
5LVDSも選べるようだけど、LVDSって差動だから2ピン使うんじゃ無いのかなぁ?どうするんだろ??
[top]
- Jさんと色々と試したけど、うまく行かず。結局、HDLの方で 記述する必要があるようだ。
- でもこれは、OBUF_LVDSがいきなり出てくるし、インバータを回路で書くのが気に入らない。
- さらに調べると、 これとか、 これを見つけた。これはアトリビュートを付加するやり方みたいで、こちらの方が良さそうだ。
出力をLVDS指定に書き直してみる。
- 要するに、LVDSの差動バッファを定義して記述するってことか。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;
entity led is
Port ( button_ip : in std_logic;
led_op : out std_logic;
led_opn : out std_logic); →差動用の出力を追加
end led;
architecture Behavioral of led is
component OBUFDS →差動バッファの定義を追加
port(I : in std_logic;
O : out std_logic;
OB : out std_logic);
end component;
attribute IOSTANDARD : string; →U0をLVDS_25インターフェースとする
attribute IOSTANDARD of U0 : label is "LVDS_25";
begin
U0: OBUFDS →定義した差動バッファで記述
port map (I => button_ip,
O => led_op,
OB => led_opn);
end Behavioral;
- でも何故、IOSTANDARDのアトリビュートをstringって指定する必要があるんだろ?
- プロジェクトにOBUFDSが追加されたが、?マークになってる??
- でも、UCFファイルをダブルクリックすると、以下のように設定6されていた。
I/O Name | I/O Direction | Loc | Bank | I/O Std. | Diff.Type | Pair Name |
led_opn | Output | K12 | BANK3 | LVDS_25 | N-Type | led_op |
led_op | Output | L12 | BANK3 | LVDS_25 | P-Type | led_opn |
button_ip | Input | M13 | BANK3 | BLVDS_25 | Unknown | |
ふぅ。なんとか、LVDS出力になったみたいだなぁ。
NET "button_ip" LOC = "M13" | IOSTANDARD = BLVDS_25 ;
NET "led_op" LOC = "L12" | IOSTANDARD = LVDS_25 ;
NET "led_opn" LOC = "K12" | IOSTANDARD = LVDS_25 ;
- LVDSの記述自体は、これで良いみたいだが、やはりOBUFDSが?になってるのは、定義の本体が無いからじゃないかなぁ。
- Xilinxの特定のコンポーネントを、 インスタンシエートする方法を見ると、Unisimライブラリというのがあるらしい。
- これを有効にすれば、良いのかな? → OBUFDSの?マークが消えた!
- Generate Programming Fileで、bitファイルが出来るから大丈夫??
- 結局、FPGAの内蔵モジュール等を使用する場合は、UNISIMライブラリを使って、Component記述だけ追加すれば良いって事か。。
- OBUFDSも、ちゃんと入ってる。わけ分かんないコンポーネントもあるけど。。
6led_opはBLVDS_25のままだったのでLVDS_25に直した。あとled_opnの方は、LVDS_25が最初薄く表示された状態だったが、それだとUCFに反映されないようなので、選び直す必要があるらしい。
[top]
- やっと、FPGAの書き込み方法が分かって嬉しい。
- でも、iMPACTって使い方が凄く分かり難いし、面倒だよね。
- スターターキットには、初心者向けに書き込み方法のメモでも付けといてくれれば良いのに。。。
- LVDSの設定にしても、ちょっと色々やろうとすると、設定が面倒、直観的に出来ないね。。
- 何やるにしても、調べまくらないとダメだなー。ネットが使えなかったら不可能だよね。
- しかし、これで実際に試してみることが出来そうだ。
- まったく、本質じゃないところで引っ掛かかってたなぁ。。。
- まぁ、やっとスタート出来るようになったから良いか。
[top]
[電子工作関連に戻る]