【问题标题】:Full 8 bit adder, illogical output全 8 位加法器,非逻辑输出
【发布时间】:2013-11-14 08:24:03
【问题描述】:

我创建了一个带有全加法器的 8 位加法器。 正如你所看到的,我开始从右到左添加相应的位,对于 cin 信号 t1 和 t2 并按顺序计算 t2 和 t1。第一个 cin 设置为加法器输入 cin。 我在我的实现中没有看到任何问题,但是当我运行它时,我得到了 o 输出信号的红线。有人可以告诉我出了什么问题吗?(我已经测试了 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;

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    您的信号t1t2 可能应该是std_logic_vector 类型而不是std_logic

    【讨论】:

      【解决方案2】:

      在我看来,您假设您的实例 C1 ... C8 是按顺序执行的,因此您交替使用两个信号 t1t2,就好像这是一个可以重用变量的程序。

      但是,您在这里创建一个带有连接的结构,t1 将是您使用它的所有 8 个实例的相同信号。因此,t1 有 4 个驱动程序 C1, C3, C5C7t2 也是如此),这段代码很可能无法合成。

      你可以做的是在一个设置中使用 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 以减少代码中的重复次数。如果将进位向量扩展为包含cincout,则所有 8 行看起来都一样(除了增加的索引)。

      signal c: std_logic_vector(8 downto 0) := (others => '0');
      -- ...
      c(0) <= cin;
      cout <= c(8);
      -- ...
      -- your for-generate loop here...
      

      【讨论】:

      • 那么,一个信号只能设置一次吗?我是这门语言的新手,所以请原谅我的无知。
      • 警告:声明期间的信号初始化不会被考虑到综合。
      • 在结构化代码中(正如您在此处使用块实例编写的那样),您通常应该(至少如果您编写可综合代码,例如对于 FPGA)每个信号只有一个驱动程序。在行为代码中(通常在一个进程中),您可以有多个依赖于某些逻辑的分配。想象一下,就像灯的电缆连接到一个插座或另一个插座,但不是不断交替......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多