https://hdlbits.01xz.net/wiki答案/Circuits/Arithmetic Circuits

1.Hadd

module top_module( 
    input a, b,
    output cout, sum );
    assign cout = a&b;
    assign sum = a^b;
endmodule

2.Fadd

module top_module( 
    input a, b, cin,
    output cout, sum );
	assign sum = a^b^cin;
    assign cout = (a&b) | (a&cin)|(b&cin);
endmodule

3.Adder3
使用generate是为了回忆generate的使用方法。

module top_module( 
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum );
	
    generate 
        genvar i;
        for(i = 0; i<3; i++)begin:u1
            if(i == 0)
                Fadd fadd(a[i],b[i],cin,sum[i],cout[i]);
            else
                Fadd fadd(a[i],b[i],cout[i-1],sum[i],cout[i]);
        end
    endgenerate
    
endmodule

module Fadd(
	input a,
    input b,
    input cin,
    output sum,
    output cout);
    assign sum = a^b^cin;
    assign cout = (a&b)|(a&cin)|(b&cin);
endmodule

4.Adder
本例引入了行为级描述,注意关于进位(x+y)是带进位的因而结构比x与y多一位的宽度,而{x+y}是不带进位的,结果与x和y的位宽相同。

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);
    
    assign sum = x + y;
endmodule

5.signed addition overflow
关于有符号数进位,只需要判断:符号位和符号位往后一位是否一个进位了,一个未进位(异或)。
可以自行推到得到这个结果,只需要一个二输入门,是比较好的。

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); //
 
    // assign s = ...
    // assign overflow = ...

    wire[7:0] cout;
    generate
        genvar i;
        for(i=0; i<8; i++)begin:u1
            if(i == 0)
                FA fa(a[i],b[i],0,s[i],cout[i]);
            else
                FA fa(a[i],b[i],cout[i-1],s[i],cout[i]);
        end
        assign overflow = cout[7]^cout[6];
    endgenerate
endmodule

module FA(
	input a,
	input b,
	input cin,
	output sum,
	output cout);
	assign sum = a^b^cin;
    assign cout = (a&b)|(a&cin)|(b&cin);
endmodule

6.Adder100
继续加深行为级描述的印象。

module top_module( 
    input [99:0] a, b,
    input cin,
    output cout,
    output [99:0] sum );
    assign {cout,sum} = a + b + cin;
endmodule

7.BCD_adder4

module top_module( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );
	
    wire[3:0] cout1;
    generate 
        genvar i;
        for(i=0; i<4; i++)begin:u1
            if(i==0)
                bcd_fadd Adder(a[4*i+3:4*i], b[4*i+3:4*i], cin, cout1[i], sum[4*i+3:4*i]);
            else
                bcd_fadd Adder(a[4*i+3:4*i], b[4*i+3:4*i], cout1[i-1], cout1[i], sum[4*i+3:4*i]);
        end
        assign cout = cout1[3];
    endgenerate         
endmodule

如有错误欢迎指正讨论。
练习网址

posted @ 2021-03-24 23:03  黑衣の甘铃儿  阅读(120)  评论(0)    收藏  举报