HOME > ソフテックだより > 第413号(2022年11月2日発行) 技術レポート「FPGA利用方法の多様性について」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第413号(2022年11月2日発行)
技術レポート

「FPGA利用方法の多様性について」

1. はじめに

近年、ソフテック社内でFPGAを利用した開発をすることや、お客様が作成した基板上にFPGAが実装されていることが増えてきました。

FPGA(Field Programmable Gate Array)とは、デジタル回路を書き込めるLSIです。
従来は、デジタル回路をICやLSIを基板に実装して実現していましたが、FPGAを利用するとHDL(Hardware Description Language:ハードウェア記述言語)でデジタル回路を記述して、作成した回路をFPGAに書き込んで利用ができます。
また、FPGAは、何度も書き換えが出来るため、回路に問題があって修正したり、回路の機能拡張をすることが可能となります。

FPGAの外見は、基板上に実装されたLSIであり、その動作は外見から全くわかりません。
一方、FPGA内部を見ると、FPGAに、CPUコアを配置して、そのCPUでソフトウェアを実行することができます。
また、CPUコアを利用せず、ソフトウェアを利用せずにシステムを実現することも可能です。

今回は、万能に変化するFPGAの多様性を説明します。

2. ソフトウェアとハードウェアのトレードオフ

FPGAに限らず、組み込みシステムの構成を検討するときに、ハードウェアで実現する機能とソフトウェアで実現する機能の切り分けをすることをトレードオフと呼びます。

トレードオフの作業を行うためには、ハードウェアとソフトウェアを理解している必要があります。また、開発するシステムのポイントを理解している必要もあります。

例えば、基板を量産する場合は、基板のコストが重要になります。
「1つ50円の部品を基板から削減するために、ソフトウェアで実現したい機能がある」という話を頂くことがあります。
年間で10,000枚の基板を作ると、50円の削減により、年間50万円のコスト削減につながります。

また、性能の向上が目的となれば、コストアップになっても、高性能なCPUの利用や、高機能なLSIを利用してソフトウェアの処理をハードウェアで実現するシステム構成を考えます。

他にも、実験的な開発の場合は、開発コスト全体を削減する必要があります。
その場合は、市販のハードウェア(例えばPLCや、マイコンボードなど)を利用して開発することで、ハードウェアの開発コストを削減して、システム全体の開発コストの削減にもつながります。

このように、開発の目的によって、ハードウェアとソフトウェアの機能のトレードオフの方法が変わってきます。

ここは、FPGAの実現方法においても、同じようなことが言えます。

3.  FPGAにおけるトレードオフの注意点

機能のトレードオフの前に、FPGAを利用した場合の、トレードオフの注意点を説明します。

FPGAには、論理回路を実現するための元になる回路(インテル製FPGAの場合はロジックエレメント:LE)が入っており、製品によって数が違います。
ちょうどCPUがROMサイズによって製品分けされて販売されているようにFPGAもロジックエレメントの数によって製品分けされています。
よって、FPGA内に配置できる論理回路には、上限が存在するため、すべての機能をハードウェアで実現することにも限界があります。

一方、FPGA内部でソフトウェアを実行するためには、CPUを構成するためのロジックエレメントが必要になります。
CPUを構成するために必要なロジックエレメント数は、公開されており、FPGAを選択する際の参考にできます。

FPGAでソフトウェアを実行するためには、プログラムを格納するROM領域やプログラムを実行するためのRAM領域が必要になります。
ただし、SDRAMなど外部にメモリ増設して利用することも可能なため、プログラムの容量が増加した場合でもロジックエレメントへの影響は少なくて済みます。

実現するシステム規模によりますが、FPGAのロジックエレメント数の上限が決まっているため、ハードウェアとして実現する回路規模にも上限があります。
この部分がトレードオフを検討する時の注意点とも言えます。

4. トレードオフの例

システム例を題材にして、FPGAを利用した場合に考えられる構成例を説明します

4-1. システム例「パルスカウンタ」

「入力されたパルス(ON/OFF信号)の立ち上がりエッジを数え、その結果を8bitの端子にバイナリ出力する」システムを例にします。
図に表すと以下のとおりです。

FPGAの入出力信号
図1.  FPGAの入出力信号

ここでは、入力パルスに、どこまで追従できるかがポイントになります。

4-1-1. CPUを利用しない構成

CPUを利用せずに実現する場合のFPGA内部の構成は以下のとおりです。
HDL(ハードウェア記述言語)で回路を作成しFPGA内に回路を配置します。
その後、配置した回路の信号と実際のFPGAのピンを結び付けると実現できます。

CPUを利用しない場合の構成
図2.  CPUを利用しない場合の構成

HDLのボリュームの参考用にVerilogで記載してみました。
(参考用のためノーデバックです)

HDLの概要は、クロックの立ち上がりエッジが入るたびに、パルス信号をサンプリングし、パルス信号がLowからHighになったタイミングでカウントアップします。
そのカウンタの状態を8bitカウンタ出力として端子へ出力します。

module PulseCounter(
    input           i_clk,	//入力信号:クロック(50MHzと仮定)
    input           i_reset,	//入力信号:リセット
    input           i_Pulse,	//入力信号:パルス信号

    output  [7:0]   o_Counter	//出力信号:8bitカウンタ
);

    reg              PulseBefore;	//前回のパルス状態を保持する
    reg	    [7:0]    PulseCounter;	//パルスの数を数える

    assign o_Counter = PulseCounter;

    //パルスカウンタ回路
    always @( posedge i_clk ) begin	//クロックの立ち上がりエッジで以下の処理をする
        if(i_reset == ON)		//リセット入力
        begin
            PulseBefore <= 1'b0;	//リセットの入力により2bitレジスタをクリア
            PulseCounter <= 8'd0;	//カウンタをクリア
        end
        else if(PulseBefore == OFF)
        begin
           if(i_Pulse == ON)			
                PulseCounter <= PulseCounter + 8'd1;	//カウントアップ
        end
        PulseBefore <= i_Pulse;			//次回の比較用に保存
    end

endmodule

参考用:Verilog記述例

この構成の場合、クロックに同期して信号をサンプリングします。
よってクロックが50MHzの場合は50MHzでサンプリングします。
よって、サンプリング定理から25MHzまでのパルス入力をカウントすることが出来ます。

4-1-2. CPUを利用する構成

CPUを利用した場合の構成は以下のとおりです。
CPUでプログラムを実行するために、ROMとRAMをバスで接続します。
また、ソフトからパルス入力や8bitカウンタ出力を制御するためIO制御用の回路もCPUとバス接続します。
このような構成によって、FPGA内部にCPUを配置し、マイコンのようにプログラムから入出力端子を制御することが可能になります。

CPUを利用した場合の構成図
図3.  CPUを利用した場合の構成図

CPUを利用した場合、プログラムによって、パルスの入力状態を読み込み、プログラムでカウンタ値を出力します。

プログラムの実行速度はCPUのアーキテクチャーによっても変わります。
FPGAの場合は、CPUコアを購入したり、究極的には自作することも可能であり、一概に性能を記載することができませんので、1命令を1クロックで実行する前提で説明します。

CPU無し構成の場合は、1クロックのタイミングでパルスをサンプリングしていました。
一方、CPUを利用する場合は、1命令を1クロックで実行するため、1回のサンプリングには、数命令の実行が必要になります。
そこから、パルスの立ち上がりエッジの検出処理や、カウントアップ処理、結果の出力処理を考えると、少なく見ても数十命令は実行します。
言い換えると、1回のサンプリングに数十クロック(命令)かかるため、パルスの周波数上限も低い周波数となります。
CPU無し構成に比べて、大幅な性能低下と言えます。

4-1-3. 機能の拡張性

上述のとおり、パルスカウンタの機能実現においては、CPUを利用せずに構成した方が高性能になります。

では、パルスカウンタの機能を拡張する場合を考えてみます。
1秒間ごとのカウンタ値を保存し、過去1時間の移動平均を8bitカウンタに出力します。

CPUを利用している場合は、ソフトウェアの修正で対応が可能です。
この場合は、FPGA内部回路(HDL)の修正は不要です。

一方、CPUを利用していない場合は、データ格納用のメモリの確保や、計算するための回路をHDLで記述して対応が可能です。

HDLで作成すると、FPGA内の回路の元(例えばロジックエレメント)を利用することになり、その上限を意識する必要があります。
また、HDLで多くの回路を作り込むと、信号の遅れなど、タイミング関連の検証も必要になり、検証も含めて容易ではありません。

5. おわりに

FPGAの多様性を「パルスカウンタ」を題材に説明しました。
基板にマイコンが実装されていれば、そのマイコンの性能は理解できます。
しかし、FPGAを利用している場合は、外見からは、実現方法(構成)が分からないため、具備されている機能や性能が予測できません。
それだけ、FPGAは自由度が高いデバイスと言えます。

本稿が、FPGAの利用経験が無い組み込み系のエンジニアの人にとって、FPGAを学ぶ機会に繋がれば幸いです。

(T.O.)


関連ページへのリンク

関連するソフテックだより

ページTOPへ