我想在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中。
答案 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设备地址是您的参考。
抱歉我的英文。