微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我看不到记忆的内容

如何解决我看不到记忆的内容

当我尝试模拟一个应该处理从 SRAM 存储器中获取的数据的电路时遇到问题。首先,SRAM 内存中充满了数据,如果查看最后一个测试平台就可以看到这一点,然后存储的数据将由自动机处理。然后,在某些特定情况下,输出会存储在另一个 SRAM 存储器中。因此,在仿真时,电路的行为方式很奇怪,因为表示从第一个 SRAM 存储器读取的数据的 rd_data_instrucions 始终未定义。因此,所有其他依赖于 rd_data_instructions 的信号也未定义。代码张贴在这里

P.S.:模块 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,output [2:0]in,output wr_en_instructions,output reg [2:0] wr_data_instructions,in order to make possible to write data
    output [3:0] wr_data_display,in order to make possible the display
    output [12:0]o
);

wishbone cut(
    .clk(clk),.start(start),.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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。