You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

RAM数据传输过程中波形异常问题求助

问题描述

需要读取128个8位数据,读取完成后将其组合为1024位的RAM并赋值给dout。ram_cnt会从0计数到65535,每累计128个数据(如0127、128255区间)时,就将RAM数据赋值给dout。但波形显示异常:当ram_cnt=0时,di应为-15,RAM应呈现...X,X,X,-15的状态。

相关代码

Data_buffer模块

module Data_buffer (
  clk,
  rst,
  we,
  en,
  addr,
  xw_data_128_done,
  di,
  dout,
  xw_bram_addr
);

output reg[11:0] xw_bram_addr;
output reg xw_data_128_done;
input clk, we, rst, en;
input [11:0] addr;
input signed [7:0] di;
output reg [1023:0] dout;

reg signed [7:0] RAM [127:0];
reg [7:0] ram_cnt;
reg first_write_xw_addr_to_bram;
reg xw_done_flag;
integer i;

always @(posedge clk) begin
  if (rst) begin
    dout <= 1024'b0;
    ram_cnt <= 0;
    xw_bram_addr <= 0;
    xw_data_128_done <= 0;
    first_write_xw_addr_to_bram <= 0;
    xw_done_flag <= 0;
  end else if (we && en) begin
    RAM[ram_cnt % 128] <= di;
    xw_done_flag <= 0;

    if ((ram_cnt != 0) && ((ram_cnt + 1) % 128 == 0)) begin
      for (i = 0; i < 128; i = i + 1) begin
        dout[(127 - i) * 8 +: 8] <= RAM[i];
      end
      xw_data_128_done <= 1;
      xw_done_flag <= 1;

      if (!first_write_xw_addr_to_bram) begin
        first_write_xw_addr_to_bram <= 1;
      end else begin
        xw_bram_addr <= xw_bram_addr + 1;
      end
    end
    ram_cnt <= ram_cnt + 1;
  end else if (xw_done_flag) begin
    xw_data_128_done <= 0;
    xw_done_flag <= 0;
  end
end

endmodule

Test Bench测试平台

module test_bench;

  reg clk;
  reg rst;
  reg we;
  reg en;
  reg [11:0] addr;
  reg signed [7:0] di;
  wire [1023:0] dout;
  wire [11:0] xw_bram_addr;
  wire xw_data_128_done;

  integer fp_r_source_xw;
  integer i, tmp_xw;
  reg signed [7:0] data_xw [0:2559];
  reg [11:0] cnt_xw;

  // Instantiate the Data_buffer module
  Data_buffer UUT (
    .clk(clk),
    .rst(rst),
    .we(we),
    .en(en),
    .addr(addr),
    .di(di),
    .dout(dout),
    .xw_bram_addr(xw_bram_addr),
    .xw_data_128_done(xw_data_128_done)
  );

  // Clock generation
  initial begin
    clk = 0;
    forever #5 clk = ~clk;
  end

  // Initialize and read data from file
  initial begin
    fp_r_source_xw = $fopen("C:/LSTM_hardware/8bit_sim/project_1.srcs/sim_1/imports/xsim/it_xw_512_8bit.txt", "r");
    i = 0;
    while (!$feof(fp_r_source_xw) && i < 2560) begin
      tmp_xw = $fscanf(fp_r_source_xw, "%d", data_xw[i]);
      i = i + 1;
    end
    $fclose(fp_r_source_xw);
  end

  // Address and data loading logic
  always @(posedge clk) begin
    if (rst) begin
      addr <= 0;
      cnt_xw <= 0;
    end else if (en && we) begin
      if (cnt_xw < 2560) begin
        di <= data_xw[cnt_xw];
        addr <= cnt_xw % 128;
        cnt_xw <= cnt_xw + 1;
      end
    end
  end

  // Test sequence
  initial begin
    rst = 1;
    we = 0;
    en = 0;
    #20;

    rst = 0;
    #10;

    en = 1;
    we = 1;

    wait (xw_data_128_done == 1);

    we = 0;
    en = 0;
    #20;

    $stop;
  end

endmodule

内容的提问来源于stack exchange,提问作者Vina

火山引擎 最新活动