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

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

 【实验要求】  

  1. 实验内容与原理说明(包括框图、逻辑表达式和真值表)。
  2. 实验模块程序代码(设计模块Design Block)和激励代码(激励模块Test Bench)。
  3. 仿真波形图。
  4. 综合得到的门级电路图。
  5. 实验结果分析及思考。
  6. 每一次报告用Word文档提交,文件名:姓名_班级_第几次实验_学号。

【实验软件工具】

  1. QuartusII;
  2. ModelSim SE.

【一】设计一个16位二进制全加器模块

1. 实验内容与原理说明

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

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

s+cout=cin+A+B

cout=A+B+cin

s=A+B+cin

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

编辑


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

(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.仿真波形图

编辑

4.门级电路图

编辑

【二】用层次化设计方法,设计一个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’。四位加法器原理图如下:

编辑

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

编辑

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

(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.仿真波形图

编辑

4.门级电路图

编辑

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。