题解 | #超前进位加法器#

超前进位加法器

http://www.nowcoder.com/practice/c4c6afdab9ce45a3a2279a98391686ca

参考答案简化版 使用了genvar,

`timescale 1ns/1ns

module huawei8//四位超前进位加法器
(
	input wire [3:0]A,
	input wire [3:0]B,
	output wire [4:0]OUT
);

//*************code***********//
    wire [3:0] G, P, F;
    wire [4:1] C;
    Add1 a1(.a(A[0]), .b(B[0]), .C_in(1'b0), .f(F[0]), .g(G[0]), .p(P[0]));
    
    genvar i;
    generate
        for(i=1; i < 4; i=i+1) begin:add_inst
            Add1 a_i(.a(A[i]), .b(B[i]), .C_in(C[i]), .f(F[i]), .g(G[i]), .p(P[i]));
        end    
    endgenerate

    
    CLA_4 cla_inst(.P(P), .G(G), .C_in(1'b0), .Ci(C), .Gm(), .Pm());
    
    assign OUT = {C[4], F};


//*************code***********//
endmodule



//////////////下面是两个子模块////////

module Add1
(
		input a,
		input b,
		input C_in,
		output f,
		output g,
		output p
		);
    assign f = a ^ b ^ C_in;
    assign g = a & b;
    assign p = a | b;
endmodule


module CLA_4(
		input [3:0]P,
		input [3:0]G,
		input C_in,
		output [4:1]Ci,
		output Gm,
		output Pm
	);
    assign Ci[1] = G[0] | (P[0] & C_in);
    assign Ci[2] =G[1] | P[1] & Ci[1];
    assign Ci[3] =G[2] | P[2] & Ci[2];
    assign Ci[4] =G[3] | P[3] & Ci[3];
//     assign Ci[1]=G[0]|P[0]&C_in;
//     assign Ci[2]=G[1]|P[1]&G[0]|P[1]&P[0]&C_in;
//     assign Ci[3]=G[2]|P[2]&G[1]|P[2]&P[1]&G[0]|P[2]&P[1]&P[0]&C_in;
//     assign Ci[4]=G[3]|P[3]&G[2]|P[3]&P[2]&G[1]|P[3]&P[2]&P[1]&G[0]|P[3]&P[2]&P[1]&P[0]&C_in;    
    
//     assign Gm=G[3]|P[3]&G[2]|P[3]&P[2]&G[1]|P[3]&P[2]&P[1]&G[0];
//     assign Pm=P[3]&P[2]&P[1]&P[0];
endmodule
全部评论
这是行波进位加法器
1 回复 分享
发布于 2025-03-31 18:28 江苏
投机取巧,Ci的低位会阻塞高位的赋值。
1 回复 分享
发布于 2022-04-25 15:23
Gm和Pm是什么输出呢
点赞 回复 分享
发布于 2023-02-05 13:28 陕西
58到61行
点赞 回复 分享
发布于 2022-08-28 10:21 陕西

相关推荐

程序员小白条:可以,技术栈别写太多,因为学院本这块,没必要太多,项目的话可以提前,技术栈放最下面,要么技术栈放最前面,多准备下八股文
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务