TEL:086-227-0113
info@gopher-tec.jp
TOP page 製品情報 FPGAサンプルコードリポジトリ BusSSO Reducer
BusSSO Reducer

バスの同時変化する信号数を減らす目的で作ったモジュール(SSOはSimultaneous Switching Output
の意)です。
話はシンプルで、出力段のフリップフロップに新しい値をロードする際に、前回の値から変化するビットの
数を数えて、一定数以上変化する場合にはそのままロードするのではなく、反転した値をロードして、
別途反転フラグとともにデータ伝達しようというものです。
ソースコードでは32 ビットのバスを例としています。出力フリップフロップにデータをロードする際、前回
出力した値と比べて17 ビット以上異なる場合に、反転した値を出力します。もちろんこれだけだと受け側で
正しい値を取得できませんので、データが反転したものか否かを示すビットを追加し、それに応じて受け側
でデータを再反転することが必要です。
同時スイッチング問題に直面した際の切り分け用に、あるいはマルチドロップによってインピーダンスが
極めて低くなってしまったラインをFPGA で直接ドライブしなくてはならない場合の緊急救済策の1つ
として等々で、出番があるかもしれません。

なお、32ビット出力データの変化ビットの計数は、前後のデータの各ビットのXORを取り、その1の数を
数えています(Population Count)。1の数を数えるのは、よくある3ビットスライスアダーと7ビット
スライスアダーの組合せで記載していますが、他にもいくらでもやりようはありますので、工夫してみると
面白いかもしれません。ちなみに3ビットスライスアダーだけで32ビットのPopulation Countを作ると、
32-6+5=31個のスライスアダーで記載できます(3ビットスライスアダー1個をフル活用すると3ビットが
2ビットになり1ビット減る→32ビットを最終的に6ビットにするので26個必要→しかしフル活用されずに
2ビット入力2ビット出力として使用するスライスアダーが5個存在する→つまり32-6+5=21個)。
中間変数となる信号名の付け方・まとめ方がめんどうで間違い易いですが、後で最適化され易いのは
そちらの方かもしれません。Verilog版には限定でそのサンプルを付けておきます。

Port I/O  Description 
RST in 非同期リセット入力です。
パワーオン時、またはシステムリセット時にアサートして下さい。
CLK
in バス同期クロックです。
DOUT_I[31:0] in 本モジュールへの入力データであり、DOUT_Oへ出力されるべきデータです。
DOUT_LDがアクティブの時、出力段フリップフロップへロードされますが、その値は
DOUT_Iのままか、あるいはDOUT_Iを全ビット反転したものとなります。
DOUT_O とDOUT_Iを比較し、変化ビットが少なくなるように選択されます。
DOUT_O[31:0] out 本モジュールの出力データです。
INV_FLAG が1の時は反転データが出力されているため、受け側で再反転することが必要
です。
DOUT_LD in 出力を更新(新値をロード)する際にアサートする信号です。
INV_FLAG out DOUT_Oをそのままで使用して良いか、再反転する必要があるかを示しています。
INV_FLAG が1の時は反転データが出力されているため、受け側で再反転することが必要
です。DOUT_Oとセットで使用して下さい。
※特に注記のない限り、信号は全て正論理です。
本ソースコードはVHDL版とVerilog版となっております。
詳細は下記の資料ダウンロードをクリックください。

BusSSO Reducer
資料ダウンロード