|
其调用的4个子模块如下。
以后不论位数怎么变,只会修改顶层调用的模块,以下4个子模块均不需变化。
//求和并按输出a,b,cin分组
module bitslice4 (a, b, cin, s, gp, gg);
input [3:0] a,b;
input cin;
output [3:0] s;
output gp,gg;
wire [3:0] p,g,c;
pg4 i1 (a, b, p, g);
cla4 i2 (p, g, cin, c, gp, gg);
sum4 i3 (a, b, c, s);
endmodule
//计算传播值和产生值的PG模块
module pg4 (a, b, p, g);
input [3:0] a, b;
output [3:0] p, g;
assign p = a | b;
assign g = a & b;
endmodule
//计算sum值的sum模块
module sum4 (a, b, c, s);
input [3:0] a,b,c;
output [3:0] s;
wire [3:0] t = a ^ b;
assign s = t ^ c;
endmodule
//n-bit 超前进位模块
module cla4 (p, g, cin, c, gp, gg);
input [3:0] p,g; //输出的propagate bit 和generate bit
input cin; //进位输入
output [3:0] c; //为每一位产生进位
output gp, gg; //传播值和进位制
assign {c,gp,gg} = do_cla4 (p, g, cin);
// function [99:0] do_cla4; //该函数内将为每个位计算其进位值
function [5:0] do_cla4; //该函数内将为每个位计算其进位值
input [3:0] p, g;
input cin;
begin: label
integer i;
reg gp, gg;
reg [3:0] c;
gp = p[0];
gg = g[0];
c[0] = cin;
for (i=1;i<4;i=i+1)
begin
//C0=G0+P0C_1
//C1=G1+P1C0=(G1+P1G0)+P1P0C_1
gp = gp & p;
gg = (gg & p) | g;
c = (c[i-1] & p[i-1]) | g[i-1];
end
do_cla4 = {c,gp,gg};
end
endfunction
endmodule
|
|