全8位加法器,不合逻辑的输出
我创建了一个带有fulladder的8位加法器。 正如你所看到的,我开始从右到左加上相应的位,并为信号t1和t2加上cin,并按顺序加上t2和t1。 第一个cin被设置为加法器输入cin。 在我的执行过程中,我没有看到任何问题,但是当我运行它时,我得到了红色的输出信号。可以告诉我哪里出了问题?(我测试了fulladder并返回正确的结果。)
谢谢。
代码如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity adder8bit is
Port ( a : in STD_LOGIC_VECTOR (7 downto 0);
b : in STD_LOGIC_VECTOR (7 downto 0);
cin : in STD_LOGIC;
o : out STD_LOGIC_VECTOR (7 downto 0);
cout : out STD_LOGIC);
end adder8bit;
architecture Behavioral of adder8bit is
component fulladder is
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
cin : in STD_LOGIC;
o : out STD_LOGIC;
cout : out STD_LOGIC);
end component;
signal t1,t2:std_logic:='0';
begin
C1: fulladder port map( a => a(0), b => b(0), cin => cin, o => o(0), cout => t1 );
C2: fulladder port map( a => a(1), b => b(1), cin => t1, o => o(1), cout => t2 );
C3: fulladder port map( a => a(2), b => b(2), cin => t2, o => o(2), cout => t1 );
C4: fulladder port map( a => a(3), b => b(3), cin => t1, o => o(3), cout => t2 );
C5: fulladder port map( a => a(4), b => b(4), cin => t2, o => o(4), cout => t1 );
C6: fulladder port map( a => a(5), b => b(5), cin => t1, o => o(5), cout => t2 );
C7: fulladder port map( a => a(6), b => b(6), cin => t2, o => o(6), cout => t1 );
C8: fulladder port map( a => a(7), b => b(7), cin => t1, o => o(7), cout => cout );
end Behavioral;
在我看来,你认为你的实例C1 ... C8
是按顺序执行的,因此你可以交替使用两个信号t1
和t2
,就好像这是一个可以重用变量的程序。
但是,您正在创建一个带有连接的结构,并且t1
对于您正在使用它的所有8个实例而言都是相同的信号。 因此C1, C3, C5
对于t1
C1, C3, C5
您有4个驱动程序C1, C3, C5
和C7
(对于t2
也是如此),并且此代码很可能不可合成。
你可以做的是在设置中使用8个进位信号,如下所示:
signal c: std_logic_vector(7 downto 1) := (others => '0');
-- ...
C1: fulladder port map( a => a(0), b => b(0), cin => cin, o => o(0), cout => c(1) );
C2: fulladder port map( a => a(1), b => b(1), cin => c(1), o => o(1), cout => c(2) );
C3: fulladder port map( a => a(2), b => b(2), cin => c(2), o => o(2), cout => c(3) );
-- ...
C8: fulladder port map( a => a(7), b => b(7), cin => c(7), o => o(7), cout => cout );
此外,您可以查看foor-generate-loops来减少代码中的重复次数。 如果将进位向量扩展为包括cin
和cout
,则所有8行看起来都是相同的(除了增加的索引)。
signal c: std_logic_vector(8 downto 0) := (others => '0');
-- ...
c(0) <= cin;
cout <= c(8);
-- ...
-- your for-generate loop here...
可能你的信号t1
和t2
应该是std_logic_vector
而不是std_logic
。