RIGHT:&lastmod;

* FPGAの利点 [#v4a5f608]

FPGAを使う上での利点をまとめてみました。

* 更新履歴 [#dc70f213]

- 2011-09-19 新規
- 2011-09-30 「結構電流が取り出せる」追記

** ピンの配置が自由 [#ifecfd5b]

電源ピン、JTAGピン等の一部のピンを除いて、ピン配置は自由です。

このため、回路設計、基板製作では、載せる部品、基板デザインを優先した設計ができます。

ピンは1ビットから生成できるので、例えばマイコンでは必ず8ビット、16ビットくくりでアクセスしなければならない、または他の7ビット、15ビットは捨てていたのが、制限がなくなります。

*** 例1 連続したビットを使いたい [#weef1e5e]

[[&ref(https://lh5.googleusercontent.com/-U2Kyd1hY5Oo/T7tZqVQw4xI/AAAAAAAACBk/Q_r3Et9QsZY/s144/cpu1.png);:https://picasaweb.google.com/lh/photo/XMCXftSTz1_1JeYEa_FgTNMTjNZETYmyPJy0liipFm0?feat=directlink]]

CPUでは、ピン位置、機能、番号が決まっています。

そのため、左図のポート50〜57で連続8ビットで使いたい(アートワークしたい)とき、ポート10〜12を迂回する処理をしなければなりません。

#clear

#hr

[[&ref(https://lh5.googleusercontent.com/-9BKeQa2OGXw/T7tZrFWxbQI/AAAAAAAACBw/O0flmSwO4rc/s144/fpga1.png);:https://picasaweb.google.com/lh/photo/QUfm-eegSYLcK-7JcyA7ndMTjNZETYmyPJy0liipFm0?feat=directlink]]

FPGAでは、電源ピン等の一部を除き、ピン配置は自由に行うことができます。

そのため、部品配置の自由度、アートワークの簡便化を図ることができます。


*** 例2 配線を交差させず接続したい [#if3bca02]

[[&ref(https://lh5.googleusercontent.com/-p53H3-uufpg/T7tZsX9wK_I/AAAAAAAACCI/Mby5A4DYq70/s144/flooreplan1.png);:https://picasaweb.google.com/lh/photo/rAaPAmkWTCc_MyN9d3ghVdMTjNZETYmyPJy0liipFm0?feat=directlink]]

回路図を描画した後、例えば図のように、配線が左右入れ子になっているとき、この配線を入れ替えることで、基板の配線は非常に簡単になります。


#hr

[[&ref(https://lh5.googleusercontent.com/-33nzp_lG03Y/T7tZq4fitJI/AAAAAAAACB4/WkTzjOaI56M/s144/flooreplan2.png);:https://picasaweb.google.com/lh/photo/ndAit8KT1lZBuYFogM9BZ9MTjNZETYmyPJy0liipFm0?feat=directlink]]

このようなことがFPGAでは可能になります。

*** 例3 部品の位置を合理化させたい [#nefc5d9a]

[[&ref(https://lh4.googleusercontent.com/-qOWfh2YcYck/T7tZrn2KIsI/AAAAAAAACCA/MUyL6i7Py4k/s144/uart1.png);:https://picasaweb.google.com/lh/photo/zzgMF46BlsNF38LnaaEhJ9MTjNZETYmyPJy0liipFm0?feat=directlink]]

たとえば、UARTが使いたいときは、図のように、決められたピンを使う必要があります。

#hr

[[&ref(https://lh5.googleusercontent.com/-XFzFB4axyW4/T7tZsKdFgxI/AAAAAAAACCE/Q0-YVAhqzas/s144/uart2.png);:https://picasaweb.google.com/lh/photo/vM4Z6qnCrSDP3jCL8_R_8NMTjNZETYmyPJy0liipFm0?feat=directlink]]

そのため、必然的に部品配置もマイコンのピンアサインありきで行われ、変えようがないのである意味楽な部分もありました。

#hr

FPGAではピンアサインは基本的に自由ですので、先にどう部品を配置したいかを決める必要があります((高速I/O、差動信号等利用できるピンに制限がある場合はその部分の配置を優先しますが、ここでは割愛します))。

[[&ref(https://lh6.googleusercontent.com/-lBkx5PgVCEw/T7tZscp1HZI/AAAAAAAACCU/UB_p6H89bvU/s144/uart3.png);:https://picasaweb.google.com/lh/photo/uNUYLPTM_FvYYRtYN1wX9dMTjNZETYmyPJy0liipFm0?feat=directlink]]

左図のように、どこに部品配置を行うかを決めます。

#clear

** 記述したとおりの回路が生成される [#pc5de462]

入力を出力に反映させる、簡単な処理を考えます。

CPUのメインプログラムでは

 int main(void)
 {
   OUTPUT_PORT = INPUT_PORT;
 }

以上の記述になりますが、実際は、リセット処理が入ります。

//さらに、アセンブラコードに直すと、
//
// mov

FPGAはこの場合、接続記述だけなので、

 module top(
   input mclock,
   input [7:0] in,
   output [7:0] out
 );
 
   always @(posedge mclock) begin
     out <= in;
   end
 endmodule

以上の記述になります。

** 並列動作が可能 [#l6d972e0]

同様に、複数の入力を出力に反映させる処理を考えます。

CPUでは

 int main(void)
 {
   OUTPUT_PORT1 = INPUT_PORT1;
   OUTPUT_PORT2 = INPUT_PORT2;
 }

以上のように、PORT1の処理とPORT2の処理で、時間差が生じてしまいます。

FPGAでは

 module top(
   input mclock,
   input [7:0] in1,
   input [7:0] in2,
   output [7:0] out1,
   output [7:0] out2
 );
 
   always @(posedge mclock) begin
     out1 <= in1;
     out2 <= in2;
   end
 endmodule

以上の記述になります。

この場合、

 always @(posedge mclock) begin
   〜〜〜
 end

の中が、mclockの立ち上がりエッジ(posedge)で駆動します。

囲まれている、

 out1 <= in1;
 out2 <= in2;

がすべて同時に動きます。

** 高速に処理を行うことができる [#f74876a8]

CPUでは、1処理に対し数クロックを要します(([[インターフェース2011年7月号を試す>実験/インターフェース2011年7月号]]に詳しく書く予定))。

たとえば1ビットの信号をI/Oから読んで、シフトする処理を考えます。

CPUだと「読み込み」「ビットシフト」の2命令が必要です。それぞれの命令で「フェッチ」「命令デコード」「実行」の3クロック必要なので、合計6クロック経過します。

一方FPGAでは1クロックで読み込みと、シフトを完了します。

 module 1bit_shift(
   input mclock,
   input mreset,
   input in,
   output reg [7:0] out
   );
 
   always @(posedge mclock) begin
     if (~mreset) begin
       out <= 8'h00;
     end else begin
       out <= {out[6:0], in};
     end
   end
 
 endmodule


** ビット配置が自由 [#me75c867]

CPUでは信号を入出力する単位は、CPUアーキテクチャに依存します(8ビット、16ビット、32ビット等)。

そのため、特定の1ビット信号を操作するとき、以下のような操作が必要です(PORTの1ビット目を1にする例)。

 int main(void)
 {
   int temp;
   temp = PORT;
   temp |= 0x01;
   PORT = temp;
 }

FPGAでは、信号と信号の幅を自由に定義できます。

 module output(
   output [7:0] out1,
   output [3:0] out2,
   output       out3
   );
 
   assign out1 = 8'h12
   assign out2 = 4'he
   assign out3 = 1'b1
 endmodule

** CPUを構成できる [#u50d93f2]

順序処理、OSの搭載、従来の開発手法を用いたいときなどでCPUが必要なときでも、FPGAは内部にCPUを構成することができます。

- [[とにかく始めるMico8]]
- [[とにかく始めるMico32]]

** 多品種少量生産が可能 [#tebfd601]

マイコンでもプログラムの変更、バリエーションによって違う動きをさせることができますが、ハードウェア機能の変更までは行えません。

例えば、UARTポートが5つ必要、I2Cバスがほしい、タイマが10コほしい、というのが挙げられます。

これらをソフトウェアで実現しようとすると、CPU処理を多く必要とし効率の悪いものとなってしまいます。

** 結構電流が取り出せる [#f67718fd]

マイコンとFPGAで、それぞれI/O電流がどれだけ取り出せるか調べました。

||マイコン(H8/3694)|FPGA(MachXO2)|
|HIGH出力|2mA|24mA|
|LOW出力|20mA|24mA|

H8/3694データシート

[[&ref(https://lh4.googleusercontent.com/-QkG75kCxMKY/T7tZp-WhGyI/AAAAAAAACBc/7GTnIanOH6E/s144/01.png);:https://picasaweb.google.com/lh/photo/A4GR6M40H1FssHYreIRsZ9MTjNZETYmyPJy0liipFm0?feat=directlink]]

MachXO2データシート

[[&ref(https://lh5.googleusercontent.com/-M7yGHX-EARk/T7tZpyn2i4I/AAAAAAAACBU/hVJ0iCxcA-A/s144/03.png);:https://picasaweb.google.com/lh/photo/skAePeh0aCMPRFV7G51AW9MTjNZETYmyPJy0liipFm0?feat=directlink]]

マイコンは、データシートより、LOW出力で合計80mAなので、8ビットのLEDを並べた場合、1個あがり10mAが限度となります。

FPGAは、データシートより、LOW出力、HIGH出力関係なく、設定により24mA流すことができます。

ただし、データシートに以下の記述があり、

> 4. The average DC current drawn by I/Os between GND connections, or between the last GND in an I/O bank and the end of an I/O bank, as
> shown in the logic signal connections table shall not exceed n * 8mA. Where n is the number of I/Os between bank GND connections or
> between the last GND in a bank and the end of a bank.

GNDで挟まれたピンで流せる電流の合計値は、挟まれたピン数×8mAとなります。

よって以下のように、デバイス合計では856mA流せることになります。この場合発熱の検討が必要です。

[[https://lh6.googleusercontent.com/-tS8JdcLrbK4/ToTqocBghWI/AAAAAAAAAjo/-L6OLPjn9eA/s288/06.png:https://picasaweb.google.com/lh/photo/NuwJu0wRsUUUrlhiAt1EMtMTjNZETYmyPJy0liipFm0?feat=directlink]]

ピンの場所を工夫することにより、10mAのLEDを68点繋げることができます。

[[https://lh4.googleusercontent.com/-drvaswrgW4w/ToTqnmt56pI/AAAAAAAAAjk/gVqgtF3NtA4/s288/05.png:https://picasaweb.google.com/lh/photo/3cwiRGey3bAuKFCpSpFW39MTjNZETYmyPJy0liipFm0?feat=directlink]]

* 関連書籍 [#n23d9726]

- [[インターフェース2009年9月号 ソフトウェア技術者のためのFPGA入門>http://www.kumikomi.net/interface/contents/200909.php]]

* この記事は役に立ちましたか? [#m37b36ad]

#vote(役に立った[15],役に立たなかった[3],コレジャナイ![6])
#vote(役に立った[16],役に立たなかった[3],コレジャナイ![6])
- 試しに押してみました。 -- [[商品開発部]] &new{2011-10-20 (木) 08:37:59};

#comment_kcaptcha

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS