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均可。
- 将全加器、4位加法器和testbench三个代码分别保存为
full_adder.vhd、adder_4bit.vhd、tb_adder_4bit.vhd。 - 编译顺序:先编译
full_adder.vhd,再编译adder_4bit.vhd,最后编译tb_adder_4bit.vhd。 - 启动仿真,运行testbench,观察
sum和cout波形。
通过条件:仿真结果与下表一致(以无符号数计算):
| a | b | cin | sum | cout | 十进制结果 |
|---|---|---|---|---|---|
| 0000 | 0000 | 0 | 0000 | 0 | 0 |
| 0101 | 0011 | 0 | 1000 | 0 | 8 |
| 1111 | 0001 | 0 | 0000 | 1 | 16(溢出) |
| 1010 | 0101 | 1 | 0000 | 1 | 16(溢出) |
| 0111 | 1000 | 0 | 1111 | 0 | 15 |
若波形中所有测试向量对应的 sum 与 cout 均与上表一致,则判定设计正确。