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

Verilog 如何在多个模块中共享和使用一个RAM模块?,verilog,fpga,hdl,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

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

两个不同的模块不能访问一个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
模块ram(
输入时钟,
输入wr,
输入[7:0]数据
);
///这里是Ram模型
端模
模块仲裁器(
输入时钟,
输入rst\n,
输出ram_wr,
输出[7:0]ram_数据,
输出[1:0]写入被接受,
输入m0_wr,
输入[7:0]m0_数据,
输入m1_wr,
输入[7:0]m1_数据,
);
始终@(posedge clk或negedge rst_n)
如果(!rst_n)

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

在某种抽象层次上,I2C设备地址是您的参考


对不起我的英语

我不知道你所说的“通过引用传递RAM模块”是什么意思。你想要一个由一个模块写入另一个模块读取的RAM吗?您是否有单独的写地址和读地址端口。Verilog是一种硬件描述语言(HDL)。HDL的行为与普通编程语言完全不同。通常没有指针和引用的概念。在现实电路中,只有导线或信号的概念。我建议阅读一些关于如何在Verilog中构建简单模块的教程。