tag 标签: bram

相关博文
  • 热度 20
    2014-3-7 15:49
    2603 次阅读|
    0 个评论
             在“ BRAM 和 DSP 间的纠缠 ( 一 ) ”中介绍了 Xilinx FPGA 中 BRAM 和 DSP 的使用,可能大家会奇怪为什么博文标题中会有“纠缠”二字,那在本文中将会详细道来。          笔者在 FPGA 项目中多次遇到一个问题:设计中关键路径在 BRAM 和 DSP 之间。也许有读者会问,是不是 BRAM 和 DSP 之间没有寄存器分割路径?答案是有,输出寄存、输入也寄存了,至于为什么产生这个问题,请看以下分析:          以一个简单设计为例,结构如图 1 所示,算法也一目了然 y(n)=x(n)*x(n-128) ,其中 BRAM 延时 128 个时钟, DSP 作为乘法单元。 图 1          顶层 Verilog 代码如下,其中 bram_delay 和 mult 分别为封装 BRAM 原语和 DSP48E1 原语后的模块,模块代码见附件。 以下是代码片段: module top(     clk,     rst,     x,     y     );     input clk;     input rst;     input x;     output y;         wire x_n;     bram_delay #(.ADDR_WIDTH(7),.DATA_WIDTH(16))     bram_delay_u(         .clk(clk),         .rst(rst),         .idat(x),         .odat(x_n)         );                    mult #(16,16,32)(         .clk(clk),         .rst(rst),         .a(x),         .b(x_n),         .p(y)         );        endmodule          加入全局时钟约束 491MHz ,经过 vivado 软件综合实现后,时序报告关键路径如图 2 所示,果不其然, setup slack=-0.742 不收敛,是从 BRAM 到 DSP 的这条路径,下面两图分别是综合后框图(左下)和布局布线后结果图(右下)。 图 2          详细的关键路径报告如图 3 所示,在 Data Path 由两部分组成: RAMB36E1(Prop ramb36e1 CLKARDCLK DOADO ) 和 net(fo=1, routed) 。前者属于 BRAM 输出寄存器的 clock_to_out 延时,而后者属于布线延时,显然这个布线延时 0.608ns 过大,对于 491MHz 时钟频率下只有 2.037ns 的余量的情况下。另外当前设计只是时钟频率较高,在设计资源紧缺的情况下,布局不可能如此好, BRAM 和 DSP 是紧挨着的两列布局,因此实际情况中这段布线延时至少会大于 0.608ns 。 图 3          以上算是复现了问题,究其问题的原因是布线过长,布线过长是因为没有寄存器分割,但是 BRAM 和 DSP 之间是有寄存器分割的呀,只不过寄存器是在 BRAM 和 DSP 内部,而 BRAM 和 DSP 的布局位置被限制在资源列中,布局不是那么灵活,至此答案已经很清晰了,只要中间再加入一级寄存器( slice 实现)分割路径即可,修改后的顶层 Verilog 实现代码如下,由于多了一级延时,相应的在 BRAM 中需要减少一级延时: 以下是代码片段: module top(     clk,     rst,     x,     y     );     input clk;     input rst;     input x;     output y;             wire x_n;     bram_delay #(.ADDR_WIDTH(7),.DATA_WIDTH(16))     bram_delay_u(         .clk(clk),         .rst(rst),         .idat(x),         .odat(x_n)         );            reg x_n_rg;        always@(posedge clk) begin         if(rst)             x_n_rg=0;         else             x_n_rg=x_n;     end                 mult #(16,16,32)(         .clk(clk),         .rst(rst),         .a(x),         .b(x_n_rg),         .p(y)         ); endmodule          修改后的关键路径如图 4 所示虽然 setup clack=-0.272 还是未收敛,但是已经得到了很大的改善,可以发现中间加入寄存器之后, BRAM 和 DSP 间的布线从中间被割断。 图 4          综上,这“纠缠”和解“纠缠”讲诉完毕,这边需要说明一下,这问题不一定适用于所有情况,在低速设计中或者资源不紧张的情况下此问题可以完全忽略。
  • 热度 18
    2014-3-7 15:42
    2430 次阅读|
    1 个评论
             Xilinx 公司的 FPGA 中不仅有“成吨”的逻辑资源 (slice) ,另外存储器、 I/O 、时钟和集成式 IP 资源也非常丰富,笔者在设计中经常使用 Block RAM(BRAM) 、 DSP 资源,灵活运用 BRAM 和 DSP 能为设计的速度和面积都带来一定的提升,可谓是鱼和熊掌兼得。 以 Kintex-7 系列为例,如图 1 所示为 kintex-7 各芯片资源表,其中 Block RAM/FIFO w/ ECC (36 Kb each) 和 DSP48 Slices 栏分别是 BRAM 和 DSP 资源数量,在 FPGA 项目初期,芯片选型时,需要参考此表进行资源评估。 图 1          下面分别介绍一下 Kintex-7 系列 FPGA 中 BRAM 和 DSP 资源的使用: 1. BRAM          Kintex-7 中 BRAM 块大小为 36Kbit ,也可以配置成两块 18Kbit RAM ,如 FPGA 设计中不同模块分别使用了一块 18Kbit RAM , vivado 软件会将这部分在一块 BRAM 中实现。          在 FPGA 设计中可采用多种方式调用 BRAM ,最常用的就是 Core Generater 工具,而笔者习惯于使用 BRAM 原语,将其根据需求自定义封装,最终在设计中类似以 IP Core 的形式例化 BRAM ,此方法的好处就是 BRAM 可以根据设计者的需求灵活配置。如图 2 、 3 所示,打开 vivado 的代码编辑器,在 Language Templates 中可以找到 BRAM 的原语,封装时只需拷贝出来即可。 图 2 图 3          如代码见附件,笔者将 BRAM 原语封装后,经过 vivado 软件综合实现,在 FPGA 芯片中的布局实现如图 4 所示, BRAM 、 DSP 在 FPGA 芯片中是按列布局的,其中红色列为 BRAM ,绿色列为 DSP 。 图 4 2. DSP 不仅 Kintex-7 ,全 7 系列 FPGA(Artix 、 Kintex 、 Virtex) 中带有的 DSP 资源都是 DSP48E1 ,其基本结构如图 5 所示,主要由预加器 (Pre-adder) 、乘法器 (Multiplier) 、累加器 / 逻辑单元 (Accumulator/Logic Unit) 和模式检测器 (Pattern Detector) , 图 5          内部的详细结构如图 6 所示,其中预加器输入来自输入端口 A(30-Bit) 和 D(25-Bit) ;乘法器的输入来自输入端口 B(18-Bit) 和预加器结果 (25-Bit) ,支持 25-Bit X 18-Bit 的运算;累加器 / 逻辑单元的输入来自乘法器结果和输入端口 C(48-Bit) ,输入的模式组合由控制字 OPMODE 决定,运算模式由控制字 ALUMODE 决定。 图 6          与 BRAM 类似,笔者通常采用封装原语的方式使用 DSP48E1 ,在 Language Template 中选择 48-bit Multi-Functional Arithmetic Block ,然后根据需求配置参数,如需得到 P=(A+D) x B + C ,其中各参数配置需要根据 DSP48E1 的 datasheet 进行配置: 如图 7 红框中配置, OPMODE=7‘b0110101 图 7 如图 8 红框中配置, INMODE=4’b0101 图 8 如图 9 红框中配置, ALUMODE=4‘b0000 图 9 封装代码见附件,经过 vivado 软件综合实现后,类似于图 4 ,布局在 DSP 列中。
相关资源