【精品博文】FPGA内部双口块RAM 读写实现

一个双肩背包

有多难?

戳一下试试看!

→_→

长摁识别

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的数,数据读出的时候对应地址的数据都延时了两个时钟周期才输出。

(0)

相关推荐