基于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。下面展开说说:

  1. 发送部分,先发送同步码pattern(这里使用8’hb9);
  2. 接收时,如果rx_data等于pattern或它的移位数据,那么就开始数据同步操作:bitslip
  3. 当经过bitslip移位,rx_data == pattern时,同步完成,给出同步完成信号并将bitslip拉低;
  4. 同步完成后(发送模块收到同步完成信号),发送模块开始发送有用的数据。
  5. 如果选择了多通道lvds,则需等所有通道完成同步后再进行数据的收发。

3.3逻辑代码

代码都是浮云,重要的是方案~理清思路一切都好说。

四、仿真验证

仿真设计为发送累加数,在发送到49时停止仿真$finish。

发送tx_data:

可以看到,开始发送数据之前,先发送同步码8’hb9用于数据同步操作;同步完成后发送累加数进行测试。

接收rx_data:

  1. 接收数据先是8’h73 (8’b0111_0011);
  2. bitslip拉高,rx_data左移一位后为:8’hb9 / 8’b1011_1001,与pattern相等,同步完成
  3. 同步完成,开始时发送数据(0,1,2,3,4....)
  4. 接收数据(0,1,2,3,4....)
  5. 测试完成。

本文补一下之前的内容。

咱们下期见。

经验分享 程序员 微信小程序 职场和发展