Xilinx の .ngc ファイルを作成して、ソースをネットリストに変換

ここより→ カスタム設計の MicroBlaze 以下に続く
CPUをソースのままでいろいろ回路を追加しましたが、ここで、CPU部分のみの risc4s.ngc ファイルを作成して、CPUの論理合成時間を少しでも短縮したり、ソースを隠蔽したりできるようにしてみます。risc4s.ngc は、risc4s フォルダのファイルだけ論理合成して、risc4s.ngc を作成しておき、中身の無いラッパーとして、同じ名前の、risc4s.v を作成して、これを、soc_top からインスタンシエートすると、同じように使うことができます。ただ、これまでの risc4s.v と、soc_top.v を少し変更しないといけません。というのは、いままでの risc4s.v のデータバスには、inout ピンがあるので、これを ngc にすると、soc_top からうまく接続できないみたいです。また、.ngc は、Spartan6 で作成したものを、Spartan3 では使えません。その逆は使えるようですが、ゲート数が増加するようです。

ISEのオプションを設定して riec4s の .ngc ファイルを作成する

以下のように、risc4s フォルダのソースをプロジェクトに読み、Synthesize - XST を右クリックして、Prosess Properties... を開きます。この例では、プロジェクトは、E:\ISEs\project134\ncmbngc フォルダになっています。ncmbngc\risc4s フォルダに、CPUのコア部分のソースがすべて入っているものとしています。risc4s のソース一式→
risc4s.lzh このソースでは、外部データバスのinout ポートを、input と output に分離しています。なお、ここでは、ISEは、13.4としています。ngc ファイルは上位互換なので、少し古いISEのバージョンで可能です。逆は使えないことが多いです。また、デバイスも上位互換で、下位方向では使えません。



開くと、以下のような設定画面が出るので、Category で、Xilinx Specific Options を選択し、 -iobuf のチェックをOFF、-bufg の Number of Clock Buffers を、0に設定します。Clock Buffers は、デフォルトで Spartan6 なら16になっていますが、risc4s の全ソースでは、明示的には BUFG は使っていないので、0としておきます。無論、risc4s は 単一クロックで動作するので、最低1個の BUFG を使うのですが、ngc では0にしておいても、このモジュールをインスタンシエートするTOPモジュール側で BUFG をつかってクロックを供給するので、ここでは0にします。ここをデフォルトにすると、TOPモジュールの BUFG でクロックを供給しても、0の場合より、2個、BUFG を多く使ってしまうようです。


新しく作った、ngc ファイルで、CPUを構成する方法は
イーサネットPHYを操作してみる。MACの設計( Avnet Spartan6 LX9 MicroBoard )
上記のソースを元にして、SPIでSDカードを制御する回路を追加した例で説明してみます。

risc4s の .ngc ファイルを使って、回路をインプリメント

使用するファイル一式はこちら → lx9_sdfatfs_old.lzh risc4s CPUコアの .ngc のほか、CPUの周辺回路、プログラムソースを含む。←モニタにバグあり、修正は下記
上記のソースで、インプリメントした bit ファイルはこちら → lx9ether_soc_top_bit_old.lzh ←モニタにバグあり、修正は下記
修正したもの→ lx9_sdfatfs.lzh
修正したbit ファイルはこちら → lx9ether_soc_top_bit.lzh
修正内容は、モニタスタックエリアと、イーサネット用ワークエリアが一部オーバーラップしていたので修正。

@ 新規のISEプロジェクトを作成し( lx9_sdfatfs )上記の、lx9_sdfatfs.lzh を解凍して、プロジェクトフォルダに、SRCs フォルダ以下をコピーします。
A 以下のように、SRCsフォルダのソースをプロジェクトに読み込みます。このとき、risc4s.ngc は読み込みません。


B migrtl フォルダのソースを読み込みます。


C mcb_controller フォルダのソースを読み込みます。


D これでソースを全部読み込んだので、次に risc4s.ngc の所在を、ISEに設定します。これが .ngc ファイルを使って回路をインプリメントするときのポイントです。以下の図のように、Inplement Design を展開し、Translate を右クリックして、最下位の Process Properties..を選択します。



E Process Properties を開いて、Macro Serch Path の欄の右端の、+... をクリックして、risc4s.ngc があるフォルダ、SRCs を指定します。


E SRCs を指定して、OK をクリックします。


E risc4s.ngc を置いている、SRCs フォルダの絶対パスが表示されます。この例では、E:\ISEs\project142\lx9_sdfatfs\SRCs となっています。


これで、risc4s.ngc を使う設定が完了したので、回路をインプリメントできます。
次に risc4s.ngc を使う回路の例の説明をします。
FPGAのコンフィギュレーション用SPIメモリのリードライト回路のままではSDカードの操作はできなかったので、SPI操作回路には機能を追加しています。また、ELM home の、 FatFs でSDカードのファイルを操作するプログラムも走るようにしましたが、32kバイトのブロックRAMではプログラムが入らないので、DRAM上でのみ走るようになりました。
SDカードでも使えるように改造した、SPI 制御回路はこちら→ spictl2a.v この回路でシリアルROMも制御できます。

CPUとのインターフェイスで、アドレスデコード部分は以下のようになります。



SDカードとの接続は以下のようにします。カード挿入検出、ライトプロテクトも接続しています。また、SDカードの電源を、プルアップ電源を含めてON,OFFできる回路も追加しています。また、コンフィギュレーション用SPIメモリにも使えるように、内部で切り替えできるようにしています。


SDカードを操作できるSPIインターフェイスの仕様は以下のようにしました。
SPI 操作モジュールレジスタ
レジスタ名 (Read/Write)
 アドレス 
 有効ビット 
 機能 
 備考 
spiwritedata[31:0] (RW)
 0xFFF00000 --- 0xFFF00003 
 1,2,4 バイトの指定 
 SPI送信 
 ライトサイズによって送信バイト数を指定 
spibusy (RO)
 0xFFF00004 --- 0xFFF00007 
 D0 
 SPI制御ビジー 
 D0 == 1でビジー 
spireaden (WO)
 0xFFF00010 --- 0xFFF00013 
 何かを書く 
 SPI受信開始 
 ライトサイズによって受信バイト数を指定 
spireaden (WO)
 0xFFF00018 --- 0xFFF0001B 
 何かを書く 
 SPI受信開始 
 受信後、CSをHigh 
spireaden (WO)
 0xFFF00098 --- 0xFFF0009B 
 何かを書く 
 SPI受信開始 
 ダミークロックの出力 
spireaddata[31:0] (RO)
 0xFFF00010 --- 0xFFF00013 
 1,2,4 バイトの指定 
 SPI受信データ 
 リードサイズによって受信バイト数を指定 
sdmode,clkdiv[7:0] (RW)
 0xFFF00014 --- 0xFFF00017 
 D8,D7---D0 
 SD,クロックスピード 
 SPIポート、クロック分周指定 
spisetpin[3:0] (RW)
 0xFFF00020 --- 0xFFF00023 
 D3---D0 
 SD電源、SPIポートピン 
 SD電源、SPIピンへの直接出力 
sdstat[1:0] (RO)
 0xFFF00024 --- 0xFFF00027 
 D3---D2 
 SDカード状態 
 ライト禁止、カード挿入 
sdhcf,sdinit (RW)
 0xFFF00024 --- 0xFFF00027 
 D1---D0 
 SDカード種別、初期化 
 SDカード種別、初期化を表示 

SPI操作モジュールレジスタの詳細
  1. spiwritedata[31:0] バイト、ワード、ロングワードで書くと、そのバイト数のデータを送信します。送信データ順は、MSBバイトからLSBバイトの順になります。例として、0x12345678 を書くと、0x12 0x34 0x56 0x78 の順に送信されます。0x9876 を書くと、0x98 0x76 と送信されます。
  2. spibusy アドレス、0xFFF00004 をロングワードで読むと、LSBに、ビジー状態が1で読めます。
  3. spireaden アドレス、0xFFF000010 に、バイト、ワード、ロングワードで何かを書くと、書いたサイズの受信を行います。つまり、8,16,32個のクロックを出して受信します。
  4. spireaden アドレス、0xFFF000018 に、バイト、ワード、ロングワードで何かを書くと、書いたサイズの受信を行います。つまり、8,16,32個のクロックを出して受信します。このアドレスの場合は、リード後、CSをHighにします。
  5. spireaden ライトアドレスを、0xFFF00098 にすると、CSをHighのままで、送信します。SDカードの初期化前にダミークロックを出すときに使います。
  6. spireaddata[31:0] アドレス、0xFFF00010 をロングワードで読むと、上記で出したリードバイト数に応じたデータを読めます。バイトの場合は、LSB8ビットに、ワードの場合は、下位16ビットの D15--D8 に最初のデータ、D7--D0 に2バイト目のデータになります。ロングワードの場合は、受信した順にMSBバイトから読めます。
  7. sdmode sdmode:1で、SPIポートがSDカード側になります。0だと、SPIフラッシュメモリになります。ソフトで設定します。
  8. clkdiv[7:0] clkdiv[7:0]:SPIポートのクロックスピードを指定します。0で50MHz、1で25MHz、2で 50/3 で、16.666MHz。設定値を n とすると、50/(n + 1) MHz になります。
  9. spisetpin[3:0] spisetpin[0]:1で、CSをHighにします。spisetpin[1]:1で、CLKをHighにします。spisetpin[2]:1で、CMDをHighにします。spisetpin[3]:1で、SDカードに電源を供給します。0で、電源をOFF、かつ、電源ラインを、100オームでGND側にショートします。他のピン( CS, CLK, CMD )もLowにすると、約2msでほぼ0Vになり、、SDカードを挿入したままでも、内部回路を確実にリセット可能です。
  10. sdstat[1:0] sdstat[0]:1で、SDカードが入っていることを示します。sdstat[1]:1で、カードソケットのライトプロテクトスイッチがOFFで、ライトプロテクトを示します。カードが入ってないときも、1となり、ライトプロテクト状態になります。
  11. sdhcf sdhcf:1で、SDHCカードを示します。ソフトで設定します。
  12. sdinit sdinit:SDカードの初期化が正常に終了すると1。ソフトで設定します。カードを取り出すと、ハード的にクリアされます。

FatFsのタイムスタンプで使いやすいカレンダー回路の実装

FatFsでは、ファイルの作成時間の記録に、32ビットで表現できる年月日時分秒のタイムスタンプを使っていますが、これは以下の構成になっています。FAT32を含む詳しい資料は、マイクロソフトのサイトの、fatgen103.doc を参照
32ビットの Date and Time Formats
年( 1980 --> 2107 )
 月 
 日 
 時 
 分 
 秒( 2秒単位 ) 
7ビット
 4ビット 
 5ビット 
 5ビット 
 6ビット 
 5ビット 
YYYYYYY
 MMMM 
 DDDDD 
 HHHHH 
 MMMMMM 
 SSSSS 

秒データを2秒単位として、32ビットに詰め込んでいるので、ソフトでは直接扱いにくいので、これを、回路で作成します。32ビットのレジスタポートを読めば、上記フォーマットで読めるようにします。ハードウエア回路で作成すると、ソフトで構成する場合の作成途中の時刻の繰り上がりをチェックする必要がありません。
この回路で、parameter MSECRATIO = 20'hF423F は、TOPからの設定で小さい数値にすると、テストベンチで早く結果を出すことができます。またハードウエアでの初期化で、2013年6月7日20時にしていますが、ここも適当に変更します。1980年が0なので、2013年では33になっています。また、settime が、カウンタ更新と重なると、1クロック待たせるようにしています。


SPI接続のSDカード回路をテストするモニタの機能

ここに紹介したSDカードのSPI制御を含む回路( イーサネットも使える ) をテストするモニタは、解凍して得られる SRCs フォルダの、cmbiointf と、fatfscmb フォルダ以下に、ソースがあります。前者 cmbiointf は、bit ファイルに使ったモニタでFatFsはありません。後者 fatfscmb は、FatFsと、テストプログラムを入れたもので、ブロックRAMには入りきらない( 32kバイト )ので、DRAMでのみ動作確認できるものです。ですから、bit ファイルで、FPGAをコンフィギュレーションしただけでは、SDカードは操作できませんので、以下のようにしてDRAMで走るソフトをダウンロードして、0x8000000番地からモニタを走らせます。

ターミナルソフトとして、テラタームを使う場合は(他のターミナルソフトも可)以下の設定にします。ここでは、COM16になっていますが、LX9基板のUSB−UARTのCOMポートに合わせます。( Silicon Labs CP210x USB to UART Bridge )


FPGAをコンフィグレーションした直後。Custom の C が文字化けしていますが、これはコンフィギュレーション中、LX9基板のUSB−UART変換ICへ出力するFPGAからのUARTのTXが(Low)なのでこうなってしまいます。


l コマンドを送ります。( Lの英小文字 )こうしておいて、


TeraTerm から、DRAM上で動作するモニタ、SRCs\fatfscmb\cmbiofintd.mot を送信します。115200bps none 1stop そして、バイナリにチェックを入れます。バイナリにチェックを入れないと、ファイルを送信後、CRコードを余分に送ってしまうみたいで、このCRにモニタが応答して、前回実行コマンド、l を表示してしまうようです。


「開く」ボタンで、以下のようにファイルを送信します。


送信が終わると、総ロードバイト数などを表示します。


g8000000 (enter) で、DRAMにロードしたモニタを実行します。プロンプトにあるように、FatFsでSDカードのファイルを操作できるモニタになっています。


ここで、SRCs フォルダ以下のファイルとディレクトリをSDカードにコピーし、そのSDカードを入れ、mount (enter) と、コマンドを出します


その後、dir (enter) と、コマンドを出すと、SDカードのルートディレクトリのファイルを表示します。ロングファイル名を無効にしているので、MSDOSの短縮形で表示しています。


その他のコマンドとして以下のものが使えますが。SDカードソケットのライトプロテクトスイッチにはまだ対応していません。
SDカードのファイル操作を行うモニタの追加コマンド
コマンド
 引数 
 できること 
 使用例 
 結果 
date (表示)
 なし 
 現在の年月日時分秒の表示 
 date(enter) 
 2013/6/7/22:13.24 
date (設定)
 Y/M/D/H/M/S 
 年月日時分秒の設定 
 date 2013/6/7/9:13.24 
 2013/6/7/9:13.24 になる 
mkfile
ファイルパス メモリ先頭,長さ
newfile に、0x8100000 から 0x100 バイトを書く 
 mkfile newfile 8100000,100 
 newfile が作成される 
mkdir
ファイルパス
newdir を作成 
 mkdir newdir 
 newdir が作成される 
mkdir
ファイルパス
newdir/subdir を作成 
 mkdir newdir/subdir 
 newdir フォルダに subdir が作成される 
delete
 ファイルパス 
newfile を消す 
 delete newfile 
 newfile が削除される 
mkfile
ファイルパス メモリ先頭,長さ
newdir/newfile に、0x8100000 から 0x100 バイトを書く 
 mkfile newdir/newfile 8100000,100 
 newdir/newfile が作成される 
fwrite
ファイルパス メモリ先頭,長さ
newfile に0x8100000 から、0x200 を追加 
 fwrite newfile 8100000,200
 newfile に指定データが追加される 
mkfile
ファイルパス メモリ先頭,長さ
newdir/newfile に0x8100000 から、0x200 を書く 
 mkfile newdir/newfile 8100000,200
 newdir/newfile に指定データが書かれる 
fread
ファイルパス メモリ先頭,長さ,位置
newfile の 0x100 から 0x8100000 に 0x100 読む 
 fread newfile 8100000,100,180
 newfile の 0x180 から 0x8100000 に 0x100 バイト読む 


準備中





ホームに戻る

inserted by FC2 system