31
VHDL 的的的 (Objects) 的的 的的的的 (1) 訊訊 (2) 訊訊 (3) 訊訊 VHDL 的的的 (Objects) 的的的的 < 訊訊訊訊 > < 訊訊訊訊 > : < 訊訊訊訊 > [ := < 訊訊訊 > ] ;

VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

  • View
    242

  • Download
    3

Embed Size (px)

Citation preview

Page 1: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL的物件 (Objects)宣告

物件種類(1) 訊號 (2) 變數 (3) 常數

VHDL的物件 (Objects)宣告語法< 物件種類 > < 物件名稱 > : < 資料型態 > [ := < 初始值 > ] ;

Page 2: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL的物件 (Objects)宣告

(1)訊號 :

在 VHDL 中的訊號是指電路上的連接點 , 它包括實體中在埠 (Port) 後宣告的接腳及在結構 (Architecture) 中宣告的訊號 (Signal) 接點

Page 3: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL的物件 (Objects)宣告 (1) 訊號例 :

Page 4: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL的物件 (Objects)宣告(2) 變 數 ( Variable ) VHDL 中的變數與一般電腦語言中的變數一樣 , 提供在程式中做計數或運算用 例 :

variable example_var1 : std_logic := '0';

………

example_var1 := ‘1’; -- 使用變數 example_var1 及設定值 =1

Page 5: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

變數

變數物件被宣告在 process 或副程式中 ,我們稱它為 process 或副程式的區域變數

Page 6: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL的物件 (Objects)宣告

常 數 ( Constant ) 常數可以宣告在任何可宣告 區域 , 但它的數值經宣告後是

不可更改的

例 : constant enable_bits : integer := 0;

Page 7: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL標準的資料型態

布 林 代 數(B o o le a n )

位 元 向 量(B it_ V e c to r)

位 元(B it)

標 準 邏 輯 向 量(S td _ L o g ic _ V e c to r)

標 準 邏 輯(S td _ L o g ic )

邏 輯 訊 號

正 整 數(P o s itiv e )

自 然 數(N a tu ra l)

整 數(In te g e r, U n s ig n e d )

實 數(R e a l)

數 值 訊 號 字 元(C h a ra c te r)

字 串(S tr in g )

時 間(T im e )

基 本 資 料 型 態

Page 8: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL標準的資料型態

整數 (integer) 整數 (integer) 型態是資料長度最長是 32bits , 整數型態資料又可分有正負號(Signed) 及無正負號 (Unsigned) 等兩種 , 指定資料型態前 您必需先宣告相關零件庫及使用相關包裝 包裝 std_logic_1164 及 std_logic_signed 主要是提供有正負號 (Signed) 型態用。包裝 std_logic_1164 及 std_logic_unsigned 主要是提供無正負號 (unsigned) 型態用。

Page 9: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL標準的資料型態

整數資料型態其長度雖然是 32bits,

但它會隨實際的數值調整資料長度 到最短。 以調整最節省硬體的大小。 例 : a := 15; 則 a 的資料長度只有 4bits

Page 10: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL標準的資料型態資料型態 說 明

實數Real

在設計時物件宣告資料型態用 , 例如 :variable float_m: real :=1.25;這個資料型態並不被許多合成工具支援。

自然數Natural

它與整數定義相同 , 值域範圍是 0~ 最大整數例如 : variable index: natural;這個資料型態因與整數型態相同所以在設計時大多數會使用整數方式宣告。

正整數Positive

值域在 1~ 最大正整數值 , 宣告範例如下 :variable pos_val: positive;

Page 11: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL標準的資料型態布林代數Boolean

值域在 {TRUE,FALSE} 或 {1,0} 宣告範例如下 : variable logic_val: boolean;數值設定範例如 : logic_val:=TRUE;

位元Bit

值域在 {1,0} 宣告範例如下 :signal en_bit: bit;數值設定範例如 : en_bit <= ‘1’;

位元向量Bit_vector

它是個位元陣列資料型態 , 宣告範例如下 :signal data_bus: bit_vector ( 31 downto 0 );數值設定範例如 :data_bus <= “0100011100100101010101011010101010”;

Page 12: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL標準的資料型態字元Character

字元型態資料長度為 8 位元 , 宣告範例如下 :variable char_val: character;數值設定範例如 :char_val := ‘A’;

字串String

它是字元陣列的資料型態 , 宣告範例如下 :variable text_val: string;數值設定範例如 : text_val:=”Hello”

時間Time

在設計時利用它來訂出時間資料型態 , 宣告範例如 :variable Td: time;數值設定範例如 : Td := 100nS;

Page 13: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

資料型態的轉換 在 VHDL 的 std_logic_arith 包裝中提供了轉換功能函數 , 做為不同型態資料的轉換 , 如 :

CONV_INTEGER( 參數 ) 將括號內的參數轉換成整數型態 , 轉換後的數值範圍在 -2147483647 to 2147483647 之間。

CONV_UNSIGNED( 參數 ) 將括號內的參數轉換成無正負號型態。

CONV_SIGNED ( 參數 ) 將括號內的參數轉換成有正負號型態。

CONV_STD_LOGIC_VECTOR( 參數 ) 將括號內的參數轉換成 STD_LOGIC_VECTOR 。

Page 14: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

配合資料型態的數值設定狀態字 代表意義

'U' 未初始化的未知值

'X' 強制性的未知值 , 隨意值 (Don't care)

'0' 邏輯狀態 :‘0’

'1' 邏輯狀態 :‘1’

'Z' 高阻抗狀態 Hi-Z

Page 15: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

配合資料型態的數值設定'w' 弱制約性的未知值 ,

隨意值 (Don't care)

'l' 邏輯狀態 : 低電位‘0’

'h' 邏輯狀態 : 高電位‘1’

'-' 隨意值 (Don't care)

Page 16: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

Std_Logic /Std_Logic_Vector

標準邏輯資料型態 Std_Logic 及 Std_Logic_Vector 可指定以上九種數值

Page 17: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

配合資料型態的數值設定

狀態字 代表意義False 邏輯狀態 :‘0

’True 邏輯狀態 :‘1’

在一般邏輯數值系統時 ,底下兩個值及其代表意義

Page 18: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

Two drivers onto a bus

Resolution function R {A, B} predicts the result of two drivers to drive signals

with values A and B onto a bus.

R {A, B} B = 0 B = 1 B = X B = Z A = 0 0 X X 0 A = 1 X 1 X 1 A = X X X X X A = Z 0 1 X Z

Page 19: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

使用者自訂資料型態列舉資料型態:

type <type_name> is ( <value list> ) ; 例 :

type traffic_light is ( red, yellow, green); …… signal lighting : traffic_light; …… lighting <= red; ………

Page 20: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

使用者自訂資料型態如果要設定 lighting 物件數值時只有 red 、yellow 及 green 三者之一才會被接受。

電路合成器會將列舉資料由左至右作二進制邏輯編碼 , 例如這個例子而言 red 將編碼成為” 00”,yellow 為” 01” 及 green為” 10” 。

Page 21: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

使用者自訂資料型態陣列資料型態

例 : TYPE nibble IS ARRAY(3 DOWNTO 0);

TYPE byte IS ARRAY(7 DOWNTO 0);

TYPE word IS ARRAY(15 DOWNTO 0);

TYPE balls IS ARRAY(0 TO 199);

Page 22: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

使用者自訂資料型態記錄資料型態

多種資料型態組成一個記錄 (Record) 群集 例 : -- 記錄資料型態宣告如下 :

TYPE clock_rec IS

RECORD

Seconds : integer 0 to 59;

Minutes : integer 0 to 59;

Hours : integer 0 to 24;

END RECORD;

…………….

Page 23: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

使用者自訂資料型態

使用記錄資料型態 SIGNAL T1,T2,T3 : clock_rec;

設定訊號物件 T1. Seconds<= 30;

T1. Minutes<= 10;

T1. Hours<= 23 ;

T2.Hours <= 3;

Page 24: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL的運算敘述

VHDL 的運算表示式分成 : 訊號設定表示式與變數表示式兩種。對於變數 (Variable) 我們使用 “ :=” 當做類似 ”等於” 的運算對於訊號則使用 “ <=” 當做類似 ”設定” 的運算

Page 25: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL的運算敘述 例 : example_var1 := '0';

訊號表示式是以 <= 來設定運算。例 : example_signal <= '001';例 : 在圖 7.1.2 中我們可以看到運算元如何使用 , 特 別將它們截取如下 : SUM <= ( A xor B) xor C; -- 全加器”和”的布林函數 CY <= (A and B) or ( B and C ) or ( A and C ); -- 全加器”進位” 的布林函數

Page 26: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL的算術運算+ 加- 減* 乘/ 除 ,* 只在編譯時設定數值運算用** 指數 * 只在編譯時設定數值運算用Abs 絕對值 , 取正值Mod 求模數 * 只在編譯時設定數值運算用Rem 求餘數 * 只在編譯時設定數值運算用

Page 27: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL的算術運算= 等於 , 如果兩值相等則為真 (true), 否則為假 (false)

如果其中有一未知值 , 則輸出未知值 X

/= 不等於 , 如果兩值不相等則為真 (true), 否則為假 (false)如果其中有一未知值 , 則輸出未知值 X

< 小於 , 如果左值小於右值則為真 (true), 否則為假 (false)如果其中有一未知值 , 則輸出未知值 X

<= 小於等於 , 如果左值小於等於右值則為真 (true), 否則為假 (false) 如果其中有一未知值 , 則輸出未知值 X

> 大於 , 如果左值大於右值則為真 (true), 否則為假 (false) 如果其中有一未知值 , 則輸出未知值 X

>= 大於等於 , 如果左值大於等於右值則為真 (true), 否則為假 (false) 如果其中有一未知值 , 則輸出未知值 X

Page 28: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL的邏輯運算Not 取相反And 及Or 或Nand 反及Nor 反或Xor 互斥或Xnor 反互斥或

Page 29: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL的位移運算Sll 邏輯性左移Srl 邏輯性右移Sla 算術性左移 ( 牽涉正負

號 )Sra 算術性右移 ( 牽涉正負號 )Rol 向左旋轉

Ror 向右旋轉

Page 30: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

VHDL的其它運算- 取負值& 字元或字串串接運算

Page 31: VHDL 的物件 (Objects) 宣告 物件種類 (1) 訊號 (2) 變數 (3) 常數 VHDL 的物件 (Objects) 宣告語法 : [ := ] ;

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY exercise is

PORT( A : IN STD_LOGIC_VECTOR(3 DOWNTO 0); B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

C : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

END exercise;ARCHITECTURE architec OF exercise ISBEGIN

C(0) <= Not A(0);C(2 downto 1) <= A(2 downto 1) and B(2 downto 1);C(3) <= '1' xor A(3) ;C(7 downto 4) <= "1111" WHEN (A /= B) else "0000";

END architec;