2017-04-23 73 views
0

システムでザイリンクスFPGAを実装するために、32ビット乗算器の記述にVHDLを使用していますが、 Nビットサイズの入力を有する場合、出力はサイズの(2 * N)ビットでなければならない。私はそれをフィードバックシステムに使用しています、それは入力の同じサイズの出力を持つ乗数を持つ可能性がありますか?出力が同じ入力側にあるVHDL乗算器

私は、vhdlコードが同じサイズの信号で配線された加算器と乗算器ブロックを持つFPGAアプリケーションを見つけたら、私は誓っています。コードを書いた人は、製品の結果を64ビットの信号に載せなければならないと言いました。その結果、出力は最も重要な32ビットの結果を得なければなりませんでした(これは必然的に最も重要な32ビット64ビット信号のうちの1つ)。次のコード使用して、私はシステムを構築する時には

(明らかに動作します):

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity Multiplier32Bits is 
    port(
     CLK: in std_logic; 
     A,B: in std_logic_vector(31 downto 0); 
     R: out std_logic_vector(31 downto 0) 
    ); 
end Multiplier32Bits; 

architecture Behavioral of Multiplier32Bits is 
signal next_state: std_logic_vector(63 downto 0); 
signal state: std_logic_vector(31 downto 0); 

begin 

    Sequential: process(CLK,state,next_state) 
    begin 
     if CLK'event and CLK = '1' then 
      state <= next_state(61 downto 30); 
     else 
      state <= state; 
     end if; 
    end process Sequential; 

    --Combinational part 
     next_state <= std_logic_vector(signed(A)*signed(B)); 

    --Output assigment 
    R <= state; 

end Behavioral; 

を私はそれが私がブロックでは、Active-HDL FPGAシミュレータを用いてシミュレートした時以来働いてますが、知ってたがザイリンクスISE Design SuiteのiSimを使用して32ビットシステム全体をシミュレートしています。私の出力はAとBの入力の実際の製品と大きな違いがあることがわかりました。正確には32ビットをスキップして正確さが失われているのかわかりません。

+0

大丈夫です、どこに問題がありますか? – Staszek

+0

そして、シミュレーションに使用した番号を入力してください。 – Staszek

+0

ポストシフトを使用して結果を整列させたいと思うかもしれません。そして、あなたは署名された固定小数点入力を使用しています。 – JHBonarius

答えて

0

あなたのコードでは、いくつかの問題があります:センシティビティリストに属していない

  1. next_statestate
  2. CLK'event and CLK = '1'rising_edge(CLK)
  3. state <= state;によって置き換えられるべき書き込みは効果がありませんし、のようないくつかのツールを引き起こし
  4. ISEはパターンを誤読します。それを除く。
  5. オペレータの周囲にスペースを入れても問題はありませんが、読みやすさが向上します。
  6. a * bの結果が0から31の代わりにビット30から61に期待されるのはなぜですか?
  7. stateおよびnext_stateは、ステートマシンの状態を表していません。それはちょうどレジスタです。

の改善コード:

architecture Behavioral of Multiplier32Bits is 
    signal next_state: std_logic_vector(63 downto 0); 
    signal state: std_logic_vector(31 downto 0); 
begin 
    Sequential: process(CLK) 
    begin 
    if rising_edge(CLK) then 
     state <= next_state(31 downto 0); 
    end if; 
    end process Sequential; 

    --Combinational part 
    next_state <= std_logic_vector(signed(A) * signed(B)); 

    --Output assigment 
    R <= state; 
end architecture Behavioral; 
+0

'state'も機密リストに属していません。そして 'rising_edge(CALL)' - > 'rising_edge(CLK)' ...これは本当に必要というわけではありませんが。それは今のように合成されます。 – JHBonarius

+0

rising_edge(CLK)は、実際に立ち上がりエッジであるかどうかをチェックし、ハイインピーダンスから '1'に変化しないことを確認するのが良いでしょうか? – Staszek

0

私は完全にPaebbelsが書くすべてに同意するものとします。しかし、私は結果にビット数についてあなたにこのことを説明します。 は、だから私はベース10

9 * 9 = 81 (two 1 digit numbers gives maximum of 2 digits) 
99 * 99 = 9801 (two 2 digit numbers gives maximum of 4 digits) 
999 * 999 = 998001 (two 3 digit numbers gives maximum of 6 digits) 
9999 * 9999 = 99980001 (4 digits -> 8 digits) 

のように...それは全くバイナリのために同じである場合の例でそれを説明します。そのため、出力は入力のサイズの(2 * N)ビットです。その上

3 * 3 = 9 
10 * 9 = 90 
100 * 99 = 990 

そして:

しかし、あなたの番号が小さい場合、結果は要因として、同じ桁数に収まります。あなたの数字が十分に小さい場合、結果は32ビットになります。もちろん、すでに書かれているように、結果は信号の重要な部分になります。

JH.Bonariusは既に指摘したように、入力が整数ではなく固定小数点数である場合、ポストシフトを行う必要があります。これがあなたの場合、コメントに書いてください。私は何をすべきか説明します。

+0

ありがとうStaszek !!はい、私の場合、固定小数点数と符号付きの両方を使用しているので、MSBitは符号ビットとして使用され、整数部分の2ビット(出力範囲は-1と1の間です)、小数部分の32ビットの残りの部分。ポスト・シフティングについてはわからなかったので、私は答えのMSBytesを選択しましたが、小数部からLSBytesを失っても、乗算器が使用されるシステムのダイナミックスには影響しません。しかし、J.H. Bonariusは正確さを助けるように思われ、システムのダイナミクスを改善します。ありがとう! :) – Tebi

+0

実際には、出力範囲は-4〜3です。(9);) – Staszek

関連する問題