<Verilog实现加法器>半加器和全加器———持续更新版

一,内容介绍

加法器是数字电路中的最基础电路之一,也是CPU的核心功能之一。
在这个专栏,我会把所有我知道的数字电路的加法器相关模型都实现一遍并解释其原理。
编程使用的语言为Verilog,代码风格为强迫症系列风格。

加法器系列链接:
上一篇 数字电路基础知识
目前:半加器和全加器
下一篇 四位行波加法器设计

二,半加器

根据第一篇知识我们可以知道,数字电路中的异或和二进制加法的计算结果完全一致,因此,我们可以设计最简单的加法器结构:半加器。
所谓半加器,即不产生进位的加法器,是数字电路中的最基础计算单元。

module HALF_ADDER (
input a_i, b_i, 
output wire c_o
);

assign c_o = a_i ^ b_i;

endmodule

三,全加器

全加器即产生进位的加法器,输出有两位。加法器什么时候会有进位呢?显然,当加法器的三个输入有两个为1的时候,加法产生进位,由此,我们可以进一步将半加器完善为全加器。

module FULL_ADDER (
input a_i, b_i, c_i,
output wire [1:0] c_o
);

assign c_o[0] = a_i ^ b_i ^ c_i;
assign c_o[1] = (a_i && b_i) || (a_i && c_i) || (b_i && c_i);

endmodule

四、使用与或非门和异或门搭建半加器和全加器

在工作中,我们往往使用Verilog和SystemVerilog来设计我们的模块,具体的网表和电路交由综合器和编译器进行编译设计,给出具体的电路图。在工作中,我们却并不能完完全全靠综合器来自己生成电路,因为芯片的设计的完备性主要依靠人来保证,验证和工具检查终究只能为人的想法服务。所谓心中有电路,设计不迷糊。因此,我在这里附上如何使用与或非门搭建半加器和全加器。

与门:
and #0.7 u_0 ( .a(), .b(), .c());  
或门:
or #0.9 u_1 ( .a(), .b(), .c()); 
非门:
not #0.2 u_3 ( .a(), .c()); 
//与或非门的延时我随便举例的,单位为ps
异或门:
xor #1.8 u_3 ( .a(), .b(), .c()); 
//异或门的延时为一组与或非串联的延时,原因详见本系列第一篇文章:
//a ^ b = (a && ~b) || (~a && b) ;
//注:为保证电路可靠性,台积电TMIC和中芯国际SMIC最多可以实现四扇入与或非门
//此时有人问了,可以更多吗?
//当然可以,但是那种电路都是特殊定制电路,要加钱。(苹果就经常加钱做芯片,钞能力真好)

module HA (
input a_i, b_i,
output wire c_o
);

xor #1.8 u_0 ( .c(c_o), .a(a_i), .b(b_i)); 
endmodule

module FA (
input a_i, b_i, c_i,
output wire [1:0] c_o
);

wire ab,bc,ac;

xor #1.8 u_0 ( .d(c_o[0]), .a(a_i), .b(b_i), .c(c_i)); 
and #0.7 u_1 ( .c(ab), .a(a_i), .b(b_i)); 
and #0.7 u_2 ( .c(bc), .a(b_i), .b(c_i)); 
and #0.7 u_3 ( .c(ac), .a(a_i), .b(c_i)); 
or  #0.9 u_4 ( .d(c_o[1]), .a(ab), .b(bc), .c(ac)); 
endmodule

这一篇,我们设计了半加器和全加器,
下一篇,我们进行 四位行波加法器的设计.

你可能感兴趣的:(Verilog,小IP设计__持续更新版,verilog)