0%

【杂文散记】Verilog之加法器

在fpga工程应用设计中,随处可见加法器,乘法器等等。现在将一些常用模块和心得体会先记录下来,以便日后使用。

  • 一位半加器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    module halfadder(cout,sum,a,b);

             outputcout,sum; //不申明,默认是wire变量

             input  a,b;

             assign{cout,sum}=a+b;//cout为进位,sum为和

    endmodule
  • 一位全加器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    module fulladder(a,b,cin,cout,sum);

             inputa,b,cin;

             outputcout,sum;

             assign{cout,sum}=a+b+cin;

    endmodule
  • 利用两个半加器实现全加器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    module halfadder(a,b,sum,cout);

             outputcout,sum; //不申明,默认是wire变量

             input  a,b;

             assign{cout,sum}=a+b;

    endmodule



    module fulladder(x,y,c_in,sum,c_out);

             inputx;

             inputy;

             inputc_in;

             outputsum;

             outputc_out;

             wirea_sum;

             wirea_out;

             wireb_out;    

             assignc_out=a_out|b_out;

             halfadderhalf(x,y,a_sum,a_out);

             halfadderhalf1(c_in,a_sum,sum,b_out);

    endmodule

测试文件的编写技巧

就拿上面的半加器来说,我们需要添加的就是输入信号a,b.可以采用下列方法:

  • 第一种:

    1
    2
    3
    4
    5
    6
    7
    #100 a=0;

    #100 b=0;

    #100 a=1;

    #100 b=1;

    这种编辑方式虽然十分方便,可是对于很多情况的测试编写困难。

  • 第二种:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Integer I;

    For(i=0;i<=15;i=i+1)

    a=I;//注意这里a是一位,因此输出为0101010101010101

    第三种:

    Repeat(16)

     a ={$random}%2;//这里产生随机的0 1比特流。
坚持原创技术分享,您的支持将鼓励我继续创作!