包含两个部分:数据缓冲;数据处理逻辑。
数据缓冲:对AD采集数据进行高速缓冲。
本部分采用Ping-Pong FIFO
结构,由2 * 64bits位宽、64深度
FIFO组成。
FIFO运行在同步模式,即读写采用同一个时钟。写速率由AD输出数据速率决定,写入速率为2M SPS
,即一次写64bits,写入频率为2M;读取速率为100M * 64bits
,读取速率远大于写入速率,可以采用同步FIFO实现。
写入设计上,默认写入FIFO1,FIFO1写满后其Full信号拉高,状态逻辑切换到写入FIFO2。任意一个FIFO的Full信号拉高均会生成一个data_rd_reday
信号的高电平,用于通知后续数据处理逻辑读取当下已写满FIFO的数据。
读取设计上,默认处于rd_idle
状态,即所有FIFO读空时的状态。任意一个FIFO的Full信号拉高后,状态逻辑切换到读取该FIFO的数据状态。当任意一个FIFO的empty
信号拉高时,表明数据读取完成,状态逻辑切换到rd_idle
状态。
Ping-Pong FIFO
的写入信号主要由AD_Latch
信号生成,该信号具有一个时钟周期的高电平。AD_Latch
信号为高电平时,在clk上升沿下完成一次AD输出数据的更新。
Ping-Pong FIFO
的读取信号由后续的数据处理逻辑生成,为data_rd_req
信号,当接收到data_rd_ready
信号的高电平时,data_rd_req
信号拉高,FIFO读使能,开始输出数据。
数据处理逻辑
数据处理逻辑主要分为四个工作模式:停止,直通,抽取,平均。工作模式设定由内部参数控制,对该参数写入特定值设定该部分处于不同的工作状态。
输入信号为Ping-Pong FIFO
的64bits数据信号,以及一个data_rd_ready
信号。输出为四通道16bits数据信号,以及一个data_valid
信号。data_valid
信号具有一个时钟周期的高电平,指示数据是否有效。
停止模式:该模式下四通道数据信号均输出16h0000
,同时data_valid
信号拉低,表示没有任何有效数据。
直通模式:该模式下Ping-Pong FIFO
的数据全部通过数据处理逻辑,data_valid
信号在整个数据输出的过程中保持高电平。
抽取模式:该模式下设置两个参数:Num
和Loc
。Num参数用于设置需要从多少数据中抽取一个,Loc参数用于设置Num个数据中抽取哪一个。data_valid
信号在四通道数据更新时产生一个时钟周期的高电平。下图设置为4:1抽取,抽取4个数据中的第2个。
平均模式:该模式仅设置Num
参数,用于表示多少数据平均一次。平均方法为整数平均,为保证数据逻辑计算正确,方法为:Dout = Sum + Din/Num, Sum = Din/Num
。同样data_valid
信号在数据更新时产生一个时钟周期的高电平信号。平均模式采用整数除法,具有一定的误差。下图设置为3个数平均,为0x8001, 0x8002, 0x8003
三个数平均。
目前设计的数据包格式包括以下几个部分:
包头:128bits长度特定数,标识数据包开始,为0xAA55AA55 0xAA55AA55
。
包序列号:位于开始标识符之后。数据包序列号从1开始,具有32bits长度。
数据长度:位于包序列号之后。数据长度最小为1,最大不超过180。该参数也由用户设置,具有32bits长度。高于180后会出现数据包长度超过UDP单个数据包最大长度的限制,造成发送失败。180为设定仅发送4个通道的采样数据,如果增加通道数量,则该参数会进一步减小。
采样数据:单个通道为2个字节,按照ch1-ch2-ch3...ch_end的顺序排列数据,为一轮采样数据序列。最多可以发送多少个采样数据序列受到数据长度的限制。
包尾:128bits长度特定数,标识数据包结束,为0xFF00FF00 0xFF00FF00
。
数据包按照以上格式生成完成后,将采用AXI-Stream
接口,将数据流写入axis_async_fifo_adapter
中。为匹配输入输出速率,数据包将采用64bits宽度。完成包尾生成后,状态逻辑生成一个高电平信号package_send_en
,用于通知10G UDP
协议栈开始发送。
需要注意的是,数据包生成模块运行于100M
时钟域下,10G UDP
协议栈运行于156.25M
时钟域下,需要对package_send_en
进行跨时钟域处理,即在156.25M
时钟域下对该信号进行23次同步。该步骤必须进行,会引入约1220ns的固定延时。
本文章使用limfx的vscode插件快速发布