用for-loop在vhdl中设计加法器

用for-loop在vhdl中设计加法器,for-loop,vhdl,For Loop,Vhdl,我试图通过使用for/generate循环实例化n位加法器的多个副本来创建一个m位加法器。这是到目前为止我的代码,它无法通过给出错误来模拟: “第44行:并非所有a_n的部分形式都有实际的”。n位加法器被声明为组件,我已经成功地对它进行了测试,并且工作正常。 请提供解决此问题的任何建议 entity m_bit_adder is generic (m : integer := 16; n : integer := 4); Port ( A_m : in STD_LOGIC_VECTOR

我试图通过使用for/generate循环实例化n位加法器的多个副本来创建一个m位加法器。这是到目前为止我的代码,它无法通过给出错误来模拟: “第44行:并非所有a_n的部分形式都有实际的”。n位加法器被声明为组件,我已经成功地对它进行了测试,并且工作正常。 请提供解决此问题的任何建议

entity m_bit_adder is
generic (m : integer := 16; n : integer := 4);
    Port ( A_m : in  STD_LOGIC_VECTOR (m-1 downto 0);
           B_m : in  STD_LOGIC_VECTOR (m-1 downto 0);
           Cin_m : in  STD_LOGIC;
           Cout_m : out  STD_LOGIC;
           S_m : out  STD_LOGIC_VECTOR (m-1 downto 0));
end m_bit_adder;

architecture Behavioral of m_bit_adder is

component n_bit_adder is
generic (n_number : integer := 4);
    Port ( A_n : in  STD_LOGIC_vector(n-1 downto 0);
           B_n : in  STD_LOGIC_vector(n-1 downto 0);
           Cin_n : in  STD_LOGIC;
           S_n : out  STD_LOGIC_vector(n-1 downto 0);
           Cout_n : out  STD_LOGIC);
end component;

signal sig_m : std_logic_vector (m downto 0);


begin

 m_bit_adder : for j in 0 to m-1 generate

 n_bit : n_bit_adder generic map (n_number => n)

 port map (  
                   A_n(n-1) => A_m(j),       
                 B_n(n-1)=> B_m(j),
                 S_n(n-1) => S_m(j),
                 Cin_n => sig_m(j),
                 Cout_n => sig_m(j+1)              
                );



end generate;
sig_m(0) <= Cin_m; 
Cout_m   <= sig_m(m);

end Behavioral;
实体m_位加法器为
泛型(m:整数=16;n:整数=4);
端口(A_m:标准逻辑向量中的(m-1向下至0);
B_m:标准逻辑向量(m-1向下至0);
CINU m:标准逻辑中;
Cout_m:输出标准逻辑;
S_m:输出标准逻辑向量(m-1向下到0);
结束m_位加法器;
介绍了m_位加法器的结构
组件n_位加法器为
通用(n_数:整数=4);
端口(A_n:标准逻辑向量中(n-1向下至0);
B_n:在标准逻辑向量中(n-1到0);
Cin:标准逻辑中;
S_n:输出标准逻辑向量(n-1到0);
Cout\n:输出标准逻辑);
端部元件;
信号信号m:std逻辑矢量(m向下至0);
开始
m_位加法器:为0到m-1中的j生成
n_位:n_位加法器通用映射(n_数=>n)
港口地图(
A_n(n-1)=>A_m(j),
B_n(n-1)=>B_m(j),
S_n(n-1)=>S_m(j),
Cin_n=>sig_m(j),
Cout_n=>sig_m(j+1)
);
终端生成;
sig_m(0)B_n(i),
S=>S_n(i),
Cin=>sig_n(i),
Cout=>sig_n(i+1)
);            
终端生成;

sig_n(0)仅使用形式侧的单个位对
n位加法器进行实例化,其中
a_n(n-1)
位于:

n_bit : n_bit_adder generic map (n_number => n)
  port map (  
    A_n(n-1) => A_m(j),       
    ....
但是
n位加法器
的组件对于
A\u n
具有多个位的as
std\u逻辑向量

component n_bit_adder is
  generic (n_number : integer := 4);
    Port ( A_n : in  STD_LOGIC_vector(n-1 downto 0);
    ...
因此,对于
std_logic_vector(3向下到0)
,则
a_n(2向下到0)
不用于映射的形式侧(左侧),这也是错误消息在“并非所有a_n的部分形式都具有实际值”中所说的


还要注意的是,它看起来像是通用组件中使用了不同的名称
n\u编号
n
,端口上的
std\u逻辑向量
长度。

是的,我明白你的意思,谢谢。但是,我可以使用什么语法来访问所有位?使用downto会导致其他错误。我只是一个VHDL初学者,请更新映射以确保
std\u logic\u vector
端口中的所有位都映射到实际信号或端口。根据使用情况,可能更容易声明一个信号,并映射到该信号,然后分配给该信号。出于兴趣,仅使用
+
运算符并让合成器为您进行加法有什么问题?为什么不使用现有的加法器并在其通用格式中设置所需的宽度?
component n_bit_adder is
  generic (n_number : integer := 4);
    Port ( A_n : in  STD_LOGIC_vector(n-1 downto 0);
    ...