VHDL基礎2
Signals & Variables
VHDL 提供了 signal
和 variable
兩種對象來處理非靜態數據;提供了 constant
和 generic
來處理靜態數據。
constant
和 signal
是全局的,可以在順序執行的代碼中,也可以在並發執行的代碼中;variable
是局部的,只能值順序代碼中,並且它們的值是不能向外傳遞的(如果想傳遞出去,必須先把這個變量值傳遞給一個信號,再由這個信號傳遞出去)。
constant
constant 可以定義在 package, entity, architecture 中,對應的作用域也不同。
-
定義在 package 中的 constant 是真正的全局的,可以被所有調用該 package 的 entity 使用
-
定義在 entity 中的 constant 對於該 entity 的所有 architecture 而言是全局的
-
定義在 architecture 中的 constant 僅在該 architecture 中是全局的
signal
VHDL 中的 signal
代表的是邏輯電路中的 “硬”連線,既可以用於電路的輸入輸出端口,也可以用於 內部單元之間的連接。
variable
相比於 signal 是局部的,variable 只能在 process,function,procedure 中使用,而且對它的賦值是立即更新的,新的值可以在下一行代碼中立即使用。
Packages and Components
package
除了 component
, function
, procedure
之外,package 中還可以包含 TYPE
, CONSTANT
的定義。
1 PACKAGE package_name IS 2 (declarations) 3 END package_name; 4 5 [PACKAGE BODY package_name IS 6 (delarations 7 and conments) 8 END package_name;]
可以看到,語法包括兩部分,PACKAGE
和 PACKAGE BODY
Component
一個 component 是一段完整的代碼(包括 library, entity, architecture 這些組成部分),如果將這些代碼聲明為一個 component,那麽就可以被其他電路調用,從而使代碼具有了層次化的結構。
使用 component 必須先聲明這個元件,然後再例化這個元件(類似 C++,變量先聲明,在定義)。聲明和例化都必須在 architecture 中進行。
declaration syntax
1 COMPONENT component_name IS 2 --元件端口信息 3 PORT( 4 port_name: signa_type; 5 port_name: signa_type; 6 ...); 7 END COMPOMENT;
instantiation(例化) syntax
1 例化名: component_name PORT MAP (port_list);
聲明元件時,可以有兩種方法:
-
上面的方法,先聲明再例化
-
使用 package 進行聲明,將 component 的聲明放在 package 中,則可以避免每次元件例化都要重復聲明
Functions and Procedure
function 和 procedure 統稱為 子程序,它們和 process 相似,內部包含的都是順序描述的代碼,通常使用相同的順序描述語句。但是,function 和 procedure 的存在主要是為了建庫,以達到代碼重用和共享的目的,當然它們也可以直接建立在主代碼中。
Function
在寫代碼的過程中,我們通常會遇到一些有共性的問題,我們希望實現這些功能的代碼可以被共享和重用,從而使代碼變得簡潔,易於理解,function 的建立和使用就能達到這個目睹。 function 中可以使用 if
, case
, loop
等語句,但是不能有 signal
和 component
。
Function Body
1 FUNCTION function_name [<參數列表>] RETURE 數據類型 IS 2 [說明部分] 3 4 BEGIN 5 (順序語句) 6 END function_name;
其中,函數的參數列表:
1 <parameter list> =[CONSTANT] name : type; 2 = SIGNAL name : type;
Function Call
函數可以單獨構成表達式,也可以作為表達式的一部分
Function Location
函數可以存放在兩個地方:
-
Package 中,這時候,函數聲明在 package 中,函數定義在 package body 中
-
Main Code 中,既可以在 entity 中,也可以在 architecture 中
FUNCTION versus PROCEDURE Summary
-
function 有任意個輸入參數和一個返回值,輸入參數只能是 constant, signal
-
procedure 有任意個輸入/輸出/雙向參數,可以是 signal, variable, constant
-
function 可以作為表達式的一部分,procedure 直接調用
-
function 和 procedure 內部,wait 和 component 都不可綜合
-
function 和 procedure 的存放位置相同,經常位於 package 中,也可以在主代碼中
VHDL基礎2