如何在多个模块中共享和使用一个 RAM 模块?

How can I share and use just one RAM module in multiple modules?

我想在 RAM 中写入一个模块,然后从同一个模块中读入另一个模块。我怎样才能做到这一点?我认为必须有一种方法可以通过引用其他模块来传递 RAM 模块。例如:

在模块 A 中:

// write in ram and pass to module B

ram ram_ins();
ram_ins.wr_en = 1;
ram_ins.addr = 1;
ram_ins.data_in = 1234;
B b_ins(ram_ins); // pass by reference the ram_ins to the module B 

在模块 B 中:

// read from ram 

ram_ins.addr = 1;
reg [7:0] a;
assign a = ram_ins.data_out

在模块B中寄存器a必须是1234,因为在模块A中1234写在RAM的地址1中。

一个内存不能被两个不同的模块访问。您需要的是一个在访问之间进行仲裁的模块,为了简单起见,我将只显示写入路径,即:

module ram ( 
    input clk,
    input wr,
    input [7:0] data
);
///Ram model here
endmodule

module arbiter (
input clk,
input rst_n,


output ram_wr,
output [7:0] ram_data,

output [1:0] write_accepted,

input m0_wr,
input [7:0] m0_data,
input m1_wr,
input [7:0] m1_data,
);
always @(posedge clk or negedge rst_n)
if (!rst_n) 
  current <= 1'b0;
else
  current <= !current;

assign ram_data = current ? m1_data : m0_data;
assign write_accepted = {(current & m1_wr),(!current & m1_wr)};
assign ram_wr = |write_accepted;
endmodule

有很多原因我不想发布带有该代码的芯片,但希望您明白了。

您可以从其他模块访问 RAM,您需要一些用于此或通信总线的控制模块。例如 Altera UFM I2C 接口。 RAM可以被模块A写入和模块B以不同的时钟读取(双端口RAM):

http://www.asic-world.com/examples/verilog/ram_dp_sr_sw.html

http://www.asic-world.com/examples/verilog/ram_dp_ar_aw.html

在一定的抽象层次上,I2C 设备地址是您的参考。

对不起我的英语。