AFE处理顶层模块:

TOP_AFE5832x4作为顶层模块,例化了三个子模块:spi_ctrl_afe5832、initial_card、afe4_lvds_process;
spi_ctrl_afe5832模块:spi时序控制模块,接收外部几个通道的spi读写请求,转换为spi线路的时序去读写afe芯片;
initial_card模块:初始化模块,初始化afe,输出初始化结束的状态,实现复位等操作,需要使用到spi读写寄存器;
afe4_lvds_process模块:前述的afe的lvds数据接收处理模块,需要使用到spi读写寄存器;
实现逻辑:
上电后,100M时钟稳定,
initial_card模块通过spi和控制管脚初始化afe,初始完毕后拉高init_card_ok;
afe4_lvds_process模块接收到init_card_ok为1后开始lvds的解串同步扫描等操作;
如果同步成功拉高sync_lvds_ok信号,通知外部其他模块可以使用其输出数据;
如果同步失败拉高afe_soft_rst信号,通知initial_card模块再次进行一次AFE芯片的复位和初始化工作,将整个流程再次进行一遍;
仿真验证:
在tb中模拟afe芯片的逻辑,实现spi时序和数据模拟,

afe_chip_tb模块是一个afe5832简易仿真模型,模拟afe芯片在本次实验中使用到的时序;

模块功能:
模拟AFE5832芯片的核心功能:
SPI从机响应:响应FPGA的SPI读写操作,模拟内部两组寄存器;
LVDS数据发送:生成符合AFE5832时序的LVDS的多通道串行数据;
时钟生成:产生LVDS接口所需的高速时钟(800MHz)和帧时钟(50MHz)
LVDS数据生成逻辑:
位时钟(800MHz):DDR模式,数据速率1.6Gbps;
帧时钟(50MHz):每20ns一个帧周期;
数据:每个帧时钟周期内传输20位数据(10位奇数+10位偶数);
双沿:在800MHz时钟的双边沿更新数据;
测试模式:当寄存器2的值为0x180时,进入测试模式,测试模式下,使用固定的测试数据或从寄存器5读取用户设置的测试数据,正常模式下,使用外部输入的adce_in和adco_in数据;
仿真结果:
如果直接给到正确测试数据,在仿真中,我们没有做时延等操作,所以在仿真模型输出的时序就是最好的时序,

上图为lvds_s2p模块,可以看到125M时钟域的8bit数据,转换到了100M时钟域的170bit,16通道联合的10bit数据,
上图为afe_sync模块时序,可以看到,512扫描开始一段时间,时序采样位置好,其中各通道的macth_cnt匹配计数器都在连续计数,这段时间每次扫描的sync_ok也都能拉高,表示能同步上,说明数据正确;
但是等到扫描多次后,扫描操作给数据通道施加的输入延时,导致之前的最佳时序渐渐采样不到正确数据,一直保持到扫描结束,
可以看到最后同步成功,输出正弦波波形;

上图为时延控制模块idelay_ctrl,其中扫描512次的detc_cnt计数器从0递增到511,

上图为通道0例化的idelay_lane延时控制单元模块,可以看到,在512次扫描中,匹配成功的扫描处于前面一小部分,得到的同步窗口是从0开始到73,所以这里最后设置的最佳延时值就取了中心点的36;
可以看出对于同步逻辑和有效窗口的搜索逻辑正确实现;
接下来验证如果,如果在第一次全秒扫描中给出错误的测试数据,模拟实际上板出现无法同步的极端情况,当afe软复位后,后续再次工作的串行时序和上一次不同,就有可能会同步上,这里仿真是验证这个软复位逻辑在同步失败后能否被触发;
把仿真模型中的下面代码:

改为:

在前面50毫秒,输出一个与测试数据不相干的值,逻辑就无法同步,一次扫描大概耗时50ms;

上图为afe_sync模块波形,可以看到在第一次扫描时,未同步,进行了第二次 ,然后扫描成功,
上图为时序控制模块逻辑,可以看到,state状态在3时,设置最佳延时值尝试锁定后,检测到locking_err拉高,表示最佳配置无法同步,于是拉高afe_soft_rst取重新开始复位扫描;
可以看到上图,在第二次扫描时把测试数据输出,就能同步成功,拉高looking_ok,扫描成功;
本文章由威三学社威三学院出品
对课程感兴趣可以私信联系