VHDL で単純な 32 ビット Alu を作成することになっています。2 つのことを除いて、すべて正常に動作しています。ALU にはキャリーアウトとオーバーフローのフラグがあるはずですが、それを実装する方法がわかりません。
まずは一般質問。回路図は、減算の場合、ALU が減算を反転し、「1」を追加して、2 の補数で入力値の負の等価物を作成することを示しています。これは、入力に符号なしの値を使用する必要があるということですか? または、std_logic_vector に固執する必要がありますか?
キャリーアウトビットは結果ワードに「適合」しないビットであるため、サマンドをゼロ拡張し、一時的な33ビットサム信号を作成してから、結果をキャリーアウトと実際の合計に単純に分割しようとしました。残念ながら、シミュレートするときに得られるのは、合計の出力として「UU ... U」だけです。
オーバーフロー フラグの場合: ALU の説明は動作に基づいているため、キャリーにアクセスすることはできません。つまり、最後の 2 つのキャリーを単純に xor するだけでは、オーバーフローが発生したかどうかを判断できません (値が 2 秒であると仮定します)。 -補足しますが、最初の質問が示すように、この点についてはよくわかりません...)。オーバーフローを特定する別の方法はありますか? インターネットで見つけた「次の場合にオーバーフローが発生する」ルールを if ステートメントに単純に変換するようなものですか?
これはこれまでの私のコードです。このバージョンでは、加算/減算時に出力に「UUU...U」が表示されます。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity ALU is
Port ( Clk : in STD_LOGIC;
A : in std_logic_vector (31 downto 0);
B : in std_logic_vector(31 downto 0);
Y : out std_logic_vector(31 downto 0);
OP : in std_logic_vector(2 downto 0);
Nul : out boolean;
Cout : out STD_LOGIC);
end ALU;
architecture Behavioral of ALU is
signal Smd0, Smd1, Sum : std_logic_vector (31 downto 0);
signal temp : std_logic_vector (32 downto 0);
signal Cry : STD_LOGIC;
signal snul : boolean;
begin
Smd0 <= A;
Smd1 <= B;
Y <= Sum;
Cout <= Cry;
nul <= snul;
process(Clk) begin
if (rising_edge(Clk)) then
if ( Sum = "00000000000000000000000000000000") then -------Zero flag
snul <= true;
else
snul <= false;
end if;
case OP is
when "000" =>
Sum <= Smd0 and Smd1;
when "001" =>
Sum <= Smd0 xor Smd1;
when "010" =>
temp <= std_logic_vector((unsigned("0" & Smd0) + unsigned(Smd1)));
Sum <= temp(31 downto 0);
Cry <= temp(32);
when "100" =>
Sum <= Smd0 and not Smd1;
when "101" =>
Sum <= Smd0 xor not Smd1;
when "110" =>
Sum <= std_logic_vector((unsigned(Smd0) - unsigned(Smd1)));
when "111" =>
if (A < B) then
Sum <= "00000000000000000000000000000001";
else
Sum <= "00000000000000000000000000000000";
end if;
when others =>
NULL;
end case;
end if;
end process;
end Behavioral;
私はVHDLにまったく慣れていないので(講義の半分で話しました...)、コードに関するコメントは大歓迎です。これは、グーグルで遊んで調べた結果です。
それが与えられた回路図です:
//編集:
別物。「000」以降、マイゼロフラグが正常に動作しません。最初のケースを除いて、出力が良い理由は何ですか?