一、宽度为4,深度为16的分布式RAM
module top(
input clk,
input we,
input en,
input [3:0] addr,
input [3:0] di,
output reg[3:0] do
);
reg [3:0] RAM [15:0];
always @(posedge clk)
begin
if(en)
begin
if(we)
RAM[addr] <= di;
do <= RAM[addr];
end
end
endmodule
二、RTL电路图
三、综合后的电路图
1、图中RAM32X 1S的输入端 A3A2A1A0 分别对应 addr的 addr[3] addr[2] addr[1] addr[0] RAM32X 1S的输入端共有2*2*2*2=16种情况,所以可以对应16个数据,即深度为16。而输出do[3:0]的数据位宽为4,所以需要4个 RAM32X 1S 来实现。
2、图中的LUT2控制RAM32X 1S的使能端,只有we和en同时为1,LUT2才输出1 (可以在cell properties窗口下面的truth table查看真值表)
四、实现后的电路图
1、在实现后,点击device,routing resources,然后会发现3处多出了布线。3处是设计的电路映射在FPGA器件中的真实物理位置。
2、用鼠标点击一下其中一个小方框,方便放大时找到电路
3、一边放大电路,一边调整,把电路移动到屏幕中间,直到看清电路。
4、分析实现后的电路
把1处放大后,发现每个o6可以配置两个o5,这是因为每个输入寄存器都输入共同的4bit地址,所以有共同的4输入。用两个o6便可以配置4个4输入寄存器。
(这里不太懂为什么还会多出一个o6,但是上面标着EQN:O6=0,应该指的是这个O6实际上被占用了但是没有功能?)
此处是输出寄存器,一共有四个。
把2处放大后,放大后发现是个LUT2,即它是控制端we和en在FPGA的物理映射