1. 程式人生 > >FPGA 內部雙口塊RAM 讀寫實現

FPGA 內部雙口塊RAM 讀寫實現

XILINX官網文件PG058 “LogiCORE IP Block Memory Generator v8.2”

FPGA 內部塊RAM 的讀時序如下圖:

   可知,塊RAM的讀延時為兩個時鐘週期。

FPGA 內部塊RAM 的寫時序如下圖:

 可知,塊RAM 的寫延時為0,但是RAM 中的內容是在寫的下一個時鐘改變。

在ISE下實現對FPGA內部塊RAM 的讀寫程式碼:

  1. module TOP(

  2. input USER_CLK

  3. );

  4. `define DLY #1

  5. reg FPGA_Enable=0;

  6. reg[3:0] FPGA_Write_Enable=4'h0;

  7. reg[31:0] FPGA_Address=0;

  8. reg[31:0] FPGA_Write_Data=0;

  9. reg[31:0] FPGA_Read_Data_reg=0;

  10. wire[31:0] FPGA_Read_Data;

  11. reg[10:0] count=0;

  12. always @ (posedge USER_CLK)

  13. begin

  14. count <= count + 1;

  15. if(count<=100)

  16. begin

  17. FPGA_Enable <= 0;

  18. FPGA_Write_Enable <= 4'h0;

  19. end

  20. else if((count <= 105)&&(count >100))

  21. begin

  22. FPGA_Enable <= 1;

  23. FPGA_Write_Enable <= 4'hf;

  24. FPGA_Address <= FPGA_Address + 4;

  25. FPGA_Write_Data <= FPGA_Write_Data + 1;

  26. end

  27. else if((count <= 110)&&(count >105))

  28. begin

  29. FPGA_Enable <= 0;

  30. FPGA_Write_Enable <= 4'h0;

  31. FPGA_Address <= 0;

  32. FPGA_Write_Data <= 0;

  33. end

  34. else if((count <= 117)&&(count >110))

  35. begin

  36. FPGA_Enable <= 1;

  37. FPGA_Write_Enable <= 4'h0;

  38. FPGA_Read_Data_reg <= FPGA_Read_Data;

  39. FPGA_Address <= FPGA_Address + 4;

  40. end

  41. else if(count == 118)

  42. begin

  43. FPGA_Enable <= 0;

  44. count <= count;

  45. end

  46. end

  47. BBBB your_instance_name (

  48. .clka(USER_CLK), // input clka

  49. .ena(FPGA_Enable), // input ena

  50. .wea(FPGA_Write_Enable), // input [3 : 0] wea

  51. .addra(FPGA_Address), // input [31 : 0] addra

  52. .dina(FPGA_Write_Data), // input [31 : 0] dina

  53. .douta(FPGA_Read_Data), // output [31 : 0] douta

  54. .clkb(clkb), // input clkb

  55. .enb(enb), // input enb

  56. .web(web), // input [3 : 0] web

  57. .addrb(addrb), // input [31 : 0] addrb

  58. .dinb(dinb), // input [31 : 0] dinb

  59. .doutb(doutb) // output [31 : 0] doutb

  60. );

  61. endmodule

效果圖:

從上圖可以看出,在地址4~20裡面寫入了1-5的數,資料讀出的時候對應地址的資料都延時了兩個時鐘週期才輸出。