[原创] BB方案大结局之FPGA端软件实现篇——基于BB及FPGA的DAQ及DDS设计与实现

黑非拉   2014-6-22 19:39 楼主
BB方案大结局之FPGA端软件实现篇——基于BB及FPGA的高速数据采集及DDS信号发生器设计与实现

这一部分主要说明一下在FPGA端软件的设计中采用的小技巧并测试了GPMC对FPGA RAM的读取速率,展示一些实验的图片数据。

(1)开发平台及语言为:

QuartusII,Verilog与原理图输入相结合

(2)主要包括三个模块:

硬线连接DDS芯片与BB GPIO端口模块;

FPGA DDS模块;

数据采集与传输模块。

(3)FPGA管脚分配如下:
  1. #连接DDS芯片的管脚
  2. set_location_assignment PIN_121 -to DDSCHIP_FSEL
  3. set_location_assignment PIN_122 -to DDSCHIP_FSYNC
  4. set_location_assignment PIN_129 -to DDSCHIP_MCLK
  5. set_location_assignment PIN_119 -to DDSCHIP_PSEL0
  6. set_location_assignment PIN_120 -to DDSCHIP_PSEL1
  7. set_location_assignment PIN_126 -to DDSCHIP_SCLK
  8. set_location_assignment PIN_125 -to DDSCHIP_SDATA
  9. #连接BB GPIO,用于控制DDS芯片的管脚
  10. set_location_assignment PIN_96 -to IN_FSYNC
  11. set_location_assignment PIN_100 -to IN_SCLK
  12. set_location_assignment PIN_97 -to IN_SDATA
  13. //FPGA时钟与复位管脚
  14. set_location_assignment PIN_17 -to FPGA_CLK0
  15. set_location_assignment PIN_90 -to FPGA_RST
  16. //连接BB GPMC接口的管脚
  17. set_location_assignment PIN_72 -to GPMC_CLK
  18. set_location_assignment PIN_118 -to GPMC_A[1]
  19. set_location_assignment PIN_113 -to GPMC_A[2]
  20. set_location_assignment PIN_114 -to GPMC_A[3]
  21. set_location_assignment PIN_104 -to GPMC_A[4]
  22. set_location_assignment PIN_112 -to GPMC_A[5]
  23. set_location_assignment PIN_101 -to GPMC_A[6]
  24. set_location_assignment PIN_103 -to GPMC_A[7]
  25. set_location_assignment PIN_87 -to GPMC_A[8]
  26. set_location_assignment PIN_93 -to GPMC_A[9]
  27. set_location_assignment PIN_81 -to GPMC_AD[0]
  28. set_location_assignment PIN_80 -to GPMC_AD[1]
  29. set_location_assignment PIN_57 -to GPMC_AD[2]
  30. set_location_assignment PIN_58 -to GPMC_AD[3]
  31. set_location_assignment PIN_79 -to GPMC_AD[4]
  32. set_location_assignment PIN_76 -to GPMC_AD[5]
  33. set_location_assignment PIN_53 -to GPMC_AD[6]
  34. set_location_assignment PIN_55 -to GPMC_AD[7]
  35. set_location_assignment PIN_73 -to GPMC_AD[8]
  36. set_location_assignment PIN_65 -to GPMC_AD[9]
  37. set_location_assignment PIN_67 -to GPMC_AD[10]
  38. set_location_assignment PIN_71 -to GPMC_AD[11]
  39. set_location_assignment PIN_64 -to GPMC_AD[12]
  40. set_location_assignment PIN_63 -to GPMC_AD[13]
  41. set_location_assignment PIN_70 -to GPMC_AD[14]
  42. set_location_assignment PIN_69 -to GPMC_AD[15]
  43. set_location_assignment PIN_75 -to GPMC_CSN
  44. set_location_assignment PIN_59 -to GPMC_OEN_REN
  45. set_location_assignment PIN_60 -to GPMC_WEN
  46. #连接DAC的管脚
  47. set_location_assignment PIN_144 -to DAC_CLK
  48. set_location_assignment PIN_143 -to DAC_BIT[10]
  49. set_location_assignment PIN_142 -to DAC_BIT[9]
  50. set_location_assignment PIN_141 -to DAC_BIT[8]
  51. set_location_assignment PIN_139 -to DAC_BIT[7]
  52. set_location_assignment PIN_137 -to DAC_BIT[6]
  53. set_location_assignment PIN_136 -to DAC_BIT[5]
  54. set_location_assignment PIN_135 -to DAC_BIT[4]
  55. set_location_assignment PIN_134 -to DAC_BIT[3]
  56. set_location_assignment PIN_133 -to DAC_BIT[2]
  57. set_location_assignment PIN_132 -to DAC_BIT[1]
  58. #连接ADC的管脚
  59. set_location_assignment PIN_7 -to ADC_CLK
  60. set_location_assignment PIN_8 -to ADC_BIT[1]
  61. set_location_assignment PIN_9 -to ADC_BIT[2]
  62. set_location_assignment PIN_24 -to ADC_BIT[3]
  63. set_location_assignment PIN_25 -to ADC_BIT[4]
  64. set_location_assignment PIN_26 -to ADC_BIT[5]
  65. set_location_assignment PIN_27 -to ADC_BIT[6]
  66. set_location_assignment PIN_28 -to ADC_BIT[7]
  67. set_location_assignment PIN_30 -to ADC_BIT[8]
  68. set_location_assignment PIN_31 -to ADC_BIT[9]
  69. set_location_assignment PIN_32 -to ADC_BIT[10]
  70. #连接BB GPIO端口,辅助数据采集与传输的管脚
  71. set_location_assignment PIN_86 -to RD_INT_PULSE
  72. set_location_assignment PIN_74 -to WR_RDN
(4)硬线连接DDS芯片与BB GPIO端口模块

这部分FPGA原理图如图8所示:

图8:硬线连接DDS芯片与BBGPIO端口模块FPGA原理图
图9展示了DDS芯片输出的正弦波形,从图中可以看出,频率达到KHz后波形会有衰减,频率越高,衰减越厉害,这涉及放大器带宽及信号完整性问题,模拟部分有待深入修改。
图9:DDS芯片输出的正弦波
(5)FPGA DDS模块
这个模块的设计采用了一个小技巧,只用到了GPMC的A[1]、A[2]、A[3]三根地址线(特别注意16位模式下的GPMC A[0]地址线未用,具体可以参考GPMC的相关文档),这三根地址线配合GPMC写控制线WEN,利用FPGA搭建的若干三八译码器及寄存器产生中间控制信号CTL[15..0],写频率控制字的控制信号WFREQH、WFREQM、WFREQL,写相位的控制信号WPHASE,写波形数据的控制信号WDATA,写直流幅值的控制信号WDC,如图10 所示:
这一部分不再对DDS的基本原理进行阐述,关于基本原理可以参考之前我发的一篇帖子:https://bbs.eeworld.com.cn/thread-439651-1-1.html,理解这一部分一定需要与BB端应用程序dds.c文件中的相关函数配合起来一起看,否则很难理解,总之,一句话代过:只可意会,不可言传。
图11展示了FPGA DDS输出的各种波形,含直流、正弦波、斜波、以及方波,仍然存在波形失真的问题。
图10:FPGA DDS模块控制信号生成部分FPGA原理图
图11 :FPGA DDS输出的各种波形
(6)数据采集与传输模块
这个模块采用FPGA内的双口RAM作为数据缓存,缓存的容量为一行数据的容量,采样频率为25KHz,FPGA原理图下图12所示:
图12:数据采集与传输模块FPGA原理图
这个部分测试了GPMC对FPGA RAM的读取速率,BB通过GPMC接口连续读FPGA RAM,用示波器分别探测A[1]地址线以及WR_RDN管脚信号,如图13所示。图13的最上面一幅图是示波器探测的A[1]地址线,其高或低电平持续的时间约为+441.000ns,一个高电平或低电平期间读取16bits的数据,数据读取速率约为36.3Mbps。中间一幅图测量了读取512个点,即一行数据的时间为+225.600000us,根据上面的数据读取速率计算一行数据的读取时间理论值为+441.000ns*512=+225.792000us,理论值与测量值基本吻合。下面一幅图是示波器探测的WR_RDN管脚信号,WR_RDN高电平期间读一行数据,WR_RDN低电平期间写一行数据。读一行数据的时间显示为+242.000000us,与上述的值基本吻合,另外测量时数据采样频率设置的为500KHz,512/500KHz=+1.024000000ms,与测量值+1.030000000ms也是相当吻合的。
这个部分的研究基本回答了wy52119514在论坛这个帖子中的提问,https://bbs.eeworld.com.cn/thread-421181-1-1.html
大哥你测过GPMC的速度可以达到多少呢?,以你这个方式
图13:GPMC读FPGA RAM速率测试图
(8)附件3为FPGA端软件的全部源代码:
附件3: DDS_FPGA.rar
至此,BB方案大结局的内容已经齐全了。
本帖最后由 黑非拉 于 2014-6-22 19:39 编辑
  • 图8:硬线连接DDS芯片与BB GPIO端口模块FPGA原理图
  • 图9:DDS芯片输出的正弦波
  • 图10:FPGA DDS模块控制信号生成部分FPGA原理图
  • 图11 :FPGA DDS输出的各种波形
  • 图12:数据采集与传输模块FPGA原理图
  • 图13:GPMC读FPGA RAM速率测试图

回复评论 (2)

感谢分享啊。
点赞  2014-6-22 23:31
点赞  2016-12-20 12:12
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复