two port ram ---TP RAM
1.1 概念
伪双口RAM有两个读写端口,但一个端口只能读,一个端口只能写。
1.2 使用
1、一般FIFO内部例化的都是伪双口RAM
2、如果读和写同时有效,且读和写是同一个地址时,发生RAM读写冲突,此时会把最新的写数据直接赋给读数据,称为写穿通到读
1.3 伪双口RAM读写代码
下面展示 功能代码
。
`timescale 1ns / 1ps
///
// 读写模块 Verilog 功能代码如下:
module tp_ram_ab_rw(
input sys_clk,
input sys_rst_n
);
wire ram_en ;
wire ram_wrena ;
wire ram_rdenb ;
wire [7:0] ram_rd_data ;
wire [4:0] ram_wr_addr ;
wire [4:0] ram_rd_addr ;
reg [7:0] ram_wr_data ;
reg [7:0] ram_cnt ;
assign ram_rdenb = ((ram_cnt >= 8'd5) && (ram_cnt <= 8'd32))? 1'b1:1'b0 ;
assign ram_wrena = ((ram_cnt >= 8'd0) && (ram_cnt <= 8'd31))? 1'b1:1'b0 ;
assign ram_wr_addr = ram_cnt[4:0];
assign ram_rd_addr = ram_cnt[4:0] - 5'd1 ;
always @ (posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
ram_cnt <= 8'd0 ;
else if(ram_cnt == 8'd63)
ram_cnt <= 8'd0 ;
else
ram_cnt <= ram_cnt + 1'b1 ;
always @ (posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
ram_wr_data <= 8'd0 ;
else if(ram_wrena)
if(ram_wr_data == 8'd31)
ram_wr_data <= 8'd0 ;
else
ram_wr_data <= ram_wr_data + 1'b1 ;
tp_ram_ab_ctrl tp_ram_ab_ctrl_inst(
.clka(sys_clk) ,
.clkb(sys_clk) ,
.wena(ram_wrena) ,
.ena (ram_en) ,
.enb (ram_rdenb) ,
.dina(ram_wr_data) ,
.wr_addra(ram_wr_addr),
.rd_addrb(ram_rd_addr),
.doutb(ram_rd_data)
);
endmodule
// 控制模块 Verilog 功能代码如下:
module tp_ram_ab_ctrl(
input clka,
input clkb,
input wena,
input ena,
input enb,
input [7:0] dina,
input [4:0] wr_addra,
input [4:0] rd_addrb,
output reg [7:0] doutb
);
reg [7:0] ram [31:0] ;
always @ (posedge clka)
if(wena)
ram[wr_addra] <= dina ;
always @ (posedge clkb)
if(enb)
doutb <= ram[wr_addra] ;
else
doutb <=8'hx;
endmodule
// 仿真模块 Verilog 功能代码如下:
module tb_tp_ram(
);
reg clk ;
reg rst ;
initial begin
clk = 1'b0 ;
rst = 1'b0;
#400
rst = 1'b1;
end
always #10 clk = ~clk ;
tp_ram_ab_rw tp_ram_ab_rw_inst(
.sys_clk (clk),
.sys_rst_n (rst)
);
endmodule