AURORA仿真

news2024/11/14 21:26:49

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.coloradmin.cn/o/1910360.html

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

相关文章

KBPC5010-ASEMI逆变焊机专用KBPC5010

编辑:ll KBPC5010-ASEMI逆变焊机专用KBPC5010 型号:KBPC5010 品牌:ASEMI 封装:KBPC-4 正向电流(Id):50A 反向耐压(VRRM):1000V 正向浪涌电流&#xff…

【YOLO格式的数据标签,目标检测】

标签为 YOLO 格式,每幅图像一个 *.txt 文件(如果图像中没有对象,则不需要 *.txt 文件)。*.txt 文件规格如下: 每个对象一行 每一行都是 class x_center y_center width height 格式。 边框坐标必须是 归一化的 xywh 格式&#x…

AutoMQ 产品动态 | 发布 1.1.0,兼容至 Apache Kafka 3.7,支持 Kaf

2024年05-06月动态 01 云原生 Kafka 内核 AutoMQ 发布 1.1.0 版本,兼容 Apache Kafka 到 3.7 版本。 AutoMQ 采用存算分离的思路重构 Apache Kafka,计算层 100% 保留 Kafka 代码,可以更好、更快地适配 Apache Kafka 新版本。经过代码 Revi…

三菱FX3U转OPC UA服务器的配置指南

在工业4.0的浪潮中,传统企业正面临着前所未有的转型压力,其中最为紧迫的挑战之一便是如何高效便捷地将PLC数据无缝集成到PC端上位软件中。我们知道,如果直接从PLC采集数据,不仅涉及复杂的技术难题,如繁琐的软件开发和冗…

MySQL之备份与恢复(五)

备份与恢复 备份数据 符号分隔文件备份 可以使用SQL命令SELECT INTO OUTFILE以符号分隔文件格式创建数据的逻辑备份。(可以用mysqldump的 --tab选项导出到符号分隔文件中)。符号分隔文件包含以ASCII展示的原始数据,没有SQL、注释和列名。下面是一个导出为逗号分隔…

请编写函数,判断一字符串是否是回文,若是回文函数返回值为1,否则返回值为0,回文是顺读和倒读都一样的字符串

int gets_arr(char* p) {int i 0;int j strlen(p) - 1;while (i < j && p[i] p[j]){i;j--;}if (i<j){return 0;}else {return 1;}} int main() {printf("请输入一串字符串\n");char arr[100];gets(arr);int ret gets_arr(arr);if (ret 1){printf(…

如何降低pdf内存,如何降低pdf內存大小,如何降低pdf内存占用

在现代办公环境中&#xff0c;pdf文件已经成为了一种不可或缺的文档格式。然而&#xff0c;pdf内存太大文件常常给我们的工作带来困扰&#xff0c;本文将为你揭秘几种简单有效的方法&#xff0c;帮助你轻松降低 pdf 内存&#xff0c;提高工作效率。 方法一、安装pdf转换软件 打…

能源电子领域2区SCI,版面稀缺,即将截稿,无版面费!

【SciencePub学术】今天小编给大家推荐1本能源电子领域的SCI&#xff01;影响因子1.0-2.0之间&#xff0c;最重要的是审稿周期较短&#xff0c;对急投的学者较为友好&#xff01; 能源电子类SCI 01 / 期刊概况 【期刊简介】IF&#xff1a;1.0-2.0&#xff0c;JCR2区&#xf…

安防监控视频平台LntonCVS视频监控管理平台智慧仓储应用方案

在当前许多大型工厂和物流基地中&#xff0c;仓库是存放物品的核心地点。这些仓库不仅存放大量货物&#xff0c;还配备大量辅助设备&#xff0c;需要全面监管以避免安全事故和财产损失。传统的人工巡检方式已经无法满足现代大规模监管的需求&#xff0c;尤其是面对仓储物品种类…

【区块链+跨境服务】粤澳健康码跨境互认系统 | FISCO BCOS应用案例

2020 年突如其来的新冠肺炎疫情&#xff0c;让社会治理体系面临前所未见的考验&#xff0c;如何兼顾疫情防控与复工复产成为社会 各界共同努力的目标。区块链技术作为传递信任的新一代信息基础设施&#xff0c;善于在多方协同的场景中发挥所长&#xff0c;从 而为粤澳两地的疫情…

C基础day6

1、思维导图 2、 #include<myhead.h> #define MAX 10 int main(int argc, const char *argv[]) {//定义一个数组&#xff0c;用于存储班级所有成员的成绩int score[MAX] {0};//完成对成员成绩的输入for(int i0;i<MAX;i){//任意一个元素score[i]printf("请输入第…

数据库查询基础:单表查询与多表查询

❤❤前言 &#x1f44d;&#x1f44d;点关注&#xff0c;编程梦想家&#xff08;大学生版&#xff09;-CSDN博客&#xff0c;不迷路❤❤ 数据库是现代软件开发中不可或缺的一部分&#xff0c;它帮助我们存储、检索和管理大量数据。在这篇文章中&#xff0c;我们将探讨数据库查…

智慧科技照亮水利未来:深入剖析智慧水利解决方案如何助力水利行业实现高效、精准、可持续的管理

目录 一、智慧水利的概念与内涵 二、智慧水利解决方案的核心要素 1. 物联网技术&#xff1a;构建全面感知网络 2. 大数据与云计算&#xff1a;实现数据高效处理与存储 3. GIS与三维可视化&#xff1a;提升决策支持能力 4. 人工智能与机器学习&#xff1a;驱动决策智能化 …

RockYou2024 发布史上最大密码凭证

参与 CTF 的每个人都至少使用过一次臭名昭著的rockyou.txt单词表&#xff0c;主要是为了执行密码破解活动。 该文件是一份包含1400 万个唯一密码的列表。 源自 2009 年的 RockYou 黑客攻击&#xff0c;创造了计算机安全历史。 多年来&#xff0c;“rockyou 系列”不断发展。…

Java基础-组件及事件处理(上)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 Swing 概述 MVC 架构 Swing 特点 控件 SWING UI 元素 JFrame SWING 容器 说明 常用方法 示例&a…

Python的异常处理(与C++对比学习)

一、C语言中错误的处理方式 用assert来判断一个表达式是否出错&#xff1b;在调用接口函数时&#xff0c;接口函数会设置errno&#xff0c;我们可以通过errno&#xff0c;strerror(errno)来拿到错误码和错误信息。在自定义函数中&#xff0c;我们设置函数错误信息处理的时候&a…

【C++题解】1290 - 二进制转换十进制

问题&#xff1a;1290 - 二进制转换十进制 类型&#xff1a;进制转换 题目描述&#xff1a; 请将一个 25 位以内的 2 进制正整数转换为 10 进制&#xff01; 输入&#xff1a; 一个 25 位以内的二进制正整数。 输出&#xff1a; 该数对应的十进制。 样例&#xff1a; 输…

国芯方案|珠宝口袋秤芯片方案

口袋秤顾名思义就是可以放进口袋里面的电子秤。可能这个目前在国内使用的人比较少&#xff0c;但在西方国家口袋秤却是可以用来送礼的物品。因为口袋秤的外观跟手机外观大多相似&#xff0c;所以也有人称口袋秤为手机秤。口袋秤主要是用在珠宝、科研、工厂等小物件的高精度测量…

【面试八股总结】面向对象三大特性、虚函数、纯虚函数、虚继承

参考资料&#xff1a;阿秀 一、面向对象三大特性 封装&#xff1a;将数据和代码捆绑在一起&#xff0c;避免外界干扰和不确定性访问 继承&#xff1a;让某种类型对象获得另一个类型对象的属性和方法 多态&#xff1a;同一种事务表现出不同事务的能力&#xff0c;即&#xf…

井字游戏00

题目链接 井字游戏 题目描述 注意点 1 < board.length board[i].length < 100输入一定遵循井字棋规则 解答思路 如果某一方想要获胜&#xff0c;则其需要占满某一行或某一列或对角线&#xff0c;所以只需要根据第一行和第一列判断是否填充完某一行或某一列或对角线…