原创 流水线加法器设计(Verilog)

2009-2-13 21:50 10158 7 13 分类: FPGA/CPLD

流水线加法器设计(Verilog<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


流水线4(4bit)加法器


代码如下:


 


`timescale 1ns / 1ps


 


module pipeline_add(a,b,cin,cout,sum,clk);


 


input[3:0] a,b;


input clk,cin;


output[3:0]sum;


output cout;


 


reg[3:0] tempa,tempb;


reg tempci;


 


reg cout;


reg firstco;


reg[1:0] firstsum;


reg[2:0] firsta,firstb;              //空出fista[2]firstn[2]放进位


reg[3:0] sum;


 


always@(posedge clk)


   begin


      tempa=a;                 //输入数据缓存


      tempb=b;


      tempci=cin;


   end


 


always@(posedge clk)


   begin


      {firstco,firstsum}=tempa[1:0]+tempb[1:0]+tempci;   //第一级加(低2位)


       firsta=tempa[3:2];                   //未参加计算的数据缓存


       firstb=tempb[3:2];


   end


 


always@(posedge clk)


   begin


      {cout,sum}={firsta[2:0]+firstb[2:0]+firstco,firstsum};  //第二级加(高2位)


   end


 


endmodule


 


顶层测试模块代码


`timescale 1ns/1ps


 


module pipeline_add_test;


    reg [3:0] a = 4'b0000;


    reg [3:0] b = 4'b0000;


    reg cin = 1'b0;


    wire cout;


    wire [3:0] sum;


    reg clk = 1'b0;


 


    parameter PERIOD = 200;


    parameter real DUTY_CYCLE = 0.5;


    parameter OFFSET = 100;


 


    initial    // Clock process for clk


    begin


        #OFFSET;


        forever


        begin


            clk = 1'b0;


            #(PERIOD-(PERIOD*DUTY_CYCLE)) clk = 1'b1;


            #(PERIOD*DUTY_CYCLE);


        end


    end


 


    pipeline_add UUT (


        .a(a),


        .b(b),


        .cin(cin),


        .cout(cout),


        .sum(sum),


        .clk(clk));


 


    initial begin


        // -------------  Current Time:  100ns


        #100;


        cin = 1'b1;


        // -------------------------------------


        // -------------  Current Time:  185ns


        #85;


        a = 4'b0010;


        b = 4'b0011;


        // -------------------------------------


        // -------------  Current Time:  385ns


        #200;


        a = 4'b0100;


        b = 4'b0010;


        // -------------------------------------


        // -------------  Current Time:  585ns


        #200;


        cin = 1'b0;


        a = 4'b1010;


        b = 4'b0011;


        // -------------------------------------


        // -------------  Current Time:  785ns


        #200;


        a = 4'b1011;


        b = 4'b1010;


        // -------------------------------------


        // -------------  Current Time:  985ns


        #200;


        a = 4'b1111;


        b = 4'b1110;


        // -------------------------------------


        // -------------  Current Time:  1185ns


        #200;


        a = 4'b1101;


        b = 4'b0100;


        // -------------------------------------


        // -------------  Current Time:  1585ns


        #400;


        a = 4'b0011;


        // -------------------------------------


        // -------------  Current Time:  1785ns


        #200;


        b = 4'b1101;


        // -------------------------------------


        // -------------  Current Time:  1985ns


        #200;


        cin = 1'b1;


        a = 4'b0101;


        b = 4'b1111;


        // -------------------------------------


        // -------------  Current Time:  2385ns


        #400;


        a = 4'b0100;


        b = 4'b1101;


        // -------------------------------------


    end


 


endmodule


 


布线-布局仿真(Post-Route Simulate


 


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


点击看大图 


 


水线加法器延时3个时钟周期得到两数相加的值。


 下面是综合器综合后的RTL视图。从下图也能很好解释2级流水线的工作原理和延时3个时钟周期的原因。因为经过了三个寄存器(D触发器)。



 


点击看大图           


 


要注意的是,不能用前仿真验证,因为前仿真没有考虑器件延时,仿真出来的波形与实际不符。下面是前仿真(行为仿真Behavioral Simulation



 

点击看大图


 


    可以看到两个加数(ab)没有经过延时就得到结果(sumcout),这个可以从RTL中知道,寄存器FD在时钟上升沿,数据就从输入到输出,没仿真出来流水线的特点。


    下面再认真看看程序高2位相加代码为


{cout,sum}={firsta[2:0]+firstb[2:0]+firstco,firstsum};


不能用下面代码:


{cout,sum}={firsta[1:0]+firstb[1:0]+firstco,firstsum};


这是由于”{}”就已经限定等号右边为4位,由于等号左边为5位,这造成cout没用,综合的时候会把cout综合掉


综合报告(Synthesis Report)会出现这样的信息:


WARNING:Xst:1710 - FF/Latch  <cout> (without init value) has a constant value of <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0 in block <pipeline_add>.


RTL视图可以看到cout接地了,都表明cout没用到。


 

b76c8730-2a35-4678-bff3-12311342668e.JPG 



 


之前参考了书《FPGA开发实用教程》第六节《Verilog 常用程序示例2


(http://www.eefocus.com/article/08-03/37234s.html )写成下面的样子,结果也出错


{cout,sum}={{firsta[1],firsta[1:0]}+{firstb[1],firstb[1:0]}+firstco,firstsum};


 


   这段代码解决了位数问题,但结果还是不正确,这是由于进位cout不单单是由firsta[1]firstb[1]决定的:01+11=100,与firsta[1:0]firstb[1:0]都有关系。


 


采用流水线设计的加法器,有效提高了系统的最高运行频率,提高了工作速度,尤其是对于FPGA器件,效果跟明显。


采用流水线设计的4位加法器时序分析:(XC3S500E)



 

be10ef79-f5aa-4c3c-b921-48dee038f6e0.JPG


 


   串行加法器和超前进位加法器的时序分析可参考下面两篇博文:


加法器设计(三)超前进位加法器(Verilog


加法器设计(二)串行加法器(Verilog


 


参考资料:


1)            Verilog数字系统设计教程,夏宇闻,北京航空航天大学出版社,P105 2.6流水线


2)            Verilog HDL程序设计教程,P151页,10.2流水线设计技术 (程序不能综合,具体参考上文)


      下载地址:http://bbs.ednchina.com/ShowTopic.aspx?id=73098


3)            FPGA开发实用教程》第六节《Verilog 常用程序示例2(程序不能综合,具体参考上文)


       http://www.eefocus.com/article/08-03/37234s.html


 


本文工程文件:https://static.assets-stash.eet-china.com/album/old-resources/2009/2/13/e2011d1c-af7f-4c39-abee-5cf86ad46710.rar

PARTNER CONTENT

文章评论6条评论)

登录后参与讨论

用户377235 2014-10-3 12:05

难道不用非阻塞?

用户377235 2012-5-9 18:16

为什么我前仿的结果也是正确的(不管是阻塞赋值还是非阻塞赋值),推后三个周期输出相加结果。

用户1489508 2010-10-20 10:01

楼上的都是高手,多多学习!

用户219778 2009-11-4 16:09

把你的资源带走了,要设计一个32位超进位加法器,借鉴一下!

用户777813 2009-5-20 22:44

1如果你的always块里面用的都是非阻塞赋值的话,不需要布线后仿真也可以得到正确的结果。除非在上升沿的时候输入数据也变化,这个时候由于没有延时就会出现错误的结果了。

用户1395232 2009-3-10 16:40

拜读 注意到原书中的错误 不过十这样修改的: always @(posedge clk) begin tempa_d1<=cina; tempb_d1<=cinb; {cout2,sum2} <= {tempa_d1[3:2] + tempb_d1[3:2]+{2'b0,cout1},sum1}; end 本质上还是位宽的问题
相关推荐阅读
藤井树 2015-10-12 14:43
印制电路板的抗干扰设计 zz
印制电路板的抗干扰设计     作者:中船重工集团第707所 肖麟芬   摘   要:本文以印制电路板的电磁兼容性为核心,分析了电磁干扰的产生机理...
藤井树 2013-10-22 15:32
2010.5.30 黄草梁上包饺子一日登山活动——摘韭菜篇
        上次桃花节的时候也有野韭菜,那时候的我连草和韭菜叶分不清,才回去的韭菜也不敢吃,哈哈,这次可算真正见识了韭菜,黄草梁也叫韭菜梁,因为满山遍野都是野韭菜而闻名,比较圆比较粗的就是野韭...
藤井树 2013-10-22 15:28
2010.5.30 黄草梁上包饺子一日登山活动——包饺子篇
摘韭菜回来,大家已经忙开了 我也装模作样地“工作着” 哈哈,还不让我包,包饺子是技术活,一定要皮薄馅厚才有资格包,像我这样的只能旁观了 摘的韭菜应该足够了,旁边那个袋子是我摘来带回学校的 ...
藤井树 2013-08-09 15:19
datasheet下载网站整理(查IC芯片手册)【原创】
*************************************************************************         作为电子工程师,芯片的dat...
藤井树 2010-06-04 00:21
陈伟宁王辉一家捐助渠道(北京菲亚特—英菲尼迪)
       王辉的最新消息请关注 http://chenweining.org/       目前事故责任认定已经出来了——陈家全责。        发信人: program (程序), 信区: D...
藤井树 2010-06-01 13:43
2010.5.30 黄草梁上包饺子一日登山活动——美景篇
这天不得不说的是天空,蓝蓝的天空,白白的云    绿油油的山脊  我、洪涛哥哥、huangna妹妹还有她同事小艾走在黄草梁上    在蓝天白云下合影       阳光照过来,景色真美 象鼻山,走不...
EE直播间
更多
我要评论
6
7
关闭 站长推荐上一条 /3 下一条