FPGA 內部雙口塊RAM 讀寫實現
由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的數,資料讀出的時候對應地址的資料都延時了兩個時鐘週期才輸出。