1、介绍
半加器(Half Adder)是一种基本的数字电路,用于执行二进制加法。它可以对两个输入位进行二进制数的加法运算电路,并输出两个结果:和(Sum)和进位(Carry)。
2、实战任务
设计并进行仿真验证 半加器,使用开发板上的按键作为被加数输入,RGB灯作为(R9)加和 和 (N6)进位 输出。
3、系统框图
半加器的功能是对两个 1bit 的加数(输入为 A 和 B )进行加法运算,并生成两个输出信号。这两个输出信号分别是和(sum)和进位(carry),这是因为在二进制加法中,除了计算出“和”外,还可能会产生进位。因此,我们将进位信号单独输出,以便处理所有可能的输入组合,确保能正确地给出和与进位值。
4、真值表
输入 A | 输入 B | 输出和 sun | 输出进位 carry |
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
5、波形图
通过对真值表进行分析,我们可以绘制半加器的输入与输出波形。其波形如下图所示:
6、程序编写
module half_adder (
input A, // 输入 A
input B, // 输入 B
output sum, // 输出 sum 和
output carry // 输出 carry 进位
);
assign sum = A ^ B; // 使用异或运算符计算 A 和 B 的和
assign carry = A & B; // 使用与运算符计算 A 和 B 的进位
endmodule
2
3
4
5
6
7
8
9
10
11
12
程序注释:
第 1 - 6 行:根据半加器的功能定义了,两个输入信号,分别为 A B ,两个输出信号分别为 sum ,代表半加器的和 ,另一个是 carry 代表半加器的进位 。
第 8 - 10 行:根据真值表的数据可以得出以下关系,异或运算符计算 A 和 B 的和,与运算符计算 A 和 B 的进位。
7、仿真编写
`timescale 1ns / 1ns // 设置仿真时间单位和时间精度为 1 纳秒
module half_adder_mod(); // 定义测试模块
// reg define
reg A; // 输入 A
reg B; // 输入 B
// wire define
wire sum; // 输出 sum,表示和
wire carry; // 输出 carry,表示进位
initial begin
A <= 1'b0; // 初始 A 为 0
B <= 1'b0; // 初始 B 为 0
#100;
A <= 1'b0; // A 为 0
B <= 1'b1; // B 为 1
#100;
A <= 1'b1; // A 为 1
B <= 1'b0; // B 为 0
#100;
A <= 1'b1; // A 为 1
B <= 1'b1; // B 为 1
#100;
end
// 例化
half_adder u_half_adder (
.A (A), // 将 A 连接到半加器的输入 A
.B (B), // 将 B 连接到半加器的输入 B
.sum (sum), // 将 sum 连接到半加器的和输出
.carry (carry) // 将 carry 连接到半加器的进位输出
);
endmodule
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
程序注释:
第 5 - 11 行:根据半加器的功能定义,重新声明,两个输入信号,分别为 A B ,两个输出信号分别为 sum ,代表半加器的和 ,另一个是 carry 代表半加器的进位 。
第 14 - 30 行:根据真值表的数据依次进行模拟输入情况。
第 33 - 38 行:进行I/O绑定,例化。
8、工程创建
开始使用 Gowin 创建项目工程了,接着在 Gowin 的 Design 窗口空白地方右键点击选择 Add Files... 添加文件,分别创建所需的文件 half_adder.v 和 half_adder_mod.v ,如下图所示:
添加完对应程序后,然后开始仿真,新建工程将 Project_Name 和 Default Library Name 都改成 half_adder 名称,如下图所示:
分别添加我们仿真所需的文件 half_adder.v 和 half_adder_mod.v,如下图所示:
接下来选择 Compile->Compile All ,编译没有问题后,在 Add Simulation Configuration 配置好对应的文件,如下图所示:
仿真结果如下:
由上面的仿真图,可以看出与我们的真值表所列出的来结果是一致的,证明我们的程序没有问题。
9、I/O 引脚绑定
在仿真验证完成后,开始 Synthesize 编译判断 half_adder.v 文件是否有语法错误,执行 Synthesize 编译,接下来使用 Gowin 对 引脚 进行分配并上板验证。如下图所示:
本实验中,系统时钟、二个 key 按键以及二个 led 端口的管脚分配如下表所示:
信号 | 方向 | 引脚 | 端口作用 | 电平标准 |
---|---|---|---|---|
A | input | F10 | 输入信号A | LVCMOS33 |
B | input | D11 | 输入信号B | LVCMOS33 |
sun | output | N6 | 和 | LVCMOS33 |
carry | output | R9 | 进位 | LVCMOS33 |
Gowin 软件中 I/O Constraints 界面如下图所示:
10、RTL 原理图
接下来在过程管理窗口 Process > Place & Route > Run,来对代码布局布线进行综合(如果前面没有执行 Synthesize 编译,直接执行这个,编译器会自动执行前面的内容),如下图所示:
再点击 tools -> Shematic Viewer -> RTL Design Viewer 然后查看 RTL 电路图,如下图所示:
然后查看 RTL 电路图,在软件里 半加器 是怎样的,如下图所示: