当前位置:   article > 正文

【Quartus FPGA】EMIF DDR3 读写带宽测试_quartus ddr3

quartus ddr3

通信原理中,通信系统的有效性用带宽来衡量,带宽定义为每秒传输的比特数,单位 b/s,或 bps。在 DDR3 接口的产品设计中,DDR3 读/写带宽是设计者必须考虑的指标。本文主要介绍了 Quartus FPGA 平台 EMIF 参数配置,以及测试 DDR3 读写带宽的过程,FPGA 器件型号是 Cyclone 10 GX 10CX220YF780E6G,DDR3 颗粒型号是 Winbond W631GG6KB。

目录

1 EMIF IP 配置

2 AMM 接口

3 读写带宽测试


1 EMIF IP 配置

        在进行 EMIF DDR3 读写带宽测试之前,先确保 EMIF DDR3 IP 时钟与时序参数配置正确。

         General -> Clocks 选项卡,填写内存时钟频率 Memory clock frequency ,这里填了 933M,PLL 参考时钟频率为 116.625MHz.

        Memory -> Latency and Burst 选项卡,根据 DDR3 内存颗粒用户手册,设置 Memory CAS latency 和 Memory write CAS latency 值。

        这里所使用的 DDR3 内存型号为 Winbond W631GG6KB,933M 对应的 tCK 为 1.07ns,根据手册得知,CL = 13,CWL = 9.

 Memory Timing 参数如下:

 

2 AMM 接口

        Quartus EMIF IP 提供了 AMM(Avalon Memory-Mapped) 接口,用于 DDR3 数据的传输,AMM 接口定义如下。

        amm_ready 扮演 waitrequest_n 的角色,当控制器处于 busy 状态时,该信号将会拉低;amm_burstcount 表示读/写 burst 传输的周期数;DDR3 颗粒数据接口位宽是 16bit,8n-prefetch,所以 amm_writedata 与 amm_readdata 的位宽是 16bit × 8 = 128bit。

AMM 接口读写时序图与其他细节,可以参考 Intel 官网 Avalon® 接口规范简介

3 读写带宽测试

        在本设计中,DDR3 读写采用固定地址突发的方式,突发传输 amm_burstcount 大小固定,同时定义两个计数器 wr_data_cnt 与 rd_data_cnt,用于一段时间读写数据的计数,需要注意计数器位宽,避免溢出的情况。这里计数器位宽定义 32bit,时间间隔取 200ms。

VHDL 设计代码如下,

  1. process(sys_rst,sys_clk)
  2. begin
  3. if sys_rst = '1' then
  4. pstate <= st_init;
  5. buf_test_wr_req <= '0';
  6. buf_test_rd_req <= '0';
  7. test_wr_q <= (others => '0');
  8. test_wr_mask <= (others => '0');
  9. wr_cnt_scope <= (others => '0');
  10. rd_cnt_scope <= (others => '0');
  11. rd_err_cnt_scope <= (others => '0');
  12. elsif rising_edge(sys_clk) then
  13. if timeout_event = '1' then
  14. wr_cnt_scope <= (others => '0');
  15. rd_cnt_scope <= (others => '0');
  16. rd_err_cnt_scope <= (others => '0');
  17. end if;
  18. case(pstate) is
  19. when st_init =>
  20. -- power on delay and initialization
  21. if ddr_init_done = '1' then
  22. pstate <= st_idle;
  23. else
  24. pstate <= st_init;
  25. end if;
  26. when st_idle =>
  27. -- idle state
  28. pstate <= st_test_write;
  29. when st_test_write =>
  30. -- pull up req and wait fot ack
  31. if buf_test_wr_req = '1' and test_wr_ack = '1' then
  32. pstate <= st_test_write_end;
  33. buf_test_wr_req <= '0';
  34. else
  35. pstate <= st_test_write;
  36. buf_test_wr_req <= '1';
  37. end if;
  38. when st_test_write_end =>
  39. -- wait write ending
  40. if test_wr_end = '1' then
  41. pstate <= st_test_read;
  42. else
  43. pstate <= st_test_write_end;
  44. end if;
  45. test_wr_q(4*128-1 downto 3*128) <= DDR_DATA_PATTERN;
  46. test_wr_q(3*128-1 downto 2*128) <= DDR_DATA_PATTERN;
  47. test_wr_q(2*128-1 downto 1*128) <= DDR_DATA_PATTERN;
  48. test_wr_q(1*128-1 downto 0*128) <= DDR_DATA_PATTERN;
  49. test_wr_mask <= (others => '0');
  50. if test_wr_rden = '1' then
  51. wr_cnt_scope <= wr_cnt_scope + 1;
  52. end if;
  53. when st_test_read =>
  54. -- pull up req and wait for ack
  55. if buf_test_rd_req = '1' and test_rd_ack = '1' then
  56. pstate <= st_test_read_end;
  57. buf_test_rd_req <= '0';
  58. else
  59. pstate <= st_test_read;
  60. buf_test_rd_req <= '1';
  61. end if;
  62. when st_test_read_end =>
  63. -- wait read ending
  64. if test_rd_end = '1' then
  65. pstate <= st_idle;
  66. else
  67. pstate <= st_test_read_end;
  68. if test_rd_rdvld = '1' then
  69. rd_cnt_scope <= rd_cnt_scope + 1;
  70. if test_rd_rdata(4*128-1 downto 3*128) /= DDR_DATA_PATTERN then
  71. rd_err_cnt_scope <= rd_err_cnt_scope + 1;
  72. elsif test_rd_rdata(3*128-1 downto 2*128) /= DDR_DATA_PATTERN then
  73. rd_err_cnt_scope <= rd_err_cnt_scope + 1;
  74. elsif test_rd_rdata(2*128-1 downto 1*128) /= DDR_DATA_PATTERN then
  75. rd_err_cnt_scope <= rd_err_cnt_scope + 1;
  76. elsif test_rd_rdata(1*128-1 downto 0*128) /= DDR_DATA_PATTERN then
  77. rd_err_cnt_scope <= rd_err_cnt_scope + 1;
  78. end if;
  79. end if;
  80. end if;
  81. when others => NULL;
  82. end case;
  83. end if;
  84. end process;

以下是突发长度取 64 和 127 时,读写计数测试结果如下。

突发长度读计数写计数总个数
6413,119,67713,119,68026,239,357
12713,830,68113,830,79427,661,475

对应带宽与总效率测试结果如下。

突发长度读带宽写带宽总效率
648.397 Gb/s8.397 Gb/s56.25%
1278.852 Gb/s8.852 Gb/s59.30%

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号