2011-06-22 12 views
2

MIPSアーキテクチャ用のALUを開発しています。ALUが任意のビット数だけシフトできるように、左シフトと右シフトを試行しています。右シフトと左シフト(SLL/SRL)

私が持っていたアイデアは、シフト値を整数に変換し、結果になるエントリを選択することです(整数は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; 
+0

私はVHDLで作業してから約3年経ちましたが、それでもVortex 3ボードにありました。あなたは電線、入力と出力を定義する必要はありませんか、私の記憶に失敗していますか?私はQuartusがあなたのIDEだと私は考えています。全く別のものを使いました。 –

答えて

0

あなたのコードはまた、いくつかの暗黙のラッチ(あなたは2つのシフトの場合、出力のすべてのビットを割り当てていない)を持っているが、私は、同様のQuartusでこれで問題がありました。

私が使用する回避策は、すべての可能な結果を​​持つ中間配列を定義し、セレクタを使用してそれらの結果の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; 
3

のQuartusが好きではない場合、それは次の2つの選択肢があります - あなたが推測しようとしている

  1. はそれをのQuartusがないようにすることをいくつかの方法を書きますバレルシフターを使うと、1つの長さを書いて、それをインスタンス化することができます。潜在的に高価な時間
  2. それを受け入れる別のシンセサイザーを入手してください。潜在的に高価なお金。
0

は、各シフト/レベルを回転させるか、シフト及び回転させるためstandard functions({シフト、回転} _ {左、右})を使用することができを作成するgenerate又はforを使用することによってこの問題を回避することができました。

関連する問題