加法和减法等算术运算在处理器逻辑的设计中起着重要作用。任何处理器的算术逻辑单元(ALU)都可以设计为执行加法、减法、增量、减量运算。算法设计由RTL Verilog代码描述,以实现最佳区域和较少关键路径。本节用等效的Verilog RTL描述描述执行算术运算的重要逻辑块。
单比特加法器Adder
加法器用于执行两个二进制数的二进制加法。同时用于有符号或无符号加法运算。
单比特半加法器
半加法器有两个一位输入“a_in”,“b_in”,并生成两个一位输出“sum_out”,“ carry_out”其中,“sum_out”是求和或加法输出,“carry_out进位输出”是进位输出。表2.9是半加法器的真值表,示例2.90中描述了RTL。
表2.9半加法器真值表
示例2.9半加法器的可综合RTL代码
注:半加法器用作执行加法的基本元件。全加器逻辑电路是以半加器为例设计的
图2.9综合后半加法器
综合后半加法器如图2.9所示,半加法器的输入端口命名为“a_in”,“b_in”,输出为“sum_out”,“ carry_out”
单比特全加器
全加器用于对三个一位二进制输入执行加法。一比特(one-bit)二进制数,被命名为“a_in”、“b_in”、“c_in”和一比特(one-bit)二进制输出,称为“sum_out”、“ carry_out”。表2.10是全加器的真值表,RTL在示例2.10中描述。
表2.10全加器真值表
示例2.10全加器的可综合Verilog代码。注:全加器消耗更多面积,因此强烈建议使用多路复用器实现加法器逻辑 综合后全加器如图2.10所示,全加器的输入端口命名为‘a_in’、‘b_in’、‘c_in’,输出为‘sum_out’、‘ carry_out’
图2.10综合后全加器
单比特减法器Subtractor
减法器用于执行两个二进制数的二进制减法。本节介绍半减法器和全减法器。
单比特半减法器
半减法器有两个一位(one-bit)输入‘a’,’b’,并产生两个一位(one-bit)输出“d”,‘bor’。其中“d”是减法器输出,“bor”是借位输出(borrow output)。表2.11是半减法器的真值表,示例2.11中描述了可综合RTL。
综合后半减法器如图2.11所示,半加法器的输入端口命名为‘a’、‘b’,输出端口命名为‘d’、‘bor’
表2.11半减法器真值表
示例2.11半减法器的可综合Verilog代码。注:半减法器是用作执行二进制减法的基本部件。全减法器逻辑电路的设计是使用半减法器作为组件的实例化。
图2.11综合后半减法器
单比特 全减法器
全减法器用于执行三个一位(one-bit)二进制输入的减法。一位(one-bit)输入数字命名为‘a,’ ‘b,’ ‘c’和一位(one-bit)二进制输出,命名为‘d,’ ‘bor.’。表2.12是全减法器的真值表说明,RTL在示例2.12和图2.12中描述。
表2.12全减法器真值表
示例2.12全减法器的可综合Verilog代码。注:建议使用全加器执行减法运算。减法是使用二的补码加法进行的
图2.12综合后全减法器
综合后全减法器如图2.12所示。全减法器的输入端口命名为‘a’、‘b’、‘c’,输出端口命名为‘d’、‘bor’
多位加法器和减法器Multi-bit Adders and Subtractors
多位加法器和减法器用于处理器算术单元的设计。逻辑密度取决于加法器或减法器的输入位数。
四位全加器
许多实际设计使用多位加法器和减法器。使用基本元件作为全加器执行加法运算是经过工业实践验证的最佳方式。例如,如果设计人员需要实现四位加法器的设计逻辑,则需要四个全加器。如示例2.13所示,对两个四位二进制数“A”、“B”执行加法。最终结果是四位加法,并在“S”处输出。进位输入为Ci,进位输出为Co。
综合后的四位加法器如图2.13所示,四位加法器的输入端口命名为“A”、“B”、“Ci”,输出端口命名为“S”、“Co”
示例2.13四位加法器的可综合Verilog代码。注:四位加法运算使用四个全加器。根据有符号或无符号添加要求,可以修改Verilog代码
图2.13综合后四位加法器
四位加法器和减法器
加法和减法的设计都是用加法器来完成。减法可以使用二的补码加法来执行。例如,表2.13中所示的场景。
综合的四位加法器/减法器如图2.14所示,示例2.14中四位加法器/减法器的输入端口命名为“A”、“B”、“Ci”,输出端口命名为“S”,“ Co”。当控制输入SUB等于逻辑“0”时,它将执行加法,对于控制输入SUB等于逻辑“1”,它将执行减法,即2的补码加法。
表2.13加法器-减法器操作表
示例2.14四位加法器和减法器的可综合Verilog代码。注意考虑子控制,输入Ci和S4作为合成逻辑中的CO。这里,使用的资源是二进制全加器来执行加法和减法。减法运算仅使用加法器执行。资源共享和资源利用将在后面讨论
图2.14综合后四位加法器/减法器
比较器和奇偶校验检测器
在大多数实际场景中:比较器用于比较两个二进制数的相等性。奇偶校验器用于计算给定二进制数的奇偶校验。对设计工程师来说,更好地理解这一点变得非常重要。
二进制比较器
二进制比较器用于比较两个二进制数。如前所述,Verilog支持四值逻辑,它们是逻辑“0”、逻辑“1”、未知 “x”和高阻抗“z”。Verilog支持逻辑等式运算符(==)和不等式运算符(!=),用于描述两个数字的比较。这些运算符都是可综合的。
表2.14比较运算操作表
例如,如表所示;当A、B相等时,则输出“Y”被分配给“A”、“B”的异或,对于不相等的情况,输出“Y”被分配给“A”、“B”的与操作(示例2.15)。
综合后的等效表示如图2.15所示(示例2.15)。
示例2.15 1位(one-bit)比较器的可综合Verilog代码。注:可综合RTL代码中使用逻辑等式和不等式运算符,对于任何操作数为“x”或“z”时,比较结果为false
图2.15综合后的等效比较器
奇偶校验检测器
奇偶校验检测器用于检测二进制数字字符串的奇偶个数。对于偶数个1,输出为逻辑“0”,对于奇数个1,输出为逻辑“1”,则RTL Verilog可以如示例2.16所示进行描述。
示例2.16奇偶校验检测器的可综合Verilog代码。注:奇偶校验检测器多用于DSP应用和加密引擎的集成模块
表2.15奇偶校验检测器操作表
| 条件 | 描述 | | :--------- | :--: | | 奇校验1 | 将输出分配为逻辑1| | 偶校验1| 将输出分配为逻辑0|
图2.16综合后奇偶校验检测器
奇偶校验检测器的操作表如下表2.15所示。对于奇数1的输出为逻辑“1”,对于偶数1的输出为逻辑“0”。综合后表示如图2.16所示。
代码转换器
本节介绍设计中常用的代码转换器。正如名称本身所示,代码转换器用于将代码从一个数字系统转换为另一个数字系统。在实际场景中,可用于二进制到格雷码(binary to gray)和格雷码到二进制转换器(gray to binary)。
二进制到格雷码转换器
二进制数系统的基数是2,对于任何多位二进制数,不稳定变化可能是一次一位或者多位。但是在格雷码中,一次只改变一位。
例2.17中描述了四位二进制到格雷码转换的RTL描述。
示例2.17四位二进制到格雷码转换器的可综合Verilog代码。注:格雷码用于多时钟域设计,以将控制信息从一个时钟域传输到另一个时钟域
图2.17综合后四位二进制到灰度转换器
综合后表示如图2.17所示。
格雷码到二进制代码转换器
Gray-to-binary代码转换器与binary-to-Gray的RTL描述相反,例2.18中描述的四位Gray-to-binary代码转换。综合后表示如图2.18所示。
示例2.18四位格雷码到二进制代码转换器的可综合Verilog代码。注:格雷码用于格雷码计数器实现,也常用于纠错机制
图2.18综合后四位格雷码到二进制转换器
阶段性总结
如前面所述;以下是实现组合逻辑RTL时需要考虑的要点。
- 通过共享算术资源使使用面积最小。
- 使用灵敏度列表中的所有所需信号,以避免仿真和综合不匹配。
- 避免使用三态逻辑,并使用具有适当使能电路的多路复用器实现所需的逻辑。
- Verilog支持四值逻辑,它们是逻辑“0”、逻辑“1”、未知“x”、高阻抗“z”
- 在设计中减少加法器的使用。加法器可以使用多路复用器实现。
- NAND和NOR是通用逻辑门,可用于实现任何组合逻辑或顺序逻辑。
原文:OpenFPGA
作者:碎碎思
相关文章推荐
更多FPGA技术干货请关注FPGA 的逻辑技术专栏。