Verilog N位全加器

本文展示了使用Verilog语言编写8位全加器的三种不同方法:一种是通过generate语句进行实例化,一种是直接赋值实现,另一种是使用always块和for循环。每种方法都包括输入和输出的定义,并在最后提供了测试bench以验证设计的功能。
摘要由CSDN通过智能技术生成

本文梳理了三种写法,直接上代码

第一种:

module adder(
    input   [7:0]   num1,//输入的加数num1
    input   [7:0]   num2,//输入的加数num2
    input           cin ,//第0位进位输入
    output          cout,//第7位进位输出
    output          [7:0]   s   ,//8位的本位的和
    output  [8:0]   sum  //当num1=8'b1111_1111;num2=8'b1111_1111;
);
     wire     [8:0]   cin_temp;//定义一个进位信号cin_temp

    assign  cin_temp[0] = cin;

//generate:当需要去循环调用实例化模块的时候使用generate-endgenerate;generate中整形变量用genvar去定义
     genvar i;//定义一个整形变量i
     generate
         for(i=0;i<8;i=i+1)begin : my_adder
            full_add    u_full_add(
             /*input           */.x   (num1[i]       ),
            /*input           */.y   (num2[i]       ),
            /*input           */.cin (cin_temp[i]   ),//上一位的进位
             /*output          */.c   (cin_temp[i+1] ),//本位进位
             /*output          */.s   (s[i]          ) //本位和
             );
         end
    endgenerate

 //输出
    assign  cout = cin_temp[8];

    assign  sum = {cout,s};
endmodule

第二种:

module adder(
    input   [7:0]   num1,//输入的加数num1
    input   [7:0]   num2,//输入的加数num2
    input           cin ,//第0位进位输入
    output          cout,//第7位进位输出
    output         [7:0]   s   ,//8位的本位的和
    output  [8:0]   sum  //当num1=8'b1111_1111;num2=8'b1111_1111;
);
    wire    [8:0]   cin_temp;
    //第一个全加器(第0位)
     assign  cin_temp[0] = cin;
     assign  {cin_temp[1],s[0]} = num1[0] + num2[0] + cin_temp[0];//第1个全加器
     assign  {cin_temp[2],s[1]} = num1[1] + num2[1] + cin_temp[1];//第2个全加器
    assign  {cin_temp[3],s[2]} = num1[2] + num2[2] + cin_temp[2];//第3个全加器
     assign  {cin_temp[4],s[3]} = num1[3] + num2[3] + cin_temp[3];//第4个全加器
     assign  {cin_temp[5],s[4]} = num1[4] + num2[4] + cin_temp[4];//第5个全加器
    assign  {cin_temp[6],s[5]} = num1[5] + num2[5] + cin_temp[5];//第6个全加器
    assign  {cin_temp[7],s[6]} = num1[6] + num2[6] + cin_temp[6];//第7个全加器
     assign  {cin_temp[8],s[7]} = num1[7] + num2[7] + cin_temp[7];//第8个全加器
 //输出
    assign  cout = cin_temp[8];
     assign  sum = {cout,s};
endmodule

第三种

module adder(
    input   [7:0]   num1,//输入的加数num1
    input   [7:0]   num2,//输入的加数num2
    input           cin ,//第0位进位输入
    output          cout,//第7位进位输出
    output      reg    [7:0]   s   ,//8位的本位的和
    output  [8:0]   sum  //当num1=8'b1111_1111;num2=8'b1111_1111;
);

 reg    [8:0]   cin_temp;

    integer j;

    always @(*) begin
        cin_temp[0] = cin;
        for ( j=0 ;j<=7;j=j+1) begin
            {cin_temp[j+1],s[j]} = num1[j] + num2[j] + cin_temp[j];
        end
    end
    
    assign  cout = cin_temp[8];
    assign  sum = {cout,s};

endmodule

TESTBENCH

`timescale 1ns/1ns

module adder_tb();

//激励信号定义
    reg     [7:0]       num1;
    reg     [7:0]       num2;
    reg                 cin ;

//输出信号定义
    wire                cout;
    wire    [7:0]       s   ;
    wire    [8:0]       sum ;

//模块例化
    adder   adder_inst(
    /*input   [7:0]   */.num1(num1  ),//输入的加数num1
    /*input   [7:0]   */.num2(num2  ),//输入的加数num2
    /*input           */.cin (cin   ),//第0位进位输入
    /*output          */.cout(cout  ),//第7位进位输出
    /*output  [7:0]   */.s   (s     ),//8位的本位的和
    /*output  [8:0]   */.sum (sum   ) //当num1=8'b1111_1111;num2=8'b1111_1111;
);

    initial begin
        #20;
        num1 = 8'd0;//8'b0000_0000
        num2 = 8'd0;
        cin  = 'd0;

        #50;
        repeat(100) begin 
            num1 = {$random}%256;
            num2 = {$random}%256;
            cin = 0;
            #100;
        end

        num1 = 8'd0;//8'b0000_0000
        num2 = 8'd0;
        cin  = 'd0;
        #1000;

    end


endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值