微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 采用四级流水线的加法器综合有问题(请教)

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

时间:10-02 整理:3721RD 点击:

如题,写了一段采用四级流水线的加法器,在对比几种设计方法的性能。但用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


有什么问题,RTL 知识帮助你了解设计的大致结构,跟综合后的结果可能差距很大,没有多大参考价值。
还有,如果你使用的altera的FPGA,做个加法器完全没必要这么做,就按照普通那样的写法,性能也会很高,位宽在20bit以内的,跑150m以上没有任何问题,因为ALM内有加法器和高速互联资源
在ASIC设计中,才会涉及到高速加法器的设计


您好,我用的是Xilinx的器件,在对比几种设计方法的性能。不知为什么综合后cout和前面的链接断开了。

改改这种写法吧{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};

改改这种写法吧{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};


改一下试试。


谢谢,成功实现。

你的第二级进位second_co就没有生成


您好,可否讲解一下原理。俗话说售之以鱼,不如售之以渔。


按五楼的写法,可以实现了。正在考虑细节。

你把综合工具想的太智能了,运算前后的位宽不匹配,最高位丢失
你看看netlist就知道了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top