そもそもFPGAとは何なのか

そもそもFPGAって何なのか、ピンと来ない方も多いかと思うんです。
(そんな人がこんなブログを見に来ることがあるのかはさておき)
一言で言ってしまうと動作を書き換えられるICです。
参考画像(Terasic社 DE0-Nano)
DE0-Nano レイアウト
画像中央右の「Altera」と書かれた大型のチップがFPGAです。
イメージとしてはマイコンが近いと思います。
大まかな違いは下記4点辺りかなと。
①タイミングを指定できる精度
②ピンの機能を変えられる自由度
③並列動作
④動作を記述する言語

 

LEDを点滅させる回路を例に考えてみましょう。
FPGAとマイコン.jpg

 

H8 マイコンでLEDを点滅させる場合、ソースはこんな感じ。

void main(void)

{
    volatile unsigned int i;

    volatile unsigned char *pdr = (unsigned char *)0xffd9;

    *(unsigned char *)0xffe9 = 0xff;

    while(1) {
        *pdr = 0x00;
        for ( i = 0; i < 60000; i++);//点灯時間
        *pdr = 0xFF;
        for ( i = 0; i < 60000; i++);//消灯時間
    }
}

(引用元: http://www.eleki-jack.com/h8/2009/07/h8-11-ledc.html )
このソースの場合、for文で点灯時間を設定していますね。
for文の中で加算と比較を繰り返している時間が点灯/消灯時間になります。
具体的に何秒になるか、と言うのはわからないです。
実測値を元に計算すれば大体の値は出せるかと思います。

FPGAの記述言語の一つ、VerilogでLED点灯回路を書くとこんな感じ。


module led_blink(
    clk         , //クロック50MHz
    reset_n     , //リセット信号(ローアクティブ)
    led           //LED
    );
    input  wire        clk     ; //クロック50MHz
    input  wire        reset_n ; //リセット信号(ローアクティブ)
    output reg  [ 7:0] led     ; //LED
    
    reg  [31:0] ctr; //時間計測用カウンタ

    always @(posedge clk)
    begin
        if(!reset_n)
        begin
            ctr <= 32'd1;
        end
        else if(ctr == 32'd25_000_000) //25M回クロックをカウントしたら(=0.5秒経過)カウンタをリセット
        begin
            ctr <= 32'd1;
        end
        else  begin
            ctr <= ctr + 32'd1; //それ以外の時はカウンタを加算
        end
    end

    always @(posedge clk)
    begin
        if(!reset_n)
        begin
            led <= 8'hFF;
        end
        else if(ctr == 32'd25_000_000) //0.5秒経ったとき、LEDを反転
        begin
            if(led == 8'hFF)
            begin
                led <= 8'h00;
            end
            else begin
                led <= 8'hFF;
            end
        end
    end

endmodule

文法に関しては別の機会に説明します。

①タイミングを指定できる精度
この回路では入力されたクロック(内部回路のデータを変化させるタイミングを合わせるための信号)をカウントして、時間を設定しています。
今回の回路では50MHzのものをクロックとして使用する想定で設計してますので、設定できる時間の分解能は20nsということになります。
H8マイコンでこの精度で時間を設定するのは中々難しいのではないかと思います。

②ピンの機能を変えられる自由度
マイコンは各機能に専用ピンが割り当てられています。
UARTを使うならこのピンをUARTとして使う、などは基本的に変えることができません。
FPGAにはこういった制約はほとんどありません。
メモリやコンフィギュレーション用のピン以外は電圧さえ適合していれば大抵の機能を割り当てることができます。
例えばUARTを3系統持たせるなんてこともできます。

③並列動作
マイコンは大半の機能の制御をCPUが担っています。
CPUはソフトウェアで動くので基本的にはソースの最初から順番に制御を行っていきます。

FPGAはクロックに同期して各素子が同時並行で処理をしていきます。
100個の加算器を置けば同時に100個の加算をすることも可能です。

マイコンからFPGAに移る際にイメージしにくい部分の一つではないかと思います。

④動作を記述する言語
FPGAの設計にはハードウェア記述言語(HDL:Hardware Description Language)を使います。
よく使われるものとしてはVerilog-HDLとVHDLがあります。
最近ではCで書いたプログラムをHDLに変換するようなものもあるようです。

HDLを書いてコンパイルしたものをハードウェアにダウンロードするので、開発の流れはC言語などのソフトと似ています。
ただ最終的に出来上がるものはソフトウェアではなくFPGA内部の配線データです。
同じソースコードを使ってもFPGA内部での回路の配置、配線によって最終的なパフォーマンスは変わってきます。


今回はおおまかにFPGAがどういうものか、私見を書いてみました。
私自身もまだまだビギナーですので、思い違い等があればご指摘ください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です