數字邏輯verilog

2021-10-01 20:53:28 字數 1818 閱讀 9062

數字邏輯verilog

q:什麼是可綜合的電路

a:可綜合的意思是說所編寫的**可以對應成具體的電路,

不可綜合就是所寫**沒有對應的電路結構

例如行為級語法就是一種不可綜合的**,通常用於寫**測試檔案。

建立可綜合模型時,需注意以下幾點:

不使用initial

不使用#10之類的延時語句

不使用迴圈次數不確定的迴圈語句,如forever,while等

不使用使用者自定義原語(udp元件)

盡量使用同步方式設計電路

用always塊來描述組合邏輯時,應列出所有輸入訊號作為敏感訊號列表,即always@(*)

所有的內部暫存器都應該能夠被復位,在使用fpga實現設計時,盡量使用器件的全域性復位端作為系統的總復位

對時序邏輯描述和建模,盡量使用非阻塞賦值的方式,對組合邏輯描述和建模,雖然阻塞和非阻塞賦值的方式都可以,但在同一過程快中最好不要同時使用阻塞賦值和非阻塞賦值。我個人比較推薦用阻塞賦值的方式描述組合邏輯

不能在多個always塊中對同乙個變數進行賦值。對同乙個物件不能既使用非阻塞賦值,又使用阻塞賦值

如果不打算讓變數生成鎖存器,那麼必須在使用if語句或case語句時補全所有條件

不可綜合語句:

initial 初始化語句,只能在testbench中使用,不可綜合

event event在同步testbench時更有用,不能綜合

real 不支援real資料型別的綜合

time 不支援time資料型別的綜合

assign 和 deassign 不支援對reg資料型別賦值的綜合,但支援wire 型別賦值的綜合

以#開頭的延時語句不能被綜合

verilog是一種硬體描述語言,我們在寫verilog **時,首先要有所要寫的module在硬體上如何實現的概念,而不是去想編譯器如何解釋這個module。比如在決定是否使用 reg 定義時,要問問自己物理上是不是真正存在這個 register, 如果是,它的clock 是什麼? d 端是什麼?q 端是什麼?有沒有清零和置位?同步還是非同步?再比如上面討論的三態輸出問題,首先想到的應該是在 register 的輸出後面加乙個三態門,而不是如何才能讓編譯器知道要「賦值」給乙個訊號為三態。同樣,verilog 中沒有「編譯」的概念,而只有綜合的概念,我們只有綜合工具,而沒有所謂的編譯器。

當然,並不是說不可綜合的**就不重要了,在ic設計中,有70%的時間都是用來做驗證,所以說**驗證的工作對於fpga的設計同樣重要。(感謝度娘,就留著方便自己看可以的吧?)

///q:三態控制電路

a:就相當於增加乙個使能端,有三種狀態,0,1,高阻

計算機中的記憶元件由觸發器組成,而觸發器只有兩個狀態。即「0」態和「1」態,所以每條訊號線上只能傳送乙個觸發器的資訊。如果要在一條訊號線上連線多個觸發器,而每個觸發器可以根據需要與訊號線連通或斷開,當連通時可以傳送「0」或「1」,斷開時對訊號線上的資訊不產生影響,就需要乙個特殊的電路加以控制,此電路即為三態輸出電路,又稱為三態門。

///q:組合邏輯和時序邏輯

a:組合邏輯:輸出只是當前輸入邏輯電平的函式(有延時),與電路的原始狀態無關。當前電路輸入訊號任何乙個發生改變,輸出都將發生改變。

時序邏輯:輸出不僅是當前輸入電平的函式,還與目前電路的狀態有關。

///

時序邏輯中的Verilog程式解讀

同步時序邏輯電路中由於引入了時鐘脈衝,在寫verilog程式時,習慣面向過程或物件導向程式設計思維的童鞋帶來理解上的困難。在理解verilog程式時,基本要點是從電路出發,拋棄傳統的面向過程或物件導向思維,而從電路構造和電流變化的角度理解。如下面的時序邏輯電路 當時序電路處於穩態,時鐘脈衝沒有到來時...

數字邏輯基礎

十六進製制數 十六進製制數的特點是 1.由16個數碼,0 9和a f組成 2.基數是16,運算規則是逢16進1 3.在小數點左邊,從右至左的位權依次是 160 161 162 在小數點右邊,從左至右的位權依次是 16 1 16 2 16 3 數制轉換 1.非十進位制數轉換成十進位制數 轉換方法是 將...

數字邏輯基礎

數字邏輯基礎 邏輯代數與邏輯門 邏輯代數 又稱為布林代數,和普通代數一樣用字母代表變數,稱為邏輯變數。邏輯變數的取值只有兩種 0 和 1 表示與,或,非,真和假。邏輯與門 只有當決定一件事情的所有條件全部具備時,這件事情才會發生,這樣的邏輯關係稱為邏輯與關係。表示式為y ab或者y a b。邏輯或門...