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版には限定でそのサンプルを付けておきます。
の意)です。
話はシンプルで、出力段のフリップフロップに新しい値をロードする際に、前回の値から変化するビットの
数を数えて、一定数以上変化する場合にはそのままロードするのではなく、反転した値をロードして、
別途反転フラグとともにデータ伝達しようというものです。
ソースコードでは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版には限定でそのサンプルを付けておきます。
※特に注記のない限り、信号は全て正論理です。
本ソースコードはVHDL版とVerilog版となっております。
詳細は下記の資料ダウンロードをクリックください。
詳細は下記の資料ダウンロードをクリックください。