0

GENERATE を使用して n ビットのビットスライス ALU を設計しており、次のコードを書きました。

library IEEE; 
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;


ENTITY ALU IS
  GENERIC (n : integer := 8);
  PORT (A,B : IN std_logic_vector(n-1 DOWNTO 0);
        funct : IN std_logic_vector (2 DOWNTO 0);
        clk,nrst : IN std_logic;
        Z : OUT std_logic_vector (n-1 DOWNTO 0);
        ov,cout : OUT std_logic);
  END ALU;


  ARCHITECTURE bitSlice OF ALU IS
    SIGNAL C : std_logic_vector (0 TO n);
    SIGNAL temp : std_logic_vector (n-1 DOWNTO 0);
  BEGIN
      L1:IF nrst = '1' GENERATE 
      L2:IF funct = "000" GENERATE  Z <= A;
        END GENERATE L2;
      L3:IF funct = "001" GENERATE Z <= B;
        END GENERATE L3;
      L4:IF funct = "010" GENERATE 
        c(0) <= '0';
        cout <= C(n);
        ov <= C(n);
        L5: FOR i IN 0 TO n-1 GENERATE
          Z(i) <= (A(i) XOR B(i) XOR C(i));
          C(i+1) <= (A(i) AND B(i)) OR
                    (A(i) AND C(i)) OR
                    (B(i) AND C(i));
          END GENERATE L5;
        END GENERATE L4;

      L6:IF funct = "011" GENERATE 
        c(0) <= '0';
        cout <= C(n);
        ov <= C(n);
        temp <= std_logic_vector(signed(NOT(b))+1);
        L7: FOR i IN 0 TO n-1 GENERATE
          Z(i) <= (A(i) XOR temp(i) XOR C(i));
          C(i+1) <= (A(i) AND temp(i)) OR
                    (A(i) AND C(i)) OR
                    (B(i) AND C(i));
          END GENERATE L7;
        END GENERATE L6;
      L8:IF funct = "100" GENERATE Z <= A(n-1 DOWNTO 0) & '0';
      END GENERATE L8;
      L9:IF funct = "101" GENERATE Z <= B(n-1 DOWNTO 0) & '0';
      END GENERATE L9;
      L10:IF funct = "110" GENERATE Z <= '0' & a(n DOWNTO 1);
      END GENERATE L10;
      L11:IF funct = "111" GENERATE Z <= '0' & b(n DOWNTO 1);
      END GENERATE L11;
   END GENERATE L1;

END bitSlice;

正常にコンパイルされますが、動作しませんが、生成ブロックには IF ステートメントが静的でなければならないという警告がたくさんあります。どこで間違えたのかしら。

4

3 に答える 3

1

入力値がランタイムまで不明なポートに応じて、ツールに異なるハードウェアを生成するように求めています。それはうまくいきません!

"funct" をジェネリック入力にすると、Generate を正常に使用できるようになりますが、機能は作成時に修正されます。

すべてのハードウェアを生成し、「関数」を使用して生成された異なる結果を多重化することは、おそらくあなたが望むものに近いでしょう。

于 2013-10-24T10:16:43.737 に答える
0

この種の実装では、GENERATE の代わりに WHEN または SELECT ステートメントを使用できます。

コードには別の問題があります。組み合わせ回路を実装していますが、完全な LUT を指定していないため、ラッチが推論されます。たとえば、nrst='0' の出力値を指定しませんでした (他のいくつかのシグナル/ケースの中で)。

于 2013-10-25T22:28:34.273 に答える