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 Interface
    input   [0:255]    axi_tx_tdata,
    input              axi_tx_tvalid,
    input   [0:31]     axi_tx_tkeep,
    input              axi_tx_tlast,
    output             axi_tx_tready,

    //RX Interface
    output  [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 
	);      


	//接收AURORA
	aurora_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
	);

	//发送AURORA
	aurora_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;
	end

endmodule

代码分析:

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

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

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

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

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

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

仿真结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ctfshow-web入门-php特性(web96-web99)

目录 1、web96 2、web97 3、web98 4、web99 1、web96 试了下通配、转义、拼接、大小写都不行 这里使用绝对路径或者当前路径绕过: ?u./flag.php ?u/var/www/html/flag.php 还可以使用 php 伪协议: ?uphp://filter/resourceflag.php 2、web97 关…

102.qt qml-最全Table交互之多列固定、行列拖拽、自定义委托、标题交互使用教程

自定义实现的Table控件,支持跨qt版本,兼容qt5,qt6! 截图如下所示: 黑色风格如下所示: 视频演示入口:Qt QML QianWindowV2.5(新增曲线综合示例、QML最全Table交互示例、支持qt5/qt6)_哔哩哔哩_bilibili 1.示例页面入口…

【低照度图像增强系列(8)】URetinex-Net算法详解与代码实现(2022|CVPR)

前言 ☀️ 在低照度场景下进行目标检测任务,常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题,给检测带来一定的难度。 🌻使用图像增强模块对原始图像进行画质提升,恢复各类图像信息,再使用目标检…

中创算力公益行 | 夏日炎炎送清凉,温暖童心筑梦行

这是一个关于爱与关怀的故事,也是一段关于成长与责任的旅程。在这个炎炎夏日,喧嚣与热浪交织,有些孩子,他们生活在偏远的乡村,用稚嫩的双肩承载着生活的重担,在这个本应享受无忧无虑童年的年纪,…

SpringBoot3.3.0升级方案

本文介绍了由SpringBoot2升级到SpringBoot3.3.0升级方案,新版本的升级可以解决旧版本存在的部分漏洞问题。 一、jdk17下载安装 1、下载 官网下载地址 Java Archive Downloads - Java SE 17 Jdk17下载后,可不设置系统变量java_home,仅在id…

【python】PyQt5事件传递,鼠标动作捕获,键盘按键捕获原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

深度学习论文: MobileSAMv2: Faster Segment Anything to Everything

深度学习论文: MobileSAMv2: Faster Segment Anything to Everything MobileSAMv2: Faster Segment Anything to Everything PDF:https://arxiv.org/pdf/2312.09579 PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 1 概述 SAM模型应对两大分割任务的挑战&…

数字数据编码为数字信号/编码模式

~~~~~~~~~~~~~ 1 非归零编码【NRZ】 2 曼彻斯特编码 3 差分曼彻斯特编码 ~~~&#xff…

『C++成长记』vector模拟实现

🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.2拷贝…

Unity实现安卓App预览图片、Pdf文件和视频的一种解决方案

一、问题背景 最近在开发app项目,其中有个需求就是需要在app软件内显示图片、pdf和视频,一开始想的解决方案是分开实现,也就是用Image组件显示图片,找一个加载pdf的插件和播放视频的插件,转念一想觉得太麻烦了&#x…

集成excel工具:自定义导入监听器、自定义类型转换器、web中的读

文章目录 I 封装导入导出1.1 定义工具类1.2 自定义读监听器: 回调业务层处理导入数据1.3 定义文件导入上下文1.4 定义回调协议II 自定义转换器2.1 自定义枚举转换器2.2 日期转换器2.3 时间、日期、月份之间的互转2.4 LongConverterIII web中的读IV 其他注意事项应用场景:导入…

Canvas:实现在线动态时钟效果

想象一下,用几行代码就能创造出如此逼真的图像和动画,仿佛将艺术与科技完美融合,前端开发的Canvas技术正是这个数字化时代中最具魔力的一环,它不仅仅是网页的一部分,更是一个无限创意的画布,一个让你的想象…

万界星空科技MES系统:食品加工安全的实时监控与智能管理

万界星空科技MES系统通过集成多种技术和功能,能够实时监控食品加工过程中各环节的安全风险。以下是对该系统如何实现实时监控的详细分析: 一、集成传感器和数据分析技术 万界星空科技MES系统利用集成的传感器和数据分析技术,实时监控生产过程…

c++ - 多态

文章目录 一、多态的概念二、多态使用三、多态的原理 一、多态的概念 1、概念: 多态就是具有多种形态,可以理解为同一个行为不同对象去完成表现出不同的状态,如: 二、多态使用 1、构成多态的条件 (1)派…

硬件开发笔记(二十五):AD21导入电解电容原理图库、封装库和3D模型

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140344547 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

[DiT] Scalable Diffusion Models with Transformers

1、目的 用transformer来替代U-Net backbone,提升生成效果 2、方法 Diffusion Transformers (DiTs) 1)结构 Latent Diffusion Models (LDMs) -> Transformer (Vision Transformer, ViT) based DDPM -> off-the-shelf convolutional VAE 2&#xf…

Navicat使用教程——连接/新建数据库、SQL实现表的创建/数据插入、解决报错【2059-authentication plugin‘caching_sha2_password’……】

一、连接数据库 以MySQL为例 1、新建连接 (1)点击“文件”“新建连接”“MySQL” (2)根据需要,自定义连接名,输入安装MySQL时的密码,点击“连接测试”,确定是否可以连接 &#xf…

【企业级监控】Zabbix实现邮箱报警

Zabbix监控自动化 文章目录 Zabbix监控自动化资源列表基础环境前言四、Zabbix邮件告警4.1、实现报警所需的条件4.1.1、告警媒介4.1.2、触发器(trigger)4.1.3、动作(action) 4.2、配置告警媒介4.2.1、设置告警媒介参数4.2.2、启用此…

秋招Java后端开发冲刺——Mybatis使用总结

一、基本知识 1. 介绍 MyBatis 是 Apache 的一个开源项目,它封装了 JDBC,使开发者只需要关注 SQL 语句本身,而不需要再进行繁琐的 JDBC 编码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJO(Plain …

【提交ACM出版 | EIScopus检索稳定 | 高录用】第五届大数据与社会科学国际学术会议(ICBDSS 2024,8月16-18)

第五届大数据与社会科学国际学术会议(ICBDSS 2024)将于2024年08月16-18日在中国-上海隆重举行。 ICBDSS会议在各专家教授的支持下,去年已成功举办了四届会议。为了让更多的学者有机会参与会议分享交流经验。本次会议主要围绕“大数据”、“社…