初 末 2022-10-17 11:15 采纳率: 75.7%
浏览 29
已结题

编写双口ram结果出现问题

在编写双口ram中,一填加 if(!rst_n)
begin
for(i=0;i<7;i=i+1)
mem[i] <= 'b0;
end 这几句结果dataout中的123就没了。删去这几句结果就正确。请问是为什么?

module ram_8192
(
    input    wire        clk1,//写时钟
    input    wire        clk2,//读时钟
    input   wire        rst_n,
    input    wire        we,//写使能
    input    wire        rd,//读使能
    input    wire [2:0]    we_addr,//写地址
    input     wire [2:0]  rd_addr,//读地址
    input    wire [7:0]  datain,//写数据
    output  reg  [7:0]  dataout//读数据
    );
reg [7:0]mem[7:0];
integer i;
always @(posedge clk1) begin
 module ram_8192
(
    input    wire        clk1,//写时钟
    input    wire        clk2,//读时钟
    input   wire        rst_n,
    input    wire        we,//写使能
    input    wire        rd,//读使能
    input    wire [2:0]    we_addr,//写地址
    input     wire [2:0]  rd_addr,//读地址
    input    wire [7:0]  datain,//写数据
    output  reg  [7:0]  dataout//读数据
    );
reg [7:0]mem[7:0];
integer i;
always @(posedge clk1) begin
    if(!rst_n)
      begin
        for(i=0;i<7;i=i+1)
        mem[i] <= 'b0;
      end 
     else if (we == 1'b1) begin
        mem[we_addr] <= datain;
    end
end
always @(posedge clk2) begin
    if (rd == 1'b1) begin
        dataout <= mem[rd_addr];
    end
    else 
       dataout <='b0;
end
 
endmodule
     else if (we == 1'b1) begin
        mem[we_addr] <= datain;
    end
end
always @(posedge clk2) begin
    if (rd == 1'b1) begin
        dataout <= mem[rd_addr];
    end
    else 
       dataout <='b0;
end
 
endmodule

tb文件

`timescale 1ns / 1ps
module ram_sim();
reg                clk1,clk2;
reg             rst_n;
reg                we,rd;
reg    [7:0]        we_addr,rd_addr;
reg    [7:0]        datain;
wire[7:0]        dataout;
 
initial begin
    clk1 = 0;
    clk2 = 0;
    rst_n =0;
    #10 rst_n = 1;
    we   = 0;
    rd      = 0;
    we_addr = 0;
    rd_addr = 0;
    datain  = 0;
end
 
always #10 clk1 = ~clk1;
always #10 clk2 = ~clk2;
 
initial begin
    #25
    we = 1;
    #50
    rd = 1;
    #100
    we = 0;
end
 
initial begin
    #20
    repeat(7)
    #20
    begin
        we_addr = we_addr +1;
        datain  = datain + 1;
    end
end
initial begin
    #75
    repeat(7)
    #20
    begin
        rd_addr = rd_addr +1;
    end
end
 
initial
#240
rd = 0;
 
ram_8192 inst_single_dualram(
    .clk1    (clk1),
    .clk2    (clk2),
    .rst_n   (rst_n),
    .we      (we),
    .rd      (rd),
    .we_addr (we_addr),
    .rd_addr (rd_addr),
    .datain  (datain),
    .dataout (dataout)
    );
 
endmodule

仿真图

img

  • 写回答

1条回答 默认 最新

  • 老皮芽子 2022-10-17 11:46
    关注

    代码重新贴,乱了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月25日
  • 已采纳回答 10月17日
  • 修改了问题 10月17日
  • 创建了问题 10月17日

悬赏问题

  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探