vivado ram核同時讀寫疑問

當建立ram核以後, 若是ab兩個端口,使能同時有效,並且地址都是相同地址。換句話說,對ram地址同時讀寫, b端口會輸出什麼值?
結果是,要麼是ram中原先存儲的值, 要麼是剛剛寫進去的值。
建立單口ram核 時候,
選擇的是write first。 common clock 不打勾。 primitive output register打勾。
下面是測試文件。 由於設置了write first。因此,當同時讀寫一個ram 地址時,讀出的數據是剛剛寫進去的值。當ram地址發送改變的時候,下一個時鐘不會出數據,要再過一個時鐘,ram中 數據纔會出來。ide

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2021/01/30 08:07:49
// Design Name:
// Module Name: ramIP_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module ramIP_tb();測試

reg clk,clkTFT; //50M , 33M
initial clk = 1;
initial clkTFT = 1;
always #10 clk = ~clk;
always #15 clkTFT = ~clkTFT;code

reg rst_n;
reg [15:0] din;
reg wea, enb;
reg [15:0] addra;
reg [15:0] addrb;
wire [15:0] dout;
initial begin
rst_n = 0;
din = 0;
enb = 0;
addra = 0;
addrb = 0;
#303;
rst_n = 1;
//把ram寫滿
repeat(65536) begin
wea=1;
#20;
din =din +1;
addra = addra+ 1;
end
wea=0;ip

// #10000;
#9997; enb=1;
#3;
//讀ram
repeat(65536) begin
#30;
addrb = addrb+ 1;
end
#30;
enb=0;
#10000;ci

//讀寫同時有效,發現讀出來的數據是剛剛寫進去的值。
  addra=16'h0000;
  din = 16'h1111;
  wea=1;
  enb=1;
  #100;
  wea=0;
  enb=0;
  #1000;

  enb=1;
  #100;
  enb=0;

  #10000;
  $stop;

endget

ram16X64K ram(.clka(clk),
.ena(1),
.wea(wea),
.addra(addra),
.dina(din),
.clkb(clkTFT),
.enb(enb),
.addrb(addrb),
.doutb(dout)
);
endmoduleit

相關文章
相關標籤/搜索