磕磕碰碰 发表于 2022-6-2 16:23:08

【智多晶FPGA-040】【开发流程】AD7606串口数据传输实验


工程源码|----01_设计实例 |--------AC208_ad7606_spi_driver_uart.zip
相关视频课程暂无相关视频课程
本实验对各开发板支持情况
开发板型号AC208()
是否支持√


文档所涉及文件说明本次实验配套的文件压缩包名为AC208_ad7606_spi_driver_uart.zip,解压后可得到配套的工程文件,说明文档和调试工具。
n AC208_ad7606_spi_driver_uart.zip:基于AC208开发板智多晶平台AD7606串行数据采集系统源工程n ADCdata_to_wave_v1_1.m:基于MATLAB的采样结果数据处理函数n sscom5.13.1: 串口调试工具
n 实验说明手册
导读本节介绍了基于FPGA的AD7606串行驱动数据采集系统实验步骤。案例基于智多晶系列FPGA,结合ADI公司的16位8通道并行采样ADC芯片,通过开发板上串口,实现对AD7606型8通道16位ADC的数据转换控制并输出。数据采集系统主要内容分为数据采集、数据处理、数据存储和数据传输几个部分。就整个系统而言,为了实现数据的控制采集,系统一般需要包括采集器,A/D转换模块,数据采集控制器,PC端,通信线路等一系列硬件支持。其中AD转换模块,对模拟信号进行转换输入,采集控制部分控制采集数据的参数量,PC端数据分析,对采集的数据进行收集分析。
系统的模块设计大多基于原有工程进行设计,这里不在做过多的介绍,这里新设计AD7606串行驱动模块。下面我们对此模块的设计进行介绍。
若要通过串行接口从AD7606回读数据。在串行模式下CS和SCLK信号用来传输AD7606的数据。AD7606有两个串行数据输出引脚: DoutA和DoutB。可通过单或双串行线路从AD7606回读数据。对于AD7606,通道V1至V4的转换结果首先出现在DoutA上,通道V5至V8的转换结果则首先出现在DoutB。

接口名称I/O功能描述
ClkI驱动模块工作时钟信号50MHz,四分频可得到模块工作时钟
Reset_nI模块复位信号,低电平复位
Speed_SetI采样频率控制参数输入
Dout_AIAD7606模块数据采集串行输入A,输入1—4通道数据
Dout_BIAD7606模块数据采集串行输入B,输入5—8通道数据
ad7606_cs_n_oO在串行模式使能串行数据帧传输,低电平有效,并逐个输出串行输出数据的最高有效位(MSB)。
ad7606_rd_n_oO在串行模式下,此引脚用作数据传输的串行时钟输人。
ad7606_os_oO过采样模式引脚,不使用过采样
ad7606_convst_oO转换有效信号,用来启动模拟输人通道转换。本模块默认短接。引脚从低电平变为高电平时,相应模拟输人的前端采样保持电路被设置为保持。
ad7606_db15OBYTE SEL引脚。当PAR/SER/BYTESEL = 1时, BYTE SEL引脚用来在串行接口模式与并行字节接口模式之间做出选择。串行模式设置为0。
ad7606_db14_9O在串行模式下这些引脚设置为与AGND相连
ad7606_db6_0O在串行模式下这些引脚设置为与AGND相连
ad7606_frstdataIFRSTDATA输出信号指示何时在并行、字节或串行接口上回读第一通道V1。在串行模式下,FRSTDATA在CS下降沿变为高电平,因为此时将在DoutA上输出V1的MSB。在CS下降沿之后的第16个SCLK下降沿,它恢复低电平。
ad7606_reset_oO复位输人。当设置为逻辑高电平时,RESET上升沿复位模块。
data_flagO数据采集通道有效标志信号
data_aO1—4通道数据输出
data_bO5—8通道数据输出
data_1-8O通道数据单独输出


进行数据采样频率控制,在默认设置下SCLK_CNT计数到130完成一次数据采集。进行驱动逻辑设计,在第一个下降沿开始获取数据
      always@(posedge Clk ornegedge Reset_n)      if(!Reset_n)begin                ad7606_cs_n_o<= 1;                data_a<= 16'd0;                data_b<= 16'd0;                ad7606_convst_o<= 1;                ad7606_reset_o<= 0;                data1<= 0;                data2<= 0;      end      else begin                case(SCLK_CNT)                         0:                                  begin                                           ad7606_cs_n_o<= 1;                                           data_a<= data_a;                                           data_b<= data_b;                                           ad7606_convst_o<= 0;                                           ad7606_rd_n_o<= 1;                                  end                         1:begin                                      ad7606_convst_o <= 1;                                           ad7606_cs_n_o<= 0;                                           ad7606_rd_n_o<= 1;                           end                         2:begin                                            ad7606_rd_n_o<= 1;                                           ad7606_cs_n_o<= 0;                           end
                         4 ,6 ,8 ,10,12,14,16,18,20,22,24,26,28,30,32,                        36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,                         68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,                         100,102,104,106,108,110,112,114,116,118,120,122,124,126,128:                         begin                                           ad7606_rd_n_o<= 1;                         end                         3, 35,67,99:begin data1[15]<=Dout_A;data2[15]<= Dout_B;ad7606_rd_n_o<= 0;end                         5, 37,69,101:begin data1[14]<=Dout_A;data2[14]<= Dout_B;ad7606_rd_n_o<= 0;end                         7, 39,71,103:begin data1[13]<=Dout_A;data2[13]<= Dout_B;ad7606_rd_n_o<= 0;end                         9, 41,73,105:begin data1[12]<=Dout_A;data2[12]<= Dout_B;ad7606_rd_n_o<= 0;end                         11,43,75,107:begin data1[11]<=Dout_A;data2[11]<= Dout_B;ad7606_rd_n_o<= 0;end                         13,45,77,109:begin data1[10]<=Dout_A;data2[10]<= Dout_B;ad7606_rd_n_o<= 0;end                         15,47,79,111:begin data1[9]<=Dout_A;data2[9]<= Dout_B;ad7606_rd_n_o<= 0;end                          17,49,81,113:begin data1[8]<=Dout_A;data2[8]<= Dout_B;ad7606_rd_n_o<= 0;end                          19,51,83,115:begin data1[7]<=Dout_A;data2[7]<= Dout_B;ad7606_rd_n_o<= 0;end                          21,53,85,117:begin data1[6]<=Dout_A;data2[6]<= Dout_B;ad7606_rd_n_o<= 0;end                          23,55,87,119:begin data1[5]<=Dout_A;data2[5]<= Dout_B;ad7606_rd_n_o<= 0;end                          25,57,89,121:begin data1[4]<=Dout_A;data2[4]<= Dout_B;ad7606_rd_n_o<= 0;end                          27,59,91,123:begin data1[3]<=Dout_A;data2[3]<= Dout_B;ad7606_rd_n_o<= 0;end                          29,61,93,125:begin data1[2]<=Dout_A;data2[2]<= Dout_B;ad7606_rd_n_o<= 0;end                         31,63,95,127:begin data1[1]<=Dout_A;data2[1]<= Dout_B;ad7606_rd_n_o<= 0;end                         33,65,97,129:begin data1[0]<=Dout_A;data2[0]<= Dout_B;ad7606_rd_n_o<= 0;end                         34,66,98,130:begin data_a <=data1;data_b <= data2;ad7606_rd_n_o<= 1;end                         default:                                  begin                                           ad7606_cs_n_o<= 1;                                           data_a<= data_a;                                           data_b<= data_b;                                           ad7606_convst_o<= 1;                                           ad7606_reset_o<= 0;
                                           data1<= data1;                                           data2<= data2;                                  end                endcase      end                                    endmodule

基于PFGA开发板的功能测试对系统功能设计完成并仿真验证通过之后,准备好硬件设施,连接好硬件,就可以对设计的工程进行板级验证测试实验功能。系统所需硬件1、对应实验开发板。2、AD9606模块。3、电源线。4、程序下载线。5、串口线。6、信号发生器。硬件连接根据前面的描述准备好硬件,我们可以进行连接:1、连接好ACM7606发板。2、信号发生器的输出端连接到ACM7606道输入端,可根据设置连接不同通道。3、连接好FPGA开发板串口线4、连接好开发板电源。5、连接好开发板下载器。6、修改acm7606上的键帽 如下图()靠近灯的那个拔出连接左边两个引脚

最终全图


在以上所有模块和线路连接好之后就可以打开开关,开始下载程序。
在信号发生器上设定好采样频率,可使用示波器对信号发生器输入的数据进行观察,确认输入数据是否正常,和采集的数据进行对比验证。数据采集与分析
用户可以在电脑上发送特定格式的串口数据帧来设置FPGA中与控制功能相关的寄存器。FPGA中共设计了4个寄存器。以下为寄存器介绍:

名称地址位宽功能简介
RestartReq01 重新开始采集请求寄存器,向该寄存器写入任意值即可启动新一轮的采样存储传输。
ChannelSel1 8通道设置寄存器,共8位,对应了8个通道的数据存储开关,如果某通道对应的设置位为1,则该通道的采样结果就会被存入FIFO并通过串口发送
DataNum216数据个数寄存器,设定总共采集传输多少个数据。注意,该寄存器设置的是总共采集的数据个数,假设设置采集100个数据,而且设置了ChannelSel为0000_0011b,则实际每个通道采样的次数就是50,2个通道的数据加起来是100个。假设设置采集100个数据,而且设置了ChannelSel为0011_0011b,则实际每个通道采样的次数就是25。4个通道加起来采集100个数据
ADC_Speed_Set332ADC采样速率设置寄存器。该寄存器用来设置ADC每多久执行一次转换。由于ADC的最大采样速率为200Ksps,所以可以通过设置该寄存器的值来让ADC的采样速率在1~200Ksps范围内调整,以适应不同的应用场景。该寄存器的值与采样速率关系为:ADC_Speed_Set= 1000000000/20/speed – 130,其中speed就是实际要设置的采样速率。

串口一次发送的数据内容为1个字节,为了实现通过串口修改这些寄存器的值,需要发送多个字节才能实现,为此,设计了简单的串口数据帧,该帧一帧数据共8个字节,包含帧头、帧尾、地址段、数据段。帧格式如下所示:

数据D0D1D2D3D4D5D6D7
功能帧头0帧头1地址datadatadatadata帧尾
值0x550xA5xxxxxxxxxx0xF0

每帧数据共8个字节,分别用D0~D7表示,其中,D0和D1两个数据作为帧头,其值分别为固定的0x55、0xA5,D7作为帧尾,其值为固定的0xF0。D2则为要操作的寄存器地址,D3为要写入寄存器的数据的24~31位,D2为要写入寄存器的数据的16~24位,D2为要写入寄存器的数据的8~15位,D0为要写入寄存器的数据的0~7位。例如,PC端要设置采样数据个数(DataNum寄存器,地址为2)为16000(0x3E80)个,则发送的数据帧内容为:0x55 0xA5 0x02 0x00 0x00 0x3E 0x80 0xF0。例如,PC端要设置采样速率(ADC_Speed_Set寄存器,地址为3)为100K,则对应的ADC_Speed_Set值为1000000000/20/100000– 1 = 499(0x000001F3)个,则发送的数据帧内容为:0x55 0xA5 0x03 0x00 0x00 0x01 0xF3 0xF0。当上述设置都设置完成后,就可以向0号寄存器写入任意值,来开始一次采样传输了。数据帧内容可以为0x55 0xA5 0x00 0x00 0x00 0x00 0x00 0xF0。


打开sscom5.13.1串口调试工具。点击多字符串,点击勾选四个指令栏,填入指令:n采8192个的数据,则设置为:55A5 02 00 00 20 00 F0n采样通道为第一通道,则设置为:55 A5 01 00 00 00 01 F0 采样通道为第二通道,则设置为:55 A5 01 00 00 00 02 F0n采样的速率为50M,指令设置为:55 A5 0300 00 00 00 F0, 采样的速率为5k,指令设置为:55 A5 03 00 00 27 0F F0
n 采集使能指令帧设置为:55 A5 00 00 00 00 00 F0


页: [1]
查看完整版本: 【智多晶FPGA-040】【开发流程】AD7606串口数据传输实验