1 需求
1、PL端通过AXI总线将ADC采样得到的每通道40 MB/s的ADC_A和ADC_B两个通道的数据传输至DDR环形缓冲区(Ring Buffer),以便PS端进行读取。
2、提供DDR Ring Buffer的PL写指针,以确保PS端在读取数据时能够避开PL正在写入的DDR地址区域。
2 功能点
1、正确采样每通道40MB/s 的ADC数字信号。
2、将采样得到的ADC数据送入FIFO缓存。
3、将FIFO中的数据搬运到DDR Ping-Pong Buffer缓存。(为将来可能的算法做准备)
4、将DDR Ping-Pong Buffer中的数据搬运到DDR Ring Buffer中,供PS端读取。
5、ring_wr_ptr寄存器用作DDR Ring Buffer的写指针,指示PL当前写入的DDR地址区域。这保障了PS端在读取数据时避免与PL正在写入的40 MB DDR地址区域冲突。
3 详细设计
3.1 设计框图
3.2 IOB采样
通过I/O Block内的寄存器对输入的ADC数字信号进行采样,确保从端口输入至寄存器的采样延迟是固定的,从而保证数据采样的准确性。然后将采样得到的信号输出到FIFO。
3.3 FIFO设计
1、Ping-Pong搬运模块每次从FIFO突发搬运128 Bytes数据,因此FIFO至少要缓存128 Bytes数据。
2、当AXI总线繁忙时,FIFO的突发搬运速率会发生波动。因此,FIFO的设计必须确保即使在突发搬运速率最慢的情况下,也能防止FIFO写入数据的溢出。实测发现,从FIFO突发搬运128 Bytes数据最慢需要Ncycles = 234个时钟周期。
由于FIFO读出时钟为200 MHz,时钟周期为TC = 5ns。
FIFO最慢一次突发搬运的时间Tone_burst:
Tone_burst= Ncycles× TC=234×5ns=1170 ns
这段时间写入FIFO的数据Din:
Din=40 MByte/s × Tone_burst = 47 Bytes
为了防止写入数据Din的丢失,FIFO大小至少要为 128 Bytes + 47 Bytes = 175 Bytes。
3、FIFO突发搬运的过程中,可能会因总线繁忙等原因导致搬运速度变慢。为了防止这种情况下数据的溢出,后续数据 < 128 Bytes时,应能够暂存在FIFO中以保持数据的完整性。因此,FIFO最终采用背靠背设计,128 Bytes × 2 = 256 Bytes。
综上:FIFO的容量设计为256 Bytes,采用背靠背设计。当其中的数据量达到128 Bytes时,将Pro_Full信号置高,输出到数据流控制模块。
3.4 数据流控制模块
1、数据流控制模块根据Pro_Full信号判断FIFO中是否有128 bytes数据。
2、当FIFO中的数据量达到128 Bytes时,CTRL信号使得Ping-Pong搬运模块开始数据搬运。CTRL信号还会指定数据搬运的目标地址,使得Ping-Pong搬运模块能够交替地将FIFO中的数据搬运到DDR Ping和DDR Pong缓冲区中。
3、输出Ping-Pong指示信号到FSM模块,标明搬运的数据是进入DDR Ping还是DDR Pong。
3.5 Ping-Pong DMA 模块
Ping-Pong DMA模块根据数据流控制模块的信号CTRL,会从FIFO中取出128 Bytes的数据,并通过AXI总线将这些数据搬运至DDR Ping 或DDR Pong。
3.6 FSM设计
1、根据Ping-Pong指示信号,判断当前DDR Ping和DDR Pong哪个处于非写入状态。
2、CTRL信号负责控制Ring Buffer搬运模块,使得Ring Buffer搬运模块搬运将非写入状态的DDR Ping或DDR Pong中的数据搬运到DDR Ring Buffer中。在搬运过程中,CTRL信号提供给Ring Buffer搬运模块的源地址和目的地址。目的地址每隔半秒递增,实现每半秒将Ping-Pong Buffer中的数据搬运到DDR Ring Buffer中。
3、PS端能够访问ring_wr_ptr_A和ring_wr_ptr_B寄存器。其中,ring_wr_ptr_A是PL端A通道当前写入的DDR Ring Buffer A的写指针,指向正写入的40 MB DDR地址空间的起始地址。同样,ring_wr_ptr_B是PL端B通道当前写入的DDR Ring Buffer B的写指针,也指向相应40 MB DDR地址空间的起始地址。
状态机图:
IDLE:空闲状态。
PING: DDR Pong正在写入,DDR Ping数据搬运到Ring Buffer。
PONG: DDR Ping正在写入,DDR Pong数据搬运到Ring Buffer。每次Pong搬运结束后,时间计数器加1,当计数器值达到5时,将其重置为零。计数器指示正在写入第几秒的数据。
3.7 Ring Buffer DMA模块
Ring Buffer搬运模块受FSM的控制信号CTRL控制,按照该信号指示从DDR Ping和DDR Pong交替搬运数据到DDR Ring Buffer中。每隔半秒,该模块从DDR Ping或DDR Pong搬运单通道20Mbyte数据至DDR Ring Buffer。
文章评论