4. 4位二进制加法器

任务目标

使用VHDL设计一个4位二进制加法器,采用4个1位全加器级联的结构,并通过VHDL测试平台(testbench)进行仿真验证。

实现方案

本设计包含两个实体:full_adder(1位全加器)和adder_4bit(4位级联加法器)。全加器通过半加器逻辑实现,4位加法器将4个全加器按进位链串联,输出4位和与最终进位。仿真测试平台提供多组输入向量,覆盖无进位、有进位及边界情况。

完整VHDL代码

-- 1位全加器
library ieee;
use ieee.std_logic_1164.all;

entity full_adder is
    port (
        a, b, cin : in  std_logic;
        sum, cout : out std_logic
    );
end entity;

architecture dataflow of full_adder is
begin
    sum  <= a xor b xor cin;
    cout <= (a and b) or (cin and (a xor b));
end architecture;

-- 4位二进制加法器(全加器级联)
library ieee;
use ieee.std_logic_1164.all;

entity adder_4bit is
    port (
        a, b : in  std_logic_vector(3 downto 0);
        cin  : in  std_logic;
        sum  : out std_logic_vector(3 downto 0);
        cout : out std_logic
    );
end entity;

architecture structural of adder_4bit is
    component full_adder is
        port (a, b, cin : in std_logic; sum, cout : out std_logic);
    end component;
    signal c : std_logic_vector(3 downto 1);  -- 内部进位
begin
    fa0: full_adder port map (a(0), b(0), cin, sum(0), c(1));
    fa1: full_adder port map (a(1), b(1), c(1), sum(1), c(2));
    fa2: full_adder port map (a(2), b(2), c(2), sum(2), c(3));
    fa3: full_adder port map (a(3), b(3), c(3), sum(3), cout);
end architecture;

仿真测试平台(testbench)

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity tb_adder_4bit is
end entity;

architecture sim of tb_adder_4bit is
    component adder_4bit is
        port (a, b : in std_logic_vector(3 downto 0); cin : in std_logic;
              sum : out std_logic_vector(3 downto 0); cout : out std_logic);
    end component;
    signal a, b, sum : std_logic_vector(3 downto 0);
    signal cin, cout : std_logic;
begin
    uut: adder_4bit port map (a, b, cin, sum, cout);

    process
    begin
        -- 测试用例:a + b + cin
        a <= "0000"; b <= "0000"; cin <= '0'; wait for 10 ns;  -- 0+0=0
        a <= "0101"; b <= "0011"; cin <= '0'; wait for 10 ns;  -- 5+3=8
        a <= "1111"; b <= "0001"; cin <= '0'; wait for 10 ns;  -- 15+1=16(溢出)
        a <= "1010"; b <= "0101"; cin <= '1'; wait for 10 ns;  -- 10+5+1=16
        a <= "0111"; b <= "1000"; cin <= '0'; wait for 10 ns;  -- 7+8=15
        wait;
    end process;
end architecture;

运行与验证

仿真工具:ModelSim、GHDL或Vivado Simulator均可。

  1. 将全加器、4位加法器和testbench三个代码分别保存为 full_adder.vhd、adder_4bit.vhd、tb_adder_4bit.vhd。
  2. 编译顺序:先编译 full_adder.vhd,再编译 adder_4bit.vhd,最后编译 tb_adder_4bit.vhd。
  3. 启动仿真,运行testbench,观察 sum 和 cout 波形。

通过条件:仿真结果与下表一致(以无符号数计算):

abcinsumcout十进制结果
000000000000000
010100110100008
1111000100000116(溢出)
1010010110000116(溢出)
0111100001111015

若波形中所有测试向量对应的 sum 与 cout 均与上表一致,则判定设计正确。

FA0 a0 b0 cin FA1 a1 b1 c1 FA2 a2 b2 c2 FA3 a3 b3 c3 c1 c2 c3 a0 b0 a1 b1 a2 b2 a3 b3 cin sum0 sum1 sum2 sum3 cout 内部进位 加数输入 和输出 进位输入