FPGA|CPLD|ASIC论坛
直播中

seduce

9年用户 56经验值
擅长:可编程逻辑 嵌入式技术 制造/封装 处理器/DSP
私信 关注
[资料]

理解流水线编程——四位全加器(夏老师书第十章)代码

第十章 如何编写和验证简单的纯组合逻辑模块
关于这一章,我唯一想总结一下的就是流水线的设计,书上没有范例,上网上搜索了一下,关于4位全加器的流水线设计大部分都不正确,后来终于找到了一个和我理解一样的人的博客(tengjingshu)在此谢过,如有版权问题,务必及时通知,但是他的pipeline_add模块中采用阻塞赋值,显然是不对的,应该采用非阻塞赋值,我将他的例程稍作修改引用如下:
流水线4位(4bit)加法器
代码如下:
`timescale 1ns / 1ps
modulepipeline_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 realDUTY_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
        // -------------  CurrentTime:  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
看懂这个例程,也就理解了流水线编程~~~


回帖(2)

489240

2015-1-16 23:38:11
pipeline,怎么说呢,对于新手来讲,用不到,理解不了也很正常。对于职业的来说,觉得没必要多讲。。。
其实pipeline电路设计和计算机pipleline指令处理,是不一样,前者主要是为了满足时序环境,后者是一种高效技巧,后者更为人所知。
举报

seduce

2015-1-17 15:59:57
引用: glace12123 发表于 2015-1-16 23:38
pipeline,怎么说呢,对于新手来讲,用不到,理解不了也很正常。对于职业的来说,觉得没必要多讲。。。
其 ...

您说的“时序环境”是指组合逻辑时延匹配时钟频率吗?流水线设计的出发点确实是为了减少组合逻辑时延,从而可以用更高频率的时钟,而并非提高处理效率,这点我也认同。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分