在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4786|回复: 10

[求助] 采用四级流水线的加法器综合有问题(请教)

[复制链接]
发表于 2012-3-12 22:27:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 苍穹的眼泪 于 2012-3-13 09:18 编辑

如题,写了一段采用四级流水线的加法器,在对比几种设计方法的性能。但用Symply pro综合后RTL图有问题。不知为什么综合后cout和前面的链接断开了。特此请教。谢谢。
源码如下:
//////////////////////////////////////////////////////////////////////////////////
// Company:  -------
// Engineer:   -------
//
// Create Date:    17:29:02 03/12/2012
// Design Name:    流水线技术在加法器上的应用
// Module Name:    adder_pipe4
// Project Name:   四级流水加法器
// Target Devices: XC3S500E-4PQ208
// Tool versions:  ISE12.4
// Description:
//////////////////////////////////////////////////////////////////////////////////
module adder_pipe4(cout, sum, ina, inb, cin, clk);
    //定义输入、输出变量
    input [7:0] ina, inb;
    input cin, clk;
    output reg [7:0] sum;
    output reg cout;
   
    //定义中间变量
    reg [7:0] tmp_a, tmp_b;
    reg tmp_ci, first_co, second_co, third_co;
    reg [1:0] first_sum, third_a, third_b;
    reg [3:0] second_a, second_b, second_sum;
    reg [5:0] first_a, first_b,third_sum;
   
    //输入数据缓存
    always @ (posedge clk)
        begin
            tmp_a = ina;
            tmp_b = inb;
            tmp_ci = cin;
        end
   
    //第一级流水
    always @ (posedge clk)
        begin
            //第一级加(低两位)
            {first_co, first_sum} = tmp_a[1:0] + tmp_b[1:0] + tmp_ci;
            //未参加计算的数据缓存
            first_a = tmp_a[7:2];
            first_b = tmp_b[7:2];            
        end
        
    //第二级流水
    always @ (posedge clk)
        begin
            //第二级加(第2,3位)
            {second_co, second_sum} = {first_a[1:0] + first_b[1:0] + first_co, first_sum};
            //数据缓存
            second_a = first_a[5:2];
            second_b = first_b[5:2];
        end
        
    //第三级流水
    always @ (posedge clk)
        begin
            //第三级加(第4,5位)
            {third_co, third_sum} = {second_a[1:0] + second_b[1:0] + second_co,second_sum};
            //数据缓存
            third_a = second_a[3:2];
            third_b = second_b[3:2];
        end
        
    //第四级流水
    always @ (posedge clk)
        begin
            //第四级加(第7,8位)
            {cout, sum} = {third_a[1:0] + third_b[1:0] + third_co, third_sum};
        end
endmodule

Symplify pro综合后的RTL图

Symplify pro综合后的RTL图
发表于 2012-3-13 07:12:21 | 显示全部楼层
有什么问题,RTL 知识帮助你了解设计的大致结构,跟综合后的结果可能差距很大,没有多大参考价值。
还有,如果你使用的altera的FPGA,做个加法器完全没必要这么做,就按照普通那样的写法,性能也会很高,位宽在20bit以内的,跑150m以上没有任何问题,因为ALM内有加法器和高速互联资源
在ASIC设计中,才会涉及到高速加法器的设计
 楼主| 发表于 2012-3-13 09:17:27 | 显示全部楼层
回复 2# fuyaolong
您好,我用的是Xilinx的器件,在对比几种设计方法的性能。不知为什么综合后cout和前面的链接断开了。
发表于 2012-3-13 18:49:21 | 显示全部楼层
改改这种写法吧{second_co, second_sum} = {first_a[1:0] + first_b[1:0] + first_co, first_sum};
先用3bit wire 代替 wire [2:0] wire_tmp3 = first_a[1:0] + first_b[1:0] + first_co;
然后{second_co, second_sum} = {wire_tmp3, first_sum};
发表于 2012-3-13 18:50:32 | 显示全部楼层
改改这种写法吧{second_co, second_sum} = {first_a[1:0] + first_b[1:0] + first_co, first_sum};
先用3bit wire 代替 wire [2:0] wire_tmp3 = first_a[1:0] + first_b[1:0] + first_co;
然后{second_co, second_sum} = {wire_tmp3, first_sum};
 楼主| 发表于 2012-3-13 20:40:17 | 显示全部楼层
回复 5# iyama
改一下试试。
 楼主| 发表于 2012-3-13 20:51:53 | 显示全部楼层
回复 5# iyama
谢谢,成功实现。
发表于 2012-3-13 21:00:25 | 显示全部楼层
你的第二级进位second_co就没有生成
 楼主| 发表于 2012-3-13 21:07:59 | 显示全部楼层
回复 5# iyama
您好,可否讲解一下原理。俗话说售之以鱼,不如售之以渔。
 楼主| 发表于 2012-3-13 21:09:33 | 显示全部楼层
回复 8# haibo2806
按五楼的写法,可以实现了。正在考虑细节。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-23 06:49 , Processed in 0.022234 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表