上一篇博客介绍了Kogge-Stone加法器和brent-kung加法器,本文将用Verilog代码进行实现。原理部分请看:
各种加法器的比对分析与Verilog实现(2)_Albert_yeager的博客
module koggle_stone (
input [3:0] a_i,b_i,
input c_i,
output wire [3:0] c_o
);
wire [3:0] q,p;
wire [4:0] carry;assign p = a_i & b_i;
assign q = a_i | b_i;
assign carry[0] = c_i;
assign carry[1] = p[0] + q[0] & carry[0];
assign carry[2] = p[1] + q[1] & p[0] + q[1] & q[0] & carry[0];
assign carry[3] = p[2] + q[2] & p[1] + q[2] & q[1] & carry[1];
assign carry[4] = p[3] + q[3] & p[2] + q[3] & q[2] & carry[2]; assign c_o[3:0] = a_i ^ b_i ^ carry[3:0];
assign c_o[4] = carry[4];
endmodule
module brent_kung (
input [2:0] a_i,b_i,
input c_i,
output wire [3:0] c_o
);
wire [2:0] q,p,carry;
wire [1:0] level_0_p,level_0_q;
wire [1:0] level_1_p,level_1_q;assign p = a_i & b_i;
assign q = a_i | b_i;CELL level_0_tree0 (.p_1(p[0]), .q_1(q[0]), .p_0(1'b0), .q_0(c_i),.P(level_0_p[0]), .Q(level_0_q[0])
);CELL level_0_tree1 (.p_1(p[2]), .q_1(q[2]), .p_0(p[1]), .q_0(q[1]),.P(level_0_p[1]), .Q(level_0_q[1])
);CELL level_1_tree0 (.p_1(p[1]), .q_1(q[1]),.p_0(level_0_p[0]), .q_0(level_0_q[0]),.P(level_1_p[0]), .Q(level_1_q[0])
);
CELL level_1_tree1 (.p_1(level_0_p[1]), .q_1(level_0_q[1]),.p_0(level_0_p[0]), .q_0(level_0_q[0]),.P(level_1_p[1]), .Q(level_1_q[1])
);assign carry[0] = level_0_p[0] | level_0_q[0];
assign carry[1] = level_1_p[0] | level_1_q[0];
assign carry[2] = level_1_p[1] | level_1_q[1];
assign c_o[3] = carry[2];
assign c_o[2:0] = a_i ^ b_i ^ {carry[1:0],c_i};endmodule
求学路上,你我共勉(๑•̀ㅂ•́)و✧
本文发布于:2024-01-28 15:29:30,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064269768403.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |