【FPGA】——verilog实现四位全加器和三八译码器
目录
一、四位全加器原理
1、半加器
2、一位全加器
3、四位全加器
二、在Quartus里实现四位全加器
三、在Quartus里三八译码器
1、三八译码器真值表
2、七段数码管
3、verilog代码
总结
一、四位全加器原理
1、半加器
半加器是一种基本的数字电路元件,用于对两个二进制数进行加法运算。它只能处理两个一位二进制数的加法,无法处理来自低位的进位。半加器具有两个输入和输出,其真值表如下图所示:
A、B表示两个输入,C表示进位,S表示和
在Quartus里面画出的逻辑电路图如下:
2、一位全加器
全加器可以对三个二进制数进行加法运算。与半加器不同,全加器能够处理来自低位的进位,因此适用于多位二进制数的加法运算。其真值表如下图所示:
它有三个输入和两个输出,Ain、Bin表示两个二进制数,Cin表示地位进位,Cout表示高位进位,Sum表示相加得到的和
使用verilog语言编写一位全加器:
module full_adder (
// 输入信号:被加数 (ain),加数 (bin),低位进位 (cin)
input ain, bin, cin,
// 输出信号:和 (sum),高位进位 (cout)
output sum, cout
);
// 计算和与进位
assign sum = ain ^ bin ^ cin; // 本位和
assign cout = (ain & bin) | (bin & cin) | (ain & cin); // 进位
endmodule
得到的仿真图如下:
3、四位全加器
四位全加器通过级联四个全加器实现,能够对两个四位二进制数进行加法运算,并处理进位。它是计算机硬件中实现算术运算的基础模块之一。其真值表如下图所示:
verilog语言
module adder_4bit (
// 输入信号:4 位被加数 (a),4 位加数 (b),低位进位 (cin)
input [3:0] a, b,
input cin,
// 输出信号:4 位和 (sum),高位进位 (cout)
output [3:0] sum,
output cout
);
// 内部信号:用于存储每一位的进位
wire c1, c2, c3;
// 实例化四个一位全加器,级联实现四位全加器
full_adder fa0 (
.ain(a[0]),
.bin(b[0]),
.cin(cin),
.sum(sum[0]),
.cout(c1)
);
full_adder fa1 (
.ain(a[1]),
.bin(b[1]),
.cin(c1),
.sum(sum[1]),
.cout(c2)
);
full_adder fa2 (
.ain(a[2]),
.bin(b[2]),
.cin(c2),
.sum(sum[2]),
.cout(c3)
);
full_adder fa3 (
.ain(a[3]),
.bin(b[3]),
.cin(c3),
.sum(sum[3]),
.cout(cout)
);
endmodule
生成仿真图如下所示:
二、在Quartus里实现四位全加器
1、创建工程过程 启动 Quartus II 软件,选择File->New Project Wizard,在出现的界面下先Next,填写工程的路径和名称,然后接着Next,直到出现下面界面并进行相应操作。接着一路Next,直到Finish,完成工程的创建。
2、创建Verilog文件
首先创建一个一位全加器的Verilog HDL 文件full_adder,然后输入上面的Verilog代码,保存并编译
然后再创建四位全加器文件adder_4bit,输入上面的Verilog代码,保存并编译
通过tool->Netlist Viewers->RTL Viewer,可以查看电路图
3、创建一个向量波形文件,选择菜单项 File→New->VWF
添加信号
4、编辑仿真信号并得到波形图
5、绑定引脚
我们在开发板上需要用到按键去表示输入的二进制值,查询DE2-115开发板的按键引脚如下图所示:
知道需要用到的按键之后就可以在Quartus里面绑定,通过Assignments->Pin Planner,打开引脚配置
6、烧录程序
实物图如下:
四位全加器
三、在Quartus里三八译码器
1、三八译码器真值表
2、七段数码管
为方便查看三八译码器的输出,我们可以将输出转化到七段数码管上查看。
本次使用开发板采用共阳极数码seg值
3、verilog代码
//利用38译码器点亮8段数码管
module yima_38(
input wire [2:0] sw, // 3位输入开关,用于选择数码管显示的8数字
output reg [6:0] seg // 8位输出,连接到数码管的段选信号(a-g + dp)
);
// 数码管段选信号定义(共阳极)
// seg[6:0] 分别对应数码管的 g, f, e, d, c, b, a
// 共阳极数码管:0 点亮,1 熄灭
always @(sw) begin
case (sw)
3'b000: seg = 8'b1100_0000; // 显示数字 0
3'b001: seg = 8'b1111_1001; // 显示数字 1
3'b010: seg = 8'b1010_0100; // 显示数字 2
3'b011: seg = 8'b1011_0000; // 显示数字 3
3'b100: seg = 8'b1001_1001; // 显示数字 4
3'b101: seg = 8'b1001_0010; // 显示数字 5
3'b110: seg = 8'b1000_0010; // 显示数字 6
3'b111: seg = 8'b1111_1000;
default: seg = 8'b1111_1111; // 默认全灭
endcase
end
endmodule
仿真图如下:
实物效果如下所示:
三八译码器
参考
FPGA——1位全加器的实现_fpga全加器代码-CSDN博客
FPGA——1位全加器和4位全加器的实现_一位全加器电路图-CSDN博客
总结
此次FPGA的实验受益颇多,更进一步了解了四位全加器和三八译码器的原理以及verilog代码的编写。