2

そのため、MIPS アーキテクチャ用の ALU を開発しており、ALU が任意の量のビットをシフトできるように、左シフトと右シフトを試みています。

私が持っていたアイデアは、シフト値を整数に変換し、結果にあるエントリの一部を選択することです(整数はXに格納されます)が、Quartusは変数値を受け入れず、定数のみを受け入れます.

これを作るにはどうすればよいですか?(ケースは "WHEN "1000" =>..." および "WHEN "1001" =>..." の行にあります)

ありがとう。

PROCESS ( ALU_ctl, Ainput, Binput, X )
BEGIN
                -- Select ALU operation
    --ALU_output_mux <= X"00000000"; --padrao   
CASE ALU_ctl IS
    WHEN "1000" =>  ALU_output_mux(31 DOWNTO X) <= (Ainput( 31-X DOWNTO 0 ));
    WHEN "1001" =>  ALU_output_mux(31-X DOWNTO 0) <= (Ainput( 31 DOWNTO X ));
    WHEN OTHERS =>  ALU_output_mux  <= X"00000000";
END CASE;
END PROCESS;
4

3 に答える 3

3

Quartus が気に入らない場合は、2 つの選択肢があります。

  1. Quartus が好む方法で記述します。つまり、バレル シフターを推論しようとしているので、手書きで記述してインスタンス化することができます。時間がかかる可能性がある
  2. それを受け入れる別のシンセサイザーを入手してください。お金がかかる可能性があります。
于 2011-06-22T14:42:32.157 に答える
0

generateまたはforを使用して各シフト/回転レベルを作成するか、標準関数({shift,rotate}_{left,right}) を使用してシフトと回転を行うことで、この問題を回避できます。

于 2011-07-12T14:30:26.630 に答える
0

Quartusでもこれに問題がありましたが、コードにはいくつかの暗黙的なラッチもあります(2つのシフトケースで出力のすべてのビットを割り当てていません)。

私が使用する回避策は、可能なすべての結果を含む中間配列を定義し、セレクターを使用してそれらの結果の 1 つを選択することです。あなたの場合、次のようなもの:

subtype DWORD_T         is std_logic_vector( 31 downto 0);
type    DWORD_A         is array (natural range <>) of DWORD_T;
signal  shift_L         : DWORD_A(31 downto 0);
signal  shift_R         : DWORD_A(31 downto 0);
signal  zero            : DWORD_T;

...

zero <= (others=>'0');

process (Ainput)
begin    
    for index in Ainput'range loop
        shift_L(index) <= Ainput(31 - index downto 0) & zero(index - 1 downto 0);
        shift_R(index) <= zero(index - 1 downto 0) & Ainput(31 downto index);
    end loop;
end process;

ALR_output_mux <= shift_L(to_integer(X)) when ALU_ctl="1000", 
                  shift_R(to_integer(X)) when ALU_ctl="1001",
                  (others=>'0') when others;
于 2011-06-22T14:40:28.053 に答える