Chinaunix首页 | 论坛 | 博客
  • 博客访问: 252241
  • 博文数量: 65
  • 博客积分: 2525
  • 博客等级: 少校
  • 技术积分: 740
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-01 23:46
文章分类
文章存档

2010年(13)

2009年(52)

我的朋友

分类:

2009-04-17 12:20:49

module fulladd4 ( a, b, ci, s, co);
input[3:0] a;

input[3:0] b;
input ci;
output[3:0] s;
output co;

wire[3:0] p;
wire[3:0] g;
wire[2:0] c;

wire mg,mp;

assign p[0] = a[0] ^ b[0];
assign p[1] = a[1] ^ b[1];
assign p[2] = a[2] ^ b[2];
assign p[3] = a[3] ^ b[3];

assign g[0] = a[0] & b[0];
assign g[1] = a[1] & b[1];
assign g[2] = a[2] & b[2];
assign g[3] = a[3] & b[3];

assign c[0] = (p[0] & ci) | g[0];
assign c[1] = (p[1] & c[0]) | g[1];
assign c[2] = (p[2] & c[1]) | g[2];

assign mp = p[3] & p[2] & p[1] & p[0];
assign mg = g[3] | (p[3] & (g[2] | p[2] & (g[1] | p[1] & g[0])));

assign co = (mp & ci) |mg;

assign s[0] = p[0] ^ ci;
assign s[1] = p[1] ^ c[0];
assign s[2] = p[2] ^ c[1];
assign s[3] = p[3] ^ c[2];

endmodule

现在来解释每个元素的含义:
p(pass):进位传递信号,表示上一级的信号是否要传递到下一级,eg.如果a[0],b[0]分别为0,1或1,0,那么p[0] = 1,就是表示上一级的进位需要传递到下一级,都为0肯定不会进位,全为1呢?那再看看g的含义就明白了。

g(generate):进位生成信号,如果为1代表一定会有进位信号到下一级,固当a[0],b[0]全为1时,这个信号也为1,肯定会进位的,那么p就不重要了,所以g的优先级大于p。

mp:模块进位传递信号,这个很容易理解表达式含义,当整个模块中每一位进位都传递的时候那么就代表整个模块进位传递。

mg:模块是否生成进位信号,g[3] | (p[3] & (g[2] | p[2] & (g[1] | p[1] & g[0])))这是个迭代递推表达式,当g[3](最高位)一定进位时,那么必然进位,否则如果p[3]=1,那么再看前一级是否有进位信号,如果没有再递推下去。

co表达式的推出也很容易看出了,呵呵,co就是另外一个版本的c[3]啊,加个mp,mg可以让你把原理理解深刻点。

附加几点说明:

1.p的表达式为什么用^而不用|,如果光看进位的话,用^效果是一样的,而且更快。这里主要是为了s的运算,如果用|,那s... ...

2.超前进位加法的特点是进位的运算,在数值结果的运算方面感觉没有什么特别。它可以在不知道进位的前提下把该做的工作都做好,进位一来,很快结果就出来了,但如果多个模块级联起来,每个模块不产生进位而都传递进位,想要得到正确的运算结果还是要等待进位的逐个模块传递的。

3.在FPGA中做这个结构我不知道会不会得到好结果,估计还不如直接的+号来的快,FPGA中的“+”估计自动给你调用系统加法器,而这样画蛇添足,估计... ...
 

 
阅读(5967) | 评论(0) | 转发(0) |
0

上一篇:linux查看登陆用户w

下一篇:JavaScript目录树

给主人留下些什么吧!~~