Verilog复杂逻辑设计指南-ALU

Verilog复杂逻辑设计指南-ALU

9a0737214b822690455d732e2d6e6bbf.png
使用Verilog可以方便地实现复杂的设计。现在,设计复杂性增加,设计需要针对低功率、高速和最小面积进行优化~
f8a720160448843a2149c78b94a6c32f.png

ALU设计

算术逻辑单元(ALU)在大多数处理器中用于执行算术和逻辑运算。处理器根据操作代码(opcode)一次执行一个操作。对于8位处理器,ALU用于对两个8位操作数(Operand,操作数是需要对其执行操作的数据)执行操作。同样,对于16位处理器,ALU用于对两个16位数字执行操作。

如图7.1所示,ALU体系结构用于对两个四位数字A(A3为MSB,A0为LSB)、B(B3为MSB,B0为LSB)和进位输入C0执行操作,ALU生成输出F(F3为MSB,F0为LSB)和输出Cout3。在实际的基本设计方案中,设计一位运算器来对单个数据位执行操作。根据S1、S0指定的操作码位执行该操作。如图所示,ALU设计用于执行四条指令。表7.1对ALU和功能进行了说明,这些操作取决于所选线路“S1”和“S0”的状态。在此示例中,操作码为2位,由“S1”和“S0”表示。

2cfc195480d058f3edcefbb0f4f9fb5c.png图7.1四位ALU体系结构表7.1四位ALU真值表
S1S0Operation
00不带进位的A、B的加法
01A,B的减法,无需借位
10A,B的异或
11A的补码

逻辑单元设计

在实际的ASIC/FPGA设计场景中,建议使用有效的Verilog RTL描述设计功能。因此,在微体系结构层面,设计被划分为多个模块。设计的划分为设计师提供了更好的理解和可视性。考虑一个场景来实现8位ALU的设计功能,该设计被为单独的逻辑单元和算术单元。可以通过使用高效的Verilog RTL来描述单独的算术和逻辑单元功能,以获得更好的可读性和更好的综合结果。

图7.2如下所示,用于实现四个逻辑操作,这些逻辑操作在功能表中进行了描述。逻辑单元是执行AND、OR、XOR或补码运算。下表7.2描述了不同的逻辑操作。通过使用一个输入A0和另一个输入逻辑“1”的加法器执行补码运算。

这种设计的问题是由于使用了并行和多路复用逻辑,这种技术效率很低,因为它需要更多的面积和功率,没有有效的实施机制。如果“S1”、“S0”是延迟到达的信号,并且如果在寄存器中使用该块来寄存器路径,则可能存在时序冲突。另一个重要方面是本设计中未使用的资源共享概念。下面示例描述了从输入A0和B0到多路复用器数据输入的数据路径,控制路径是多路复用器“S1”和“S0”的控制线。如图7.2所示,逻辑单元一次执行所有操作,其中一个操作结果的结果为“F0”。

79ca3afed3597b4866c7143db0922bbd.png图7.2单位逻辑单元表7.2单位逻辑单元操作表
S1S0Operation
00A0 与 B0
01A0或B0
10A0,B0的异或
11A0的补码

因此,建议使用“case”构造,通过共享公共资源,为逻辑单元编写有效的Verilog RTL。下一节描述逻辑单元的Verilog RTL,以推断并行逻辑和具有寄存器输入和输出的逻辑。

用于推断并行逻辑的逻辑单元

示例7.1描述了对两个8位二进制输入“a_in”和“b_in”执行操作的功能。使用表7.3中描述的功能执行操作。Verilog RTL使用乘法器编码推断并行逻辑。

如例7.1所述,通过使用带有“case”结构的程序“always”块来描述功能。描述了所有情况条件,在“default”条件期间,逻辑单元生成等于“8”b0000_0000”的输出“result_out”。

逻辑单元的功能可以使用full-case构造进行建模。如例7.2所述,通过使用带有完整“case”结构的程序“always”块来描述功能。所有case条件都使用full-case结构进行描述。

f2ffd007a1e9ac7ca312da7186b3a7ac.png

图7.3所示为使用8位逻辑单元的full-case结构的综合逻辑。如上图所示,它推断出具有多路复用逻辑的逻辑门。在实际场景中,建议使用加法器作为公共资源来实现逻辑和算术单元。

表7.3表8位ALU操作表
操作码1操作码0逻辑运算
00a_in OR b_in
01a_in XOR b_in
10a_in AND b_in
11a_in的补码
04528585949f794ff00e16875cf2dccd.png示例7.2使用full-case构造的8位ALU的Verilog RTL 17c3a4f49257cf390355a39bf0a01a46.png图7.3 8位逻辑单元的综合逻辑

具有寄存器输入和输出的逻辑单元

为了高效和干净的时序分析,建议使用寄存器输入和寄存器输出。如果所有输入都是在时钟的活动边缘上采样的数据,并且所有输出都是在时钟的活动边缘上寄存器和捕获的,那么该设计可以更好地分析寄存器到寄存器的时序路径。寄存器输入和寄存器输出可提供干净的数据路径,这样的输出就是无故障或无危险(glitch or hazard free)。为了提高性能,可以使用流水线来减少数据到达时间。有关定时分析的详细信息,请参阅后面文章。

示例7.3使用寄存器输入和寄存器输出逻辑。在时钟“clk”的正边缘对输入进行采样或捕获。在复位条件“reset_n=0”期间,逻辑单元被初始化为逻辑“0”。

113deda50776576f967ce6c095a54cb7.png示例7.3带寄存器输入和输出的8位逻辑单元的Verilog RTL e281fdcf4224e85ae458a5c615c90fe7.png图7.4具有寄存器输入和输出的综合逻辑单元

上面的示例生成逻辑单元,所有输入和输出都记录在时钟的正边缘。读者需要假设每个寄存器都有一个异步复位输入“reset_n”。综合逻辑如图7.4所示。

算术单元-ALU

算术单元用于执行加法、减法、增量(自增++)和减量(自减--)等算术运算。这些操作在两个不同的操作数上执行。功能表7.4给出了需要执行的不同操作的相关信息。算术单元一次只执行一个操作。图7.5描述了不同输入和输出信号的信号连通框图(示例7.4)。

表7.4算术单元的运算表
操作码操作码1操作码0逻辑运算
000Transfer a_in
001a_in ADD b_in
010a_in ADD b_in with carry input cin_in
011a_in SUB b_in
100a_in SUB b_in与借用输入cin_in
101Increment a_in 自增++
110Decrement b_in 自减--
111未执行任何操作
d20dc48d173c40d7d628b096859861b8.png图7.5ALU单元框图 502b6ed3a91ab2b2604f7f03e0cb60df.png示例7.4算术单元的Verilog RTL 401bfe76bcb0282facd71f4107cfb1e4.png图7.6一位算术单元综合结果

一位算术单元的综合逻辑如图7.6所示。该逻辑使用全加器作为执行加法和减法运算的部件。使用2的补码加法执行减法。综合逻辑还包括多路复用器4:1,根据操作码在全加器的一个输入端传递所需的操作数。

算术和逻辑单元

图7.7说明了ALU及其相关逻辑电路,用于对两个8位数字“a_in”和“b_in”执行操作。对于逻辑运算,将忽略进位输入(cin_in),并根据指令的操作代码生成输出“result_out”。根据操作代码,ALU可以执行算术或逻辑运算。在算术运算期间,若结果大于8位,则进位输出“co_out”设置为逻辑“1”,表示进位传播超出MSB(表7.5)。

表7.6描述了11条指令的ALU设计在输入和输出端所需的位数。该表描述了七条算术指令和四条逻辑指令。引脚或信号说明如表7.5所示。

示例7.5中描述了使用两种不同的“case”结构来推断并行逻辑的有效Verilog RTL描述。对于 “op_code_in[3]=0” 执行算术运算,当op_code_in[3]=1时,它执行逻辑运算。

93133cbf07bf5f05a6e20e085ed0dacc.png图7.7 ALU顶层图表7.5 8位ALU的信号或引脚说明
信号或引脚名称大小(位)描述
a_in88位操作数
b_in88位操作数
cin_in1ALU进位输入端
op_code_in44位操作码
result_out8来自ALU的8位输出
co_out1来自ALU的一位输出进位
表7.6 8位ALU的操作表
操作代码指示描述
0000Transfer a_in在a_in+0+0中生成输出
0001无进位加法a_in+b_in+0
0010带进位的加法a_in+b_in+1
0011无借位减法a_in− b_in
0100借位减法a_in− b_in− 1
0101将a_in增加1a_in+1
0110将a_in减1a_in− 1
1000a_in OR b_ina_in OR b_in
1001a_in XOR with b_ina_in XOR b_in
1010a_in AND with b_ina_in AND b_in
1011Complement a_ina_in补码
0180813b875c6a66b7312d7d8d881b4c.png示例7.5 8位ALU的Verilog RTL ded6640f324e3df0c2e30a740035026b.png图7.8综合的8位ALU

8位ALU的综合图如图7.8所示。如图所示,它由算术运算和逻辑运算的并行逻辑组成。在输出端使用多路复用器生成算术或逻辑运算结果。该逻辑没有使用资源共享和面积、功率优化。

29aaedbd96f55fe2ebf852d91293db3f.png

Verilog时序电路设计指南

b205baddf9ae7bcfaa285bacef53b522.png

Verilog时序逻辑硬件建模设计(五)异步计数器&总结

4ed4a45931bcdda1811b182fd0d21bf2.png

Verilog时序逻辑硬件建模设计(四)移位寄存器

55b2ca214778ee25787d4d15a3f687ba.png

Verilog时序逻辑硬件建模设计(三)同步计数器

6edc31d749664d713f0afe16d1c29d62.png

Verilog时序逻辑硬件建模设计(二)同步和异步复位

cc70178e2ebdf233a491853f5c8c5329.png

Verilog时序逻辑硬件建模设计(一)锁存器D-latch和触发器Flip-Flop

390cb56a38e7f34fcc6386c83973d476.png

Verilog组合逻辑设计指南

974c2f48a21e65e75ceb797fff9d86b7.png

组合逻辑硬件建模设计(二)算术电路

e49a4fd7b105cdce66516435fcbaf1d7.png

Verilog 里面,always,assign和always@(*)区别

903026729796d9b83e2ffa240ddc5d7b.png

组合逻辑硬件建模设计(一)逻辑门

c47b36ba9124a33ac10f674730b54fc8.png

数字硬件建模-重新从另一方面理解Verilog(二)

48b9f94d0b5ab32692ccce9de278b099.png

数字硬件建模-从另一方面理解Verilog(一)

60d417428be5d40fec60a942dcf0096e.png

数字硬件建模综述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OpenFPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值