伪双口 RAM 的读写地址是独立的,可以随机选择写或读地址,同时进行读写操作。代码如下,在激励文件中定义了 en 信号,在其有效时发送读地址。
代码如下:
(CSDN代码块不支持Verilog,代码复制到notepad++编辑器中,语言选择Verilog,看得更清楚)
module top
(
input [7:0] data,
input [5:0] write_addr,
input [5:0] read_addr,
input wr,
input rd,
input clk,
output reg [7:0] q
);
reg [7:0] ram[63:0]; //declare ram
reg [5:0] addr_reg; //addr register
always @ (posedge clk)
begin
if (wr) //write
ram[write_addr] <= data;
if (rd) //read
q <= ram[read_addr];
end
endmodule
激励文件如下:
`timescale 1 ns/1 ns
module top_tb() ;
reg [7:0] data ;
reg [5:0] write_addr ;
reg [5:0] read_addr ;
reg wr ;
reg clk ;
reg rd ;
wire [7:0] q ;
initial
begin
data = 0 ;
write_addr = 0 ;
read_addr = 0 ;
wr = 0 ;
rd = 0 ;
clk = 0 ;
#100 wr = 1 ;
#20 rd = 1 ;
end
always #10 clk = ~clk ;
always @(posedge clk)
begin
if (wr)
begin
data <= data + 1'b1 ;
write_addr <= write_addr + 1'b1 ;
if (rd)
read_addr <= read_addr + 1'b1 ;
end
end
top t0(.data(data),
.write_addr(write_addr),
.read_addr(read_addr),
.clk(clk),
.wr(wr),
.rd(rd),
.q(q)) ;
endmodule