一個雙肩背包
有多難?
戳一下試試看!
→_→
長摁識别
FPGA 内部塊RAM 的讀時序如下圖:
可知,塊RAM的讀延時為兩個時鐘周期。
FPGA 内部塊RAM 的寫時序如下圖:
可知,塊RAM 的寫延時為0,但是RAM 中的内容是在寫的下一個時鐘改變。
在ISE下實現對FPGA内部塊RAM 的讀寫代碼:
1. module TOP(
2. input USER_CLK
3. );
4.
5. `define DLY #1
6. reg FPGA_Enable=0;
7. reg[3:0] FPGA_Write_Enable=4'h0;
8. reg[31:0] FPGA_Address=0;
9. reg[31:0] FPGA_Write_Data=0;
10. reg[31:0] FPGA_Read_Data_reg=0;
11. wire[31:0] FPGA_Read_Data;
12.
13. reg[10:0] count=0;
14. always @ (posedge USER_CLK)
15. begin
16. count <= count 1;
17. if(count<=100)
18. begin
19. FPGA_Enable <= 0;
20. FPGA_Write_Enable <= 4'h0;
21. end
22. else if((count <= 105)&&(count >100))
23. begin
24. FPGA_Enable <= 1;
25. FPGA_Write_Enable <= 4'hf;
26. FPGA_Address <= FPGA_Address 4;
27. FPGA_Write_Data <= FPGA_Write_Data 1;
28. end
29. else if((count <= 110)&&(count >105))
30. begin
31. FPGA_Enable <= 0;
32. FPGA_Write_Enable <= 4'h0;
33. FPGA_Address <= 0;
34. FPGA_Write_Data <= 0;
35. end
36. else if((count <= 117)&&(count >110))
37. begin
38. FPGA_Enable <= 1;
39. FPGA_Write_Enable <= 4'h0;
40. FPGA_Read_Data_reg <= FPGA_Read_Data;
41. FPGA_Address <= FPGA_Address 4;
42. end
43. else if(count == 118)
44. begin
45. FPGA_Enable <= 0;
46. count <= count;
47.
48. end
49. end
50.
51. BBBB your_instance_name (
52. .clka(USER_CLK), // input clka
53. .ena(FPGA_Enable), // input ena
54. .wea(FPGA_Write_Enable), // input [3 : 0] wea
55. .addra(FPGA_Address), // input [31 : 0] addra
56. .dina(FPGA_Write_Data), // input [31 : 0] dina
57. .douta(FPGA_Read_Data), // output [31 : 0] douta
58.
59.
60. .clkb(clkb), // input clkb
61. .enb(enb), // input enb
62. .web(web), // input [3 : 0] web
63. .addrb(addrb), // input [31 : 0] addrb
64. .dinb(dinb), // input [31 : 0] dinb
65. .doutb(doutb) // output [31 : 0] doutb
66. );
67. endmodule
效果圖:
從上圖可以看出,在地址4~20裡面寫入了1-5的數,數據讀出的時候對應地址的數據都延時了兩個時鐘周期才輸出。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!