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

时间:2016-03-11 05:59:25

标签: verilog fpga hdl

我想在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中。

2 个答案:

答案 0 :(得分:1)

两个不同的模块无法访问一个Ram。你需要的是一个在访问之间进行仲裁的模块我只是为了简单而显示写路径,即:

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

有很多理由我不想发布带有该代码的芯片,但希望你能得到这个想法。

答案 1 :(得分:1)

您可以从其他模块访问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设备地址是您的参考。

抱歉我的英文。