名称:16位二进制加法器 Verilog Quartus
软件:Quartus
语言:Verilog
功能介绍
该工程实现一个16位二进制加法器,支持两个16位输入数据adder_A和adder_B,以及1位输入进位CIN。运算结果通过16位输出S给出,同时由COUT输出最高位进位,能够覆盖带进位输入的常规无符号多位加法场景。 设计没有直接以单一表达式完成全部运算,而是由4个4位加法器级联构成。每一级负责连续的4位数据计算,并将本级产生的进位传递至下一级,因此可以直观观察从低位到高位的进位传播过程。顶层模块接口简洁,既可作为组合逻辑设计练习,也可作为更大算术运算单元中的基础模块。 工程包含Quartus工程配置、Verilog源文件以及ModelSim RTL仿真相关文件。对于需要理解层次化组合逻辑、子模块例化和位选切片连接的学习者,本设计具有直接的参考价值。
运行环境
开发语言:Verilog。 工程适用于Quartus,工程文件包含adder_16.qpf与adder_16.qsf,可用于查看、编译和管理设计。仿真部分提供ModelSim RTL工作库、仿真执行脚本和波形配置文件,可作为RTL功能仿真的工程参考。
设计思路
本设计采用层次化的串行进位结构实现16位二进制加法。顶层将16位操作数按位段划分为4组,每组交由一个4位加法器完成局部加法;低位加法器产生的进位依次传递到更高位加法器,最终得到16位和S及最高位进位COUT。 这种实现方式把16位运算拆分为可复用的4位基本单元,信号路径和模块职责清晰。输入端adder_A、adder_B分别提供两个16位操作数,CIN作为初始进位参与最低4位计算;CIN_1、CIN_2、CIN_3用于连接四级4位加法器,S_signal汇总各段和结果后输出到S。该工程适合学习多位加法器的模块化设计、端口连接方式以及进位级联关系。
模块结构
顶层模块为adder_16,端口包括16位输入adder_A、adder_B,输入进位CIN,16位和输出S以及输出进位COUT。 内部模块adder_4bit被例化4次:i1_adder_4bit处理adder_A[3:0]与adder_B[3:0],i2_adder_4bit处理[7:4]位,i3_adder_4bit处理[11:8]位,i4_adder_4bit处理[15:12]位。CIN、CIN_1、CIN_2、CIN_3依次构成级联进位链,各级结果分别写入S_signal对应的4位区间,最后统一输出S和COUT。
仿真图/仿真说明/设计文档图片
工程提供adder_16_vlg_tst测试平台及ModelSim RTL仿真配置,包括仿真执行脚本、wave.do波形配置和仿真工作库文件。可在ModelSim环境中加载顶层设计与测试平台,观察两个16位输入、输入进位、16位和及输出进位之间的时序变化,并核对四级4位加法器的进位级联关系。
部分代码
以下展示顶层模块adder_16的部分代码,完整代码可关注下方公众号卡片获取。
module adder_16(adder_A, adder_B, CIN, COUT, S); input [15:0] adder_A;//输入A input [15:0] adder_B;//输入B input CIN;//输入进位 output COUT;//输出进位 output [15:0] S;//输出和 //定义中间进位 wire CIN_1; wire CIN_2; wire CIN_3; wire COUT_signal; wire [15:0] S_signal; assign COUT = COUT_signal;//输出进位 assign S = S_signal;//输出和 //调用4位加法器 adder_4bit i1_adder_4bit ( .A(adder_A[3:0]), .B(adder_B[3:0]), .CIN(CIN), .COUT(CIN_1), .S(S_signal[3:0]) ); //调用4位加法器 adder_4bit i2_adder_4bit ( .A(adder_A[7:4]), .B(adder_B[7:4]), .CIN(CIN_1), .COUT(CIN_2), .S(S_signal[7:4]) ); //调用4位加法器 adder_4bit i3_adder_4bit ( .A(adder_A[11:8]), .B(adder_B[11:8]), .CIN(CIN_2), .COUT(CIN_3), .S(S_signal[11:8]) ); //调用4位加法器 adder_4bit i4_adder_4bit ( .A(adder_A[15:12]), .B(adder_B[15:12]), .CIN(CIN_3), .COUT(COUT_signal), .S(S_signal[15:12]) ); endmodule
代码获取:下方公众号
“FPGA代码设计学习资料”