集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 7000|回复: 17

16位超前进位加法器

[复制链接]
CHA 发表于 2010-6-27 23:35:07 | 显示全部楼层 |阅读模式
module cla16 (a,b,s);//top module 含有四个4 位超前进位加法器子模块
input [15:0] a, b;
output [15:0] s;

wire pp4,pp3,pp2,pp1;
wire gg4,gg3,gg2,gg1;
wire [14:0] Cp;

wire [15:0] p,g;


claslice i1 (p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],1'b0,Cp[2],Cp[1],Cp[0],pp1,gg1);
claslice i2 (p[7],p[6],p[5],p[4],g[7],g[6],g[5],g[4],Cp[3],Cp[6],Cp[5],Cp[4],pp2,gg2);
claslice i3 (p[11],p[10],p[9],p[8],g[11],g[10],g[9],g[8],Cp[7],Cp[10],Cp[9],Cp[8],pp3,gg3);
claslice i4 (p[15],p[14],p[13],p[12],g[15],g[14],g[13],g[12],Cp[11],Cp[14],Cp[13],Cp[12],pp4,gg4);
claslice i5 (pp4,pp3,pp2,pp1,gg4,gg3,gg2,gg1,1'b0,Cp[11],Cp[7],Cp[3],pp5,gg5);

pg i0(a[15:0],b[15:0],p[15:0],g[15:0]);

assign s[0]=p[0]^1'b0;
assign s[1]=p[1]^Cp[0];
assign s[2]=p[2]^Cp[1];
assign s[3]=p[3]^Cp[2];
assign s[4]=p[4]^Cp[3];
assign s[5]=p[5]^Cp[4];
assign s[6]=p[6]^Cp[5];
assign s[7]=p[7]^Cp[6];
assign s[8]=p[8]^Cp[7];
assign s[9]=p[9]^Cp[8];
assign s[10]=p[10]^Cp[9];
assign s[11]=p[11]^Cp[10];
assign s[12]=p[12]^Cp[11];
assign s[13]=p[13]^Cp[12];
assign s[14]=p[14]^Cp[13];
assign s[15]=p[15]^Cp[14];

endmodule

module claslice(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],Co,Cp[2],Cp[1],Cp[0],pp,gg);//4位超前进位加法器模块

input [3:0] p, g;
input Co;
output [2:0] Cp;
output pp,gg;
assign Cp[0]=g[0]|p[0]&Co;
assign Cp[1]=g[1]|p[1]&Cp[0];
assign Cp[2]=g[2]|p[2]&Cp[1];
assign pp=p[3]&p[2]&p[1]&p[0];
assign gg=g[3]|(p[3]&(g[2]|p[2]&(g[1]|p[1]&g[0])));
endmodule

module pg(a,b,p,g);//进位产生信号、进位传递信号 产生模块
input [15:0] a, b;
output [15:0] p,g;
assign p=a^b;
assign g=a&b;
endmodule
ATA 发表于 2010-6-28 00:48:03 | 显示全部楼层
谢谢楼主!!呵呵
ATA 发表于 2010-6-28 02:45:35 | 显示全部楼层
楼主应该把LA的原理讲讲清楚呀,恭喜楼主做出来,呵呵。<br>
pass位=a^b;意思是会不会传递一个进位,如果a与b异或等于1,那么ab=10或者10,这时,由下向上的进位将会被传递。如果为0,也就是ab=00或者11,这时,由下向上的进位将会被忽略,产生进位与否只在于generate信号。<br>
generate位=a&amp;b;意思是是否产生一个进位,如果ab=11,那么就一定会产生一个进位。<br>
有了这两个信号,就有了LA的核心想法。
ups 发表于 2010-6-28 02:50:58 | 显示全部楼层
module claslice(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],Co,Cp[2],Cp[1],Cp[0],pp,gg);&nbsp;&nbsp;//4位超前进位加法器模块<br>
<br>
input [3:0] p, g;<br>
input Co;<br>
output [2:0] Cp;<br>
output pp,gg;<br>
assign Cp[0]=g[0]|p[0]&amp;Co;<br>
assign Cp[1]=g[1]|p[1]&amp;Cp[0];<br>
assign Cp[2]=g[2]|p[2]&amp;Cp[1];<br>
assign pp=p[3]&amp;p[2]&amp;p[1]&amp;p[0];<br>
assign gg=g[3]|(p[3]&amp;(g[2]|p[2]&amp;(g[1]|p[1]&amp;g[0])));<br>
endmodule<br>
<br>
请问楼主一下,你的这个仿真结果是正确的吗? 我仿真了一下怎么有的结果是不对的亚?<br>
请问一下哪里体现了超前进位呀? 这样不还是第二位用到第一位的进位,第三位用到第二位的进位,仍然会产生延时,不是很懂,提的问题如果不对,请原谅。<br>
也期望其他人给与回答 ,谢谢!!!
usb 发表于 2010-6-28 04:03:26 | 显示全部楼层
先看一下&nbsp;&nbsp;!
inter 发表于 2010-6-28 05:37:44 | 显示全部楼层
看看,不错!!!
interige 发表于 2010-6-28 05:50:28 | 显示全部楼层
原帖由 anni 于 2006-6-27 11:19 发表<br>
module claslice(p,p,p,p,g,g,g,g,Co,Cp,Cp,Cp,pp,gg);&nbsp;&nbsp;//4位超前进位加法器模块<br>
<br>
input&nbsp;&nbsp;p, g;<br>
input Co;<br>
output&nbsp;&nbsp;Cp;<br>
output pp,gg;<br>
assign Cp=g|p&amp;Co;<br>
assign Cp=g|p&amp;Cp;<br>
assign Cp=g|p&amp; ... 不好意思 ,楼主的程序仿真结果是正确的 ,是我理解错了。
ATA 发表于 2010-6-28 07:45:42 | 显示全部楼层
向各位大侠学会了不少东西啊!多谢.如能进一不注释就更好了.
usb 发表于 2010-6-28 09:13:06 | 显示全部楼层
可不可以用VHDL 写吖!!多谢楼主~
longtim 发表于 2010-6-28 09:40:51 | 显示全部楼层
正在学习,感觉是个好的例子!!!
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-4-19 23:59 , Processed in 0.062843 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表