Vhdl 从多个1位ALU制作4位ALU

Vhdl 从多个1位ALU制作4位ALU,vhdl,alu,Vhdl,Alu,我正在尝试将几个1位ALU组合成一个4位ALU。我对如何在VHDL中真正做到这一点感到困惑。以下是我正在使用的1bit ALU的代码: component alu1 -- define the 1 bit alu component port(a, b: std_logic_vector(1 downto 0); m: in std_logic_vector(1 downto 0); result: out std_logic_vector(1 downto 0)); end alu

我正在尝试将几个1位ALU组合成一个4位ALU。我对如何在VHDL中真正做到这一点感到困惑。以下是我正在使用的1bit ALU的代码:

component alu1 -- define the 1 bit alu component
  port(a, b: std_logic_vector(1 downto 0);
  m: in std_logic_vector(1 downto 0);
  result: out std_logic_vector(1 downto 0));
end alu1;

architecture behv1 of alu1 is
begin
  process(a, b, m)
  begin
   case m is
     when "00" =>
        result <= a + b;
      when "01" =>
        result <= a + (not b) + 1;
      when "10" =>
        result <= a and b;
      when "11" =>
        result <= a or b;
    end case
  end process
end behv1
组件alu1——定义1位alu组件
端口(a,b:标准逻辑向量(1到0);
m:标准逻辑向量(1到0);
结果:输出标准逻辑向量(1到0);
末端alu1;
alu1的体系结构是
开始
过程(a、b、m)
开始
案例m是
当“00”=>
结果
结果
结果
结果您不能(轻松地)将这些1位ALU串成一个功能性的多位版本。没有办法处理加法和减法模式正常工作所需的进位/出(但是,按位and&or应该可以正常工作)

暂时忽略进位问题,您通常只需设置for generate循环并实例化按位逻辑的多个副本,可能对第一个和/或最后一个元素进行特殊封装,即:

MyLabel : for bitindex in 0 to 3 generate
begin
  alu_x4 : entity work.alu1
  port map (
    a => input_a(bitindex),
    b => input_b(bitindex),
    m => mode,
    result => result_x4(bitindex) );
end generate;

有趣的是,你甚至会问这个问题。VHDL合成器能够推断出您喜欢的任何加法器。您只需键入所需内容:

use ieee.numeric_std.all;
...
signal r : unsigned(3 downto 0);
signal a : unsigned(2 downto 0);
signal b : unsigned(2 downto 0);
signal c : unsigned(2 downto 0);
...
r  <=  a + b + c;
result  <=  std_logic_vector(r(2 downto 0));