xilinx原語詳解及仿真——ODDR

??ODDR位于OLOGIC中,可以把單沿傳輸的數據轉換為雙沿傳輸的數據, 在講解ODDR功能之前,需要先了解OLOGIC的結構及功能。

1、OLOGIC

??OLOGIC塊位于IOB的內側,FPGA內部信號想要輸出到管腳,都必須經過OLOGIC。OLOGIC資源的類型為OLOGICE2(HP I/O Bank)和OLOGICE3(HR I/O Bank),兩者在功能和結構上是相同的,所以本文稱為OLOGIC。

??圖1是OLOGIC的結構框圖,分為上下兩部分,下半部分用于配置輸出數據路徑,上半部分用于配置三態控制路徑,分別實現對數據、三態信號進行單沿轉雙沿的功能,兩部分具有共同的時鐘 (CLK),但是使能信號不同(OCE和TCE)。

在這里插入圖片描述

圖1 OLOGIC結構框圖

??如果輸出的信號不使用OLOGIC中的ODDR功能,那么此時信號從圖1中紅線路徑進行傳輸,從組合邏輯電路輸出到IOB模塊。如果要使用OLOGIC模塊中的D觸發器功能,那么信號從D1進入OLOGIC模塊,沿綠色信號線進行傳輸。如果要使用OLOGIC的ODDR功能,把單沿傳輸的信號轉換為雙沿傳輸的信號,此時需要兩個輸入信號D1、D2沿藍色路徑進行傳輸。

??圖2是FPGA中OLOGIC實際的框圖,因為該電路還可以被配置為OSERDESE2,所以相比圖1會多出一些信號端口。

在這里插入圖片描述

圖2 OLOGIC在FPGA中結構框圖

2、ODDR原語

??圖3是ODDR原語框圖,與IDDR一樣不支持同時復位和置位。ODDR端口信號如表1所示,表2描述了ODDR原語的可用參數。

在這里插入圖片描述

圖3 ODDR原語框圖

表1 ODDR端口信號
端口名含義
C時鐘輸入信號。
CE鐘使能信號,高電平有效。
D1、D2ODDR輸入信號。
S/R置位/復位引腳,高電平有效。
QODDR輸出信號。
表2 ODDR原語的參數
參數名含義取值
DDR_CLK_EDGEODDR工作模式OPPOSITE_EDGE (默認), SAME_EDGE
INIT設置Q端口的初始值0(默認),1
SRTYPE設置復位/置位相對于時鐘的類型ASYNC, SYNC(默認)

??上述的信號和參數都比較簡單,與前面IDDR原語相似,不做過多解釋。ODDR只有兩種工作模式,相比IDDR會少一種,下文對兩種模式進行講解。

??圖4是OPPOSITE_EDGE模式的時序圖,在時鐘CLK上升沿采集D1信號D1A,并在時鐘上升沿把D1A輸出到OQ。然后在時鐘CLK下降沿采集D2信號D2A,并在下降沿將采集到的信號輸出。這種模式使用起來會相對麻煩,FPGA內部需要在時鐘上升沿給D1賦值,在時鐘下降沿給D2賦值,一般不使用。

在這里插入圖片描述

圖4 OPPOSITE_EDGE模式

??圖5是SAME_EDGE模式的時序圖,在時鐘CLK上升沿 同時采集D1、D2的數據,OQ再時鐘上升沿輸出采集的D1數據,再下降沿輸出采集的D2數據。這種方式實現比較簡單,屬于常用模式。

在這里插入圖片描述

圖5 SAME_EDGE模式

3、ODDR模式仿真

?ODDR原語的模板如下所示:

   ODDR #(.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE" .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" ) ODDR_inst (.Q(Q),   // 1-bit DDR output.C(C),   // 1-bit clock input.CE(CE), // 1-bit clock enable input.D1(D1), // 1-bit data input (positive edge).D2(D2), // 1-bit data input (negative edge).R(R),   // 1-bit reset.S(S)    // 1-bit set);

??接下來對ODDR的兩種工作模式進行仿真,對應的設計文件如下所示,din0在內部D觸發器打一拍后得到dout0輸出,din0經過OLOGIC內部的D觸發器打一拍后得到dout1輸出。兩個單沿輸入的信號din1、din2轉化位單沿信號dout2,對應代碼如下所示。

module oddr_ctrl(input       clk      ,//系統時鐘信號;input       rst      ,//系統復位信號,高電平有效;input       clk_en   ,//時鐘使能信號;input       din0     ,//輸入數據;input       din1     ,//輸入數據;input       din2     ,//輸入數據;output      dout0    ,//輸出數據output      dout1    ,//輸出數據output      dout2    
); reg         dout0   ;(* IOB = "TRUE" *)reg dout1 ;//將dout1放在ILOGICE中;always@(posedge clk)begindout0 <= din0;dout1 <= din0;end//例化ODDR原語ODDR #(.DDR_CLK_EDGE ( "OPPOSITE_EDGE" ),// "OPPOSITE_EDGE" or "SAME_EDGE" .INIT         ( 1'b0            ),// Initial value of Q: 1'b0 or 1'b1.SRTYPE       ( "SYNC"          ) // Set/Reset type: "SYNC" or "ASYNC" ) ODDR_inst (.Q    ( dout2   ),// 1-bit DDR output.C    ( clk     ),// 1-bit clock input.CE   ( clk_en  ),// 1-bit clock enable input.D1   ( din1    ),// 1-bit data input (positive edge).D2   ( din2    ),// 1-bit data input (negative edge).R    ( rst     ),// 1-bit reset.S    ( 1'b0    ) // 1-bit set);endmodule

對應的Test?Bench文件如下所示:

`timescale 1 ns/1 ns
module test();parameter	CYCLE		=   10      ;//系統時鐘周期,單位ns,默認10ns;reg			                clk     ;//系統時鐘,默認100MHz;reg			                rst     ;//系統復位,默認高電平有效;reg                         clk_en  ;reg                         din0    ;reg                         din1    ;reg                         din2    ;wire                        dout0   ;wire                        dout1   ;wire                        dout2   ;oddr_ctrl  u_oddr_ctrl (.clk        ( clk       ),.rst        ( rst       ),.clk_en     ( clk_en    ),.din0       ( din0      ),.din1       ( din1      ),.din2       ( din2      ),.dout0      ( dout0     ),.dout1      ( dout1     ),.dout2      ( dout2     ));//生成周期為CYCLE數值的系統時鐘;initial beginclk = 1;forever #(CYCLE/2) clk = ~clk;end//生成復位信號;initial beginrst = 0;#2;rst = 1;//開始時復位10個時鐘;#(10*CYCLE);rst = 0;endinitial begin#1;clk_en = 1'b0;din2 = 1'b0;din0 = 1'b0;din1 = 1'b0;#(CYCLE*20);clk_en = 1'b1;#(CYCLE);repeat(100)begin//產生100個雙沿時鐘數據。#(CYCLE/2);din0 = ({$random} % 2);din1 = ({$random} % 2);#(CYCLE/2);din2 = ({$random} % 2);end#(CYCLE);clk_en = 1'b0;#(10*CYCLE);$stop;//停止仿真;endendmodule

??首先對OPPOSITE_EDGE模式進行仿真,對應的TestBench代碼如下所示,仿真結果如圖6所示。

在這里插入圖片描述

圖6 OPPOSITE_EDGE模式

??圖6仿真結果與圖4的時序圖一致,不做過多解釋。

??然后對SAME_EDGE模式進行仿真,對應的設計文件:

module oddr_ctrl(input       clk      ,//系統時鐘信號;input       rst      ,//系統復位信號,高電平有效;input       clk_en   ,//時鐘使能信號;input       din0     ,//輸入數據;input       din1     ,//輸入數據;input       din2     ,//輸入數據;output      dout0    ,//輸出數據output      dout1    ,//輸出數據output      dout2    
); reg         dout0   ;reg         doutr   ;(* IOB = "TRUE" *)reg dout1 ;//將dout1放在ILOGICE中;always@(posedge clk)begindoutr <= din0;dout0 <= doutr;dout1 <= doutr;end//例化ODDR原語ODDR #(.DDR_CLK_EDGE ( "SAME_EDGE" ),// "OPPOSITE_EDGE" or "SAME_EDGE" .INIT         ( 1'b0            ),// Initial value of Q: 1'b0 or 1'b1.SRTYPE       ( "SYNC"          ) // Set/Reset type: "SYNC" or "ASYNC" ) ODDR_inst (.Q    ( dout2   ),// 1-bit DDR output.C    ( clk     ),// 1-bit clock input.CE   ( clk_en  ),// 1-bit clock enable input.D1   ( din1    ),// 1-bit data input (positive edge).D2   ( din2    ),// 1-bit data input (negative edge).R    ( rst     ),// 1-bit reset.S    ( 1'b0    ) // 1-bit set);endmodule

TestBench文件如下所示:

`timescale 1 ns/1 ns
module test();parameter	CYCLE		=   10      ;//系統時鐘周期,單位ns,默認10ns;reg			                clk     ;//系統時鐘,默認100MHz;reg			                rst     ;//系統復位,默認高電平有效;reg                         clk_en  ;reg                         din0    ;reg                         din1    ;reg                         din2    ;wire                        dout0   ;wire                        dout1   ;wire                        dout2   ;oddr_ctrl  u_oddr_ctrl (.clk        ( clk       ),.rst        ( rst       ),.clk_en     ( clk_en    ),.din0       ( din0      ),.din1       ( din1      ),.din2       ( din2      ),.dout0      ( dout0     ),.dout1      ( dout1     ),.dout2      ( dout2     ));//生成周期為CYCLE數值的系統時鐘;initial beginclk = 1;forever #(CYCLE/2) clk = ~clk;end//生成復位信號;initial beginrst = 0;#2;rst = 1;//開始時復位10個時鐘;#(10*CYCLE);rst = 0;endinitial begin#1;clk_en = 1'b0;din2 = 1'b0;din0 = 1'b0;din1 = 1'b0;#(CYCLE*20);clk_en = 1'b1;#(CYCLE);repeat(100)begin//產生100個雙沿時鐘數據。#(CYCLE);din0 = ({$random} % 2);din1 = ({$random} % 2);din2 = ({$random} % 2);end#(CYCLE);clk_en = 1'b0;#(10*CYCLE);$stop;//停止仿真;endendmodule

仿真結果如圖7所示。

在這里插入圖片描述

圖7 SAME_EDGE模式

??圖7仿真結果與圖5基本一致,不再過多解釋。圖8是該模式下時鐘使能無效時仿真結果,此時輸出信號將保持不變。

在這里插入圖片描述

圖8 SAME_EDGE模式下EN信號拉低

??上述仿真均與前文理論一致,下面將工程信號引腳分配,對工程進行編譯,查看走線的圖。

4、OLOGIC中觸發器(OFD)的使用方式

??在vivado中打開走線的方式在講解IDDR原語時已經進行了講解,本文不再贅述。

??前文的代碼中dout0與dout1的代碼都相同,都是使用D觸發器對din0打一拍,然后輸出,通過查看dout0和dout1的寄存器位置,得到OLOGIC中組合電路和觸發器功能的使用方式。圖9是din0到dout0信號的走線圖,紅框處是寄存器所在位置,白線是信號的走線。

在這里插入圖片描述

圖9 dout0信號走向

??dout0信號是沒有使用OLOGIC中的觸發器和ODDR功能的,圖10就是dou0信號經過OLOGIC時的路徑,與前文講解一致,直接經過組合邏輯輸出。

在這里插入圖片描述

圖10 dout0經過OLOGIC

??如圖11所示,是dout1信號在FPGA內部的走向,路徑上又兩個觸發器,其中一個在OLOGIC中。

在這里插入圖片描述

圖11 dout1信號走向

??將OLOGIC放大,如圖12所示,可知dout1觸發器在OLOGIC中。

在這里插入圖片描述

圖12 dout1經過OLOGIC

??最后查看dout2信號的走向,如圖13所示,din1和din2輸入FPGA后,在OLOGIC進行單沿轉雙沿信號,然后通過dout2管腳輸出。

在這里插入圖片描述

圖13 dout2信號走向

??將對應的OLOGIC放大,可見其實現的是ODDR功能,信號流向與前文講解一致。

在這里插入圖片描述

圖13 dout2經過OLOGIC

??綜上,OLOGIC與ILOGIC功能類似,本文主要是講解ODDR的工作模式,并對工作模式進行仿真,同時將OLOGIC的使用方式進行講解。掌握ODDR使用方式的同時,也知道如何使用OLOGIC中的觸發器(使用IOB=TRUE原語,查看設計文件中dout1信號的定義)功能,以及OLOGIC在FPGA中的位置。

??OLOGIC中的觸發器相對于FPGA內部觸發器更靠近管腳,并且觸發器輸出與IOB之間的路徑是固定的,對于多bit數據輸出更有利于對齊。

??最后需要此工程文件的用戶,在公眾號后臺回復“ODDR”(不包括引號)即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/206684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/206684.shtml
英文地址,請注明出處:http://en.pswp.cn/news/206684.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CleanMyMac4.16中文最新版本下載

當很多人還在為電腦運行緩慢、工作問題不能快速得到解決而煩惱的時候&#xff0c;我已經使用過了多款系統清理工具&#xff0c;并找到了最適合我的那一款。我的電腦是超耐用的Mac book&#xff0c;接下來給大家介紹三種在眾多蘋果電腦清理軟件的排名較高的軟件。 一、Maintena…

【ET8】0.ET8入門-ET框架介紹

ET8 新特性 多線程多進程架構,架構更加靈活強大&#xff0c;多線程設計詳細內容請看多線程設計課程抽象出纖程(Fiber)的概念&#xff0c;類似erlang的進程&#xff0c;非常輕松的創建多個纖程&#xff0c;利用多核&#xff0c;仍然是單線程開發的體驗纖程調度: 主線程&#xf…

首次面試經歷(忘指導)當我在簡歷上寫了蒼穹外賣,瑞吉外賣時……

&#x1f308;鍵盤敲爛&#xff0c;年薪30萬&#x1f308; 個人簡介: 大三在校生&#xff0c;二本院校&#xff0c;專業&#xff1a;信息管理與信息系統 面試崗位&#xff1a; java開發實習生 投”簡歷“ 臨近大三寒假&#xff0c;很早就有實習想法的我&#xff0c;對12月做…

一篇文章了解JDK的前世今生

我們每天都在開發Java,每天都在使用JDK,那么我們了解JDK的發展史嗎,這篇文章將帶你深入了解JDK的發展史。 JDK(Java Development Kit)是Java開發者工具包,是用于編寫Java程序和運行Java程序的軟件開發工具集。自從1995年Java語言首次發布以來,JDK已經經歷了數十年的發展…

python打開相機,用鼠標左鍵框選矩形區域,支持一次框選多個矩形區域,通過鼠標右標清除上一次畫的矩形。

方案一 import cv2# Global variables rectangles [] current_rectangle [] drawing False# Mouse callback function def mouse_callback(event, x, y, flags, param):global rectangles, current_rectangle, drawingif event cv2.EVENT_LBUTTONDOWN:drawing Truecurren…

C語言——常用庫函數

C語言——常用庫函數 memcmp int my_memcmp(char* str1,char* str2,int num) {while(num--){if(*str1>*str2){return 1;}else if(*str1<*str2){return -1;}else{str1;str2;}}return 0; }memcpy void* my_memcpy(void *str1,void *str2,int size) {int *p1str1;int *p2…

Linux數據庫Mysql增刪改查

從安裝數據庫到增刪改查 apt install mariadb-serverUndefined 安裝好后初始化 mysql_secure_installationUndefined 查 查詢現有的庫 show databases;SQL 進入庫 use mysql;Perl 查詢表 show tables;SQL 查詢表結構 desc mysql;SQL 查詢表內容 select * from my…

深度學習TensorFlow2基礎知識學習后半部分

介紹幾個重要操作&#xff1a; 1.范數 a tf.fill([1,2], value2.) b tf.norm(a)# 二范數#第二種計算方法 # 計算驗證 a tf.square(a) log("a的平方:", a) a tf.reduce_sum(a) log("a平方后的和:", a) b tf.sqrt(a) log("a平方和后開根號:"…

NVIDIA與 Sparkfun 的合作伙伴在 Hackster.io 上發起了人工智能創新挑戰賽,喊你來參加!

NVIDIA與 Sparkfun 的合作伙伴在 Hackster.io 上發起了人工智能創新挑戰賽&#xff0c;喊你來參加&#xff01; 本次競賽的目標旨在吸引開發者社區在 NVIDIA Jetson Orin 平臺上為邊緣構建生成式 AI 應用程序和模型&#xff0c;希望通過本次比賽提高人們對新 Jetson 生成式 AI…

Python微信公眾號批量發布文章問題記錄,調用api接口發草稿箱編碼有問題

1、accesstoken獲取方法 def get_access_token():url https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appid{}&secret{}.format(*****************, ***********)response requests.get(url)res_html response.json()access_token res_ht…

四元數,歐拉角,旋轉矩陣,旋轉向量

四元數&#xff0c;旋轉矩陣&#xff0c;旋轉向量&#xff0c;歐拉角 一、歐拉角 1、歐拉角是表達旋轉的最簡單的一種方式&#xff0c;形式上它是一個三維向量&#xff0c;其值分別代表物體繞坐標系三個軸(x,y,z軸&#xff09;的旋轉角度&#xff0c;默認旋轉正向為逆坐標軸逆…

C#winform上下班打卡系統Demo

C# winform上下班打卡系統Demo 系統效果如圖所示 7個label控件(lblUsername、lblLoggedInEmployeeId、lab_IP、lblCheckOutTime、lblCheckInTime、lab_starttime、lab_endtime)、3個按鈕、1個dataGridView控件、2個groupBox控件 C#代碼實現 using System; using System.Dat…

Java零基礎——Elasticsearch篇

1.Elasticsearch簡介 Elasticsearch是一個基于Lucene的一個開源的分布式、RESTful 風格的搜索和數據分析引擎。Elasticsearch是用Java語言開發的&#xff0c;并作為Apache許可條款下的開放源碼發布&#xff0c;是一種流行的企業級搜索引擎。Elasticsearch用于云計算中&#xf…

【Ambari】Python調用Rest API 獲取YARN HA狀態信息并發送釘釘告警

&#x1f984; 個人主頁——&#x1f390;開著拖拉機回家_Linux,大數據運維-CSDN博客 &#x1f390;?&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

二層交換原理

二層交換設備工作在OSI模型的第二層&#xff0c;即數據鏈路層&#xff0c;它對數據包的轉發是建立在MAC&#xff08;Media Access Control &#xff09;地址基礎之上的。二層交換設備不同的接口發送和接收數據獨立&#xff0c;各接口屬于不同的沖突域&#xff0c;因此有效地隔離…

【C/PTA —— 15.結構體2(課內實踐)】

C/PTA —— 15.結構體2&#xff08;課內實踐&#xff09; 7-1 計算職工工資7-2 計算平均成績7-3 找出總分最高的學生7-4 通訊錄的錄入與顯示 7-1 計算職工工資 #include<stdio.h> #include<stdlib.h> typedef struct GZ {char name[6];double j;double f;double z;…

記一次由 jedis 引發的離譜選學問題

背景 我的應用中&#xff0c;使用 jedis 作為連接 redis 的客戶端&#xff0c;一直在用的好好的&#xff0c;后來有一個新的組件&#xff0c;也需要使用 redis&#xff0c;但是組件是內部封裝的&#xff0c;我只能提供一個 StringReidsTempalte&#xff0c;所以我基于應用本身…

Java 多線程之 LockSupport (阻塞和喚醒線程)

文章目錄 一、概述二、使用方法三、測試示例1四、測試示例2 一、概述 LockSupport 是Java并發包中的一個工具類&#xff0c;用于線程的阻塞和喚醒。它提供了一種基于線程的許可&#xff08;permit&#xff09;的方式來實現線程的阻塞和喚醒&#xff0c;而不需要顯式地使用鎖。例…

【無線網絡技術】——無線廣域網(學習筆記)

&#x1f4d6; 前言&#xff1a;無線廣域網(WWAN)是指覆蓋全國或全球范圍內的無線網絡&#xff0c;提供更大范圍內的無線接入&#xff0c;與無線個域網、無線局域網和無線城域網相比&#xff0c;它更加強調的是快速移動性。典型的無線廣域網&#xff1a;蜂窩移動通信系統和衛星…

Linux UUCP命令教程:如何在Linux系統中進行文件復制(附實例詳解和注意事項)

Linux UUCP命令介紹 UUCP&#xff08;Unix-to-Unix Copy&#xff09;是一套允許遠程執行命令和傳輸文件的程序。UUCP命令是該套件中的一個程序&#xff0c;它為請求文件復制操作提供了用戶界面。UUCP套件還包括uux&#xff08;遠程命令執行的用戶界面&#xff09;、uucico&…