2006年09月07日

SPARTAN-3E開発の目標

さて、ひととおり、基礎をマスターしたところで、最終目標を設定したいと思います。
ずばり、

「RTPパケットの送受信」

です!
・・・やっと、この話の本題に突入しました。
なぜ、VoIP屋の私が、FPGAなぞをやってきたかといえば、まさにこのためで、VoIPの処理で非常に高負荷となるメディアパケットをハードウェア処理させたいがためのFPGAなのです。
特に、最先端のFPGAでは、数クロックですべての回路を書き換えられるという製品が出始めているらしく、これを用いれば、アプリケーションごとにFPGAの内容を書き換えるなんてことも可能になります。もし、そうなれば、PCにもコプロセッサとしてFPGAが搭載される可能性もあるわけです。
というところを、夢に見つつ、FPGAをやっている次第であります。(それに、ハードウェア周りは、おもしろいですから。)



さて、上記の目的を果たすために、やらなければならないことは、下記のことと思われます。

・LDCの表示

・キーボードの操作

・NICドライバの作成

・IPStackの作成

・UDPStackの作成

・RTPStackの作成

・・・・・・先は長いです、長すぎです。
しかし、光明もあったりします。実は、これをやるのによいサンプル(というか、ほぼそのもの)を、毎度おなじみすすたわりさんが作成しておられるのです!その名もSUSUBOX!!!ということで、これを利用して、いきたいと考えております。(ただ、Verilog-HDL版は、ないかも。。。)

本当なら、

・音声コーデック

・映像コーデック

も、実装したいところなのですが、こちらは、次の目標というところで。



これからは、非常に重量級の話になってくるので、更新頻度は落ちると思いますが、ちまちまと進めていく予定ですので、よろしくお願いします。

2006年09月04日

Verilog-HDLの文法後編

前回の続きです。

■回路記述
●function
関数です。
どうやら、moduleは、関数ではなく、C言語で言うところのプログラム自体を指すということになりそうです。そうすると、main関数は、moduleの内部にあるということで、moduleのmain関数(相当)というのはないのかもしれません。

function ビット幅 ファンクション名;
endfunction

●if
C言語同様の扱いとなります。特に、変わったところはありません。

●case

case (式)

式:ステートメント

default:ステートメント

endcase

C言語で言うところのswitchです。

●for
C言語同様の扱いとなります。特に、変わったところはありません。

●while
C言語同様の扱いとなります。特に、変わったところはありません。

●repeat

repeat(回数)


指定回数、繰り返すという構文です。

●forever

forever


無限ループするという構文です。。。さすがは、ハードウェアって感じですね。これは。



■特殊な文
C言語には無いハードウェアならではと思われる構文を説明します。

●遅延制御

#遅延式

というように、遅延を制御するために使用します。
#10 A=B;

10単位時間後に、「A=B」を実行します。(単位時間は、timescalse文で指定します。)

●イベント制御

@イベント式

というように、イベント駆動をするための構文となります。
always @(A)

B=C;

Aが、変化したら、「B=C」が実行されます。(alwaysは、後述します。)
また、特別な条件指定として、
posedge・・・立ち上がりエッジ

negedge・・・立ち下がりエッジ

というものも使えるそうで、ほかにもいろいろとあるようです。

●イベント文

event イベント;

上記の駆動条件として使用できるものです。
ただし、論理回路化されないそうなので、実回路を考える場合にはレジスタ宣言などに置き換えなければなりません。

●assign文

aggign 遅延 代入文;

ポート、ネット宣言に対して、代入したい場合に使用します。
レジスタ宣言に対しては、「=」のみで代入できます。

●always文
Verilog-HDLのキモというべきものだそうです。いろいろ使用法があるようですのです。

always タイミング・コントロール ステートメント

タイミング・コントロール・・・@イベント式 または #定数式


タイミング・コントロールに、変化がある度に実行される文となります。C#のdelegateのような存在となります。

●initial文
上記always文の実行時に一回のみ実行されるバージョンです。

●制御ブロック

begin

式;

end

C言語の「{式}」に相当し、まさにパスカルそのものの意味です。
always @(A) begin

B=1;

C=1;

end

●並行ブロック

fork

式;

join

上記の制御ブロックの仲間ですが、こちらは、「内部にある式がすべて同時に実行」されます。
fork

b=1;

#10 c=1;

#5 d=1;

e=1;

join

上記の場合、「b=1」と「e=1」が実行され、5単位時間経過後、「d=1」が実行され、10単位時間経過後、「c=1」が実行されるということになります。




以上、駆け足できましたが、必要そうな部分は何とかなるのではないかと思います。

2006年09月02日

Verilog-HDLの文法前編

さて、前回の謎を解くべく、こちらであげた参考書を元に、体系だった基礎勉強の開始です。


■なぜ、HDLを使うのか?
C言語とアセンブラ言語の関係と同じで、ハードウェア依存性をなくすためです。

■何を、設計・記述するのか?
回路図を設計し、記述するための言語となります。
この場合の回路図というのは、「AND回路」「OR回路」「NAND回路」「NOR回路」を組み合わせた理論回路を指します。

■文法
●構造
・moduleによる構造が基本単位となります。

module モジュール名(ポート・リスト);
ポート宣言
ネット宣言
レジスタ宣言
パラメータ宣言

回路記述
endmodule

という、構造となります。


●変数
・ポート宣言

input led;

という、入出力ポートの指定となります。
input [7:0] led;

とすると、ビット幅(配列?)指定になります。

・ネット宣言

wire led;

という、配線の指定となります。ポート宣言した場合は、省略できるようです。
こちらもビット幅指定可能です。

・レジスタ宣言

reg ff1;

という、ラッチやフリップフロップの指定となります。基本的には、ネット宣言の値を保持できる番というもののようです。
こちらもビット幅指定可能です。

・パラメータ宣言

parameter STEP=1000;

という、定数宣言の指定となります。


●値の表現
・論理値

0・・・0

1・・・1

x・・・不定値

z・・・ハイ・インピーダンス

という、値が存在します。
また、
supplay

strong

pull

large

weak

medium

small

highz

という、信号強度の指定ができるそうですが、シミュレーション時にしか使用されないようです。省略時には、「strong」になります。

・定数表現

b,B・・・2進数

o,O・・・8進数

d,D・・・10進数

x,X・・・16進数

これは、そのままの意味です。

●演算子
・基本的な演算子

算術演算

ビット演算

論理演算

等号演算

関係演算

シフト演算

は、優先順位も含めて、ほぼC言語と同じです。

・真偽値

真・・・1(1'b1)

偽・・・0(1'b0)

です。

・連接演算子

{led1, led2}

という、記述をする「{}」を使用する演算子です。
led1,led2が、8ビットであったとすると、これは16ビットということになります。

・リダクション演算

&

~&

|

~|

^

~^

意味は、ビット演算子と同じですが、ビットすべてに作用させることができます。
reg [7:0] cnt;

に、この演算子を適用すると、cnt[0]〜cnt[7]まで、すべてが演算されます。

・例外的なもの
インクリメント、デクリメントはありません。

a=b=c=1

というような記述はできません。

2006年08月29日

SPARTAN-3E開発最初の一歩の疑問

前回の「SPARTAN-3E開発最初の一歩」は、サンプルにいわれるがままにコーディングを行ったわけですが、意味不明な点が多々あるわけです。(すみません。実は、前回のコード、全然、理解していません。)
そこで、ド素人なりに考察してみたので、下記に記述しておきます。(※ド素人が自分勝手に考察したものですので、間違っている可能性が高いことをお断りしておきます。)

●I/Oは何を示す?
通常のプログラミングであれば、標準入出力やFILE、Socketから、データをin/outすることにより、プログラムとして動作するわけですが、FPGAでは、この部分が何になるのかという疑問です。

そのヒントは、「1-4」と「3-3-1」で出てきた下記の設定部分にあるようです。

1-4の設定:
・一行目

Port Name:led

Direction:output

・二行目

Port Name:sw

Direction:input



3-3-1の設定:
led1 = F12

sw = L13

これを合わせて読めば、下記のようになるかと思います。
・「led1」が、「F12」へ、「output」される

・「sw」が、「L13」へ、「input」される

「led1」や「sw」が、変数のような役割をしていることは、想像が付きますが、「F12」や「L13」とは何ののでしょうか?

それを解く鍵は、Spartan-3E スタータ キット ボード ユーザー ガイド (日本語版)Spartan-3E ASCII ピン配置と Excel フットプリント (英語版)にありました。
Spartan-3E スタータ キット ボード ユーザー ガイド (日本語版)の21ページに、LED1に対して、「F12」が接続されているという記述があります。
また、Spartan-3E ASCII ピン配置と Excel フットプリント (英語版)のピン配置は、碁盤の目のようになっており、「英字行」と「数値行」で、「F12」という記述でピン配置を表しています。

すなわち、これらの設定は、FPGAのピンが、どこに素子や端子に繋がっていて、どのような動作(in/out)をするかを、定義しているものです。

ということで、FGPAでHDLプログラミングするということは、

FGAPのピンをどの素子や端子に接続して、in/outするか?

というものを記述するということになるようです。



●main関数はどこ?
電源投入時に、読み込まれる関数(?)が、どれになるのか?という疑問です。

まず、vファイルの先頭行が、下記のようになっていることから、これが関数に相当するものだというのは想像できます。

module sw_led(led1, sw0);

ということは、main関数に相当する関数があってもよさそうです。で、調査してみようかと思ったのですが、調査法が検討付かないので、断念します。のちほど、知識が付いてきたときに再度チャレンジしたいと思います。

予想としては、main関数に相当するものは、ありそうだとは思うのですが、一つ懸念点として、

基盤上のLED1とLED2を別々に操作できるということは、FPGAの場合、関数が普通のプログラミングででいうところのプロセスやスレッドの単位で動作する

という点が気になるところです。これを考えると、固定的に1つだけmain関数を用意するのは、良くなさそうな感じがします。



●論理合成とは?
「4」では、何を行っているのか?の具体的な内容が解らないという疑問です。

下記のような設定をしたので、特別なファイルが出来るようなのですが、これがなにか?ということです。

[Readback Oprions]内の

[Create ReadBack Data Files] チェック

[Create Mask File] チェック

概要的には、FPGAの配線の設計図ということなのでしょうが、ド素人の私には、その内容が想像できません。
これも、ヒントなどがほしいところですが、いまのところ、私にはハードルが高いようです。

2006年08月26日

SPARTAN-3E開発最初の一歩

まずは、どんなモンか感じをつかむため、プログラミング言語でいうところの「Hello World」を表示するプログラムを作成したいと思います。

で、調査したところ、FPGAでやる場合は、「LCDコントローラ」を書く必要があるようで、「文字の表示」の難度は高いようです。
そこで、「LEDを光らせる」というプログラムを書いてみようかと思います。これが、一番の入門プログラムらしいので。
※下記は、「組込みプレス Vol.4」の「特集2 FPGA基礎」という記事を参考にさせていただきました。


1,新規プロジェクト作成
まず、ISEを起動してください。
そして、起動後、[File] → [New Project] とクリックします。

1-1,[Create New Project]ウィンドウ
下記の値を好きなように入力してください。

Project Name
Project Location
Top-Level Source Type:HDL


1-2,[Device Properties]ウィンドウ
デバイスの設定情報を設定します。Spartan-3Eでは、下記のような値を入力します。

Product Category:ALL
Family:spartan3e
Device:xc3s500e
Package:fg320
Speed:-4
Top-Level Source Type:HDL
Synthesis Tool:XST(VHDL/Verilog)
Simulator:ISE Simulator(VHDL/Verilog)
Enable Enhanced Design Summary:チェック

1-3,[Select Source Type]ウィンドウ
ソースファイルを作成します。ファイル名は、お好きなもので構いません。

Verilog Moduleを選択
File name:sw_led

1-4,[Define Module]ウィンドウ
ポートの入出力設定をします。下記のようにしてください。

・一行目
Port Name:led
Direction:output
・二行目
Port Name:sw
Direction:input


1-5,[Add Existing Sources]ウィンドウ
追加ソースがあれば、指定しますが、今回はナシでOKです。


1-6,終了
[Finish]をクリックします。
その後、[Adding Source Files]ウィンドウが出現しますが、[OK]をクリックします。

以上で、新規プロジェクト作成が終了です。
つづいて、プログラミングを行います。


2,プログラム作成
左上の[Sources]ウィンドウにある、上記で作成したファイルをダブルクリックします。
そうすると、ソースファイルが変更可能状態となります。
コメントを抜いた4行目に、下記コードを記述します。swの状態をled1の状態にするという記述です。

assign led1 = sw;

以上で、プログラミング終了です。(;^_^A アセアセ・・・
つづいて、配線を行います。どうやら、FPGAでのキモとなる部分のようです。


3,配線ファイルの作成
「1-4,[Define Module]」で、指定したものを具体的に配置します。

3-1,[Select Source Type]ウィンドウ
左上のWindow[Sources] にある、上記で作成したファイル上で、右クリック → [New source]をクリックします。
[Select Source Type]ウィンドウが、出現しますので、下記のようにします。

Implementation Constraints Fileを選択
File name:sw_led


3-2,[Associate Source]ウィンドウ
右クリックで選択したファイルがあることを確認して、[Finish]をクリックします。
そうすると、[Sources]ウィンドウ に、ucfファイルが追加されます。


3-3,[Xilinx PACE]ウィンドウ
上記で作成したucfファイルを選択すると、左下の[Processes]ウィンドウの内容が変わります。
その中の [User Constraints] → [Assign Package Pins]をダブルクリックします。

そうすると、[Xilinx PACE]という新しいウィンドウが開らきます。
これは、I/O(ピン配置)を設定できるツールとなります。

3-3-1,[Design Object List]ウィンドウ
[Design Object List]ウィンドウに、「1-4,[[Define Module]」で指定したデバイスがあるはずです。
そこの[Loc] に、下記のように入力します。

led1 = F12
sw = L13


3-3-2,[Save]する
[File] → [Save]で、セーブを行います。
このときに、[Bus Delimiter]ウィンドウが出現しますので、下記の設定で[Finish]をクリックします。

[Symplify Verilog Default:[]]

以上で、[Xilinx PACE]ウィンドウを終了します。


3-4,[Processes]ウィンドウ
[Sources]ウィンドウの[sw_led.v]ファイルをクリックします。
そうすると、[Processes]ウィンドウの内容が変更され、[Implement Design] に、オレンジ色の「?」がついているはずです。
※よくわかりませんが、設定が反映されないことがあるようです。そのときは、ISEを再起動してみてください。

このオレンジ色の「?」をダブルクリックします。
そうすると、配線が自動で作成されます。

4,回路作成
FPGAへ送るための配線データファイル(ビットファイル)を作成します。

4-1,[Generate Programming File]ウィンドウ
[Processes]ウィンドウの[Generate Programming File] → 右クリック → [Properties]をクリックします。
[Process Properties] ウィンドウが出現しますので、下記のようにし、[OK]をクリックします。

[Readback Oprions]内の
[Create ReadBack Data Files] チェック
[Create Mask File] チェック


4-2,データ生成
[Processes]ウィンドウの[Generate Programming File] を、ダブルクリックします。

以上で、論理合成などが生成されます。


4-3,ボード接続
ここまで終了したら、ボードを接続してください。これ以降は、ボードがないと動作しません。


4-4,[iMPACT]ウィンドウ
[Generate Programming File] → [Configure Device (iMPACT)] を、ダブルクリックします。

[iMPACT]ウィンドウが出現しますので、下記を選択して、[Finish]をクリックします。

[Configure devices using Boundary-Scan]
Automatically connect to a cable and idenify Boundary-Scan chain

以上で、コンパイルが始まりますが、数十分かかるので、覚悟の上でクリックしてください。


4-5,[Assign New Configuration File]ウィンドウ
「4-4」が終了すると、[Assign New Configuration File]ウィンドウが出現しますので、[sw_led.bit]を選択して、[Open]をクリックします。
その後、このウィンドウを終了します。

※「4-4」操作をしてから、この画面が出るまで、数十分くらいかかります。


4-6,[Programming Properties]ウィンドウ
[Boundary Scan]ウィンドウの[xc3s500e]を右クリックして、[Programming Properties]をクリックします。
[Programming Properties]ウィンドウが出現したら、何も変更せずに、[OK]をクリックします。

[Boundary Scan]ウィンドウに、「Program Successed」と表示されたら成功です。


以上で、データがボードに転送されます。
あとは、ボード上のsw0スイッチを操作するとLEDが点灯/消灯します。


以上、終了です。

2006年08月24日

SPARTAN-3E開発準備

前回の続きです。

開発環境が整ったので、続いて、実際にコードを書いてみたいと思います。

で、早速、開発環境や付属CDからサンプルコードを検索。。。。。。あれ?見つからない。。。_| ̄|○

気を取り直して、すすたわりさんところのSUSUBOXのリンク集を、眺めてみると、、、う〜ん、初心者向けのサイトって無いんですね。Google先生に聞いても、いまいち出てきませんし。。。

どうやら、HDLやFPGAの基礎は、書籍から学ぶ方が良さそうです。

FPGAを記述するHDL(Hadrware Description Language:ハードウェア記述言語)は、2種類あるそうで、どちらにするかを決めなければならないようです。
それぞれの特徴は、下記のようになっていると私が勝手に解釈しています。(;^_^A アセアセ・・・

ということで、私は、初心者に優しそうな「Verilog-HDL」を、まずやろうかと思います。(というか、VHDLの良さそうな書籍がないという問題もあります。)
※現在は、C言語の拡張をして、純粋にC言語で記述できるものとかあるそうです。

■開発言語
●Verilog-HDL
・C言語っぽくかける
→詳細はよろしくやってくれる

●VHDL
・回路の詳細まで定義できる
→アセンブラ的?




開発言語が決まりましたので、下記のような感じで、何冊が注文してみることにしました。

■書籍
●開発言語の文法
入門Verilog HDL記述
Verilog‐HDL言語入門

●例題とサンプルコード
HDLによるVLSI設計
実用HDLサンプル記述集
HDLによるデジタル設計の基礎
HDLによる高性能ディジタル回路設計




最後に、データシートなどの技術資料のリンクを付けておきます。私のようなド素人では、見ても意味不明ですが。。。(;^_^A アセアセ・・・

■技術情報
●Xilinx社の技術資料
Spartan-3E データシート (全 4 モジュール) (日本語版)
Spartan-3E スタータ キット ボード ユーザー ガイド (日本語版)


以上で、やっと、開発に取りかかる準備完了です。

2006年08月22日

SPARTAN-3E向け開発環境セットアップ

現実逃避シリーズです。(;^_^A アセアセ・・・

FPGAド素人である私が、はまったところをメインに記述します。


1,開発環境の入手
ISE WebPACKという開発環境が、無償にて提供されていますので、それを利用します。これは、MS社のVisualStudioとような開発ツールとなります。
付属のCDか上記リンクから、取得してください。
※フルパッケージは、1GBほどあるので、ダウンロードする場合は、覚悟が必要です。私の環境では、40分ほどかかりました。

これだけ、手に入れればOKです。


2,開発環境のインストール
何も考えずに、「次へ」でインストールされます。
最後に、PATHの設定をするので、そこだけ、競合しないかどうかチェックすれば、OKだと思います。

※状況により、付属CDのケースに書かれている「Product ID」が必要となるようです。


3,ボードの認識
間違うとやばいことになりそうなので、簡単に手順を記述しておきます。

1.「電源がOFF」になっているか確認します。
2.ACアダプタをボードに接続します。
3.USBケーブルをボードに接続します。
4.「電源をON」にします。
5.液晶ディスプレイに「Spartan-3E〜」の文字が出ていることを確認します。
6.USBケーブルをPCと接続します。
7.2つほど、新規デバイスが認識されますが、「自動検索」で認識可能なので、それを選びます。


以上で、すべてのインストールが終了し、PCで使用できる状態となります。

ついしん
組込みプレス Vol.4」の「特集2 FPGA基礎」という記事が出ており、こちらはもっと詳細に記載されておりますので、こちらも是非とも参照してみてください。


ついしん^2
メインのチップにバグがあって、リコールしているそうです。こちら
まぁ、私程度のド素人が踏むとは思えないので、無視する次第ですが。

2006年08月16日

Spartan-3E スタータ キット到着

Spartan-3E スタータ キット」到着いたしました。

これで、いつでも、あちらの世界に逃避行できまするるる。

●箱

●板

2006年08月08日

Spartan-3E スタータ キット

こちらおかたから、刺激を受けて、「Spartan-3E スタータ キット」を購入してしまいました。暇無いのに。(;^_^A アセアセ・・・

在庫切れで、2〜3週間くらい待たされるそうなのですが。時期的には、現実逃避をしたくなっている頃なので、ちょうど良いかも。(w