1. 程式人生 > >FPGA時序約束之時鐘約束(altera)

FPGA時序約束之時鐘約束(altera)

在quartus ii中,為了確保得到準確的靜態時序分析結果,我們必須要對設計裡所有的時鐘進行約束。
quartus ii裡的靜態時序分析工具支援以下幾種型別的時鐘約束:
(1) Base clocks 基礎時鐘;
(2) Virtual clocks 虛擬時鐘;
(3) Multifrequency clocks 多頻率時鐘;
(4) generated clocks 生成時鐘。
在sdc裡編寫約束檔案時,首先要對時鐘進行約束,因為其他的約束都是參考時鐘進行的。靜態時序分析是從sdc的上面到下面依次讀取你寫的約束指令的。
1、建立 Base clocks 基礎時鐘 約束
基礎時鐘是輸入fpga的主要時鐘,基礎時鐘是由片外的晶振或者外部器件產生的,是整個設計的時鐘源頭,其餘的generated clocks以及其它約束都是用base clocks作為參考時鐘的。
用create_clock 指令 對輸入時鐘進行約束,下面的7-8是對一個輸入的時鐘作約束

-period 10 是指輸入的時鐘週期是10ns,即頻率為100Mhz;
-waveform {2.5 7.5}是指時鐘偏移2.5ns(週期/4),即相位偏移了90°;
-get_ports clk_sys 是指輸入的時鐘是從clk_sys這個管腳輸入fpga的。
這裡寫圖片描述

對同一個輸入管腳有多個頻率的時鐘進行約束,在第二條指令後加 -add, 該約束命令表示從clk_sys管腳輸入的時鐘 有100M和200M兩種頻率。格式如下:
這裡寫圖片描述

2、建立 Virtual clocks 虛擬時鐘 約束
虛擬時鐘並沒有真正的輸入源,是通過指令虛擬出來的。虛擬時鐘主要是用在I/O輸入輸出約束上,用來代表與fpga相連的外部器件的時鐘。比如源同步輸入時,就可以通過建立虛擬時鐘進行輸入最大最小延遲約束。
下面是建立一個名稱為 my_virt_clk,週期10ns的虛擬時鐘。注意這裡沒有get_ports 項。
這裡寫圖片描述

3、建立 Multifrequency clocks 多頻率時鐘 約束
指令格式如下,上面在2裡已經講過。
這裡寫圖片描述

4、建立 generated clocks 生成時鐘 約束
generated clocks是指從PLL生成的時鐘,或者由程式分頻產生的時鐘。在sdc裡用create_generated_clock指令對生成時鐘進行約束。Options 裡有綜括號的表示是可選的,不是必須的。格式如下:
這裡寫圖片描述
-name 用來指定通過create_generated_clock指令生成的時鐘名稱
-source 指用來生成時鐘的源時鐘,比如在PLL裡,指輸入PLL的源時鐘
-master_clock 是指源時鐘如果有幾個不同的頻率,該master_clock指示源時鐘用的哪個頻率的時鐘作為source clock
-divide_by 時鐘的分頻值
-multipl_by 時鐘的倍頻值
-duty_cycle 生成時鐘的佔空比
-invert 生成時鐘反相
-phase 生成時鐘相位偏移值

下面是用程式進行分頻產生時鐘的例子
一個暫存器把輸入的時鐘CLK_IN進行二分頻輸出
這裡寫圖片描述
對其進行時鐘約束,指令如下:
這裡寫圖片描述

再舉一個PLL生成時鐘約束的例子:
下面是在程式裡例化的一個PLL,輸入時鐘CLK是 25Mhz,產生4個輸出時鐘
outclk_0 是125M,outclk_1是 25M,outclk_2 是2.5M,outclk_3 是50M

這裡寫圖片描述

首先對輸入時鐘CLK進行約束,指令如下:
這裡寫圖片描述
其次,再對PLL生成的時鐘進行約束,指令如下:
PLL為了生成輸出的4個時鐘,先產生了一個500Mhz的臨時時鐘,名稱為pll_inst|pll_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|vcoph[0],後面輸出的時鐘都是以這個時鐘作為源進行分頻的。

這裡寫圖片描述
line160-164產生一個500Mhz的時鐘
- name 名稱為pll_inst|pll_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|vcoph[0]
-source 指該模組的輸入時鐘管腳名稱為pll_inst|pll_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|refclkin
-duty_cycle 50 即生成時鐘佔空比為50%
-multiply_by 20 即倍頻20 ,所以該時鐘頻率為 源輸入時鐘頻率25M*20=500M
-master_clock {altera_tse_CLK} 即為輸入該模組的時鐘名稱 是altera_tse_CLK
gen_pins 指該模組輸出500Mhz時鐘的管腳名稱為pll_inst|pll_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|vcoph[0]

line166-170輸出125Mhz時鐘,名為 clk_125M_0deg
- name 名稱為clk_125M_0deg
-source 指該模組的輸入時鐘管腳名稱為pll_inst|pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|vco0ph[0]
-duty_cycle 50 即生成時鐘佔空比為50%
-multiply_by 1 即倍頻1
-divide_by 4 分頻4,所以該時鐘頻率為輸入時鐘頻率500M*1/4=125Mhz
-master_clock即為輸入該模組的時鐘名稱是 pll_inst|pll_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|vcoph[0] 該時鐘就是line160-164產生的公共時鐘
gen_pins 指該模組輸出500Mhz時鐘的管腳名稱為pll_inst|pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk

line172-176輸出125Mhz時鐘,名為 clk_25M_0deg

line178-182輸出2.5Mhz時鐘,名為 clk_2_5M_0deg

line184-188輸出50Mhz時鐘,名為 mm_clk

對於上面的那些輸入時鐘或者管腳的名稱是怎麼知道的?
我是先在sdc裡輸入 derive_pll_clocks 這條指令 進行全編譯,編譯後在 編譯報告裡的Timequest ->clocks裡就有對應的名稱了。然後在進行上面的約束,就行了。

5、derive_pll_clocks
該命令是將程式裡所有的PLL生成的時鐘都進行約束,生成約束時鐘的名稱不能修改。所以為了可以靈活地修改生成時鐘的名稱,很多時候都是用create_generated_clock 指令來對PLL生成時鐘進行約束。
下面就是用兩種方式對PLL生成的時鐘進行約束
這裡寫圖片描述
用create_generated_clock指令生成的時鐘名字是可以修改的,比如上面生成的時鐘名稱 c100,c200,c200_shift
而用derive_pll_clocks 生成的時鐘名稱是固定的 是PLL模組輸出管腳的名稱

6、derive_clock_uncertainty
對時鐘的uncertainty 進行約束,時鐘的uncertainty指的是時鐘的jitter抖動和skew偏斜。 用derive_clock_uncertainty,靜態時序分析工具會自動地去計算時鐘的uncertainty,而不用手動去新增。

7、set_clock_groups 建立時鐘分組 命令
由於靜態時序分析工具 預設所有的時鐘都是相關的,這樣會把一些沒有關聯的訊號進行分析,導致錯誤的分析結果,所有需要用該命令去把時鐘進行分組。
set_clock_groups 有兩個型別 :
-exclusive:表示所分的組是互斥的,不能同時存在。
-asynchronous:表示所分的組是非同步的,即不相關的。
下面是建立兩個互斥的時鐘分組,時鐘clk_A 和clk_B分在不同的組,是互斥的。兩者不會在程式裡同時存在。
這裡寫圖片描述
下面是建立兩個非同步的時鐘分組,時鐘clk_A 和clk_B為一組,clk_C為另外一組,這樣clk_A ,clk_B 與clk_C就是非同步的,不相關的。
這裡寫圖片描述

相關推薦

FPGA時序約束時鐘約束(altera)

在quartus ii中,為了確保得到準確的靜態時序分析結果,我們必須要對設計裡所有的時鐘進行約束。 quartus ii裡的靜態時序分析工具支援以下幾種型別的時鐘約束: (1) Base clocks 基礎時鐘; (2) Virtual clocks

FPGA I/O 口 時鐘約束

FPGA時鐘約束在高速訊號的傳輸設計中是非常重要的,主要是考慮到了建立裕量和保持裕量,如果上述兩個量有其中一個為負,則會導致鎖存的資料處於亞穩態的狀態。 一.當clock由外部時鐘提供,分析如下: 上圖是在外部資料傳到FPGA的一個示意圖,對各個延時的解釋如下: clk1

Xilinx FPGA內部資源時鐘篇1

以下時鐘介紹以Virtex5系列晶片作為參考晶片 從時鐘的角度可以將Xilinx FPGA劃分為若干個時鐘域(Clock Region),不同的FPGA晶片具有不同數量的時鐘域,XC5VLX30有8個時鐘域,XC5VLX330有24個時鐘域。事實上每個時鐘域的大

Web學習日記_06:XML約束DTD約束

1,為什麼需要XML約束; 比如我們定義一個人的XML檔案,裡面包括人的元素姓名、年齡、性別等,但是如果你 寫入貓這個元素的時候,執行XML可以正常顯示。但是貓不是屬於人所屬的元素,不符合 人的現實關。所以這時候就需要XML約束來約束文件人的元素。 2,XML約束技術:DTD約束和sc

約束語義約束

很好 思考 這就是 自己 c++ 通過 因此 一個 學習 思考問題的思維:考慮問題也是有方法可行的,這就是哲學的範疇,因此學習哲學可以讓我們更好的思考 約束之語義約束我們生活在一個人類自己到處制定的“約束”之中,如果我們能很好的理解這些

《XDC約束技巧時鐘

《XDC約束技巧之時鐘篇》中曾對I/O約束做過簡要概括,相比較而言,XDC中的I/O約束雖然形式簡單,但整體思路和約束方法卻與UCF大相徑庭。加之FPGA的應用特性決定了其在介面上有多種構建和實現方式,所以從UCF到XDC的轉換過程中,最具挑戰的可以說便是本文將要討論的I/O約束了。 繼《XDC約束

FPGA時序約束中常用公式推導

https://blog.csdn.net/huan09900990/article/details/76079820 在fpga工程中加入時序約束的目的:  1、給quartusii 提出時序要求;  2、quartusii 在佈局佈線時會盡量優先去滿足給出的時序要求;&n

FPGA時序約束——實踐篇

距離上一篇有關時序的理論篇已經有一段時間了(可以參考博文FPGA時序約束——理論篇),實際上此段時間,甚至到今天對FPGA的時序一直還是處於一種“朦朧”的狀態,經歷了一個階段的學習和專案時間,稍微有點感觸,故藉此總結一下。 1. 理論回顧 先來回顧一下有關時序的理論知識,上圖是典型的同步時序模型及其時序圖,

MySQL 約束】【數據庫設計】

方式 -- 間接 所有 lan incr 主表 三範式 一個 1.MySQL 約束:  1.約束的概念:    約束是一種限制,它通過對表的行或列的數據做出限制,來確保表的數據的完整性、唯一性。 MySQL中,常用的幾種約束: 約束類型: 非空 主鍵 唯一 外

myql完整性約束

reat session 約束 單單 varchar ngs field lob 應該 一 介紹 約束條件與數據類型的寬度一樣,都是可選參數 作用:用於保證數據的完整性和一致性主要分為: PRIMARY KEY (PK) 標識該字段為該表的主鍵,可以唯一的標識記錄

SQLServer刪除約束

不存在 test sys 不可 使用 lte ssms const sel 使用SSMS數據庫管理工具刪除約束 1、連接數據庫,選擇數據表-》展開鍵或者約束-》選擇要刪除的約束-》右鍵點擊-》選擇刪除。 2、在刪除對象彈出框中-》點擊確定。 3、刷新表-》展開鍵或者約束

SQLServerUNIQUE約束

clust 名稱 type 連接 多個 alter end create 姓名 原文:SQLServer之UNIQUE約束UNIQUE約束添加規則 1、唯一約束確保表中的一列數據沒有相同的值。 2、與主鍵約束類似,唯一約束也強制唯一性,但唯一約束用於非主鍵的一列或者多列

SQLServerDEFAULT約束

dde 工具 定義 where span 不存在 extend end 操作 原文:SQLServer之DEFAULT約束DEFAULT約束添加規則 1、若在表中定義了默認值約束,用戶在插入新的數據行時,如果該行沒有指定數據,那麽系統將默認值賦給該列,如果我們不設置默認值

五、資料庫完整性約束

  一、介紹 約束條件與資料型別的寬度一樣,都是可選引數 作用:用於保證資料的完整性和一致性主要分為: PRIMARY KEY (PK) 標識該欄位為該表的主鍵,可以唯一的標識記錄 FOREIGN KEY (FK) 標識該欄位為

linux mysql——約束(constraint)詳解

一、什麼是約束 約束英文:constraint 約束實際上就是表中資料的限制條件 二、約束作用 表在設計的時候加入約束的目的就是為了保證表中的記錄完整和有效性 比如name欄位中要讓其使用者名稱不重複,這就需要新增約束。或者必須註冊的時候需要新增郵箱等  三、約束種類

Hibernate Validator 6.0.7.Final 之一(宣告Bean約束class級別的約束

field級別的約束和property級別的約束都是針對單個屬性的,而類級別的屬性則是針對整個物件的,這在一個物件的多個屬性之間具有相關性的情況下是非常有用的。 對於下面這個類,我們應該確保乘客的數量不能多於座位的數量,也就是屬性seatCount和passengers之間具

Hibernate Validator 6.0.7.Final 之一(宣告Bean約束property級別的約束

承接上文,本文講解property級別的約束。如果我們的模型類使用的是標準的Java bean的話,我們也可以使用property級別的約束來替代field級別的約束。 public class Car { private String manufacturer;

Hibernate Validator 6.0.7.Final 之一(宣告Bean約束field級別的約束

bean校驗中的約束是通過Java註解的形式表現出來的(例如,@NotNull是一個非空約束),再細分的話,有4種類型的約束,它們分別是:field級別的約束、property級別的約束、容器元素的約束和類級別的約束。 本文講解第一種情況,也就是field級別的約束

Hibernate Validator 6.0.7.Final 之一(宣告Bean約束容器元素的約束

  首先,我們需要知道什麼是容器元素–其實就是List、Set、Map等。我們也知道,使用容器元素的時候,需要指定容器能容納的資料的型別,例如,List<String>就是說這個List容器可以容納String型別,這裡的String叫做引數化型別。本文要講的就是對引數化型別

Hibernate Validator 6.0.7.Final 之一(宣告Bean約束級聯約束

前幾篇文章講的校驗都是針對簡單屬性,那麼,如果一個bean的屬性是一個複雜物件呢,我們該怎麼校驗,其實也簡單,只需要在這個屬性上使用@Valid註解就可以了。 Person的定義 public class Person { @NotNull(message