基于FPGA的LVDS接口设计
实验内容:
通过LVDS接口,完成数据的收发测试。
上周居然开启了咸鱼模式,检讨一下 = =||
前集回顾:
一、系统架构
用户数据通过LVDS接口发送与接收,验证接收到的数据是否与发送数据一致。
本着简单上手的原则,发送与接收均采用IP核进行设计。后续看情况补充原语设计。
二、IP核配置
发送TX:
先取个名:lvds_tx
数据方向选择输出output
数据速率选择SDR,DDR可选;
串行化因子选择8;通道选择1个;
第三页的数据和时钟延迟不选择,测试说明嘛,怎么简单怎么来。
注:以上为测试用例,具体应用视情况而定。
接收RX:
先取个名:lvds_rx
数据方向选择输入input
下面的跟输出选择一致就好。
时钟选择外部时钟;我们知道LVDS接口是1对时钟线+n对数据线。
数据和时钟延迟照样略过。
三、系统方案
3.1发送部分
发送没什么好说的,并行的用户数据tx_data[7:0]通过IP核/OSERDESE2串行化输出。
注意一点,我们在MMCM生成相应时钟时,clk与clk_div之间是存在比例关系的,也就是串行化因子。
3.2接收部分
接收部分则与发送相反,串行接收的数据通过IP核/ISERDESE2并行化送给用户逻辑。
接收部分需要注意的是数据对齐操作-bitslip。下面展开说说:
- 发送部分,先发送同步码pattern(这里使用8’hb9);
- 接收时,如果rx_data等于pattern或它的移位数据,那么就开始数据同步操作:bitslip
- 当经过bitslip移位,rx_data == pattern时,同步完成,给出同步完成信号并将bitslip拉低;
- 同步完成后(发送模块收到同步完成信号),发送模块开始发送有用的数据。
- 如果选择了多通道lvds,则需等所有通道完成同步后再进行数据的收发。
3.3逻辑代码
代码都是浮云,重要的是方案~理清思路一切都好说。
四、仿真验证
仿真设计为发送累加数,在发送到49时停止仿真$finish。
发送tx_data:
可以看到,开始发送数据之前,先发送同步码8’hb9用于数据同步操作;同步完成后发送累加数进行测试。
接收rx_data:
- 接收数据先是8’h73 (8’b0111_0011);
- bitslip拉高,rx_data左移一位后为:8’hb9 / 8’b1011_1001,与pattern相等,同步完成
- 同步完成,开始时发送数据(0,1,2,3,4....)
- 接收数据(0,1,2,3,4....)
- 测试完成。
本文补一下之前的内容。
咱们下期见。