版權聲明:本文為部落客原創文章,轉載請注明部落格位址: https://blog.csdn.net/zy010101/article/details/88685089
VHDL語言的基本語句分為兩大類,順序語句和并行語句。這是由于硬體設計的特點所引起的。假設需要設計一個三輸入的與門和兩輸入的或門,将它們兩個的結果作為輸入給加法器,那麼這就需要同時給5個信号。這是并行的,不能順序執行。
在VHDL中,變量的指派語句使用":="這個符号,變量的指派是立即生效的。
信号的指派語句使用"<=",它的指派是有延遲的,不是立即生效的。
變量是個局部量,而信号是全局的。信号是有實際的實體硬體與之對應的。
WAIT語句
wait語句是控制程式是否挂起的語句,一般有如下幾類:
wait; --程序在無限等待
wait on 信号表; --等待信号表中某個信号發生,然後執行程序
wait until 條件表達式; --當條件表達式為真,執行程序。
wait for 25 ns; --等待25ns以後,執行程序。
複制
需要注意的是,wait for一般隻用來進行仿真,不能用來産生實際的信号。因為綜合器不能準确産生時間。
IF語句
--IF語句格式1
IF 條件表達式 THEN
順序語句;
END IF;
--IF語句格式2
IF 條件表達式 THEN
順序語句;
ELSE
順序語句;
END IF;
--IF語句格式3
IF 條件表達式 THEN
順序語句;
ELSIF 條件表達式 THEN
順序語句;
......
ELSE
順序語句;
END IF;
複制
if語句和一般的軟體程式設計語言并沒有什麼差別,需要注意的是它使用的是elsif,而不是elseif。并且if語句需要使用end if來結束。IF語句是按照順序自上而下逐一判斷條件是否成立,适合用來設計優先編碼器。
- IF語句可以嵌套,但是層數不易過多。
- IF語句允許判斷條件重疊,這是因為它是自上而下執行的。
- 當IF語句的條件無重疊的時候,建議使用CASE語句來代替。
- IF的分支必須包含所有情形,否則綜合器就會認為你需要引入鎖存器。
CASE語句
case語句一般以case開頭,後面跟上表達式和IS。注意所有的表達式的值都必須窮舉,不能窮舉的值用others表示。case語句以end case;結束。它和軟體語言不一樣,沒有break。
case 條件 is
when 取值1 => 順序處理語句1;
when 取值2 => 順序處理語句2; -- =>相當于IF語句中的THEN
......
when others => 順序處理語句n;
end case;
複制
- CASE語句的所有條件判斷是不具備優先級的,是并發執行的。
- CASE語句中所有的取值必須保證是互斥的。
- CASE語句比IF語句更加消耗晶片資源。
LOOP語句
标号: for 循環變量 in 取值範圍 loop
順序處理語句;
end loop 标号;
複制
這個和彙編語言極其相似。循環變量将會從取值範圍的左邊逐漸變化到取值範圍的右邊,一般是采用TO或者是DOWNTO來指定範圍的。通常循環變量的類型無需說明。
标号:while 條件表達式 loop
順序處理語句;
end loop 标号;
複制
這個和for loop語句是類似的效果。隻不過for loop的循環次數是确定的,while loop的循環次數不确定。這就類似于C語言的for循環和while循環。
循環語句中的标号不是必須的,通常在多重循環裡我們必須使用标号。一個例子如下:
FOR i IN 0 TO 9 LOOP
sum:=sum + 1;
END LOOP;
複制
需要注意的是一般的綜合器隻支援FOR_LOOP語句,而不支援WHILE_LOOP語句。并且範圍隻能是具體的數值。
NEXT語句和EXIT語句
next語句相當于C語言的continue語句,而exit語句相當于C語言的break語句。
next;
next 标号;
複制
exit;
exit 标号;
複制
RETURN語句
return語句是用來結束目前最内層的函數或者是過程體的執行。
return 表達式; --隻能用在函數中
return; --隻能用在過程中
複制
NULL語句
NULL語句隻是一種占位操作,它不進行任何操作,不會産生時延。一般它用在when others語句後面的順序執行語句中。用來表示除正常情形以外不做任何其他操作。
WHEN OTHERS => NULL;
複制
這個NULL實質上隐含了引入鎖存器的含義,是以一般不在組合邏輯電路中使用。