如何在多个模块中共享和使用一个 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 设备地址是您的参考。
对不起我的英语。
我想在 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 设备地址是您的参考。
对不起我的英语。