1

基本的に入力が64ビットのLUTであるモジュールがあります。LUTのalwaysブロックは、入力を200を超える異なる整数と比較するcaseステートメントで構成されます。caseステートメントのデフォルトのcaseは、出力にデフォルト値を割り当てる前に、入力が100より大きいかどうかをチェックします。

私の問題は、合成すると65ビットのコンパレータにつながることです。大きなコンパレータが合成されないようにするためのより良い方法があるかどうか疑問に思いました。

これが私のコードスニペットです:

    always @(in)
    begin
    case (in) 
        -100: out <= 495050;
        -99: out <= 500000;
        ...
         99: out <= 99500000;
        100: out <= 99504950;

        default: 
        begin
            if (in > 100)
                out <= 99504950;
            else
                out <= 495050;
        end
    endcase
end

ありがとう、

ファイサル

4

2 に答える 2

3

それが64ビットの数値であると仮定するとin、最下位の数ビットを「比較」するだけで済むように切り落とすことができます。次に、数値が必要な範囲外にあるかどうかをすばやく確認できます。

inたとえば、8ビットで切り取って、8ビットの符号付きレジスタに割り当てましょう。これにより、-128〜127を表すことができます。

次の方法で、完全な数が127より大きいかどうかをテストできます!in[63] && (|in[62:8])(上位ビットが1で、MSBが設定されていないかどうかを確認します)。

完全な数が-128未満であるかどうかは、次の方法でテストできますin[63] && !(&in[62:8])(上位ビットが0であるかどうかを確認し、MSBが設定されているかどうかを確認します)。

今、あなたは3つのことを知っています:

  1. 数が127より大きい場合
  2. 番号が127〜-128の場合
  3. 数が-128未満の場合。

中間の場合には小さな8ビットLUTを使用できるはずです。または、いずれかの上限範囲にある場合はデフォルト値を使用できます。

良いシンセサイザーがこれを自動的に行うことを期待するかもしれませんが、生成されたネットリストを見て、それが大きすぎる場合は、これを試して、より良い結果が得られるかどうかを確認できます。

于 2013-03-14T16:26:21.280 に答える
2

入力x=[-100;100]のいくつかの関数値を使用してテーブルを計算したようです。もしそうなら、それらをあるベースアドレスから始めて次々にメモリに保存する方が良いでしょう。したがって、それらを読み取るには、アドレスバスにbase + X + 100の値を書き込んで、必要な値を取得できます。

巨大なマルチプレクサが必要な場合は、「並列」caseディレクティブを使用してみてください。

「デフォルト」のコンパレータについても同じ問題があるので、答えを待っています。

これをコメントとして書きたかったのですが、そんな特権はありません

于 2013-03-14T07:52:14.360 に答える