1.首先看这个ip核的整体结构如下:
可以看到该IP主要有4个部分分别是Lane Logic、 用户接收,用户发送,全局控制。
各个模块的作用如下所示:
Lane Logic: 初始化每个收发器,并且进行数据的编解码和错误检测
Global Logic:执行通道初始化的绑定和验证该模块生成Aurora协议所需的随机idles,并监视所有通道逻辑模块中是否有错误。
Rx User interface: 用户接收侧,AXI-Stream格式数据,将数据从Lane通道搬移到用户逻辑侧
Tx User Interface: 用户发送侧,AXI-Stream格式数据
2.其次理解ip核各个参数配置
如图所示,本次的仿真配置参数如上:
------Lane width: 一般我们选择2 Bytes(1 Byte = 8bit),如果是4 Bytes那位宽更高,频率更小,同样可以有一样的传输速率。
------Lane Rate: 线速率越高,那IP使用的用户时钟就越高,这对用户逻辑的时序要求更高;
------GT Refclk:125 MHz(硬件设计决定的,可以看看原理图);
------INIT clk:默认值就可以,这个时钟可以通过系统时钟通过PLL锁出来;
------DRP clk:默认值就可以,这个时钟可以通过系统时钟通过PLL锁出来;
------Dataflow Mode:Duplex(全双工,双向独立发送接收);
------Interface:Streaming(发送端不受接收端影响,有数就发)。
再在GTXQ2模块中任意选1,2,3,4路中一个就可以了,X代表不选,1代表选择。
这里的包含共享逻辑在核和包含共享逻辑在例子设计后面我会单独讲下具体啥意思
配置好ip核后生成的官方给的工程如下:各个模块的功能下面已经给出
(1)Aurora_8b10b_exdes.v :此代码是顶层文件调用了各个子模块。
(2)Aurora_8b10b_frame_gen.v :产生测试数据并且通过 TX 接口发送出去 。模块为遵循 AXI4-Stream 协议的 PDU,UFC 和 NFC 接口中的每一个生成用户流量。该模块包含使用具有特定初始值的线性反馈移位寄存器(LFSR)的伪随机数生成器来生成可预测的数据序列。
(3)Aurora_8b10b_ll_to_axi_exdes.v: 实现了旧代码到 AXI4 总线接口的转换。
(4)Aurora_8b10b_axi_to_ll_exdes.v: 把 AXI 接口转换成旧接口
(5)Aurora_8b10b_frame_check.v: 是接收端口,接收到数据并且进行检测 。模块验证 RX 数据的完整性。该模块使用与 FRAME_GEN 模块相同的 LFSR和初始值来生成预期的 RX 帧数据。将接收的用户数据与本地生成的流进行比较,并根据AXI4-Stream 协议报告任何错误。FRAME_CHECK 模块适用于 PDU,UFC 和 NFC 接口。 FRAME_CHECK 模块使用此数据序列来验证 Aurora 数据通道的完整性。
3. ip核配置完成并且生成例子工程之后可以开始仿真了,直接仿真的结果如下:
链路1和链路2的channel_up都拉高,标志着ip核成功建立链路通道,
查看发送的数据时发送的数据时随机数,与程序中吻合:
在帧产生模块修改下面发送的随机数:
在检查模块修改下面部分,把检查随机数改为检查线性增长数据,同时也要注意data_err_dectected_c信号也应该修改:
在帧产生模块将随机数修改成线性增长的数据后如图所示:
在检验模块将随机数修改成线性增长的数据后如图所示:
4.修改数据后仿真的结果如下所示
修改为递增数据后,数据确实按照线性增长的方式传递,同时channel_up信号也同时拉高表示数据传输的链路打通:
用户发送的线性增长数据进入ip核:tdata数据
用户接送到的线性增长数据从ip核发出:rx_tdata
最后接受到的数据和发出的数据一样,都是线性增长数据,说明仿真成功。