verilog 单端口同步 RAM

例子

具有一个地址的简单单端口 RAM,用于读/写操作。

module ram_single #(
  parameter DATA_WIDTH=8,          //数据总线宽度
  parameter ADDR_WIDTH=8           //地址总线的宽度
)(
  input  [(DATA_WIDTH-1):0] data,  //要写入的数据
  input  [(ADDR_WIDTH-1):0] addr,  //写/读操作地址
  input                     we,    //写使能信号
  input                     clk,   //时钟信号
  output [(DATA_WIDTH-1):0] q      //读取数据
);

  reg [DATA_WIDTH-1:0] ram [2**ADDR_WIDTH-1:0];
  reg [ADDR_WIDTH-1:0] addr_r;

  always @(posedge clk) begin //WRITE
      if (we) begin
          ram[addr] <= data;
      end
      addr_r <= addr;
  end

  assign q = ram[addr_r]; //READ

endmodule