0

18*18の乗算の部分和を取得しようとしています。これらを多次元配列(18 * 36)に保存したいのですが、配列の各インデックスには部分和が含まれています。std_logic_vectorの配列を使用してみました。しかし、結果は得られませんでした。bit_vectorの配列とビットの配列も試しました。これが私のVHDLコードです。

entity partial is
port(
   A : in bit_vector(17 downto 0);
   B : in bit_vector(17 downto 0);
   C : out bit_vector(35 downto 0);
   D : out bit
);
end partial;

architecture Behavioral of partial is
   type partial_sums is array (17 downto 0, 35 downto 0) of bit;
   signal sums : partial_sums;

begin

   process (A,B)
   begin

    --sums <= (others=> (others=>'0'));

    --for j in 0 to 17 loop
    --   sums(j)<="000000000000000000000000000000000000";
    --end loop;

      for i in B'low to B'high loop
         if ( B(i)='1') then
            for p in A'low to A'high loop
               sums(i,p) <= A(p);   
            end loop;
         end if;
      end loop;

      D <= sums(0,0);

   end process;
end Behavioral;

sums配列でどのインデックスを使用しても、Dでは常に0になります。私を助けてください。

4

3 に答える 3

2

組み合わせプロセスで合計をDに割り当てていますが、合計はプロセス感度リストにありません。

おそらくここに行く最良の方法は、Dの割り当てをプロセスの外に移動することです。

于 2013-01-16T17:37:42.700 に答える
0

警告:Verison14を含むザイリンクスISEには、多次元配列とベクトル割り当てに問題があります。3次元配列を使用することはできません。また、制約のない配列の配列を使用することもできません。また、多次元配列を使用すると、割り当てはせいぜい不安定です。私が最後にISEを使用したとき、ModelSimが正常にコンパイルおよびシミュレートされたとしても、法的な割り当てが目的の幅を持たないことについて不平を言うことがよくありました。

実際の問題は、各エントリの下位18ビットのみを合計で割り当てることである可能性があります。ここで、エントリは実際には36ビット幅です。

読みやすくするために、おそらく定義する必要があります

type partial_sums is array (natural range <>) of bit_vector(35 downto 0);

次に、ループなしで直接bit_vector割り当てを使用します。Dの固定値は、Bのビットが「1」に設定されていない(デフォルト値がないためにUを取得する必要がある)か、Aのビットが常に「0」であるため(すべて「0」を取得する必要がある)が原因である可能性があります。下位18ビットと上位18ビスのすべての「U」。

編集:ただし、ビットは解決されたロジックであるため、そこには「0」または「1」しか表示されません。IMOはstd_logicを使用する必要があります。

于 2013-01-16T17:37:16.473 に答える
0

実際には、それは正常に機能し、適切なテストデータを部分積配列にロードします。

Dで結果を収集するためにプロセスを再度ウェイクアップしているわけではありません。これを行うには、プロセス「partial」の感度リストに「sums」を追加します。

または、クロックプロセスにすることをお勧めします(必要に応じて、合成に到達したときに適切な結果を得ることができます)。

信号の割り当てがどのように機能するかについては、このQ/Aを参照してください。 VHDLのプロセスはリエントラントですか?

于 2013-01-16T17:39:17.753 に答える