本帖最后由 黑非拉 于 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管脚分配如下:- #连接DDS芯片的管脚
- set_location_assignment PIN_121 -to DDSCHIP_FSEL
- set_location_assignment PIN_122 -to DDSCHIP_FSYNC
- set_location_assignment PIN_129 -to DDSCHIP_MCLK
- set_location_assignment PIN_119 -to DDSCHIP_PSEL0
- set_location_assignment PIN_120 -to DDSCHIP_PSEL1
- set_location_assignment PIN_126 -to DDSCHIP_SCLK
- set_location_assignment PIN_125 -to DDSCHIP_SDATA
- #连接BB GPIO,用于控制DDS芯片的管脚
- set_location_assignment PIN_96 -to IN_FSYNC
- set_location_assignment PIN_100 -to IN_SCLK
- set_location_assignment PIN_97 -to IN_SDATA
- //FPGA时钟与复位管脚
- set_location_assignment PIN_17 -to FPGA_CLK0
- set_location_assignment PIN_90 -to FPGA_RST
- //连接BB GPMC接口的管脚
- set_location_assignment PIN_72 -to GPMC_CLK
- set_location_assignment PIN_118 -to GPMC_A[1]
- set_location_assignment PIN_113 -to GPMC_A[2]
- set_location_assignment PIN_114 -to GPMC_A[3]
- set_location_assignment PIN_104 -to GPMC_A[4]
- set_location_assignment PIN_112 -to GPMC_A[5]
- set_location_assignment PIN_101 -to GPMC_A[6]
- set_location_assignment PIN_103 -to GPMC_A[7]
- set_location_assignment PIN_87 -to GPMC_A[8]
- set_location_assignment PIN_93 -to GPMC_A[9]
- set_location_assignment PIN_81 -to GPMC_AD[0]
- set_location_assignment PIN_80 -to GPMC_AD[1]
- set_location_assignment PIN_57 -to GPMC_AD[2]
- set_location_assignment PIN_58 -to GPMC_AD[3]
- set_location_assignment PIN_79 -to GPMC_AD[4]
- set_location_assignment PIN_76 -to GPMC_AD[5]
- set_location_assignment PIN_53 -to GPMC_AD[6]
- set_location_assignment PIN_55 -to GPMC_AD[7]
- set_location_assignment PIN_73 -to GPMC_AD[8]
- set_location_assignment PIN_65 -to GPMC_AD[9]
- set_location_assignment PIN_67 -to GPMC_AD[10]
- set_location_assignment PIN_71 -to GPMC_AD[11]
- set_location_assignment PIN_64 -to GPMC_AD[12]
- set_location_assignment PIN_63 -to GPMC_AD[13]
- set_location_assignment PIN_70 -to GPMC_AD[14]
- set_location_assignment PIN_69 -to GPMC_AD[15]
- set_location_assignment PIN_75 -to GPMC_CSN
- set_location_assignment PIN_59 -to GPMC_OEN_REN
- set_location_assignment PIN_60 -to GPMC_WEN
- #连接DAC的管脚
- set_location_assignment PIN_144 -to DAC_CLK
- set_location_assignment PIN_143 -to DAC_BIT[10]
- set_location_assignment PIN_142 -to DAC_BIT[9]
- set_location_assignment PIN_141 -to DAC_BIT[8]
- set_location_assignment PIN_139 -to DAC_BIT[7]
- set_location_assignment PIN_137 -to DAC_BIT[6]
- set_location_assignment PIN_136 -to DAC_BIT[5]
- set_location_assignment PIN_135 -to DAC_BIT[4]
- set_location_assignment PIN_134 -to DAC_BIT[3]
- set_location_assignment PIN_133 -to DAC_BIT[2]
- set_location_assignment PIN_132 -to DAC_BIT[1]
- #连接ADC的管脚
- set_location_assignment PIN_7 -to ADC_CLK
- set_location_assignment PIN_8 -to ADC_BIT[1]
- set_location_assignment PIN_9 -to ADC_BIT[2]
- set_location_assignment PIN_24 -to ADC_BIT[3]
- set_location_assignment PIN_25 -to ADC_BIT[4]
- set_location_assignment PIN_26 -to ADC_BIT[5]
- set_location_assignment PIN_27 -to ADC_BIT[6]
- set_location_assignment PIN_28 -to ADC_BIT[7]
- set_location_assignment PIN_30 -to ADC_BIT[8]
- set_location_assignment PIN_31 -to ADC_BIT[9]
- set_location_assignment PIN_32 -to ADC_BIT[10]
- #连接BB GPIO端口,辅助数据采集与传输的管脚
- set_location_assignment PIN_86 -to RD_INT_PULSE
- 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 所示:
图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也是相当吻合的。
大哥你测过GPMC的速度可以达到多少呢?,以你这个方式
图13:GPMC读FPGA RAM速率测试图
(8)附件3为FPGA端软件的全部源代码:
附件3: DDS_FPGA.rar
至此,BB方案大结局的内容已经齐全了。