VHDLで一般的なNビットALUを作成しています。加算のために桁上げの値を代入すること、または減算のために借りることができません。私は、次のことを試してみました:VHDL ALUのキャリー/ボロー
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity alu is
generic(n: integer :=1); --Default to 1
port (
a : in std_logic_vector(n-1 downto 0);
b : in std_logic_vector(n-1 downto 0);
op : in std_logic_vector(1 downto 0);
output : out std_logic_vector(n-1 downto 0);
carryborrow: out std_logic
);
end alu;
architecture Behavioral of alu is
signal result: std_logic_vector(n downto 0);
begin
process(a, b, op)
begin
case op is
when "00" =>
result(n) <= '0';
result(n-1 downto 0) <= a and b; --and gate
output <= result(n-1 downto 0);
carryborrow <= '0';
when "01" =>
result(n) <= '0';
result(n-1 downto 0) <= a or b; --or gate
output <= result(n-1 downto 0);
carryborrow <= '0';
when "10" =>
result(n) <= '0';
result(n-1 downto 0) <= std_logic_vector(signed(a) + signed(b)); --addition
output <= result(n-1 downto 0);
carryborrow <= result(n);
when "11" =>
result(n) <= '0';
result(n-1 downto 0) <= std_logic_vector(signed(a) - signed(b)); --subtraction
output <= result(n-1 downto 0);
carryborrow <= result(n);
when others =>
NULL;
end case;
end process;
end Behavioral;
これは、常に私はそれが型エラーなしでどうあるべきかに割り当てることができますどのように0にcarryborrow
ビットを設定しているようですか?
は[CARRYフラグとオーバーフローフラグにを読んで考えてみましょう:
だから、あなたのキャリー出力が
and
とor
操作で動作するようにである方法についての仮定を作る、これは私があなたのコードを書かれているだろうかですバイナリ演算](http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt)のすべての方法。バイナリ符号付き数値(2'sC)は、符号ビットを介してキャリーからオーバーフローする可能性があります。あなたは符号なし算術を行うことを意味しますか? – user1155120@ user1155120だから私はベクトルを 'signed'に変換するべきではないでしょうか? –
テストベンチがありません。コードをテストするのが通常の方法です。何がうまくいかなかったかを示します。 – JHBonarius