FPGA开发中使用BRAM IP core可以配置读写模式,以下分析不同的模式bram行为的不同:
1、no change
是一种读、写互不干扰的模式,他的HDL code 描述如下
reg [7:0] RAM[0:255] ;
always@(posedge clk)
begin
if(en == 1'b1)
begin
if(we == 1'b1)
begin
RAM[addr] <= din ;
end
else
begin
dout <= RAM[addr] ;
end
end
else
begin
dout <= 0 ;
end
end
2、read first
发生读写冲突时读优先的操作模式
reg [7:0] RAM[0:255] ;
always@(posedge clk)
begin
if(en == 1'b1)
begin
if(we == 1'b1)
begin
RAM[addr] <= din ;
end
dout <= RAM[addr] ;
end
else
begin
dout <= 0 ;
end
end
3、write first
发生读写冲突时、写优先的操作
reg [7:0] RAM[0:255] ;
always@(posedge clk)
begin
if(en == 1'b1)
begin
if(we == 1'b1)
begin
RAM[addr] <= din ;
dout <= din ;
end
else
begin
dout <= RAM[addr] ;
end
end
else
begin
dout <= 0 ;
end
end
4、异步读
异步读模式不需要操作 en 信号,当we信号有效时,RAM写入当前的din,无论何时,dout都会根据addr输出bram中的数据,当读写冲突发生的时候,dout会先输出旧的值,写操做完成之后输出写入的值
reg [7:0] RAM[0:255] ;
always@(posedge clk)
begin
if(we == 1'b1)
begin
RAM[addr] <= din ;
end
assign dout = RAM[addr] ;
end
5、伪同步读
采用实际上是异步但表现上好似同步的方式读取BRAM中的数据
reg [7:0] RAM[0:255] ;
always@(posedge clk)
begin
if(we == 1'b1)
begin
RAM[addr] <= din ;
end
dout <= RAM[addr] ;
end
6、真同步读
采用同步的方式从ram中读数据的操作模式
reg [7:0] RAM[0:255] ;
always@(posedge clk)
begin
if(we == 1'b1)
begin
RAM[addr] <= din ;
end
addr_lock <= addr ;
end
assign dout <= RAM[addr_lock] ;