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.mzph.cn/web/44579.shtml

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

相关文章

golang 项目打包部署环境变量设置

最近将 golang 项目打包部署在不同环境,总结一下自己的心得体会,供大家参考。 1、首先要明确自己目标服务器的系统类型(例如 windows 或者Linux) ,如果是Linux 还需要注意目标服务器的CPU架构(amd或者arm) 目标服务器的CPU架构可执行命令&…

对Mapper.xml文件进行深入的学习

1. 前言 既上次在Mapper.xml文件出现bug之后&#xff0c;痛改前非&#xff0c;决定吃透Mapper.xml映射文件。 让我们通过具体的代码段来进一步理解 MyBatis 的 Mapper XML 文件中的每个组成部分。 <?xml version"1.0" encoding"UTF-8"?> <!…

python 爬取当当网图书榜

首先查看当当网好评书单页面&#xff0c;找到翻页的URL参数 直接用requests请求页面 resp requests.get(url) 找到想要的信息&#xff0c;使用正则表达式把这些信息提取出来 patternre.compile(list_num.*?(\d).<.*?<img src"(.*?)".*?title"(.*?…

Eel入门还有一些案例

Eel入门还有一些案例 Eel 是一个 Python 库&#xff0c;它允许 Python 程序通过简单的 API 与网页进行交互。它使用 WebSocket 协议来实现 Python 后端和 JavaScript 前端之间的实时通信。下面是关于 Eel 的用法、通信原理和使用场景的一篇博客文章。 Eel的基本原理 Eel的基本原…

针对vue3的render函数添加自定义指令

话不多说 直接上代码 主要是给h函数设置自定义指令控制 import /styles/reset.css import /styles/global.scss import uno.cssimport { createApp } from vue import App from ./App.vue import { setupRouter } from ./router import { setupStore } from ./store import …

Android studio之编译提示Could not find :umeng-asms-v1.2.1

1 、问题 Could not determine the dependencies of task :app:compileDebugJavaWithJavac. > Could not resolve all task dependencies for configuration :app:debugCompileClasspath.> Could not find :umeng-asms-v1.2.1:.Required by:project :app> Could not …

FGF14:脑部疾病新潜力靶标

成纤维细胞生长因子14&#xff08;FGF14&#xff09;是FGF11亚家族成员&#xff0c;在神经元的所有基本特性&#xff08;内在放电、兴奋性和抑制性神经元的突触传递和可塑性&#xff09;中发挥作用。 &#xff08;数据来源AlphaFold&#xff09; FGF14由247个氨基酸组成&#x…

实战篇(九):解锁3D魔方的秘密:用Processing编程实现交互式魔方

解锁3D魔方的秘密:用Processing编程实现交互式魔方 使用 Processing 创建一个 3D 魔方效果展示1. 安装 Processing2. 项目结构3. 代码实现4. 代码解释4.1. 初始化魔方4.2. 绘制魔方4.3. 处理鼠标事件4.4. 检查点击的面4.5. 旋转面和最终确定旋转5. 运行和测试6. 细节解释6.1. …

【资源调度】2-如何解决资源调度问题?

导读&#xff1a;本期是全网最全【资源调度】系列推文的第2期(共50期左右)。上期我们在《何为调度&#xff1f;》中&#xff0c;对调度的定义与作用、计划与调度的关系、调度问题的拆解做了详细介绍。从本期开始&#xff0c;我们选择【客服调度】场景作为【资源调度】问题的具象…

51单片机(STC8H8K64U/STC8051U34K64)_RA8889_8080参考代码(v1.3)

硬件&#xff1a;STC8H8K64U/STC8051U34K64 RA8889开发板 硬件跳线变更为并口8080模式&#xff0c;PS00x&#xff0c;R143&#xff0c;R142不接&#xff0c;R141无关 8080接口电路连接图&#xff1a; 实物连接图&#xff1a; RA8889开发板外接MCU连接器之引脚定义&…

IMS架构中的注册与会话流程:RTPEngine集成及消息路由详解

目录 S-CSCF 调用 RTPengine 整体路由 注意 IMS 注册流程 和 IMS 会话流程 的区别 IMS注册流程 IMS会话流程(如INVITE请求) 这种设计的原因 P-CSCF 调用 RTPengine S-CSCF 调用 RTPengine 整体路由 UA a生成SDP offer&#xff0c;发送SIP INVITE请求(包含SDP offer)&…

核密度估计KDE和概率密度函数PDF(深入浅出)

目录 1. 和密度估计&#xff08;KDE&#xff09;核密度估计的基本原理核密度估计的公式核密度估计的应用Python中的KDE实现示例代码 结果解释解释结果 总结 2. 概率密度函数&#xff08;PDF&#xff09;概率密度函数&#xff08;PDF&#xff09;是怎么工作的&#xff1a;用图画…

RDNet实战:使用RDNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

ubuntu显卡驱动重启后失效的解决办法

写在前方&#xff1a;ubuntu系统&#xff0c;显卡重启后驱动失效&#xff0c;显卡不可用。网上冲浪之后得以有效解决&#xff0c;以下是解决方案 查看显卡nvidia-smi&#xff1b;驱动失效消息&#xff1a; (base) rootnode:~# nvidia-smi NVIDIA-SMI has failed because it c…

AI大模型走进汽车车机,智驾将是未来

车机里的AI大模型在汽车行业中的应用越来越广泛&#xff0c;主要体现在智能座舱和自动驾驶系统的深度融合上。通过将AI大模型应用于车机系统&#xff0c;可以实现更高智能化的人车交互体验。AI大模型作为人工智能发展的核心引擎&#xff0c;正在成为汽车智能化发展的关键之一。…

基于颜色模型和边缘检测的火焰识别FPGA实现,包含testbench和matlab验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 将FPGA仿真结果导入到matlab显示结果&#xff1a; 测试样本1 测试样本2 测试样本3 2.算法运行软件版本 vivado2019.2 …

MySQL配置数据库的连接命令

MySQL配置数据库连接命令 在MySQL中&#xff0c;配置数据库连接的命令涉及创建用户、授予权限、配置主从复制等多个方面。以下是常用的命令及其用途&#xff1a; 创建用户 创建一个新的数据库用户并为其设置密码&#xff1a; CREATE USER usernamehost IDENTIFIED BY passwo…

mysql中的存储过程

存储过程的作用:有助于提高应用程序的性能。存储过程可以不必发送多个冗长的SQL语句 废话不说多&#xff0c;直接实操 ##实现num的相加 delimiter $$ CREATE PROCEDURE test1 () begindeclare num int default 0; -- 声明变量,赋默认值为0select num20;end $$ delimiter ; …

计算机网络高频面试题

从输入URL到展现页面的全过程&#xff1a; 用户在浏览器中输入URL。浏览器解析URL&#xff0c;确定协议、主机名和路径。浏览器查找本地DNS缓存&#xff0c;如果没有找到&#xff0c;向DNS服务器发起查询请求。DNS服务器解析主机名&#xff0c;返回IP地址。浏览器使用IP地址建立…

Kafka配置SASL认证

Kafka加密 Kafka认证方式 在本博客中我们使用SASL/PLAIN的方式来进行Kafka加密 环境准备 Kafka集群环境 请参考之前的Kafka集群搭建 kafka-broker1kafka-broker2 集群配置SASL/PLAIN认证 用户校验 修改server.properties 让其支持Kafka的认证(每一个broker节点都需要修改这…