赞
踩
不得不说,老师布置这个任务,让用进位链原语的方式将定点数加法器写出来,有点愚蠢,vivado自带综合软件可以说是优化做的非常不错了,如果非要用原语去写,无非是把人家综合的结果实现一遍。反复读取xilinx的官方文档,仅仅介绍进位链的原语输入以及输出是什么并没有直接写怎么用,无奈,只能按照人家的综合文件对照文档反复摸索。
对于定点数加法器设计来讲,一般采用的是超前进位加法设计。公式如下:
当前位输出 Si=Ai^Bi^Ci(进位)
进位输出C(i+1)=(Ai^Bi)Ci +AiBi
定义两个中间变量 Gi与Pi
Gi=Ai*Bi
Pi=Ai^Bi
我们把Gi叫做产生变量,而Pi叫做传导变量。这两个变量都与进位信号无关,而仅仅与两个输入值有关。
则,可以把当前位输出公式以及进位公式改造为:
Si=Pi^Ci
C(i+1)=Gi+Pi*Ci
则,进位可以描述为:
C1=G0+P0*C0
C2=G1+P1C1=G1+P1G0+P1P0C0
C3=G2+P2C2=G2+P2G1+P2P1G0+P2P1P0C0
。。。。。
对于进位链原语下面写的是一个4位加法,并且有进位输入以及输出的进位链设计:
- module carry_chain4(in_a_4,in_b_4,out_4,cin,cout
-
- );
- input [3:0] in_a_4,in_b_4;
- input cin;
- output [3:0] out_4;
- output cout;
- wire [3:0]S;
- wire [3:0] co;
- assign S[3:0]=in_a_4[3:0]^in_b_4[3:0];
- CARRY4 CARRY4_inst (
- .CO(co), // 4-bit carry out
- .O(out_4[3:0]), // 4-bit carry chain XOR data out
- .CI(cin), // 1-bit carry cascade input
- .CYINIT(1'b0), // 1-bit carry initialization
- .DI(in_a_4[3:0]), // 4-bit carry-MUX data in
- .S(S) // 4-bit carry-MUX select input
- );
- assign cout=co[3];
- endmodule
对于用verilog直接写加号综合出来的电路图,自己可以直接用verilog自己综合实现看一看。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。