首页 > 编程知识 正文

工厂流水线,工业流水线

时间:2023-05-04 01:02:17 阅读:120178 作者:3393

流水线设计是一种系统划分组合逻辑延迟路径,在每个部分(层次)之间插入人寄存器,以临时存储中间数据的方法。 流水线缩短在一个时钟周期内信号通过的组合逻辑电路延迟路径的长度,提高时钟频率。 在同步电路的情况下,其速度是指同步电路的时钟频率,举个同步时钟越快,电路处理数据的时间间隔越短,电路在单位时间内处理的数据量越大,即电路的吞吐量越大的简单例子吧。 最近,我们希望研究数字图像处理的相关技术,完成从RGB空间迁移到Ycbcr空间的功能。 以下是我写的两个代码,实现了同样的功能。 它们都将RGB565转换为Ycbcr565。 但是第二种方法是采用流水线设计。 首先发布代码。 moduleRGB2ycbcr1(inputclk_50m,input reset_l,input [4:0] rgb_R,input [5:0] rgb_G,input [ 43336536536501; )

reg [15:0] ycbcr_Y_r1; reg [15:0] ycbcr_cb_r1; reg [15:0] ycbcr_cr_r1;

always @ (posedge clk _ 50 mornegedgereset _ l ) begin if (! reset_L(Beginycbcr_y_R1=16 ) D0; ycbcr_cb_r1=16'd0; ycbcr_cr_r1=16'd0; endelsebeginycbcr _ y _ R1=((77 * RGB _ r150 * RGB _ g29 * RGB _ B16 ' d 32768 )8); ybcr_CB_R1=((16 ) d 32768-43 * RGB _ r-85 * RGB _ g128 * RGB _ b )8); ybcr _ Cr _ R1=(128 * RGB _ r-107 * RGB _ g-21 * RGB _ B16 ' d 32768 )8); 结束结束

assign ycbcr _ y=ycbcr _ y _ R1 [ 7:4 ]; assign ycbcr _ CB=ycbcr _ CB _ R1 [ 8:4 ]; assign ycbcr _ Cr=ycbcr _ Cr _ R1 [ 7:4 ];

endmodule上述代码在一个时钟周期内完成红色部分的计算。 那样的话传播延迟就会变大。 有三个加法器和一个乘法器。 以下是综合的RTL图。

计时报告显示时钟裕度为9.785。 接下来,我们来看看采用流水线结构设计的代码。 moduleRGB2ycbcr2(inputclk_50m,input reset_l,input [4:0] rgb_R,input [ 53336600 ] input [ 433:0 ] RGB _ r output [5:0] ycbcr_cb,output [4:0] ycbcr_cr )/* * * * * * * * * * * thefirstflowline * * * * * * * * *。 reg [15:0] rgb_R3;

always @ (posedge clk _ 50 mornegedgereset _ l ) beginif ) reset_l==1'B0 ) begin rgb_R1

lt;=16'd0; rgb_R2 <=16'd0; rgb_R3 <=16'd0; end else begin rgb_R1 <= 77*rgb_R     ; rgb_R2 <= 43*rgb_R     ; rgb_R3 <= 128*rgb_R    ; end end
reg  [15:0] rgb_G1 ; reg  [15:0] rgb_G2 ; reg  [15:0] rgb_G3   ;
always @ (posedge clk_50m or negedge reset_l) begin if(reset_l==1'b0)begin rgb_G1  <=16'd0; rgb_G2 <=16'd0; rgb_G3 <=16'd0; end else begin rgb_G1 <= 150*rgb_G    ; rgb_G2 <= 85*rgb_G     ; rgb_G3 <= 107*rgb_G    ; end end
reg  [15:0] rgb_B1 ; reg  [15:0] rgb_B2 ; reg  [15:0] rgb_B3   ;
always @ (posedge clk_50m or negedge reset_l) begin if(reset_l==1'b0)begin rgb_B1 <=16'd0; rgb_B2 <=16'd0; rgb_B3 <=16'd0; end else begin rgb_B1 <= 29*rgb_B      ; rgb_B2 <= 128*rgb_B     ; rgb_B3 <= 21*rgb_B      ; end end /********************** The Second Flow Line*************************/ reg  [15:0] ycbcr_Y_r1 ; reg  [15:0] ycbcr_cb_r1 ; reg  [15:0] ycbcr_cr_r1   ;
always @ (posedge clk_50m or negedge reset_l) begin if(reset_l==1'b0)begin ycbcr_Y_r1  <=16'd0; ycbcr_cb_r1 <=16'd0; ycbcr_cr_r1 <=16'd0; end else begin ycbcr_Y_r1  <= rgb_R1 + rgb_G1 +rgb_B1 + 16'd32768   ; ycbcr_cb_r1 <= 16'd32768 - rgb_R2 - rgb_G2 + rgb_B2  ; ycbcr_cr_r1 <= 16'd32768 + rgb_R3 - rgb_G3 - rgb_B3   ; end end
/********************** The Third Flow Line*************************/ reg  [7:0] ycbcr_Y_r2 ; reg  [7:0] ycbcr_cb_r2 ; reg  [7:0] ycbcr_cr_r2   ;
always @ (posedge clk_50m or negedge reset_l) begin if(reset_l==1'b0)begin ycbcr_Y_r2  <=8'd0; ycbcr_cb_r2 <=8'd0; ycbcr_cr_r2 <=8'd0; end else begin ycbcr_Y_r2  <= ycbcr_Y_r1  >> 8   ; ycbcr_cb_r2 <= ycbcr_cb_r1 >> 8   ; ycbcr_cr_r2 <= ycbcr_cr_r1 >> 8   ; end end

/********************** To Ycbcr565 *************************/ assign  ycbcr_Y  = ycbcr_Y_r2 [7:3] ; assign  ycbcr_cb = ycbcr_cb_r2[7:2] ; assign  ycbcr_cr = ycbcr_cr_r2[7:3] ;
endmodule
 蓝色部分所示,是将之前在一个时钟周期内完成的操作分成3个周期完成。虽然直到第3个周期后才会有第一个数据输出,但是在以后的每个时钟周期内都会有处理完成的数据输出。也就是说,流水线设计只在刚开始处理时需要一定的处理时间,以后就会源源不断的输出数据。   下面是综合后的RTL图:
  很明显,流水线方式增加了逻辑块的使用量,这是因为需要使用寄存器来构建流水线。这些寄存器使用逻辑块中的触发器实现。虽然多耗费了点资源,但可以使设计的时钟速率更快,从而满足时序约束条件。  如图,意料之中,时钟的裕量为11.068,比之前的 9.785要大。这也体现了所谓的面积换速度的思想。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。