FPGA设计16位二进制全加器模块

简介: 本文主要采用FPGA设计16位二进制全加器模块


【实验要求】  
实验内容与原理说明(包括框图、逻辑表达式和真值表)。
实验模块程序代码(设计模块Design Block)和激励代码(激励模块Test Bench)。
仿真波形图。
综合得到的门级电路图。
实验结果分析及思考。
每一次报告用Word文档提交,文件名:姓名_班级_第几次实验_学号。
【实验软件工具】
QuartusII;
ModelSim SE.
【一】设计一个16位二进制全加器模块

  1. 实验内容与原理说明

此次实验为设计一个16位全加器模块并对其进行测试,本实验是以数据流的方式描述全加器模块,其中16位全加器有一个进位输入端和一个进位输出端,以及16位的数据输入和输出端,实现16位数据的计算,具体的实验如下。

由分析可知,该实验的逻辑表达式如下所示:

s+cout=cin+A+B

cout=A+B+cin

s=A+B+cin

该设计模块的实验框图如下:

  1. 实验模块程序代码和激励代码

(1) 设计模块Design Block

module bit16FullAdder(cout,s,A,B,cin);

output[15:0] s;  
output cout;  
input[15:0] A,B;  
input cin;  
assign {cout,s}=A+B+cin;  

endmodule

 (2) 激励模块Test Bench

// Generated on "04/01/2022 16:31:02"
// Verilog Test Bench template for design : bit16FullAdder
// Simulation tool : ModelSim (Verilog)
`timescale 1ns/1ns
module bit16FullAdder_vlg_tst();

wire[15:0] s;  
wire cout;  
reg[15:0] A,B;  
reg cin;  

bit16FullAdder bit16FullAdder(.cout(cout),.s(s),.A(A),.B(B),.cin(cin));
initial

begin  
 #0 A = 16'b0000_0000_0000_0000; B = 16'b0000_0000_0000_0000; cin = 1'b0;  
 #5 A = 16'b0000_0000_1000_0000; B = 16'b0000_0000_1000_0001; cin = 1'b1;  
 #5 A = 16'b1000_1000_1000_1000; B = 16'b1000_1000_1000_1000; cin = 1'b0;  
 #5 A = 16'b1111_1111_1111_1111; B = 16'b1111_1111_1111_1111; cin = 1'b1;  
 #5 $finish;  
    end  
  

initial
$monitor("At time %t, A(%b) + B(%b) + cin(%b) = s(%b)(%2d),cout(%b)",$time, A, B, cin, s, s, cout);
endmodule

3.仿真波形图

image.png

4.门级电路图
image.png

【二】用层次化设计方法,设计一个16位二进制全加器模块
【实验具体内容】

  1. 实验内容与原理说明

本实验实现一个16位全加器的设计和调试,在这个实验中实现的是从元件例化的方面进行说明和描述,所谓16位全加器就是需要有一个进位输入端和一个进位输出端,以及16位的数据输入和输出端,实现16位数据的计算。所实现的数据计算如下:

s+cout = cin+a+b

s=a+b+cin

cout = a+b +cin

其中,全加器的真值表如下所示:

其逻辑表达式为:

S = A⊕B⊕CI

CO=AB+CI(A+B)

按照自底向上的逻辑逐级设计,四位全加器可对两个多位二进制数进行加法运算,同时产生进位。当两个二进制数相加时,较高位相加时必须加入较低位的进位项(CI),以得到输出为和(S)和进位(C0)。其中CIN表示输入进位位,COUT表示输出进位位,输入A和B分别表示加数和被加数。输出SUM=A+B+CIN,当SUM大于255时,COUT置‘1’。四位加法器原理图如下:

再由四位加法器按层次封装即可形成十六位加法器。

  1. 实验模块程序代码和激励代码

(1)设计模块代码
module half(a,b,sum,co);//首先定义半加器模块
input a;//定义输入端口
input b;
output sum;//定义输出端
output co;//定义进位信号co
assign sum=a ^ b;//采用数据流的方式表达逻辑表达式
assign co=a & b;

endmodule

module full1(a,b,cin,co,sum);//然后定义一位全加器
input a;//定义输入端口
input b;
input cin;//定义进位信号cin
output sum;//定义输出端
output co;//定义进位输出信号co

wire s0,c0,c1;//定义三条wire类型的连线,其中s0是第一个半加器结果和第二个半加器输入的连接,c0是第一个半加器的进位输出,c1是第二个半加器的进位输出信号

half half_inst1(.a(a),.b(b),.sum(s0),.co(c0));
half half_inst2(.a(s0),.b(cin),.sum(sum),.co(c1));//定义两个半加器,将其元件例化并连接相应的端口
assign co=c0|c1;//采用数据流描述输出的进位输出信号co

endmodule

module full4(a,b,cin,sum,co);//定义4为的加法器
input[3:0] a;
input[3:0] b;//两个4位的输入信号a和b
input cin;//定义输入的进位信号cin
output[3:0] sum;//定义输出的和sum
output co;//定义输出的进位信号

wire c0;
wire c1;//定义三条wire类型的连线
wire c2;//分别是前一个一位加法器的进位输出与后一个一位加法器的进位输入之间的连线

full1 full1_inst1(.a(a[0]),.b(b[0]),.cin(cin),.sum(sum[0]),.co(c0));
full1 full1_inst2(.a(a[1]),.b(b[1]),.cin(c0),.sum(sum[1]),.co(c1));
full1 full1_inst3(.a(a[2]),.b(b[2]),.cin(c1),.sum(sum[2]),.co(c2));
full1 full1_inst4(.a(a[3]),.b(b[3]),.cin(c2),.sum(sum[3]),.co(co));//四位的加法器是由四个一位的加法器组成的,分别进行元件例化和端口的连接

endmodule

module bit16Level(a,b,cin,sum,co);//定义十六位的加法器
input[15:0] a;
input[15:0] b;//定义两个十六位的加数输入
input cin;//定义一个进位输入
output[15:0] sum;//定义sum为十六位的和的输出
output co;//定义co为进位输出

wire c0;//定义wire型的连线
wire c1;//是前一个四位加法器的进位输出
wire c2;//与后一个四位加法器的进位输入之间的连线

full4 full4_inst1(.a(a[3:0]),.b(b[3:0]),.cin(cin),.sum(sum[3:0]),.co(c0));
full4 full4_inst2(.a(a[7:4]),.b(b[7:4]),.cin(c0),.sum(sum[7:4]),.co(c1));
full4 full4_inst3(.a(a[11:8]),.b(b[11:8]),.cin(c1),.sum(sum[11:8]),.co(c2));
full4 full4_inst4(.a(a[15:12]),.b(b[15:12]),.cin(c2),.sum(sum[15:12]),.co(co));//十六位的加法器是由四个四位的加法器组成的,分别进行元件例化和端口的连接

endmodule

(2)激励模块代码
`timescale 1 ps/ 1 ps
module bit16Level_vlg_tst();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg [15:0] a;
reg [15:0] b;
reg cin;
// wires
wire co;
wire [15:0] sum;

// assign statements (if any)
bit16Level i1 (
// port map - connection between master ports and signals/registers

.a(a),  
.b(b),  
.cin(cin),  
.co(co),  
.sum(sum)  

);
initial
begin
a<=16'h0001;

b<=16'h0001;  
cin<=1;  
//经过150ps后停止仿真  

150 $stop;

end

always #10 a={$random}%17'h10000;
always #10 b={$random}%17'h10000;
//每经过10ps,为a、b和cin赋一个随机的值
always #10 cin={$random}%2;
endmodule

3.仿真波形图
image.png

4.门级电路图
image.png

目录
相关文章
|
数据采集 算法 测试技术
【硬件测试】基于FPGA的1024QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的1024QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同SNR条件下的性能测试。1024QAM调制将10比特映射到复平面上的1024个星座点之一,实现高效数据传输。硬件测试结果表明,在SNR=32dB和40dB时,系统表现出良好的性能。Verilog核心程序展示了各模块的连接与功能实现。
376 7
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现了16QAM基带通信系统,包括调制、信道仿真、解调及误码率统计模块。通过Vivado2019.2仿真,设置不同SNR(如8dB、12dB),验证了软解调相较于传统16QAM系统的优越性,误码率显著降低。系统采用Verilog语言编写,详细介绍了16QAM软解调的原理及实现步骤,适用于高性能数据传输场景。
726 69
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的MSK调制解调系统系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现MSK调制解调系统,采用Verilog开发,包含同步模块、高斯信道模拟、误码率统计等功能。相比仿真版本,新增ILA数据采集与VIO在线SNR设置模块。通过硬件测试验证,展示不同SNR(如10dB和16dB)下的性能表现。研究聚焦软件无线电领域,优化算法复杂度以适应硬件限制,利用MSK恒定包络、相位连续等特性提升频谱效率。核心代码实现信号生成、调制解调、滤波及误码统计,提供完整的硬件设计与分析方案。
510 19
|
数据采集 移动开发 算法
【硬件测试】基于FPGA的QPSK调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现QPSK调制与软解调系统,包含Testbench、高斯信道、误码率统计模块,并支持不同SNR设置。硬件版本新增ILA在线数据采集和VIO在线SNR设置功能,提供无水印完整代码及测试结果。通过VIO分别设置SNR为6dB和12dB,验证系统性能。配套操作视频便于用户快速上手。 理论部分详细解析QPSK调制原理及其软解调实现过程,涵盖信号采样、相位估计、判决与解调等关键步骤。软解调通过概率估计(如最大似然法)提高抗噪能力,核心公式为*d = d_hat / P(d_hat|r[n])*,需考虑噪声对信号点分布的影响。 附Verilog核心程序代码及注释,助力理解与开发。
428 5
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4ASK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的4ASK调制解调系统的硬件测试版本,该系统包括testbench、高斯信道模块和误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置功能。通过VIO设置不同SNR(如15dB和25dB),实现了对系统性能的实时监测与调整。4ASK是一种通过改变载波幅度表示数据的数字调制方式,适用于多种通信场景。FPGA平台的高效性和灵活性使其成为构建高性能通信系统的理想选择。
377 17
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前开发的16QAM调制与软解调系统,增加了硬件测试功能。该系统包含FPGA实现的16QAM调制、软解调、高斯信道、误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置模块。通过硬件测试,验证了不同SNR条件下的系统性能。16QAM软解调通过比较接收信号采样值与16个调制点的距离,选择最近的调制点来恢复原始数据。核心Verilog代码实现了整个系统的功能,包括SNR设置、信号处理及误码率统计。硬件测试结果表明系统在不同SNR下表现良好,详细操作步骤可参考配套视频。
358 13
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4FSK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前的文章《基于FPGA的4FSK调制解调系统》,增加了ILA在线数据采集模块和VIO在线SNR设置模块,实现了硬件测试版本。通过VIO设置不同SNR(如10dB和20dB),并展示了ILA采集的数据结果。四频移键控(4FSK)是一种数字调制方法,利用四个不同频率传输二进制数据,具有较高的频带利用率和抗干扰性能。输入的二进制数据分为两组,每组两个比特,对应四个频率f1、f2、f3、f4,分别代表二进制组合00、01、10、11。调制过程中选择相应频率输出,并进行幅度调制以增强抗干扰能力。接收端通过带通滤波器提取信号并还原为原始二进制数据。
362 7
|
数据采集 算法 数据处理
【硬件测试】基于FPGA的256QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的256QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同信噪比(如30dB和40dB)的仿真测试,并提供配套操作视频。256QAM调制方案每个符号携带8比特信息,通过复数值星座图映射实现高效传输。Verilog代码展示了核心模块设计,包括SNR设置、数据处理和ILA测试分析,确保系统在实际硬件环境中的稳定性和性能。
349 2
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的16QAM基带通信系统硬件测试版本。该系统在仿真基础上增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同信噪比(如15dB、25dB)的测试。16QAM是一种正交幅度调制方式,通过两路4ASK信号叠加实现,每个符号包含4比特信息。系统采用正交调幅法生成16QAM信号,并通过DAC转换为模拟信号。解调时使用正交相干解调,经低通滤波器恢复电平信号。开发板内完成发射与接收,无需定时同步模块。代码可移植至其他开发板,具体步骤见配套文档。
321 2
|
数据采集 算法 测试技术
【硬件测试】基于FPGA的2ASK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍基于FPGA的2ASK调制解调系统,涵盖仿真效果、理论知识、Verilog核心程序及开发板使用说明。系统包含testbench、高斯信道模块和误码率统计模块,支持不同SNR设置。硬件测试版本增加了ILA在线数据采集和VIO在线SNR设置功能。2ASK调制通过改变载波振幅传输二进制信号,FPGA实现包括系统设计、Verilog编码、仿真测试和硬件部署。详细操作步骤见配套视频,代码适用于多种开发板,提供移植方法。
339 1

热门文章

最新文章