由XILINX官网文档PG058 “LogiCORE IP Block Memory Generator v8.2”
FPGA 内部块RAM 的读时序如下图:
可知,块RAM的读延时为两个时钟周期。
FPGA 内部块RAM 的写时序如下图:
可知,块RAM 的写延时为0,但是RAM 中的内容是在写的下一个时钟改变。
在ISE下实现对FPGA内部块RAM 的读写代码:
-
module TOP( -
input USER_CLK -
); -
`define DLY #1 -
reg FPGA_Enable=0; -
reg[3:0] FPGA_Write_Enable=4'h0; -
reg[31:0] FPGA_Address=0; -
reg[31:0] FPGA_Write_Data=0; -
reg[31:0] FPGA_Read_Data_reg=0; -
wire[31:0] FPGA_Read_Data; -
reg[10:0] count=0; -
always @ (posedge USER_CLK) -
begin -
count <= count + 1; -
if(count<=100) -
begin -
FPGA_Enable <= 0; -
FPGA_Write_Enable <= 4'h0; -
end -
else if((count <= 105)&&(count >100)) -
begin -
FPGA_Enable <= 1; -
FPGA_Write_Enable <= 4'hf; -
FPGA_Address <= FPGA_Address + 4; -
FPGA_Write_Data <= FPGA_Write_Data + 1; -
end -
else if((count <= 110)&&(count >105)) -
begin -
FPGA_Enable <= 0; -
FPGA_Write_Enable <= 4'h0; -
FPGA_Address <= 0; -
FPGA_Write_Data <= 0; -
end -
else if((count <= 117)&&(count >110)) -
begin -
FPGA_Enable <= 1; -
FPGA_Write_Enable <= 4'h0; -
FPGA_Read_Data_reg <= FPGA_Read_Data; -
FPGA_Address <= FPGA_Address + 4; -
end -
else if(count == 118) -
begin -
FPGA_Enable <= 0; -
count <= count; -
end -
end -
BBBB your_instance_name ( -
.clka(USER_CLK), // input clka -
.ena(FPGA_Enable), // input ena -
.wea(FPGA_Write_Enable), // input [3 : 0] wea -
.addra(FPGA_Address), // input [31 : 0] addra -
.dina(FPGA_Write_Data), // input [31 : 0] dina -
.douta(FPGA_Read_Data), // output [31 : 0] douta -
.clkb(clkb), // input clkb -
.enb(enb), // input enb -
.web(web), // input [3 : 0] web -
.addrb(addrb), // input [31 : 0] addrb -
.dinb(dinb), // input [31 : 0] dinb -
.doutb(doutb) // output [31 : 0] doutb -
); -
endmodule
效果图:
从上图可以看出,在地址4~20里面写入了1-5的数,数据读出的时候对应地址的数据都延时了两个时钟周期才输出。