Exams/m2014 q4j
看到这个电路,我的想法是用生成块,把进位相连。
module top_module (
input [3:0] x,
input [3:0] y,
output [4:0] sum);
wire [3:0]cout;
assign {cout[0],sum[0]} = x[0]+y[0];
genvar i;
generate for(i=1;i<4;i=i+1)
begin:cot
assign {cout[i],sum[i]} = x[i]+y[i]+cout[i-1];
end
endgenerate
assign sum[4] = cout[3];
endmodule
然后我发现这个电路可以直接这样写,唉,写Verilog的路还是前路漫漫。
module top_module (
input [3:0] x,
input [3:0] y,
output [4:0] sum);
assign sum = x+y;
endmodule
反思了一下,我不应该只看每一个部分,而是整体的看这个电路的输入输出。
Exams/ece241 2014 q1c
Assume that you have two 8-bit 2’s complement numbers, a[7:0] and b[7:0]. These numbers are added to produce s[7:0]. Also compute whether a (signed) overflow has occurred.
由于上题的教训,我本来以为也可以直接用整体的方式来写。
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output overflow
);
assign {overflow,s}=a+b;
endmodule
后来发现自己理解错了题意。这是两个有符号数相加。两个正数相加,如果得负数,则溢出。两个负数相加,如果得正数,则溢出。
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])?((a[7]!==s[7])?1:0):0;
endmodule
看了看大佬写的,又学到了。
输入a和b是二进制补码,如果a和b是正数,则最高位,即符号位是正的,如果二者相加为负,则为溢出:
overflow = a[7] & b[7] & ~s[7];
如果a和b是负数,则最高位为负,如果二者相加为正,则表示溢出。
overflow = ~a[7] & ~b[7] & s[7];
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]);
endmodule
引用博主链接:https://blog.csdn.net/Reborn_Lee/article/details/103219777
Adder100
这个题目就是用生成块。(错误示范)后来发现想太多。。。。。
module top_module(
input [99:0] a, b,
input cin,
output cout,
output [99:0] sum );
wire [99:0]c_in;
assign {c_in[0],sum[0]}=a[0]+b[0]+cin;
genvar i;
generate for (i=1;i<100;i=i+1)
begin:fe
assign {c_in[i],sum[i]} = a[i]+b[i]+c_in[i-1];
end
endgenerate
assign cout = c_in[99];
endmodule
直接加就好
module top_module(
input [99:0] a, b,
input cin,
output cout,
output [99:0] sum );
assign {cout,sum} = a+b+cin;
endmodule
Bcdadd4
例化四个bcd_fadd就好了。
module top_module(
input [15:0] a, b,
input cin,
output cout,
output [15:0] sum );
wire [3:0] cin_reg;
bcd_fadd u0(
.a(a[3:0]),
.b(b[3:0]),
.cin(cin),
.cout(cin_reg[0]),
.sum(sum)
);
genvar i;
generate for(i=1;i<4;i=i+1)
begin:fdf
bcd_fadd (
.a(a[4*i+:4]),
.b(b[4*i+:4]),
.cin(cin_reg[i-1]),
.cout(cin_reg[i]),
.sum(sum[4*i+:4])
);
end
endgenerate
assign cout = cin_reg[3];
endmodule
写于2021/11/13 0:03