我不理解memread的使用。据我所知,如果memwrite为1,则将当前地址的内容传递给读取数据。
到目前为止,这是我的代码:
module data_memory (
input wire [31:0] addr, // Memory Address
input wire [31:0] write_data, // Memory Address Contents
input wire memwrite, memread,
output reg [31:0] read_data // Output of Memory Address Contents
);
reg [31:0] MEMO[0:255]; // 256 words of 32-bit memory
integer i;
initial begin
read_data <= 0;
for (i = 0; i < 256; i = i + 1)
MEMO[i] = i;
end
always @ (addr) begin
//**I don't understand the use of memread**//
if (memwrite == 1'b1)
MEMO[addr] <= write_data;
end
end
assign read_data = MEMO[addr];
endmodule
我是否需要memread的另一个if语句?任何帮助是极大的赞赏。感谢
答案 0 :(得分:4)
在上面编码的设计中,您不使用memread
,而是选择通过模块的最后一行从内存中进行组合读取。如果没有更详细地说明图表中的内存是如何运行的,那么很难说memread
的确切用法。典型的存储器只有memwrite
并假设如果提供了地址并且memwrite
被置为无效,则访问是读取。在这种情况下,我只能假设memread
应该被断言从内存中读取。另外,我建议您对代码进行一些编辑,以使其更好地工作并遵循更好的同步设计风格(这将包含memread
,以便您可以看到它是如何使用的):
module data_memory (
input wire [31:0] addr, // Memory Address
input wire [31:0] write_data, // Memory Address Contents
input wire memwrite, memread,
input wire clk, // All synchronous elements, including memories, should have a clock signal
output reg [31:0] read_data // Output of Memory Address Contents
);
reg [31:0] MEMO[0:255]; // 256 words of 32-bit memory
integer i;
initial begin
read_data <= 0;
for (i = 0; i < 256; i = i + 1) begin
MEMO[i] = i;
end
end
// Using @(addr) will lead to unexpected behavior as memories are synchronous elements like registers
always @(posedge clk) begin
if (memwrite == 1'b1) begin
MEMO[addr] <= write_data;
end
// Use memread to indicate a valid address is on the line and read the memory into a register at that address when memread is asserted
if (memread == 1'b1) begin
read_data <= MEMO[addr];
end
end
endmodule
重要的是要注意您的设计中需要一个时钟。该级别的大多数框图将省略所假定的时钟,但所有同步元件(存储器和寄存器)将同步到公共时钟(或在某些情况下为多个时钟)。
答案 1 :(得分:0)
@Unn提供了很好的答案,而且我只想添加一个,如果你不使用read_enable
,那么它可能是非同步的数据读操作,也最好在{{上翻转输出read_data
1}}。
这里见下面的寺庙供参考。
read_clk