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.pswp.cn/web/44579.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44579.shtml
英文地址,請注明出處:http://en.pswp.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節點都需要修改這…