Advanced FPGA Design Architecture,Implementation and Optimization学习之高速度结构设计

1.1    High  Throughput

拆开一个迭代环路会增加数据吞吐量,带来的代价是面积成比例的增加。通常,如果要求n次迭代环路的算法拆开后,流水线实现将呈n倍的流量性能(throughput performance)增加。

    迭代算法

EXP1

module power3
(
    input   [7:0]   x,
    input           clk,
    input           start,
    output  reg [7:0]   xpower,
    output          finished
);

reg [7:0]   ncount;

assign finished = (ncount == 8'd0);

always @ (posedge clk)
if(start)
    begin
        xpower <= x;
        ncount <= 8'd2;
    end
else if(!finished)
    begin
        ncount <= ncount - 8'd1;
        xpower  <= xpower *x;
    end
    
endmodule
 
EasyCapture1

    流水线算法

EXP2

module power3
(
    output reg  [7:0]   xpower,
    input           clk,
    input   [7:0]   x
);

reg  [7:0]  xpower1,xpower2;
reg  [7:0]  x1,x2;

always @ (posedge clk)
begin
    x1 <= x;
    xpower1 <= x;
    
    x2  <=  x1;
    xpower2 <= xpower1*x1;
    
    xpower  <= xpower2*x2;
    
end

endmodule 
EasyCapture2

1.2   低时滞

        低时滞设计是通过最小化中间处理过程的延时,来尽量快速地把数据从输入端传递到输出端的设计。通常,低时滞设计将要求并行性、去除流水线、缩短逻辑,可能减少设计中的流量或者降低最大时钟速度。

        EXP1没有对迭代实现进行明显的时滞优化,因为每个接连的哦乘法器操作必须为下一步操作进行寄存。但是,EXP2的流水线实现有明显的路径来减少时滞。注意每个流水线级,每个乘法的积必须等待下一个时钟沿到来才传递到下一级。去除流水线寄存器可以使输入到输出的时序最小化。

EXP3

module power3
(
    output  [7:0]   xpower,
    input   [7:0]   x
);

reg [7:0]   xpower1,xpower2;
reg [7:0]   x1,x2;

assign  xpower = xpower2*x2;

always @ *
begin
    x1       =  x;
    xpower1  =  x;
end

always @ *
begin
    x2       =  x1;
    xpower2  =  xpower1*x1;
end

endmodule 

EasyCapture4

可以通过移去流水线寄存器来减少时滞;相应的,带来的损失是增加寄存器之间的组合延时。

1.3   时序

时序是指一个设计的时钟速度,在设计中任何两个时序元件之间的最大延时将决定最大的时钟速度。

EasyCapture6

时序改进策略

1.添加中间的寄存器层次到关键路径,这个技术应该利用在高度流水线的设计,附加的时钟周期的时滞不违反设计的技术条件,整个功能将不受进一步增加的寄存器的影响。

    把关键路径分成两个更小延时的路径,添加寄存器层次改进时序

2.重新组织关键路径,以致并行地实现逻辑结构,当通过一列串行的逻辑估值的一个函数可以分解和并行的估值时,就可以利用这个技术。

        把一个逻辑功能分成大量可以并行估值的更小的功能,减少路径延时为子结构的最长延时。

3.展平逻辑结构,专门可以应用于因为特权编码而链接的逻辑。

EXP4

module regwrite
(
    output  reg [3:0]   rout,
    input   clk,in,
    input   [3:0]   ctrl
);

always @ (posedge clk)
    if(ctrl[0])         rout[0]   <= in;
    else if(ctrl[1])    rout[1]   <= in;
    else if(ctrl[2])    rout[2]   <= in;
    else if(ctrl[3])    rout[3]   <= in;

endmodule 

EasyCapture1

        如果控制线是来自另一个模块地址译码器的选通,则每个选通对其他的选通是相互排斥的,因为它们都代表唯一的地址。但是,这里已经仿照特权判决那样的编码。由于控制信号的特性,以上的代码将正确地仿照并行方式编码那样操作,但是综合工具未必能够足够智能的识别它,特别是当地址译码器发生在另一个寄存器层次后面。

        为了除去特权,展平此逻辑,可以按照下面的方式编码:

EXP5

module regwtite
(
    output  reg [3:0]   rout,
    input   clk,in,
    input   [3:0]   ctrl
);

always @ (posedge clk)
begin
    if(ctrl[0])    rout[0]   <= in;
    if(ctrl[1])    rout[1]   <= in;
    if(ctrl[2])    rout[2]   <= in;
    if(ctrl[3])    rout[3]   <= in;
end

endmodule 

EasyCapture2

        除去不需要的特权编码,展平逻辑,减少路径延时。

4.寄存器平衡。

        从概念上讲,寄存器平衡是平等地重新分布寄存器之间的逻辑,减少任何两个寄存器之间最坏的延时。这个技术应该随时利用在关键路径和相邻路径之间逻辑的高度不平衡时。因为时钟速度只由最坏条件路径来决定,可以做小的改变而成功地重新平衡关键逻辑。

EXP6

module adder
(
    output  reg [7:0]   sum,
    input   clk,
    input   [7:0]   a,b,c
);

reg [7:0]   ra,rb,rc;

always @ (posedge clk)
begin
    ra  <=  a;
    rb  <=  b;
    rc  <=  c;
    sum <=  ra + rb + rc;
end

endmodule
EasyCapture3

如果通过加法器定义关键路径,在关键路径中的一些逻辑可以移回一级,所以平衡在两个寄存器级之间的逻辑负载。

EXP7

module adder
(
    output  reg [7:0]   sum,
    input   clk,
    input   [7:0]   a,b,c
);

reg [7:0]   rab,rc;

always @ (posedge clk)
begin
    rab  <=  a + b;
    rc  <=  c;
    sum <=  rab + rc;
end

endmodule 

EasyCapture4

从关键路径移动组合逻辑到相邻路径,寄存器平衡改善时序。

5.重新安排路径

        在数据流中重新安排路径使关键路径最小化。当多个路径与关键路径组合时应该利用这个技术,组合逻辑路径可以重新安排以致关键路径可以移动到更接近目的的寄存器。利用这一策略,将只涉及任何给定的一组寄存器之间的逻辑路径。

EXP 8

module randomlogic
(
    output  reg [7:0]   out,
    input       [7:0]   a,b,c,
    input               clk,
    input               cond1,cond2
);

always @ (posedge clk)
    if(cond1)
        out <=  a;
    else if(cond2 && (c < 8))
        out <=  b;
    else
        out <=  c;

endmodule 
EasyCapture5

假设关键路径是在c和out之间,由一个比较器、一个门和一个MUX2-1串连组成,放在判决的MUX之前,假设条不互相排斥,可以修改代码重新安排比较器的长延时。

EXP 9

module  randomlogic
(
    output  reg [7:0]   out,
    input       [7:0]   a,b,c,
    input               clk,
    input               cond1,cond2
);

wire    condb   =   (cond2 & !cond1);

always @ (posedge clk)
    if(condb && (c < 8))
        out <=  b;
    else if(cond1)
        out <=  a;
    else
        out <=  c;

endmodule 
EasyCapture6

可以重新安排与关键路径组合的路径来改善时序,方法是关键路径的一些逻辑放置到接近目的寄存器。

1.4  小结

EasyCapture1

posted on 2011-03-29 22:07  齐威王  阅读(965)  评论(0编辑  收藏  举报

导航