一.概述
博主在做双令牌桶的算法模块时,用到了比较大的寄存器,综合的时候实现该寄存器是用的LUT资源和FF触发器,FF触发器板子资源够用,但是LUT资源不够用,所以就想着用BRAM实现这个寄存器块,但是模块中有3组这样的寄存器,只有一组寄存器对时序要求不高,比较宽松的时序要求让我首先对它下手。小记以下遇到的问题。
二.使用及代码
对于没有用BRAM实现的结果。该模块LUT资源使用11000多,FF触发器使用2600多。
模块中用到了这样的寄存器,reg [31:0] counting_drop_red [127:0]。如果想要将这个reg改为BRAM,那么就要编写符合RAM规范的代码并且使用综合命令ram_style="block",如果要使用DRAM也类似。以下是该寄存器对应的BRAM代码。值得一提的是,我一开始引入复位对RAM进行清0操作,可是这是不符合RAM规范的,所以查看综合结果,并没有看到该寄存器综合成BRAM,然后改成初始值{default:0}的形式,才综合成BRAM。
module CountArray_as_RAM(
input clk,
input ena,
input wea,
input [4:0]addra,
input [31:0]dina,
input enb,
input [4:0]addrb,
// input rst,
output reg [31:0]doutb
);
(* ram_style="block" *)reg [31:0] counting_drop_red [31:0] = {default:0};
always @(posedge clk)begin //写
if (ena)begin
if (wea)
counting_drop_red[addra] <= dina;
end
end
always @(posedge clk)
if (enb) doutb <= counting_drop_red[addrb]; //读
endmodule
下图是现在的资源使用量:LUT+FF触发器+BRAM。
总结:可以看到LUT资源使用明显减少,FF触发器资源明显减少,实现这个寄存器的LUT和FF触发器被BRAM资源代替。