1.Hadd
创建一个半加法器。半加法器添加两个位(不考虑低进位)并产生总和。
module top_module(
input a, b,
output cout, sum );
assign sum = a ^ b; //异或
assign cout = a & b; //与
endmodule
2.Fadd
实现一个全加器。
module top_module(
input a, b, cin,
output cout, sum );
assign sum = a ^ b ^ cin;
assign cout = ((a ^ b) & cin) + (a & b);
endmodule
3.Adder3
创建3位二进制全加器,加法器将两个3位数字和一个进位数相加,产生3位和并执行。
module top_module(
input [2:0] a, b,
input cin,
output [2:0] cout,
output [2:0] sum );
wire cout1,cout2,cout3;
full_adder instance1 (.a(a[0]), .b(b[0]), .cin(cin), .cout(cout1), .sum(sum[0]));
full_adder instance2 (.a(a[1]), .b(b[1]), .cin(cout1), .cout(cout2), .sum(sum[1]));
full_adder instance3 (.a(a[2]), .b(b[2]), .cin(cout2), .cout(cout3), .sum(sum[2]));
assign cout = {cout3 , cout2 , cout1};
assign sum = {sum[2] , sum[1] , sum[0]};
endmodule
module full_adder (
input a,b,cin,
output cout,sum);
assign sum = a ^ b ^ cin;
assign cout = ((a ^ b) & cin) + (a & b);
endmodule
4.Exams/m2014 q4j
module top_module (
input [3:0] x,
input [3:0] y,
output [4:0] sum);
wire cout1,cout2,cout3;
FA instance1 (.x(x[0]), .y(y[0]), .cin(1'b0), .cout(cout1), .sum(sum[0]));
FA instance2 (.x(x[1]), .y(y[1]), .cin(cout1), .cout(cout2), .sum(sum[1]));
FA instance3 (.x(x[2]), .y(y[2]), .cin(cout2), .cout(cout3), .sum(sum[2]));
FA instance4 (.x(x[3]), .y(y[3]), .cin(cout3), .cout(sum[4]), .sum(sum[3]));
assign sum = {sum[4] , sum[3] , sum[2] , sum[1] , sum[0]};
endmodule
module FA (
input x,y,cin,
output cout,sum);
assign sum = x ^ y ^cin;
assign cout = ((x ^ y) & cin) + (x & y);
endmodule
5.Exams/ece241 2014 q1c
假设有两个8位的二进制补码数,a[7:0]和b[7:0],将这些数字相加以生成 s[7:0],判断是否发生(签名的)溢出。
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output overflow
);
assign s = a + b;
assign overflow = (a[7] && b[7] && (~s[7])) || ((~a[7]) && (~b[7]) && s[7]);
//考虑a,b为正数和负数的两种情况
//负数相减产生正数,判断溢出。
//正数相加产生负数,判断溢出。
endmodule
6.Adder100
创建100位二进制加法器。加法器将两个100位数字和一个进位相加,以产生100位和并执行。
module top_module(
input [99:0] a, b,
input cin,
output cout,
output [99:0] sum );
//assign {cout , sum} = a + b + cin;
wire [99:0] c;
assign sum[0] = a[0] ^ b[0] ^ cin;
assign c[0] = ((a[0] ^ b[0]) & cin) + (a[0] & b[0]);
always @ (*) begin
int i;
for(i=1;i<100;i=i+1) begin
sum[i] = a[i] ^ b[i] ^ c[i-1];
c[i] = ((a[i] ^ b[i]) & c[i-1]) + (a[i] & b[i]);
end
end
assign cout = c[99];
endmodule
7.Bcdadd4
module top_module (
input [15:0] a, b,
input cin,
output cout,
output [15:0] sum );
wire [15:0] c;
bcd_fadd instance1 (a[3:0],b[3:0],cin,c[0],sum[3:0]);
generate
genvar i;
for(i=1;i<4;i=i+1) begin:bcd_fadd
bcd_fadd instance2 (a[4*(i+1)-1:4*i],b[4*(i+1)-1:4*i],c[i-1],c[i],sum[4*(i+1)-1:4*i]);
end
endgenerate
assign cout = c[3];
endmodule