Presentation is loading. Please wait.

Presentation is loading. Please wait.

VHDL 硬體描述語言 數位電路設計實務 第六章 函數副程序以及套件程式庫.

Similar presentations


Presentation on theme: "VHDL 硬體描述語言 數位電路設計實務 第六章 函數副程序以及套件程式庫."— Presentation transcript:

1 VHDL 硬體描述語言 數位電路設計實務 第六章 函數副程序以及套件程式庫

2 6-1 function 函數宣告 在行為模型 (Behavioral Model) 的設計中、我們通常在程式的許多地方重複著相同描述的程式碼,這樣的情況在一般的電腦程式語言裡、通常將重複用到的程式碼設計成函數或是程序的形式,再去引用、而不用繁瑣的鍵入同樣的程式碼,在 VHDL 中對於相同的程式碼可以在程式中的不同地方被引用而不需要繁瑣的一再鍵入相同的程式碼。 function 敘述如同在 Quick Basic 程式語言、Pascal 程式語言或 Fortran 程式語言裡的 function。 function 的傳回值是儲存在和函數同樣名樣的這個變數中。 function 可以接受一個或多個參數而將 function 運算 / 處理完成之後會傳回一個值。 由於 VHDL 對於型態的檢查特別地嚴謹,所以實際參數與相對應 function 位置的參數二者的型態必需要一致。 function 必需寫在 package body package_name is … end package_name; 或 entity entity-name is … end entity-name; 或者是 architecture … begin 之內。

3 function function-name (
signal-name-1 : signal-type; ... signal-name-N : signal-type ) return return-type is ”宣告部份“ begin sequential-statement end function-name;

4 其中: u function-name 用來描述這個 function 的名稱。function 的名稱上下要一樣,例如: function StrCat ( … begin ... end StrCat; u signal-names-1 …signal-names-N 用來描述參數的名稱,二個參數之間要用分號 (;) 區隔開來。 這個部份可以不寫。 u signal-type 訊號的型態,用來描述參數的型態。 例如:std_logic、std_logic_vector( 3 downto 0)、bit_vector( 3 downto 0) … 等等。請參考“VHDL 內定的資料型態”。 u ) return return-type is return 是“傳回”的意思,return-type 是回傳訊號的型態。

5 u ”宣告部份“ ”宣告部份“ 是可以不寫的,但內容可以包括: l subprogram declaration, 程序宣告
l subprogram body, 程序內容 l type declaration, 型態宣告 用來定義只能在 function 區塊內使用的“使用者自行定義的型態”(User-Define type)。例如請看“architecture 的語法”。 l subtype declaration, 子型態宣告 l constant declaration, 常數宣告 用來定義只能在 function 區塊內使用的“常數”,跟 C 語言的 #define 以及 Verilog 的 parameter 一樣。例如請看“常數 constant 宣告”。 l variable declaration, 變數宣告 用來定義只能在 function 區塊內使用的變數。例如: variable sig : std_logic; variable value : bit_vector(7 downto 0) := " ";

6 l file declaration, 檔案宣告
l alias declaration, 別名宣告 l use clause, use 子句 l group declaration, 群組宣告 l function declaration, 函數宣告 用來定義只能在 function 區塊內使用之函數內的巢狀函數 (nested function) 。 l procedure declaration, 程序宣告 定義只能在 function 區塊內使用的 procedure (程序)。例如請看“procedure 程序宣告”。 u 最後是 begin … end function-name 區塊 用來描述 function 的功能。在這個區塊內可以有:訊號的指定動作、if … else 之類可以寫在 process 內的敘述。

7 在 function 中可以再定義自己 function 區塊內的型態 (type)、常數(constant)、變數 (variable)、程序 (procedure) 以及函數內的巢狀函數 (nested function),函數內的 type、constant、variable、procedure以及 function 在函數之外是不能夠引用的。例如: function hash (constant a : addr_t) return integer is begin return conv_integer(a(15 downto 0)); end; function to_char( A : std_logic) return character is begin -- 將 std_logic 轉換成 character case A is when '0' | 'L' => return '0'; when '1' | 'H' => return '1'; when 'Z' => return 'Z'; when OTHERS => return 'X'; end case;

8 function to_std_logic ( B : character) return std_logic is
begin -- 將 character 轉換成 std_logic case B is when '0' => return '0'; when '1' => return '1'; when OTHERS => return 'X'; end case; end; function to_string( A : std_logic_vector) return string is variable stmp : string( A'left+1 downto 1); begin -- 將 std_logic_vector 轉換成 string for i in A'reverse_range loop if A(i) = '1' then stmp(i+1) := '1'; elsif A(i) = '0' then stmp(i+1) := '0'; else stmp(i+1) := 'X'; end if; end loop; return stmp;

9 function to_std_logic_vector ( B : string) return std_logic_vector is
variable res : std_logic_vector (B'range); begin -- 將 string 轉換成 std_logic_vector for i in B'range loop case B(i) is when '0' => res(i) := '0'; when '1' => res(i) := '1'; when OTHERS => res(i) := 'X'; end case; end loop; return res; end;

10 使用函數設計 『相加、加1及相減處理』的方塊圖
use work.pkg_Func_Add_Sub.all; entity Func_Add_Sub is port( a : in std_logic_vector( 4 downto 0); b : in std_logic_vector( 4 downto 0); Add : in std_logic; Sub : in std_logic; Inc : in std_logic; Switch : in std_logic; c : out std_logic_vector( 4 downto 0) ); end Func_Add_Sub;

11 architecture arc of Func_Add_Sub is
function Sub_Inc_Dec ( a : std_logic_vector( 4 downto 0); b : std_logic_vector( 4 downto 0); Sub : std_logic; Inc : std_logic ) return std_logic_vector is constant Is_1 : std_logic_vector( 4 downto 0) := conv_std_logic_vector( 1, 6)( 4 downto 0); variable result : std_logic_vector( 5 downto 0); begin if ( Sub = '1' ) then a 減 b result := signed(a(4)&a) - signed(b); elsif ( Inc = '1' ) then -- a 加 1 result := signed(a(4)&a) + unsigned(Is_1); else a 減 1 result := signed(a(4)&a) - unsigned(Is_1); end if; return result; end Sub_Inc_Dec;

12 begin Do_function: process( a, b, Add, Sub, Inc, Switch ) variable result : std_logic_vector( 5 downto 0); if ( Add = '1' ) then result := signed(a(4)&a) + signed(b); else if ( Switch = '0' ) then result := Sub_Inc_Dec(a, b, Sub, Inc); result := Sub_Inc_Dec(b, a, Sub, Inc); end if; c <= result( 4 downto 0); end process Do_function; end arc;

13 使用函數設計 『最多只加10的處理』的方塊圖 use work.pkg_Add_Less_Than10.all;
entity Add_Less_Than10 is port( a : in std_logic_vector( 4 downto 0); b : in std_logic_vector( 4 downto 0); c : out std_logic_vector( 5 downto 0) ); end Add_Less_Than10;

14 architecture arc of Add_Less_Than10 is
function Add_LT_10 ( a : std_logic_vector( 4 downto 0); b : std_logic_vector( 4 downto 0) ) return std_logic_vector is constant Is_10 : std_logic_vector( 4 downto 0) := conv_std_logic_vector( 10, 6)( 4 downto 0); variable temp : std_logic_vector( 4 downto 0); variable result : std_logic_vector( 5 downto 0); begin if ( b <= 10 ) then temp := b; b <= 10, +b else temp := Is_10; -- b > 10, +10 end if; result := signed(a(4)&a) + signed(temp); return result; end Add_LT_10; Do_function: process( a, b ) c <= Add_LT_10(a, b); end process Do_function; end arc;

15 6-2 procedure 程序宣告 procedure 敘述與 function 敘述大致相同、都是將模組中重複用到的程式碼設計成函數或是程序的形式,再去引用、而不用繁瑣的鍵入同樣的程式碼。不同的是 procedure 處理完成之後傳回值可以有許多個。 procedure 區塊裡面可以用來作運算的處理,也可能只是作一些一般性的敘述已並沒有傳回值的處理。 procedure敘述如同在 Quick Basic 程式語言或 Fortran 程式語言裡的Sub-Routine 或 Pascal 程式語言的 Procedure。 procedure 可以有零個或許多個參數,而 function 至少要有一個或以上的參數。 procedure 處理完成之後傳回值可以有許多個。function 處理完成之後傳回值只能有一個。

16 procedure procedure-name (
signal-name-1 : signal-type; ... signal-name-N : signal-type ) is ”宣告部份“ begin sequential-statement end procedure procedure-name;

17 其中: u procedure-name 用來描述這個 procedure 的名稱。procedure 的名稱上下要一樣,例如: procedure Sort_4_Data ( … begin ... end procedure Sort_4_Data; 也可以只寫成: end; u signal-names-1 …signal-names-N 用來描述參數的名稱,二個參數之間要用分號 (;) 區隔開來。 這個部份可以不寫。

18 u signal-type 訊號的型態,用來描述參數的型態。 例如:std_logic、std_logic_vector( 3 downto 0)、bit_vector( 3 downto 0) … 等等。請參考“VHDL 內定的資料型態”。 u ”宣告部份“ ”宣告部份“ 是可以不寫的,但內容可以包括: l subprogram declaration, 程序宣告 l subprogram body, 程序內容 l type declaration, 型態宣告 l subtype declaration, 子型態宣告 l constant declaration, 常數宣告 l variable declaration, 變數宣告 用來定義只能在 function 區塊內使用的變數。例如: variable sig : std_logic; variable value : bit_vector(7 downto 0) := " "; l file declaration, 檔案宣告 l alias declaration, 別名宣告 l use clause, use 子句 l group declaration, 群組宣告

19 u 最後是 begin … end procedure procedure-name 區塊
用來描述 procedure 的功能。在這個區塊內可以有:訊號的指定動作、if … else 之類可以寫在 process 內的敘述。 例如: procedure lookup_cache(constant a : addr_t) is variable i : integer; variable found : boolean; begin i := hash(a); found := valid_mem(i) and (a(tag_word_t'range) = atag_mem(i)); if found then hit <= '1'; else hit <= '0'; end if; end procedure lookup_cache;

20 使用procedure 『排序4筆資料』的方塊圖
由小到大排序4筆資料 (結果: ra <= rb <= rc <= rd)。 library ieee; use ieee.std_logic_1164.all; package pkg_Sort4 is component Sort4 port( a : in std_logic_vector( 3 downto 0); b : in std_logic_vector( 3 downto 0); c : in std_logic_vector( 3 downto 0); d : in std_logic_vector( 3 downto 0); ra : out std_logic_vector( 3 downto 0); rb : out std_logic_vector( 3 downto 0); rc : out std_logic_vector( 3 downto 0); rd : out std_logic_vector( 3 downto 0) ); end component;

21 procedure Sort_2_Data ( x : inout std_logic_vector( 3 downto 0); y : inout std_logic_vector( 3 downto 0) ); end pkg_Sort4; package body pkg_Sort4 is ) is variable temp : std_logic_vector( 3 downto 0); begin if ( x > y ) then temp := x; -- 交換 (Swap) x := y; y := temp; end if; end;

22 use work.pkg_Sort4.all; entity Sort4 is port( a : in std_logic_vector( 3 downto 0); b : in std_logic_vector( 3 downto 0); c : in std_logic_vector( 3 downto 0); d : in std_logic_vector( 3 downto 0); ra : out std_logic_vector( 3 downto 0); rb : out std_logic_vector( 3 downto 0); rc : out std_logic_vector( 3 downto 0); rd : out std_logic_vector( 3 downto 0) ); end Sort4;

23 architecture arc of Sort4 is
begin Do_procedure: process( a, b, c, d ) variable va, vb, vc, vd : std_logic_vector( 3 downto 0); va := a; vb := b; vc := c; vd := d; Sort_2_Data(va, vc); Sort_2_Data(vb, vd); Sort_2_Data(va, vb); Sort_2_Data(vc, vd); Sort_2_Data(vb, vc); ra <= va; rb <= vb; rc <= vc; rd <= vd; end process Do_procedure; end arc;

24 使用procedure設計 『2對4解碼器』的方塊圖
entity Decoder2to4 is port ( Sel_In : in std_logic_vector( 1 downto 0); Dec_Out : out std_logic_vector( 3 downto 0) ); end Decoder2to4; 

25 architecture arch of Decoder2to4 is
procedure Decoder2to4(Sel : in std_logic_vector(1 downto 0); Result : out std_logic_vector(3 downto 0)) is begin case Sel is when "00" => Result := "0001"; when "01" => Result := "0010"; when "10" => Result := "0100"; when "11" => Result := "1000"; when others => Result := "0000"; end case; end;

26 begin Do_Dec_2to4: process(Sel_In) variable Dec_Result : std_logic_vector(3 downto 0); Decoder2to4(Sel_In, Dec_Result); Dec_Out <= Dec_Result; end process Do_Dec_2to4; end arch;

27 6-3 function 與 procedure 宣告的 差異
u procedure 敘述與 function 敘述大致相同,都是將模組中重複用到的程式碼設計成函數或是程序的形式,再去引用、而不用繁瑣的鍵入同樣的程式碼。 u function 與 procedure 敘述都可以引用其他的 procedure 與function。 u function 與 procedure 敘述都可以擁有本身區域內的變數。 u function 與 procedure 敘述只能用於行為模型 (Behavioral Model) 的敘述中、且本身不能有 process 的敘述,但是通常是在一個 process 區塊中被引用。

28 6-4 VHDL 的 Library 以及 package 敘述
VHDL 的程式庫是讓“編譯軟體” (compiler) 儲存電路或者是專案設計資訊的地方。 “編譯軟體”預設會將編譯好的資訊放到一個叫作 work 的 library。 每當“編譯軟體”編譯產生新的模組 / 單體 (entity資訊,預設都會加到 work 這個 library 裡面。 “編譯軟體”也會尋找在 work 這個 library 裡面己經編譯好的模組 / 單體 (entity) 資訊,好讓某個正在編譯的模組可以引用到已經存在的模組 / 單體 (entity)。 也可以使用 library 內己經編譯好的模組 / 單體 (entity),例如:使用整個 IEEE library。 library IEEE;

29 6-4.2 package 敘述 您在 architecture 區塊中所定義的 procedure、function、constant、…等等都無法讓其他的 VHDL entity 來引用。 package 以及 library 敘述提供了可以讓每一個 architecture 都能存取到寫在 package 中的procedure、function、constant、…等等。 package 敘述裡面是用來作為全域性的資訊像是:constant 常數、attribute 屬性、type 型態、sub-type 子型態、component 的宣告、function 函數以及 procedure 程序的地方。

30 package 包含二大部份 宣告部份 (package declaration)
宣告 constant 常數、attribute 屬性、type 型態、sub-type 子型態、component 的宣告、attribute 的宣告、 function 函數的宣告以及 procedure 程序的宣告。 語法: package package_name is ”宣告部份“ end package;

31 u package_name 是 package 的名稱。 u ”宣告部份“ l type declaration, 型態宣告
其中: u package_name 是 package 的名稱。 u ”宣告部份“ l subprogram declaration, 程序宣告 l type declaration, 型態宣告 l subtype declaration, 子型態宣告 l constant declaration, 常數宣告 l signal declaration, 訊號宣告 l variable declaration, 變數宣告 l file declaration, 檔案宣告 l alias declaration, 別名宣告 l component declaration, 元件宣告 l attribute declaration, 屬性宣告 l attribute specification, 屬性規格 l use clause, use 子句 l group template declaration, 群組樣版宣告 l group declaration, 群組宣告

32 例如: package my_package is type ON_OFF is ( ON, OFF ); constant My_ID : INTEGER; constant MATH_E : real := _18284_59045_23536; function find_min ( a, b : integer ) return integer; procedure Sort_2_Data ( x : inout std_logic_vector( 3 downto 0); y : inout std_logic_vector( 3 downto 0) ); end my_package;

33 主體部份 (package body) 真正的 function 函數內容以及 procedure 程序內容的地方。 例如: package body my_package is function find_min ( a, b : integer ) return integer is variable result : integer; begin if ( a <= b ) then result := a; else result := b; end if; return result; end find_min; -- end; -- 也可以只寫 end;

34 procedure Sort_2_Data (
x : inout std_logic_vector( 3 downto 0); y : inout std_logic_vector( 3 downto 0) ) is variable temp : std_logic_vector( 3 downto 0); begin if ( x > y ) then temp := x; -- 交換 (Swap) x := y; y := temp; end if; end Sort_2_Data; -- end; -- 也可以只寫 end; end my_package; 因為已經事先寫好了 package,這樣子某一個 VHDL 電路只要用 use 敘述就能引用寫好的全域性的資訊、單體 (entity)、函數以及程序。語法如下: use library-name.package-name.object-to-be-used 例如:use work.pkg_my_package.all; -- 全部都要用 use work.pkg_my_package.Sort_2_Data; -- 只要用 Sort_2_Data

35 6-5 IEEE 與 STD 二套 Library 6-5.1 IEEE Library 一般來說使用方法,如下:
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_signed.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_textio.all; use ieee.numeric_bit.all; use ieee.numeric_std.all; use ieee.math_real.all; use ieee.math_complex.all;

36 std_logic_1164 套件 std_logic_1164 這個 package,提供增強型的訊號型態。 在這個 package 裡頭的 type 定義:std_ulogic、std_ulogic_vector、std_logic以及std_logic_vector。 在這個 package 裡頭的 function:resolved。 在這個 package 裡頭的邏輯運算子 (logical operator):and、nand、or、nor、xor、xnor以及not。 在這個 package 裡頭的轉換 (conversion) 函數:To_bit、To_bitvector、To_StdULogic、To_StdLogicVector以及To_StdULogicVector。 在這個 package 裡頭的轉換 (conversion) 函數:To_X01、To_X01Z以及To_UX01。 在這個 package 裡頭的訊號邊緣偵測 (edge detection):rising_edge以及falling_edge。 在這個 package 裡頭的 object contains an unknown:Is_X。

37 std_logic_arith 套件 std_logic_arith 這個 package,提供給:signed、unsigned、small_int、integer、std_ulogic、std_logic以及std_logic_vector等等資料型態使用的算術運算 (arithemtic) 函數、轉換 (conversion) 函數以及比較(comparison) 函數。 在這個 package 裡頭的 type 定義:unsigned、signed、tbl_type以及tbl_mvl9_boolean。 在這個 package 裡頭的 function:+、-、abs、*、<、<=、>、>=、=、/=、shl、shr、conv_integer、conv_unsigned、conv_signed、conv_std_logic_vector、ext、sxt、max、min、make_binary、left_signed_arg、left_unsigned_arg、mult_signed_arg、mult_unsigned_arg、mult、minus、plus、unsigned_minus、unsigned_plus、unsigned_return_boolean、signed_return_boolean、is_less、is_less_or_equal、unsigned_is_less、unsigned_is_less_or_equal、bitwise_eql以及bitwise_neq。

38 std_logic_signed 套件 std_logic_signed 這個 package,用於有號數 (signed) 2的補數 (2's-complement) 運算,提供給:std_logic_vector資料型態使用的算術運算 (arithemtic) 函數、轉換 (conversion) 函數以及比較(comparison) 函數。 在這個 package 裡頭的 function:+、-、abs、*、<、<=、>、>=、=、/=、shl、shr、conv_integer以及maximum。

39 std_logic_unsigned 套件
std_logic_unsigned 這個 package,用於無號數 (unsigned) 運算,提供給:std_logic_vector資料型態使用的算術運算 (arithemtic) 函數、轉換 (conversion) 函數以及比較(comparison) 函數。 在這個 package 裡頭的 function:+、-、abs、*、<、<=、>、>=、=、/=、shl、shr、conv_integer以及maximum。

40 std_logic_textio 套件 std_logic_textio 這個 package,用於 1164 資料型態檔案的存取處理。 在這個 package 裡頭的 type 定義:MVL9plus、char_indexed_by_MVL9、MVL9_indexed_by_char以及MVL9plus_indexed_by_char。 在這個 package 裡頭的 function:Int_to_string、Skip_white、Shrink_line、Grow_line、Report_results、lower_case、strcmp、Extract_integer以及Extract_real。 在這個 package 裡頭的 procedure:readline、read、writeline、write、 endline、Char2QuadBits、HREAD、HWRITE、Char2TriBits、OREAD、OWRITE以及Int_to_string。

41 numeric_bit 套件 numeric_bit 這個 package,提供給:無號數 (unsigned number) 以及有號數 (signed number) 資料型態使用的算術運算 (arithemtic) 函數、比較 (comparison) 函數移位與旋轉函數 (shift and rotate)、以及轉換 (conversion) 函數。再加上邏輯運算子 (logical operator),訊號邊緣偵測(edge detection)。 在這個 package 裡頭的 type 定義:unsigned以及signed。 在這個 package 裡頭的 function:abs、-、+、*、/、rem、mod、>、<、>=、<=、=、/=、shift_left、shift_right、rotate_left、rotate_right、sll、srl、rol、ror、resize、to_integer、to_unsigned、to_signed、not、and、or、nand、nor、xor、xnor、rising_edge、falling_edge、max、min、signed_num_bits、unsigned_num_bits、add_unsigned、add_signed、xsll、xsrl、xsra、xrol、xror、unsigned_equal、signed_equal、unsigned_less、signed_less、unsigned_less_or_equal以及signed_less_or_equal。 在這個 package 裡頭的 procedure:divmod。

42 numeric_std 套件 numeric_std 這個 package,提供數值 (numerical) 運算,包括:算術運算 (arithemtic) 函數、比較 (comparison) 函數移位與旋轉函數 (shift and rotate)、以及轉換 (conversion) 函數。再加上邏輯運算子 (logical operator),比對 (match) 函數以及stdulogic_table、and_table、match_table。 在這個 package 裡頭的 type 定義:unsigned以及signed。 在這個 package 裡頭的 function:abs、+、-、*、/rem、mod、>、<、>=、<=、=、/=、shift_left、shift_right、rotate_left、rotate_right、resize、to_integer、to_unsigned、to_signed、to_stdlogicvector、not、and、or、nand、nor、xor、std_match、max、min、signed_num_bits、unsigned_num_bits、add_unsigned、add_signed、xsll、xsrl、xsra、xrol、xror、unsigned_equal、signed_equal、unsigned_less、signed_less、unsigned_less_or_equal、signed_less_or_equal、to_01。

43 math_real 套件 math_real 這個 package,提供常用的:實數常數 (real constant)、實數函數。 在這個 package 裡頭的 type 定義:complex、complex_vector 以及complex_polar。 在這個 package 裡頭的 function:sign、ceil、floor、round、fmax、fmin、uniform、srand、rand、get_rand_max、sqrt、cbrt、**、exp、log、sin、cos、tan、asin、acos、atan、atan2、sinh、cosh、tanh、asinh、acosh以及atanh。cabs、carg、cmplx、+、-、*、/、conj、csqrt、cexp、complex_to_polar、polar_to_complex、power_of_2_series、cordic、sign。

44 math_complex 套件 math_complex 這個 package,提供常用的:複數常數 (complex constant)、複數函數。 在這個 package 裡頭的 type 定義:complex、complex_vector以及complex_pola。 在這個 package 裡頭的 function:cabs、carg、cmplx、+、-、*、/、conj、csqrt、cexp、complex_to_polar以及polar_to_complex。

45 standard 套件 其實存在著 standard 這個 package,不過因為它是公認的“標準”,所以“VHDL 編譯器”自動會將它引用進來。 在這個 package 裡頭的 type 定義:boolean、bit、character、severity_level integer、real、time、delay_length、natural、positive、string、bit_vector、file_open_kind以及file_open_status。 在這個 package 裡頭的 impure function:now。 使用 IEEE 的 package 必需注意的問題: 同一個 entity … architecture 區塊裡面,不能同時使用 std_logic_unsigned 以及 std_logic_signed 這二個 package,只能二選一,也就是只能挑用“無號數 unsigned”運算或者是“有號數 signed”運算。 VHDL 的程式庫是讓“編譯軟體” (compiler) 儲存電路或者是專案設計資訊的地方。

46 6-5.2 STD Library 一般來說使用方法,如下: library std; use std.textio; textio 套件
textio 這個 package,用於檔案的存取處理。 在這個 package 裡頭的 type 定義:line、text、side以及width。 在這個 package 裡頭的 function:Int_to_string、Skip_white、Shrink_line、Grow_line、Report_results、lower_case、strcmp、Extract_integer以及Extract_real。 在這個 package 裡頭的 procedure:readline、read、writeline、write、 endline以及Int_to_string。


Download ppt "VHDL 硬體描述語言 數位電路設計實務 第六章 函數副程序以及套件程式庫."

Similar presentations


Ads by Google