vhdl のレジスタの算術平均

mqwert97

私が現在取り組んでいるプロジェクトでは、いくつかの入力を取り、それらをレジスターに保存してから、レジスターの算術平均を見つけようとしています。私の入力はすべて 24 ビット長です。私のレジスターは 4 入力の長さなので、算術平均を計算するために最下位ビットの最後の 3 桁を 4 で割って削除し、単純に加算します。

平均は my register(95 downto 0)(4 x 24 = 96) で、mean_mediumtypeunsignedです。

次の行をコーディングすると

signal mean_medium : unsigned (23 downto 0) := (others => '0');
mean_medium <= unsigned(medium (95 downto 75)) +
               unsigned(medium (71 downto 51)) +
               unsigned(medium (47 downto 27)) +
               unsigned(medium (23 downto 3)) ;

私は次の警告を受けました。

幅の不一致。mean_medium の幅は 24 ビットですが、割り当てられた式は 21 ビット幅です。

これを修正するための提案はありますか?

JHBonarius

すでにエラーは、3 ビットをシフトして 4 で除算することです。2ビットだけシフトする必要があります。

ただし、正確で正確な算術演算では、切り捨てによって精度が失われるため、その式の演算子を事前にシフトしないでください。まず、4 つの完全な 24 ビット値すべてを 1 つの 26 ビット出力に追加します。次に、出力をシフト アンド ラウンドします。

signal mean_medium : unsigned (23 downto 0); -- redundant := (others => '0');
signal mean_temp : unsigned(25 downto 0);

mean_temp <=
    resize(unsigned(medium (95 downto 72)), mean_Temp'length) +
    resize(unsigned(medium (71 downto 48)), mean_Temp'length) +
    resize(unsigned(medium (47 downto 24)), mean_Temp'length) +
    resize(unsigned(medium (23 downto 0)), mean_Temp'length) +
    2; -- round factor

mean_medium <= shift_right(mean_temp, 2); --divide by 4

ps これを 1 行に結合して、mean_temp.

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事