memory - 我看不到记忆的内容
问题描述
当我尝试模拟一个应该处理从 SRAM 存储器获取的数据的电路时,我遇到了问题。首先,SRAM存储器中充满了数据,如果查看最后一个测试台可以看出这一点,然后存储的数据将由自动机处理。然后,在某些特定情况下,输出将存储在另一个 SRAM 存储器中。因此,在仿真时,电路会以一种奇怪的方式运行,因为表示从第一个 SRAM 存储器读取数据的 rd_data_instrucions 始终未定义。因此,取决于 rd_data_instructions 的所有其他信号也未定义。代码发布在这里。
PS:模块 sram_1port_instructions 和 sram_1port_data 应该作为时钟 SRAM,具有写使能信号,因此当 wr_en 为高电平时,内存存储接收到的数据(wr_data),当 wr_en 为低电平时,内存可以输出数据(rd_data)。模块用户代表一个“接口”,它有助于写入过程,因此写入 SRAM 指令存储器不需要存储数据的地址,因为该模块提供了一种增加存储器“写地址指针”的机制。此外,我们可以看到该模块对应的测试平台。然后,我们可以看到另一个内存的对应模块,它是为输出存储而创建的,以及一个旨在促进读取过程的模块(即类似于前面的情况,但是,它不是促进写作过程,而是简化了阅读)。最后但并非最不重要的一点是,我们可以区分一个叉骨模块,它应该互连所有先前的模块以创建一个数字系统。因此,自动机从 SRAM 指令存储器中获取数据,然后输出一些存储在另一个存储器中的数据。最后,可以从 SRAM 数据存储器中读取结果。当我尝试模拟系统时会出现问题,因为我在尝试读取某些信号时遇到困难,例如 rd_data_instructions,它应该显示以前存储的 SRAM 指令存储器中的值,隐含的“in”信号,它应该提供输入自动机等等。在叉骨模块中,我使用了一个标有“开始”的特殊信号 它将写使能设置为 0,以便 SRAM 存储器为读取过程做好准备。这个特殊的信号实际上触发了自动机,通过“输入”来自内存的输入数据。
//wishbone module
module wishbone(
input clk,rst,start,
output reg [2:0]in,
output reg wr_en_instructions,wr_en_display,
input [2:0] wr_data_instructions,//created for usr, in order to make possible to write data
output reg [3:0] wr_data_display,
output [2:0] rd_data_instructions,
output [3:0] rd_data_display,//created for user, in order to make possible the display
output [12:0]o
);
reg [15:0] pointer_instructions,pointer_display;
initial wr_en_instructions = 1'b1;
control_unit i0(.clk(clk),.rst(rst),.in(in),.o(o));
user i1(.clk(clk),.wr_en(wr_en),.address_in(pointer_instructions),.wr_data(wr_data_instructions),.rd_data(rd_data_instructions));
display i2(.clk(clk),.wr_en(wr_en_display),.address_in(pointer_display),.wr_data(wr_data_display),.rd_data(rd_data_display));
integer i = 0;
always @ * begin
wr_en_display = ~wr_en_instructions;
end
always @(posedge clk) begin
if(start) begin
pointer_instructions <= 16'b0;
pointer_display <= 16'b0;
wr_en_instructions <= 1'b0;
end
else begin
$display(rd_data_instructions);
if(!wr_en_instructions) begin
if(rd_data_instructions == 3'b1xx) begin
wr_en_instructions <= 1'b1;//???
end
else if(rd_data_instructions == 3'b010) begin
in <= rd_data_instructions;
wr_data_display <= o;
pointer_instructions <= pointer_instructions + 1;
pointer_display <= pointer_display + 1;
end
else begin
in <= rd_data_instructions;
pointer_instructions <= pointer_instructions + 1;
end
end
else begin
i = i + 1;
end
end
end
endmodule
//testbench for top module
module wishbone_tb(
output reg clk,rst,start,
output [2:0]in,
output wr_en_instructions,wr_en_display,
output reg [2:0] wr_data_instructions,//created for usr, in order to make possible to write data
output [3:0] wr_data_display,
output [2:0] rd_data_instructions,
output [3:0] rd_data_display,//created for user, in order to make possible the display
output [12:0]o
);
wishbone cut(
.clk(clk),.rst(rst),.start(start),
.in(in),
.wr_en_instructions(wr_en_instructions),.wr_en_display(wr_en_display),
.wr_data_instructions(wr_data_instructions),
.wr_data_display(wr_data_display),
.rd_data_instructions(rd_data_instructions),
.rd_data_display(rd_data_display),
.o(o)
);
initial $dumpvars(0,wishbone_tb);
initial begin
clk = 1'd1;
repeat (600000)
#100 clk = ~clk;
end
initial begin
rst = 1'b1;
#400 rst = 1'b0;
end
initial begin
start = 1'b0;
#13000400 start = 1'b1;
#400 start = 1'b0;
end
initial begin
wr_data_instructions = 3'd1;
#3000400 wr_data_instructions = 3'd2;
#1000000 wr_data_instructions = 3'd1;
#3000000 wr_data_instructions = 3'd0;
#2000000 wr_data_instructions = 3'd3;
#1000000 wr_data_instructions = 3'd1;
#3000000 wr_data_instructions = 3'd4;//halt
end
endmodule
解决方案
推荐阅读
- c# - LINQ - 分组,然后有条件地求和
- javascript - VTK.js VR 不在 Room 中显示/显示手控制器
- java - java.sql.SQLIntegrityConstraintViolationException:列'library_idlibrary'不能为空
- c# - 当 `throw new` 旁边发生异常时,还有其他方法可以查看程序的行为吗?
- windows - 在 VPS 中使用 KeyboardEvent
- android - 如何使用用户定义的文档 ID 创建 Firebase Firestore 文档?
- css - 如何将 box-shadow 逗号分隔值与 filter: drop-shadow 一起使用?
- powerbi - 微软 Power BI | TOP 5 客户的销售额和销售额占总销售额的百分比(不仅仅是前 5 名)
- azure - azure_managed_disk 和 storage_data_disk 之间的关系
- spring - 我想在使用条件的搜索中排除多个条目