天天看點

硬體描述語言VHDL——順序語句

版權聲明:本文為部落客原創文章,轉載請注明部落格位址: 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實質上隐含了引入鎖存器的含義,是以一般不在組合邏輯電路中使用。