异步双口RAM的综合
我写了一个异步的FIFO,里面包括一个异步双口RAM,用ModelSim仿真完全正确,但用Synplify综合时(选用Cyclone器件),却把RAM综合成了一大堆的LUT,无论怎么改都没法综合成Cyclone器件内的Block RAM。即使在Synplify里加了约束条件,仍然无济于事。
现在发现问题主要是出在异步时钟上,读和写用同一个时钟能综合成Block RAM,但分别用两个异步的时钟就不行了。
有高手能帮我想想办法吗?谢谢!
另外申明一点:我虽然知道用Quartus做的话,点点鼠标就能拉一个FIFO出来了,但我还是想直接用代码写,而且要能够综合成器件内的Block RAM。
附:我现在试了以下代码,不行.
module FIFO1024_MEM (rdata, wdata, waddr, raddr, wclken, rclken, wclk, rclk);
parameter DATASIZE = 4; // Memory data word width
parameter ADDRSIZE = 8; // Number of memory address bits
parameter DEPTH = 1<<ADDRSIZE; // DEPTH = 2^ADDRSIZE
output[DATASIZE-1:0] rdata;
input [DATASIZE-1:0] wdata;
input [ADDRSIZE-1:0] waddr, raddr;
input wclken, rclken, wclk, rclk;
reg [DATASIZE-1:0] MEM [0:DEPTH-1];
reg [DATASIZE-1:0] rdata;
always @ (posedge wclk)
begin
if (wclken)
begin
MEM[waddr] <= wdata;
end
end
/*
always @ (posedge rclk)
begin
if (rclken)
begin
rdata <= MEM[raddr];
end
end
*/
上述块替换为下面的,就能综合成功了!
【数据读出不受rclken使能控制,直接输出raddr所指定地址的数据!】
always @ (posedge rclk)
begin
rdata <= MEM[raddr];
end
endmodule
回复:
【答案】:只要把if (rclken)去掉就可以了。
你把这些代码直接可以用quartus II综合呀,
像这么大块的的话即使不加约束,它也会自动综合在EAB(嵌入式阵列块)里的。
像这么大块的的话即使不加约束,它也会自动综合在EAB(嵌入式阵列块)里的。
要把ram推入block ram的时候,语句是越简洁越好。
根据我的经历,两个always语句里(wclken),(rclken)只能出现一个。最主要的是要把那些条件、逻辑等主要写在例化后的bolck ram之外来控制。
根据我的经历,两个always语句里(wclken),(rclken)只能出现一个。最主要的是要把那些条件、逻辑等主要写在例化后的bolck ram之外来控制。