原创 [博客大赛]小程序大道理---加法器(续)

2014-3-29 11:37 1442 9 15 分类: FPGA/CPLD 文集: FPGA

位宽比较大的加法器,直接相加,肯定不是一个明智的做法。流水线加法器

还是42bit加法器

module top(clk,rst_n,data1,data2,data3);
input [41:0] data1;
input [41:0]data2;
input clk,rst_n;
output reg [42:0] data3;

reg [41:0] a,b;
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin a<=42'd0;b<=42'd0; end
else begin a<=data1;b<=data2; end


wire c1,c2,c3;
wire [14:0] out1,out2,out3;

// 一级流水
add U1(
    .cin(1'b0),
    .clock(clk),
    .dataa(a[14:0]),
    .datab(b[14:0]),
    .cout(c1),
    .result(out1));

// 二级流水
   
    add U2(
    .cin(c1),
    .clock(clk),
    .dataa(a[29:15]),
    .datab(b[29:15]),
    .cout(c2),
    .result(out2));


  // 三级流水 
   add U3(
    .cin(c2),
    .clock(clk),
    .dataa(a[41:30]),
    .datab(b[41:30]),
    .cout(c3),
    .result(out3));
   
    always@(posedge clk or negedge rst_n)
    if(!rst_n)
    begin data3<=33'd0; end
    else data3<={out3[12:0],out2,out1} ;


endmodule

RTL视图

20140311163742979.jpg

每一级加法器内部都有寄存器输出,用Technology Map Viewer 看U1,如下(部分)

20140311164858202.jpg

不会出现b[0]到data[41]那样,经过40多个组合逻辑LUT全加器,每一级流水是15bit全加器,所以,最大的路径延时,是从U1的进位端 c1(pipeline_diffe[15]) 到 U2的进位端 c2(pipeline_diffe[15]) ,或者从b[0]到 out1[14](pipeline_diffe[14]) 等等,总之最多经过15个全加器组合逻辑 !

但是,上边的流水线形式,结果不能一个时钟周期输出,3级流水线,需要3个时钟输出结果!

最大Fmax

20140311164304630.jpg

把上边的流水线程序改动一下,输入数据缓存几个节拍,可以实现1个时钟输出一个结果

module top(clk,rst_n,data1,data2,data3);
input clk,rst_n;
input [41:0] data1;
input [41:0]data2;
output reg [42:0] data3;

// 第一拍 作为第一级流水数据源
reg [41:0] a,b;
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin a<=42'd0;b<=42'd0; end
else begin a<=data1;b<=data2; end
// 第二拍 作为第二级流水数据源
reg [41:0] a2,b2;
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin a2<=42'd0;b2<=42'd0; end
else begin a2<=a;b2<=b; end
// 第三拍 作为第三级流水数据源
reg [41:0] a3,b3;
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin a3<=42'd0;b3<=42'd0; end
else begin a3<=a2;b3<=b2; end


wire c1,c2,c3;
wire [14:0] out1,out2,out3;
// 第一级流水,低15位相加
    add U1(
    .cin(1'b0),
    .clock(clk),
    .dataa(a[14:0]),
    .datab(b[14:0]),
    .cout(c1),
    .result(out1));
// 第二级流水,中15位和低15位的进位 相加   
    add U2(
    .cin(c1),
    .clock(clk),
    .dataa(a2[29:15]),
    .datab(b2[29:15]),
    .cout(c2),
    .result(out2));
// 第三级流水,高15位和中15位的进位 相加   
    add U3(
    .cin(c2),
    .clock(clk),
    .dataa(a3[41:30]),
    .datab(b3[41:30]),
    .cout(c3),
    .result(out3));
   
    always@(posedge clk or negedge rst_n)
    if(!rst_n)
    begin data3<=33'd0; end
    else data3<={out3[12:0],out2,out1} ;



endmodule

 

还有没有其他的方法???加菲在《玩转 IP core》讲座中提到了一种“先运算再选择”的方法,第一步算出所有可能的运算结果,即预先算出进位是“0”和“1”的结果;第二步根据进位进行选择,得到最终结果。这样相对于,原来的逐次进位的,信号的建立时间可以减少。但是,系统单元的面积也会急剧增加。

11.jpg
也的确是一种方法 !
 

 

话说,上篇博客开篇 提到的问题还没解决 ,下篇续。。。。。

文章评论6条评论)

登录后参与讨论

pengchengcheng082_593158939 2014-7-28 22:04

quartus自带的

用户230340 2014-7-14 11:21

ednchina的博客真难看啊,右边空白那么大,博文的界面却这么小... 博主,我想问那个时钟的图是哪来的...

pengchengcheng082_593158939 2014-5-27 08:15

9.1版本,这个也就是大概分析一下,最简单的分析方式,不用timequest

用户1737382 2014-5-26 16:04

是Quartus什么版本的?我现在用的是10.0版本的,我就知道TimeQuest里面可以分析Fmax,而且里面分析出来的Fmax不会分析这么整,恰好是250Mhz。。。

pengchengcheng082_593158939 2014-5-7 20:01

Quartus 有这个工具

用户1737382 2014-5-7 09:26

请问你文中分析得到的Fmax是怎么出来的?
相关推荐阅读
pengchengcheng082_593158939 2015-08-21 16:26
Linux 下 的 vi 编辑器
一、按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi :q 不保存文件,退出vi :wq 保存文件并退出vi :q! 不保存文件,强制退出vi :w! 强制保存,不推出...
pengchengcheng082_593158939 2015-07-28 15:57
面向对象和面向过程区别
转自 http://blog.sina.com.cn/s/blog_4dd5955301000a2m.html     面向对象和面向过程的区别,实在是难用一两句话说明白。   ...
pengchengcheng082_593158939 2015-05-23 10:39
后仿真能否被形式验证(Formal Verification)和静态时序分析(Static Timing Analysis)所取代
转自 http://www.cnblogs.com/jyaray/archive/2011/04/26/2029856.html 验证的主要目的:就是检查时间模型是否满足时间要求,是否实现了时...
pengchengcheng082_593158939 2015-05-19 11:18
两种代码方式
下面的两段程序等价,RTL图以及综合后的结果 完全一样。看似简单,其实是两种不同的思维方式。在复杂电路中能体现出两种方式各自的特点,第一种容易理解,第二种则结构更清晰,更接近综合后的结果。以前习惯用上...
pengchengcheng082_593158939 2015-05-14 16:28
Linux 下 的 cc 和 gcc
转自 http://www.cnblogs.com/zhouyinhui/archive/2010/02/01/1661078.html   在Linux下一会看到cc,另一会又看到gcc...
pengchengcheng082_593158939 2015-05-13 17:19
mips 编译器
1、linux 系统下编程的编译器 GNU toolchain(GNU工具链)是一个包含了由GNU项目所产生的各种编程工具的集合。这些工具形成了一条工具链,用于开发应用程序和操作系统。  ...
我要评论
6
9
关闭 站长推荐上一条 /2 下一条