AURORA仿真

AURORA 仿真验证

定义:AURORA是一种高速串行通信协议,通常用于在数字信号处理系统和其他电子设备之间传输数据。它提供了一种高效的方式来传输大量数据,通常用于需要高带宽和低延迟的应用中。AURORA协议通常由Xilinx公司的FPGA器件支持,它使用了一种特殊的编码和时钟恢复机制来实现可靠的数据传输。

本实验仅仅演示了如何快速将AURORA使用起来,理论知识见以下参考文章:

Aurora IP简介-CSDN博客

Aurora 8B/10B IP核(2)----Aurora概述及数据接口(Framing接口、Streaming接口)_xinlinx中的aurora协议中端口解释-CSDN博客

IP 核设计

在这里插入图片描述

这里主要注意时钟的设计和线程的安排

Aurora的输入时钟:

​ GT Refclk:该时钟是收发器的参考时钟,由外部一对差分输入时钟输入进来,取125MHZ。

​ INT Clk:初始化时钟,作为复位信号的一个时钟,可以由锁相环直接得到,取50MHZ

在这里插入图片描述

在这里插入图片描述

例化IP核

module aurora_top(input   [0:3]       RXP,input   [0:3]       RXN,output  [0:3]       TXP,output  [0:3]       TXN,input               gt_refclk_p,input               gt_refclk_n,input               init_clk,input               reset,input               power_down,input   [2:0]       loopback,output              channel_up,output  [0:3]       lane_up,output              gt_pll_lock,output              user_clk_out,output              tx_out_clk,//TX Interfaceinput   [0:255]    axi_tx_tdata,input              axi_tx_tvalid,input   [0:31]     axi_tx_tkeep,input              axi_tx_tlast,output             axi_tx_tready,//RX Interfaceoutput  [0:255]    axi_rx_tdata,output             axi_rx_tvalid,output  [0:31]     axi_rx_tkeep,output             axi_rx_tlast);aurora_64b66b_0 u_aurora_64b66b_0 (.rxp                  (RXP),                  // input wire [0 : 3] rxp.rxn                  (RXN),                  // input wire [0 : 3] rxn.reset_pb             (reset),                // input wire reset_pb.power_down           (power_down),           // input wire power_down.pma_init             (1'b0),                 // input wire pma_init.loopback             (loopback),             // input wire [2 : 0] loopback.txp                  (TXP),                  // output wire [0 : 3] txp.txn                  (TXN),                  // output wire [0 : 3] txn.hard_err             (),                     // output wire hard_err.soft_err             (),                     // output wire soft_err.channel_up           (channel_up),           // output wire channel_up.lane_up              (lane_up),              // output wire [0 : 3] lane_up.tx_out_clk           (tx_out_clk),           // output wire tx_out_clk.gt_pll_lock          (gt_pll_lock),          // output wire gt_pll_lock.s_axi_tx_tdata       (axi_tx_tdata),         // input wire [0 : 255] s_axi_tx_tdata.s_axi_tx_tkeep       (axi_tx_tkeep),         // input wire [0 : 31] s_axi_tx_tkeep.s_axi_tx_tlast       (axi_tx_tlast),         // input wire s_axi_tx_tlast.s_axi_tx_tvalid      (axi_tx_tvalid),        // input wire s_axi_tx_tvalid.s_axi_tx_tready      (axi_tx_tready),        // output wire s_axi_tx_tready.m_axi_rx_tdata       (axi_rx_tdata),         // output wire [0 : 255] m_axi_rx_tdata.m_axi_rx_tkeep       (axi_rx_tkeep),         // output wire [0 : 31] m_axi_rx_tkeep.m_axi_rx_tlast       (axi_rx_tlast),         // output wire m_axi_rx_tlast.m_axi_rx_tvalid      (axi_rx_tvalid),        // output wire m_axi_rx_tvalid.mmcm_not_locked_out  (),                     // output wire mmcm_not_locked_out.gt0_drpaddr          (10'd0),                // input wire [9 : 0] gt0_drpaddr.gt1_drpaddr          (10'd0),                // input wire [9 : 0] gt1_drpaddr.gt2_drpaddr          (10'd0),                // input wire [9 : 0] gt2_drpaddr.gt3_drpaddr          (10'd0),                // input wire [9 : 0] gt3_drpaddr.gt0_drpdi            (16'd0),                // input wire [15 : 0] gt0_drpdi.gt1_drpdi            (16'd0),                // input wire [15 : 0] gt1_drpdi.gt2_drpdi            (16'd0),                // input wire [15 : 0] gt2_drpdi.gt3_drpdi            (16'd0),                // input wire [15 : 0] gt3_drpdi.gt0_drprdy           (),                     // output wire gt0_drprdy.gt1_drprdy           (),                     // output wire gt1_drprdy.gt2_drprdy           (),                     // output wire gt2_drprdy.gt3_drprdy           (),                     // output wire gt3_drprdy.gt0_drpwe            (1'b0),                 // input wire gt0_drpwe.gt1_drpwe            (1'b0),                 // input wire gt1_drpwe.gt2_drpwe            (1'b0),                 // input wire gt2_drpwe.gt3_drpwe            (1'b0),                 // input wire gt3_drpwe.gt0_drpen            (1'b0),                 // input wire gt0_drpen.gt1_drpen            (1'b0),                 // input wire gt1_drpen.gt2_drpen            (1'b0),                 // input wire gt2_drpen.gt3_drpen            (1'b0),                 // input wire gt3_drpen.gt0_drpdo            (),                     // output wire [15 : 0] gt0_drpdo.gt1_drpdo            (),                     // output wire [15 : 0] gt1_drpdo.gt2_drpdo            (),                     // output wire [15 : 0] gt2_drpdo.gt3_drpdo            (),                     // output wire [15 : 0] gt3_drpdo.init_clk             (init_clk),             // input wire init_clk.link_reset_out       (),                     // output wire link_reset_out.gt_refclk1_p         (gt_refclk_p),          // input wire gt_refclk1_p.gt_refclk1_n         (gt_refclk_n),          // input wire gt_refclk1_n.user_clk_out         (user_clk_out),         // output wire user_clk_out.sync_clk_out         (),                     // output wire sync_clk_out.gt_rxcdrovrden_in    (1'b0),                 // input wire gt_rxcdrovrden_in.sys_reset_out        (),                     // output wire sys_reset_out.gt_reset_out         (),                     // output wire gt_reset_out.gt_refclk1_out       (),                     // output wire gt_refclk1_out.gt_powergood         ()                      // output wire [3 : 0] gt_powergood
);endmodule

上面只是例化了这个IP核,把有用的信号引出来

TB仿真

module tb_aurora();wire [0:3]RXP;wire [0:3]RXN;wire [0:3]TXP;wire [0:3]TXN;reg locked;wire channel_up;wire [0:3]lane_up;wire axi_tx_tready;wire user_clk_out;wire channel_up1;wire [0:3]lane_up1;wire user_clk_out1;reg [0 : 255] axi_tx_tdata;reg axi_tx_tvalid;wire [0 : 255] axi_rx_tdata;wire axi_rx_tvalid;reg clk_125m;wire clk_125m_p;wire clk_125m_n;//125MHZ时钟initial clk_125m = 1;always #4 clk_125m = ~clk_125m;//产生差分时钟OBUFDS #(.IOSTANDARD("DEFAULT"), // Specify the output I/O standard.SLEW("SLOW")           // Specify the output slew rate) OBUFDS_inst (.O(clk_125m_p),     // Diff_p output (connect directly to top-level port).OB(clk_125m_n),   // Diff_n output (connect directly to top-level port).I(clk_125m)      // Buffer input);wire		clk_50M;wire		locked_0;//50M时钟clk_wiz_50M instance_name(// Clock out ports.clk_out50M(clk_50M),     		// output clk_out50M// Status and control signals.locked(locked_0),       				// output locked// Clock in ports.clk_in1_p(clk_125m_p),    			// input clk_in1_p.clk_in1_n(clk_125m_n)				// input clk_in1_n );      //接收AURORAaurora_top u_aurora_64b66b_rev(.RXP 			(RXP), 			 	// input   [0:3].RXN 			(RXN), 			 	// input   [0:3].TXP 			(TXP), 			 	// output  [0:3].TXN 			(TXN), 			 	// output  [0:3].gt_refclk_p 	(clk_125m_p), 	 	// input.gt_refclk_n 	(clk_125m_n), 	 	// input.init_clk    	(clk_50M), 		 	// input.reset       	(~locked), 			// input.power_down  	(1'b0), 			// input //Drives the Aurora 64B/66B core to reset.loopback    	(3'b000), 			// input   [2:0].channel_up  	(channel_up), 		// output.lane_up     	(lane_up), 			// output  [0:3].gt_pll_lock 	(), 				// output.user_clk_out 	(user_clk_out),		// output.tx_out_clk   	(),					// output//TX Interface.axi_tx_tdata 	(),					// input   [0:255].axi_tx_tvalid	(),					// input.axi_tx_tkeep 	(),					// input   [0:31].axi_tx_tlast 	(),					// input.axi_tx_tready	(),					// output//RX Interface.axi_rx_tdata 	(axi_rx_tdata),	// output  [0:255].axi_rx_tvalid	(axi_rx_tvalid),	// output.axi_rx_tkeep 	(axi_rx_tkeep),	// output  [0:31].axi_rx_tlast 	(axi_rx_tlast) 	// output);//发送AURORAaurora_top u_aurora_64b66b_set(.RXP            (TXP),              //input   [0:3].RXN            (TXN),              //input   [0:3].TXP            (RXP),              //output  [0:3].TXN            (RXN),              //output  [0:3].gt_refclk_p    (clk_125m_p),      //input.gt_refclk_n    (clk_125m_n),      //input.init_clk       (clk_50M),          //input.reset          (~locked), 			//input.power_down     (1'b0),             //input //Drives the Aurora 64B/66B core to reset.loopback       (3'b000),           //input   [2:0].channel_up     (channel_up1),       //output.lane_up        (lane_up1),          //output  [0:3].gt_pll_lock    (),                 //output.user_clk_out   (user_clk_out1),     //output.tx_out_clk     (),                 //output//TX Interface.axi_tx_tdata   (axi_tx_tdata ),    // input   [0:255].axi_tx_tvalid  (axi_tx_tvalid ),   // input.axi_tx_tkeep   (32'hffff_ffff),     // input   [0:31].axi_tx_tlast   (1'b0),    // input.axi_tx_tready  (axi_tx_tready),    // output//RX Interface.axi_rx_tdata   (),                 //output  [0:255].axi_rx_tvalid  (),                 //output.axi_rx_tkeep   (),                 //output  [0:31].axi_rx_tlast   ()                  //output);initial begin axi_tx_tdata = 256'h0;axi_tx_tvalid = 1'b0;locked = 1'b0;#5000;axi_tx_tdata = 256'h123456879abcdef;axi_tx_tvalid = 1'b1;locked = 1'b1;endendmodule

代码分析:

  • 首先,产生一个125MHZ的时钟 clk_125m

  • 然后生成差分时钟 clk_125m_p ,clk_125m_n

  • 使用锁相环产生50MHZ时钟 clk_50M

  • 接下来例化了两次AURORA,一个是接收,另一个是发送

上面的tb代码,仿真了两个AURORA传输数据的功能

备注:reset_pb拉高5us,然后再拉低

仿真结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/375977.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux C | 管道open打开方式

Linux C | 管道open打开方式 1.参考 1. 管道 2.现象 是的,这段代码在调用 open(AUDIOIN_FIFO, O_RDONLY) 时可能会被阻塞。原因是 FIFO(命名管道)在以只读模式打开时,如果没有其他进程以写模式打开该 FIFO,open 调用将…

Argo CD入门、实战指南

1. Argo CD概述 1.1 什么是 Argo CD Argo CD 是针对 Kubernetes 的声明式 GitOps 持续交付工具。 1.2 为什么选择 Argo CD 应用程序定义、配置和环境应具有声明性并受版本控制。应用程序部署和生命周期管理应自动化、可审计且易于理解。 2. Argo CD基础知识 在有效使用 Ar…

MySQL-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

299k stars利用Public APIs提升开发效率:探索APILayer提供的开源资源

299k stars利用Public APIs提升开发效率:探索APILayer提供的开源资源 在现代软件开发中,API(应用程序接口)是实现应用间通信和功能扩展的关键工具。公共API(Public APIs)则为开发者提供了宝贵的资源&#…

微积分-导数7(关联变化率)

例一 空气被充入一个球形气球中,使其体积以每秒100立方厘米的速度增加。当气球的直径为50厘米时,气球半径的增加速度是多少? 解答:球体的体积公式为 V 4 3 π r 3 V \frac{4}{3}\pi r^3 V34​πr3 为了使用给定的信息&#x…

网络(二)——套接字编程

文章目录 理解源IP地址和目的IP地址认识端口号认识TCP/UDP协议网络字节序socket编程接口socket 常见APIsockaddr结构 理解源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址; 源IP即发送方的地址,目的IP即接受方的…

通信协议 | 一文玩转UART协议就够了

文章目录 协议基础1、UART简介2、UART特性3、UART协议帧3.1、起始位3.2、数据位3.3、奇偶校验位3.4、停止位 4、UART通信步骤 最详细的UART通讯协议分析Verilog代码实现UART接口模块驱动 协议基础 1、UART简介 UART(Universal Asynchronous Receiver/Transmitter&…

express

文章目录 🟢 Express⭐️ 1.初始Express✨安装✨使用Express 搭建一台服务器⭐️2.Express-基本路由✨1.使用字符串模式的路由路径示例:✨2.使用正则表达式的路由路径示例:✨3.中间件浅试(demo)⭐️3.Express-中间件✨1.应用级中间件✨2.路由级中间件✨3.错误处理中间件✨4…

【pytorch】手写数字识别

https://blog.csdn.net/qq_45588019/article/details/120935828 基本均参考该博客 《深度学习原理Pytorch实战》 初步处理 导包 import torch import numpy as np from matplotlib import pyplot as plt from torch.utils.data import DataLoader from torchvision import tr…

同时用到,网页,java程序,数据库的web小应用

具体实现功能:通过网页传输添加用户的请求,需要通过JDBC来向 MySql 添加一个用户数据 第一步,部署所有需要用到的工具 IDEA(2021.1),Tomcat(9),谷歌浏览器,MySql,jdk(17) 第二步,创建java项目,提前部署数…

《梦醒蝶飞:释放Excel函数与公式的力量》12.2 DAVERAGE函数

第12章:数据库函数 第二节 12.2 DAVERAGE函数 12.2.1 简介 DAVERAGE函数是Excel中的一个数据库函数,用于计算数据库或数据表中特定条件下某字段的平均值。DAVERAGE函数在处理大规模数据、数据筛选和分析时非常有用。 12.2.2 语法 DAVERAGE(database…

Kithara与OpenCV (一)

Kithara使用 OpenCV 库 目录 Kithara使用 OpenCV 库简介需求和支持的环境构建 OpenCV 库使用 CMake 进行配置以与 Kithara 一起工作 使用 OpenCV 库设置项目运行 OpenCV 代码图像采集和 OpenCV自动并行化限制和局限性1.系统建议2.实时限制3.不支持的功能和缺失的功能4.显示 Ope…

排序-java(详解)

一,分类 主要的排序大致分为以下几类: 1,插入排序,又分为直接插入排序和希尔排序 2,选择排序,又分为选择排序和堆排序 3,交换排序,又分为冒泡排序和快速排序 4,归并…

219.贪心算法:柠檬水找零(力扣)

代码解决 class Solution { public:bool lemonadeChange(vector<int>& bills) {int num50, num100; // 初始化5美元和10美元的计数器for(int i0; i < bills.size(); i) // 遍历所有账单{if(bills[i]5) // 如果账单是5美元{num5; // 增加5美元的计数continue; // …

手撸俄罗斯方块(五)——游戏主题

手撸俄罗斯方块&#xff08;五&#xff09;——游戏主题 当确定游戏载体&#xff08;如控制台&#xff09;后&#xff0c;界面将呈现出来。但是游戏的背景色、方块的颜色、方框颜色都应该支持扩展。 当前游戏也是如此&#xff0c;引入了 Theme 的概念&#xff0c;支持主题的扩…

ubuntu使用kubeadm搭建k8s集群

一、卸载k8s kubeadm reset -f modprobe -r ipip lsmod rm -rf ~/.kube/# 自己选择性删除 坑点哦 rm -rf /etc/kubernetes/ rm -rf /etc/systemd/system/kubelet.service.d rm -rf /etc/systemd/system/kubelet.service rm -rf /usr/bin/kube* rm -rf /etc/cni rm -rf /opt/cn…

【常见开源库的二次开发】一文学懂CJSON

简介&#xff1a; JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。它基于JavaScript的一个子集&#xff0c;但是JSON是独立于语言的&#xff0c;这意味着尽管JSON是由JavaScript语法衍生出来的&#xff0c;它可以被任何编程语言读取和生成…

自动驾驶(萝卜快跑)是毁灭出租司机工作机会的灾难?

引言 自动驾驶技术的飞速发展在全球范围内引发了广泛的讨论和担忧&#xff0c;特别是在中国&#xff0c;自动驾驶出租车服务“萝卜快跑”成为了热门话题。本文探讨自动驾驶对出租司机工作机会的影响&#xff0c;以及这种技术变革背后的社会经济因素。 自动驾驶的历史与现状 …

【深度学习】PyTorch深度学习笔记01-Overview

参考学习&#xff1a;B站视频【《PyTorch深度学习实践》完结合集】-刘二大人 ------------------------------------------------------------------------------------------------------- 1. 基于规则的深度学习 2. 经典的机器学习——手动提取一些简单的特征 3. 表示学习…

Qt下使用OpenCV的鼠标回调函数进行圆形/矩形/多边形的绘制

文章目录 前言一、设置imshow显示窗口二、绘制圆形三、绘制矩形四、绘制多边形五、示例完整代码总结 前言 本文主要讲述了在Qt下使用OpenCV的鼠标回调在OpenCV的namedWindow和imshow函数显示出来的界面上进行一些图形的绘制&#xff0c;并最终将绘制好的图形显示在QLabel上。示…