FPGA中的流水线设计(含Verilog范例)

一、流水线设计介绍

在高速通信系统设计中,如何提高系统的工作速度至关重要,通常使用的方法有两种:

1. 并行方式设计:可减少模块间的延时;

2. 流水线设计:流水线设计如同生产线一样,将整个执行过程分解为若干个工作段,从流水线的起点连续输入,各操作段以重叠方式执行。使得运行的速度只与流水线输入的速度有关,而与处理所需的时间无关,从而提高运行效率。

无流水线设计和有流水线设计示意图如下:

图1 无流水线设计

图2 有流水线设计

        如果不采用流水线,输入的所有信号都要等前一个处理单元所有运算结束后才能进入处理模块;而采用了流水线设计后,输入信号只需经过一级流水处理后,就可以进入下一个流水线处理模块,数据处理时间减少了N倍。吞吐量也从T变为了NT,是面积换速度思想的具体体现。 

         流水线的基本结构是将适当划分的N个操作步骤串联起来。流水线操作的最大特点是数据流在各个步骤的处理,从时间上看是连续的,其操作的关键在于时序设计的合理安排,以及前后级接口间数据的匹配。

  • 如果前级操作的时间等于后级操作的时间:直接输入即可;
  • 如果前级操作的时间小于后级操作的时间:对前级数据进行缓存;
  • 如果前级操作的时间大于后级操作的时间:串并转换等方法对数据进行分流处理后,再输入到后级模块。

图3 常用流水线设计时序示意图

二、流水线应用实例

 接下来将介绍非流水线设计、二级流水线设计实例。

(1)非流水线实现方式

module addr1(
input wire          clk,
input wire    [7:0] cina,
input wire    [7:0] cinb,
output reg    [7:0] sum,
output reg          count);


always @(posedge clk) begin
 {count,sum} <= cina + cinb + cin;  //8位相加
end

endmodule

(2) 二级流水线实现方式

module addr2(
input wire          clk,
input wire          cin,
input wire    [7:0] cina,
input wire    [7:0] cinb,
output reg    [7:0] sum,
output reg          count);

reg           [7:0] sum1;
reg                 count1;

always @(posedge clk) begin
 {count1,sum1} <= cina[3:0] + cinb[3:0] + cin;  //低四位相加
end

always @(posedge clk) begin
 {count,sum} <= {{cina[7],cina[7:4]} + {cinb[7],cinb[7:4] + cout1},sum1};  
//高四位相加,并且将8位拼起来
end

endmodule

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值