dp_ram.v 758 B

1234567891011121314151617181920212223242526272829303132
  1. module dp_ram #(parameter DATA_WIDTH = 16, ADDR_WIDTH = 4, DEPTH = 2**ADDR_WIDTH)
  2. (
  3. input wire wr_clk,
  4. input wire wr_en,
  5. input wire [DATA_WIDTH - 1 : 0] wr_data,
  6. input wire [ADDR_WIDTH - 1 : 0] wr_addr,
  7. input wire rd_clk,
  8. output wire [DATA_WIDTH - 1 : 0] rd_data,
  9. input wire [ADDR_WIDTH - 1 : 0] rd_addr
  10. );
  11. (* ram_style = "block" *) reg [DATA_WIDTH - 1 : 0] mem [DEPTH - 1 : 0];
  12. reg [DATA_WIDTH - 1 : 0] reg_rd_data;
  13. // for visualisation only:
  14. reg [ADDR_WIDTH - 1 : 0] reg_rd_addr;
  15. assign rd_data = reg_rd_data;
  16. always @(posedge wr_clk)
  17. begin
  18. if (wr_en == 1'b1)
  19. mem[wr_addr] <= wr_data;
  20. end
  21. always @(posedge rd_clk)
  22. begin
  23. reg_rd_data = mem[rd_addr];
  24. reg_rd_addr = rd_addr;
  25. end
  26. endmodule