VHDL组件输出返回零

VHDL组件输出返回零,vhdl,Vhdl,我正在用VHDL写一篇文章,我面临着一个奇怪的情况。我已经编写了一些组件,对它们进行了模拟和测试,一切似乎都很好。然而,当模拟顶部实体时,我得到的结果是零!请查看以下列表: 顶级实体: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity foobar is port ( data_i : in std_logic_vector(39 downto 0); sum_12bit_o : out std_logic_vec

我正在用VHDL写一篇文章,我面临着一个奇怪的情况。我已经编写了一些组件,对它们进行了模拟和测试,一切似乎都很好。然而,当模拟顶部实体时,我得到的结果是零!请查看以下列表:

顶级实体:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity foobar is
  port ( data_i : in std_logic_vector(39 downto 0);
             sum_12bit_o : out std_logic_vector(11 downto 0)
            );
end foobar;

architecture Behavioral of foobar is

--Declare components
component four_10bit_word_adder is
    port( --Input signals
            a_byte_in: in std_logic_vector(9 downto 0);
            b_byte_in: in std_logic_vector(9 downto 0);
            c_byte_in: in std_logic_vector(9 downto 0);
            d_byte_in: in std_logic_vector(9 downto 0);
            cin: in std_logic;
            --Output signals
            val12bit_out: out std_logic_vector(11 downto 0)
    );
end component;

-- Signal declaration
signal int: std_logic_vector(11 downto 0);
signal intdata: std_logic_vector(39 downto 0);

begin
    intdata <= data_i; --DEBUG
        U1: four_10bit_word_adder port map (intdata(39 downto 30), intdata(29 downto 20), 
                                                        intdata(19 downto 10), intdata(9 downto 0),
                                               '0', int);

end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity four_10bit_word_adder is

generic (
    bits: integer := 10
  );

port( --Input signals
        a_byte_in: in std_logic_vector(bits-1 downto 0);
        b_byte_in: in std_logic_vector(bits-1 downto 0);
        c_byte_in: in std_logic_vector(bits-1 downto 0);
        d_byte_in: in std_logic_vector(bits-1 downto 0);
        cin: in std_logic;
        --Output signals
        val12bit_out: out std_logic_vector(bits+1 downto 0)
);

end four_10bit_word_adder;

architecture Behavioral of four_10bit_word_adder is

-- Component Declaration

component compressor_4_2 is
    port(a,b,c,d,cin : in std_logic; 
          cout, sum, carry : out std_logic
          );
end component;

--------------------------------------------------------+
component generic_11bit_adder
port (
    A:  in  std_logic_vector(10 downto 0); --Input A
    B:  in  std_logic_vector(10 downto 0); --Input B
    CI: in  std_logic;                           --Carry in
    O:  out std_logic_vector(10 downto 0); --Sum
    CO: out std_logic                            --Carry Out
  );
end component;
--------------------------------------------------------+

-- Declare internal signals
signal int: std_logic_vector(bits-1 downto 0); -- int(8) is the final Cout signal
signal byte_out: std_logic_vector(bits-1 downto 0);
signal carry: std_logic_vector(bits-1 downto 0);
signal int11bit: std_logic_vector(bits downto 0);
-- The following signals are necessary to produce concatenated inputs for the 10-bit adder.
-- See the paper for more info. 
signal Concat_A: std_logic_vector(bits downto 0);
signal Concat_B: std_logic_vector(bits downto 0);
signal co : std_logic;

begin

    A0: compressor_4_2 port map (a_byte_in(0), b_byte_in(0), 
                                c_byte_in(0), d_byte_in(0),
                                '0', int(0), byte_out(0), carry(0));
    instances: for i in 1 to bits-1 generate
        A: compressor_4_2 port map (a_byte_in(i), b_byte_in(i), 
                                             c_byte_in(i), d_byte_in(i), int(i-1),
                                             int(i), byte_out(i), carry(i));
    end generate;

    R9: generic_11bit_adder port map (Concat_A, Concat_B, '0', int11bit, co);

Concat_A <= int(8) & byte_out;
Concat_B <= carry & '0';

process (co)
begin
    if (co = '1') then 
        val12bit_out <= '1' & int11bit;
    else
        val12bit_out <= '0' & int11bit;
    end if; 
end process;
end Behavioral;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity generic_11bit_adder is
  generic (
    bits: integer := 11
  );
  port (
    A:  in  std_logic_vector(bits-1 downto 0);
    B:  in  std_logic_vector(bits-1 downto 0);
    CI: in  std_logic;
    O:  out std_logic_vector(bits-1 downto 0);
    CO: out std_logic
  );
end entity generic_11bit_adder;

architecture Behavioral of generic_11bit_adder is
begin

process(A,B,CI)

  variable sum:         integer;

  -- Note: we have one bit more to store carry out value.
  variable sum_vector:  std_logic_vector(bits downto 0); 

begin

  -- Compute our integral sum, by converting all operands into integers.

  sum := conv_integer(A) + conv_integer(B) + conv_integer(CI);

  -- Now, convert back the integral sum into a std_logic_vector, of size bits+1

  sum_vector := conv_std_logic_vector(sum, bits+1);

  -- Assign outputs
  O <= sum_vector(bits-1 downto 0);

  CO <=  sum_vector(bits); -- Carry is the most significant bit

end process;

end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体foobar是
端口(数据i:标准逻辑向量中(39向下至0);
求和12位:输出标准逻辑向量(11到0)
);
结束foobar;
foobar的架构是
--声明组件
元件四位字加法器是
端口(-)输入信号
a_byte_in:标准逻辑向量(9到0);
b_byte_in:标准逻辑向量(9到0);
c_byte_in:标准逻辑向量(9到0);
d_byte_in:标准逻辑向量(9到0);
cin:标准逻辑;
--输出信号
VAL12位输出:输出标准逻辑矢量(11向下至0)
);
端部元件;
--信号声明
信号int:std_逻辑_向量(11向下至0);
信号intdata:标准逻辑向量(39至0);
开始

intdata查看在
四位字加法器
实体中生成
val12bit\u out
的过程。它缺少一个输入


此外,还有其他几个问题。解决这一问题并不能解决所有问题。但一旦您修复了它,我想事情会变得更加清楚。

我已经更改了这段特定的代码,从使用process和if语句改为使用when和it。缺少的输入是什么?我还想问你,你发现了什么样的问题,你有什么建议来纠正它们?我又解决了一个关于携带的问题。它连接到错误的信号(int(8)而不是int(9))。非常感谢你指出了正确的方向。如果你对代码有任何建议,我想听听。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity generic_11bit_adder is
  generic (
    bits: integer := 11
  );
  port (
    A:  in  std_logic_vector(bits-1 downto 0);
    B:  in  std_logic_vector(bits-1 downto 0);
    CI: in  std_logic;
    O:  out std_logic_vector(bits-1 downto 0);
    CO: out std_logic
  );
end entity generic_11bit_adder;

architecture Behavioral of generic_11bit_adder is
begin

process(A,B,CI)

  variable sum:         integer;

  -- Note: we have one bit more to store carry out value.
  variable sum_vector:  std_logic_vector(bits downto 0); 

begin

  -- Compute our integral sum, by converting all operands into integers.

  sum := conv_integer(A) + conv_integer(B) + conv_integer(CI);

  -- Now, convert back the integral sum into a std_logic_vector, of size bits+1

  sum_vector := conv_std_logic_vector(sum, bits+1);

  -- Assign outputs
  O <= sum_vector(bits-1 downto 0);

  CO <=  sum_vector(bits); -- Carry is the most significant bit

end process;

end Behavioral;