VHDL並行語句於順序語句的理解

2021-09-30 08:01:20 字數 4735 閱讀 3548

vhdl的並行語句用來描述一組並發行為,它是併發執行的,與程式的書寫順序無關。

程序語句

begin

程序語句包含在結構體中,乙個結構體可以有多個程序語句,多個程序語句間是並行的,並可訪問結構體或實體中定義的訊號。因此程序語句稱為並行描述語句。

進行語句結構內部所有語句都是順序執行的

程序語句的啟動是由process後敏感訊號表中所標明的敏感訊號觸發來的。

各程序間的通訊是由訊號來傳遞的

語法如下:

標記:

process(敏感訊號表)

變數說明語句;

begin

一組順序語句;

end process 標記;

標記:為程序標號

敏感訊號表:是程序用來讀取所有敏感訊號(包括埠)的列表。

變數說明:主要包括變數的資料型別說明、子程式說明等

從begin到end process之間是一組順序執行語句。

敏感訊號表

所 謂敏感訊號表:就是用來存放敏感訊號的列表。在程序語句中,敏感訊號指那些發生改變後能引起程序語句執行的訊號。敏感訊號表中可以使用乙個或多個訊號,當 其中乙個或多個訊號值改變時,就在程序內部引起語句執行。敏感訊號表也可忽略,但程式中必須有其他形式的敏感訊號激勵。例如wait、wait for、wait until和wait on。

程序語句的啟動

在vhdl語言中,程序有兩種工作狀態:等待和執行。當敏感訊號表中的訊號沒有變化時,程序處於等待狀態;當敏感訊號表中的訊號有變化時,程序處於執行狀態

程序語句的同步

同乙個結構體中不僅可以有多個程序存在,同乙個結構體中的多個程序還可以同步。vhdl中通常採用時鐘訊號來同步程序,具體方法是:結構體中的幾個程序共用同乙個時鐘訊號來進行激勵。

併發訊號賦值語句

訊號賦值語句在程序內部出現時,它是一種順序描述語句。

訊號賦值語句在結構體的程序之外出現時,它將以一種併發語句的形式出現。它們在結構體中是並行執行的。

注意:併發訊號賦值語句是靠事件來驅動的,因此對於併發訊號賦值語句來說,只有當賦值符號「<=」右邊的物件有事件發生時才會執行該語句。

條件訊號賦值語句

語法結構:

目標訊號<=表示式1 when 條件1 else

表示式2 when 條件2 else

表示式3 when 條件3 else

...表示式n-1 when 條件n-1 else

表示式n;

vhdl 語言程式執行到該語句時,首先要進行條件判斷,之後才進行訊號賦值。如果滿足條件,就將該條件前面那個表示式的值賦給目標訊號;如果不滿足條件按,就繼續 判斷,直到最後乙個表示式,如果前面的條件均不滿足就無條件的賦值給最後乙個表示式,因為最後乙個表示式賦值無需條件。

選擇訊號賦值語句

語法結構:

with 表示式 select

目標訊號<=表示式1 when 選擇條件1,

表示式2 when 選擇條件2,

...表示式n when 選擇條件n;

該語句在賦值之前需要對條件進行判斷,附和條件則賦值,否則繼續判斷,直到最後乙個語句。選擇賦值語句需要把表示式的值在條件中都列舉出來。

元件例化語句

在vhdl中,引用元件或者模組的說明採用component語句,他的作用是在結構體說明部分說明引用的元件或者模組,是元件說明語句。

語法格式:

component 引用的元件名

generic 引數說明;

port 埠說明;

end componet;

引用的元件名

是將乙個設計現成的實體定義為乙個元件,是已經設計好的實體名,用來制定要在結構體中使用的元件名稱

如果結構體中要進行引數的傳遞,那麼component語句中需要類屬引數說明--可選項;

引用元件埠的說明,是已經設計好的實體埠名錶;

元件說明語句在architecture和begin之間。

元件例化引用

採用componet語句對要引用的原件進行說明後,為了引用的元件正確地嵌入到高一層的結構體描述中,就必須把被引用的元件埠訊號於結構體中相應埠訊號正確地連線起來,這就是元件例化語句要實現的功能。

語法結構:

標號名:元件名

generic map(引數對映)

prot map(埠對映);

其中標號:是元件例化語句的惟一標識,結構體中的標號名應該是惟一的

generic map語句:它的功能是實現對引數的賦值操作,從而可以靈活地改變引用元件的引數,為可選項

prot map:它的功能是把引用元件的埠訊號與實際連線的訊號對應起來,從而進行元件的引用操作。

vhdl中,為了實現引用元件的埠訊號與結構體中的實際訊號相連線,往往採用兩種對映方法:

1、位置對映方法:指port map語句中實際訊號的書寫順序於componet語句中埠說明的訊號書寫語句順序一致

2、名稱對映方法:指在port map中將引用的元件的埠訊號名稱賦值給結構體中要使用例化元件的各個訊號

(名稱對映語句的書寫要求不是十分嚴格,只要把對映的對應訊號連線起來就可以,順序可以顛倒)。

生成語句

規則結構

某些電路部分是由同類元件組成的陣列,這些同類元件叫規則結構,例如:隨機ram、唯讀rom、移位暫存器等規則結構一般用生成語句來描述。

生成語句有兩種形式:for_generate和if_generate

for_generate主要用來描述規則

if_generate主要用來描述結構在其端部表現出的不規則性,例如邊界條件的特殊性

for_generate語句

標號:for 迴圈變數 in 離散範圍 generate

並行處理語句;

end generate 標號;

標號:用來作為for_generate語句的唯一識別符號,可選項;

迴圈變數:它的值在每次迴圈中都將發生變化;

離散範圍:用來指定迴圈變數的取值範圍,迴圈變數的取值將從取值範圍最左邊的值開始並且遞增到取值範圍的最右邊,實際上限定了迴圈次數

for_generate與for_loop語句很類似,但二者有區別。for_loop語句的迴圈體中的處理語句是順序的,而for_generate語句中處理的語句是並行處理的,具有併發性。

if_generate語句

標號:if 條件 generate

並行處理語句;

end generate 標號;

if_generate語句是並行處理語句,其中不允許出現else子語句

初學vhdl,對一些問題總是感到困惑。比如,同樣的賦值語句,在什麼場合是並行的,什麼時候又是順序的?訊號與變數有什麼區別,為什麼在process 裡,對訊號賦值的結果要等到程序掛起才起作用,而變數賦值卻立刻起作用?其實,從語句產生的電路這個角度,可以更深刻地理解這些問題,下面是我自己摸索的 一些理解方法,有不妥之處請大蝦們指正!

1、賦值語句。

同樣a <= b的賦值語句,會形成什麼電路,起關鍵作用的是敏感訊號。

a) 如果a <= b是在程序之外,那麼隱含的敏感訊號就是b,那麼,這個賦值語句就形成一條連線。

b) 如果是在乙個同步程序中,如if (rising_edge(clk)) then a <= b,這時候,就會形成乙個觸發器,因為敏感訊號是時鐘邊沿。

c) 如果敏感訊號是乙個電平訊號,那麼會形成乙個鎖存器。如乙個不完整的if條件:if (cond = '1') then a <= b;

2、並行語句和順序語句。

從形成的電路的角度,並行語句最終會有兩種形式:

a) 併聯或不相聯的邏輯門或組合電路。因為是併聯或不相聯的,當然是同時執行,這個好理解。

b) 由同乙個時鐘邊沿驅動的d觸發器,不論d觸發器之間是併聯、串聯或者不相連的。為什麼呢?因為觸發器是在同乙個時鐘邊沿同時翻轉的,也就是同時執行,所以本質上就是並行。

順序語句只有一種情況,就是形成串聯的邏輯門或組合電路。

3、訊號與變數有什麼不同?為什麼訊號賦值要等到程序掛起生效,變數賦值卻立刻生效?

其實,了解了上一點並行語句和順序語句所生成的電路,這個問題就好理解了。因為在同步程序裡的並行語句,大多是形成b的情況,就是多個由同一時鐘驅動的觸 發 器。由於從觸發器的輸入到翻轉、輸出需要一定的延時,這個延時基本就是程序執行完畢的時間,所以,觸發器翻轉後的輸出在同乙個時鐘邊沿中是看不到的,因為 它還沒翻轉過來呢。這就是訊號賦值要等到程序掛起才生效的原因。

那為什麼變數賦值卻能立刻生效呢?這是因為,變數其實是為了幫助在同步程序中生成一些邏輯門或組合電路用的。看一看**:var1 := not i1; var2 := var1 and i2 ; sig <= var2; 生成的rtl,就會看到,兩個變數賦值語句其實生成了乙個非門、乙個與門。而且,輸入訊號i1和i2到var2這段是個組合電路,是不受時鐘邊沿控制的, 而到訊號賦值語句sig <= var2,才形成乙個d觸發器。所以,這兩個變數賦值語句生成了乙個串聯的非門和與門,那當然var2取到的是var1賦值後的值了。

最後順便提一下為什麼變數必須只能在程序內可見,我猜可能是為了防止在同步程序中輸出非同步訊號,造成混亂吧。因為如果變數是外部可見的,如上面的 var2,那麼var2的值就可以非同步輸出到程序外了。所以限制變數只能程序內可見後,要輸出變數的值就只能賦值給乙個訊號,在同步程序中,就是加了乙個 觸發器了。 

硬體描述語言VHDL 並行語句

並行語句是是硬體描述語言的特殊之處,這也是硬體描述語言不可少的一部分。硬體電路例如 匯流排,它需要多個輸入。這個時候,我們必須併發的給出匯流排上的資料。軟體程式語言也有併發,但是在效能要求不是苛刻的情形下,無需使用併發。軟體的併發由多執行緒和多程序來實現。在vhdl中,併發語句是同時執行的。它們的書...

for迴圈的語句執行順序

在乙個技術qq群中,試著做了一道c的題,感覺是考察for迴圈的執行流程.原題 在c語言中,下列 的輸出結果是 選擇一項 void main j printf d,d i,j a 0,109,9 b 0,10 10,10c 10,10d 9,11 群裡居然有不少人都選了b,那個提問者還一直在問正確的結...

SQL Update語句的執行順序

執行順序 從左到右,變數優先,逐行更新 摘自csdn的例子 http topic.csdn.net u 20091030 16 7fd75fa6 bdb9 4516 9b27 48aef69703ba.html 1.變數優先 create table t field1 varchar 10 fiel...