第8講 包集、元件和子程序_第1頁(yè)
第8講 包集、元件和子程序_第2頁(yè)
第8講 包集、元件和子程序_第3頁(yè)
第8講 包集、元件和子程序_第4頁(yè)
第8講 包集、元件和子程序_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第第8 8講講 包集、元件和子程序包集、元件和子程序1 概述概述第第8 8講講 包集、元件和子程序包集、元件和子程序 庫(kù)聲明庫(kù)聲明主代碼 實(shí)體實(shí)體entityentity結(jié)構(gòu)體結(jié)構(gòu)體 architecture LIBRARYLIBRARY聲明聲明 包集包集PACKAGEPACKAGE COMPONENTFUNCTIONPROCEDURE VHDL代碼的基本組成代碼的基本組成配置配置 configuration第第8 8講講 包集、元件和子程序包集、元件和子程序2 包集(包集(packagepackage)l 包集的概念包集的概念:已定義的常數(shù)、數(shù)據(jù)類型、元件調(diào)用說(shuō)已定義的常數(shù)、數(shù)據(jù)類型、元件調(diào)

2、用說(shuō)明、子程序的一個(gè)集合,類似于明、子程序的一個(gè)集合,類似于C C語(yǔ)言中的語(yǔ)言中的“.h”.h”文件文件(頭文件);(頭文件);l 使用包集的目的使用包集的目的:方便公共信息、資源的訪問(wèn)和共享。方便公共信息、資源的訪問(wèn)和共享。l 包集的主要內(nèi)容包集的主要內(nèi)容:除了包含元件:除了包含元件(component) (component) 、函數(shù)函數(shù)(function)(function)和過(guò)程和過(guò)程(procedure)(procedure)之外,還可之外,還可以包含類型以包含類型(type)(type)和常量和常量(constant)(constant);l 元件、函數(shù)和過(guò)程的作用元件、函數(shù)和過(guò)程

3、的作用:經(jīng)常使用的:經(jīng)常使用的VHDLVHDL代碼代碼通常以這幾種形式編寫,從而可以被添加到包集通常以這幾種形式編寫,從而可以被添加到包集中,然后被編譯到目標(biāo)中,然后被編譯到目標(biāo)librarylibrary中,有利于代碼中,有利于代碼分割、代碼共享和代碼重用;分割、代碼共享和代碼重用;l 庫(kù)庫(kù):多個(gè)包集構(gòu)成庫(kù)多個(gè)包集構(gòu)成庫(kù)。 第第8 8講講 包集、元件和子程序包集、元件和子程序3 package package 包集名包集名 isis 聲明:聲明:元件元件、函數(shù)、過(guò)程、類型和常量說(shuō)明、函數(shù)、過(guò)程、類型和常量說(shuō)明 end end 包集名;包集名; package body package bod

4、y 包集名包集名 isis 包體說(shuō)明項(xiàng)包體說(shuō)明項(xiàng): :函數(shù)、過(guò)程的所有描述代碼函數(shù)、過(guò)程的所有描述代碼 end end 包集名;包集名; 包集的語(yǔ)法結(jié)構(gòu)包集的語(yǔ)法結(jié)構(gòu)包集的聲明部分,包集的聲明部分,必須必須包體,可選包體,可選l雖然包體是可選的,但是如果包集的聲明部分有一個(gè)或多雖然包體是可選的,但是如果包集的聲明部分有一個(gè)或多個(gè)函數(shù)、過(guò)程的聲明,則在包體部分必須存在對(duì)應(yīng)的描述代個(gè)函數(shù)、過(guò)程的聲明,則在包體部分必須存在對(duì)應(yīng)的描述代碼碼;如果在包集的聲明部分含有元件,則不必在包體中出現(xiàn)如果在包集的聲明部分含有元件,則不必在包體中出現(xiàn)該元件的描述代碼,元件的代碼以完整的該元件的描述代碼,元件的代碼以

5、完整的.vhd.vhd文件存在文件存在。lpackagepackage和對(duì)應(yīng)的和對(duì)應(yīng)的package bodypackage body的名稱必須相同的名稱必須相同!特殊特殊注意注意:第第8 8講講 包集、元件和子程序包集、元件和子程序4library ieee;use ieee.std_logic_1164.all;package my_package is type state is (st1, st2, st3, st4); type color is (red, green, blue); constant vec: std_logic_vector(7 downto 0):=“1111

6、1111”;end my_package;-例1 簡(jiǎn)單的程序包僅包含類型和常量聲明的僅包含類型和常量聲明的packagepackage,不需要使用,不需要使用package package bodybody!第第8 8講講 包集、元件和子程序包集、元件和子程序5library ieee;use ieee.std_logic_1164.all;package my_package is type state is (st1, st2, st3, st4); type color is (red, green, blue); constant vec: std_logic_vector(7 dow

7、nto 0):=“11111111”; function positive_edge (signal s: std_logic) return boolean;end my_package;-package body my_package is function positive_edge(signal s: std_logic) return boolean is begin return (sevent AND clk=1); end positive_edge;end my_package;例2 內(nèi)部包含函數(shù)的packagelibrary ieee;use ieee.std_logic_

8、1164.all;use work.my_package.all;-entity .architecture .packagepackage可以被編譯成可以被編譯成workwork或其它或其它庫(kù)中的一部分庫(kù)中的一部分!包集中除了說(shuō)明類型和變量之外,還包括了一個(gè)函數(shù)要使用自定義要使用自定義的包集,必須的包集,必須在主程序中加在主程序中加入一個(gè)入一個(gè)useuse語(yǔ)句語(yǔ)句在包集中出現(xiàn)自定義函在包集中出現(xiàn)自定義函數(shù)時(shí),須使用數(shù)時(shí),須使用package package bodybody聲明這個(gè)函數(shù)聲明這個(gè)函數(shù)第第8 8講講 包集、元件和子程序包集、元件和子程序6元件聲明的兩種位置(或兩種方法)元件聲明的

9、兩種位置(或兩種方法)a. 在主代碼段中聲明在主代碼段中聲明b. 在在package中聲明中聲明第第8 8講講 包集、元件和子程序包集、元件和子程序7例例3 3 在主代碼中聲明元件在主代碼中聲明元件abcdn設(shè)計(jì)步驟:設(shè)計(jì)步驟: 編寫幾個(gè)基本組成模塊(編寫幾個(gè)基本組成模塊(inverter /nand_2 inverter /nand_2 /nand_3 /nand_3)的)的.vhd.vhd文件文件; ; 在主代碼中將這幾個(gè)基本組成模塊聲明為元件;在主代碼中將這幾個(gè)基本組成模塊聲明為元件; 在主代碼中實(shí)例化這些元件。在主代碼中實(shí)例化這些元件。第第8 8講講 包集、元件和子程序包集、元件和子程

10、序8-文件文件inverter.vhd-library ieee;use ieee.std_logic_1164.all;entity inverter is port (a: in std_logic; b: out std_logic);end inverter;architecture inverter of inverter isbegin b= NOT a;end inverter;-具體實(shí)現(xiàn)具體實(shí)現(xiàn)(1)(1):三個(gè)待聲明的三個(gè)待聲明的.vhd.vhd文件文件-文件文件nand_2.vhd-library ieee;use ieee.std_logic_1164.all;entit

11、y nand_2 is port (a, b: in std_logic; c: out std_logic);end nand_2;architecture nand_2 of nand_2 isbegin c= NOT (a AND b);end nand_2;-文件文件nand_3.vhd-library ieee;use ieee.std_logic_1164.all;entity nand_3 is port (a, b, c: in std_logic; d: out std_logic);end nand_3;architecture nand_3 of nand_3 isbeg

12、in d= NOT (a AND b AND c);end nand_3;-注意:注意:文件名、實(shí)體名必須一致!文件名、實(shí)體名必須一致!第第8 8講講 包集、元件和子程序包集、元件和子程序9具體實(shí)現(xiàn)具體實(shí)現(xiàn)(2)(2):主主.vhd.vhd文件,將前三個(gè)文件的代碼文件,將前三個(gè)文件的代碼作為元件加以實(shí)例化,用以實(shí)現(xiàn)新的功能。作為元件加以實(shí)例化,用以實(shí)現(xiàn)新的功能。-主文件主文件project.vhd-library ieee;use ieee.std_logic_1164.all;entity project is port (a, b, c, d: in std_logic; x, y: ou

13、t std_logic);end project;architecture structural of project is-元件在主代碼中的聲明元件在主代碼中的聲明- component inverter is port (a: in std_logic; b: out std_logic); end component; -對(duì)應(yīng)文件對(duì)應(yīng)文件inverter.vhd - component nand_2 is port (a, b: in std_logic; c: out std_logic); end component; -對(duì)應(yīng)文件對(duì)應(yīng)文件nand_2.vhd - component

14、nand_3 is port (a, b, c: in std_logic; d: out std_logic); end component; -對(duì)應(yīng)文件對(duì)應(yīng)文件nand_3.vhd-注意:注意:主文件名與其實(shí)主文件名與其實(shí)體名必須一致,元件名體名必須一致,元件名稱必須與元件所在文件稱必須與元件所在文件的文件名及文件中的實(shí)的文件名及文件中的實(shí)體名一致體名一致!!- signal w: std_logic;begin u1: inverter port map (b, w); u2: nand_2 port map (a, b, x); u3: nand_3 port map (w, c, d

15、, y);end structural;-第第8 8講講 包集、元件和子程序包集、元件和子程序10例例4 4 在包集中聲明元件在包集中聲明元件abcdn設(shè)計(jì)步驟:設(shè)計(jì)步驟: 編寫幾個(gè)基本組成模塊(編寫幾個(gè)基本組成模塊(inverter /nand_2 inverter /nand_2 /nand_3/nand_3)的)的.vhd.vhd文件文件; ; 創(chuàng)建一個(gè)包集文件,在該包集中將這幾個(gè)基本組創(chuàng)建一個(gè)包集文件,在該包集中將這幾個(gè)基本組成模塊聲明為元件;成模塊聲明為元件; 在主代碼中在主代碼中useuse該包集;該包集; 在主代碼中實(shí)例化這些元件。在主代碼中實(shí)例化這些元件。雖多了一個(gè)包集文件,但

16、可避免雖多了一個(gè)包集文件,但可避免在主代碼中每實(shí)例化一個(gè)元件就在主代碼中每實(shí)例化一個(gè)元件就聲明一次,聲明一次,在有多個(gè)在有多個(gè)project時(shí)很時(shí)很方便方便!!第第8 8講講 包集、元件和子程序包集、元件和子程序11具體實(shí)現(xiàn):省略前三個(gè)具體實(shí)現(xiàn):省略前三個(gè).vhd.vhd文件文件-主文件主文件project.vhd-library ieee;use ieee.std_logic_1164.all;use work.my_components.all;entity project is port (a, b, c, d: in std_logic; x, y: out std_logic);en

17、d project;architecture structural of project is - signal w: std_logic;begin u1: inverter port map (b, w); u2: nand_2 port map (a, b, x); u3: nand_3 port map (w, x, c, d, y);end structural;-包集文件包集文件my_components.vhd-library ieee;use ieee.std_logic_1164.all;package my_components is -元件在包集中的聲明元件在包集中的聲明

18、- component inverter is port (a: in std_logic; b: out std_logic); end component; -對(duì)應(yīng)文件對(duì)應(yīng)文件inverter.vhd - component nand_2 is port (a, b: in std_logic; c: out std_logic); end component; -對(duì)應(yīng)文件對(duì)應(yīng)文件nand_2.vhd - component nand_3 is port (a, b, c: in std_logic; d: out std_logic); end component; -對(duì)應(yīng)文件對(duì)應(yīng)文件n

19、and_3.vhd-end my_components;-注意:注意:主文件中包集名稱必須與主文件中包集名稱必須與包集文件名及包集文件中包集定包集文件名及包集文件中包集定義名一致!義名一致!第第8 8講講 包集、元件和子程序包集、元件和子程序12 GENERIC GENERIC參數(shù)的映射參數(shù)的映射label:元件名稱:元件名稱 generic map(參數(shù)列表參數(shù)列表) port map (端口列表端口列表); 在元件進(jìn)行實(shí)例化時(shí)如果需要傳遞參數(shù),在元件進(jìn)行實(shí)例化時(shí)如果需要傳遞參數(shù),則須使用關(guān)鍵字則須使用關(guān)鍵字genericgeneric,來(lái)進(jìn)行,來(lái)進(jìn)行g(shù)enericgeneric參數(shù)參數(shù)的映

20、射。的映射。語(yǔ)法結(jié)構(gòu):語(yǔ)法結(jié)構(gòu):進(jìn)行進(jìn)行g(shù)eneric參數(shù)參數(shù)的說(shuō)明和傳遞的說(shuō)明和傳遞第第8 8講講 包集、元件和子程序包集、元件和子程序13 用于指定常規(guī)參數(shù),用于指定常規(guī)參數(shù),所指定的參數(shù)是靜態(tài)的,方便設(shè)計(jì)人所指定的參數(shù)是靜態(tài)的,方便設(shè)計(jì)人員進(jìn)行參數(shù)修改,可增加代碼的靈活性和可重用性員進(jìn)行參數(shù)修改,可增加代碼的靈活性和可重用性。 genericgeneric語(yǔ)句須在語(yǔ)句須在ENTITYENTITY中進(jìn)行聲明;中進(jìn)行聲明; genericgeneric語(yǔ)句所指定的參數(shù)是全局的,不僅可以在語(yǔ)句所指定的參數(shù)是全局的,不僅可以在ENTITYENTITY 內(nèi)部使用,還可以在后面的整個(gè)設(shè)計(jì)中使用。內(nèi)部

21、使用,還可以在后面的整個(gè)設(shè)計(jì)中使用。 主要用來(lái)為設(shè)計(jì)實(shí)體指定參數(shù),如端口寬度、器件延時(shí)等;主要用來(lái)為設(shè)計(jì)實(shí)體指定參數(shù),如端口寬度、器件延時(shí)等;n 通用屬性語(yǔ)句(通用屬性語(yǔ)句(GENERIC)的一種用法)的一種用法語(yǔ)法結(jié)構(gòu):語(yǔ)法結(jié)構(gòu): GENERIC (參數(shù)名(參數(shù)名:參數(shù)類型參數(shù)類型:=參數(shù)值);參數(shù)值);如:如:第第8 8講講 包集、元件和子程序包集、元件和子程序14例例5 5 帶有帶有GENERICGENERIC參數(shù)的元件的實(shí)例化參數(shù)的元件的實(shí)例化奇偶校驗(yàn)奇偶校驗(yàn)發(fā)生器發(fā)生器input(n-1:0)output(n:0)功能功能: 1 1、輸入矢量的寬度比輸出矢量的寬度少一位;輸出矢量的其

22、它位由輸入矢、輸入矢量的寬度比輸出矢量的寬度少一位;輸出矢量的其它位由輸入矢量直接賦值。量直接賦值。 2 2、功能固定,規(guī)格不固定,可以設(shè)計(jì)成通用構(gòu)造體。、功能固定,規(guī)格不固定,可以設(shè)計(jì)成通用構(gòu)造體。 3 3、需要統(tǒng)計(jì)輸入矢量中、需要統(tǒng)計(jì)輸入矢量中11的個(gè)數(shù),當(dāng)輸入矢量中的個(gè)數(shù),當(dāng)輸入矢量中11的個(gè)數(shù)為奇數(shù)時(shí)的個(gè)數(shù)為奇數(shù)時(shí)則插入一個(gè)則插入一個(gè)11,為偶數(shù)時(shí)則插入一個(gè),為偶數(shù)時(shí)則插入一個(gè)00。設(shè)計(jì)方案設(shè)計(jì)方案:具有較強(qiáng)的通用性,將輸入矢量的寬度具有較強(qiáng)的通用性,將輸入矢量的寬度n作為作為generic參數(shù)加參數(shù)加以傳遞;以傳遞;將代碼元件化。將代碼元件化。第第8 8講講 包集、元件和子程序包集、

23、元件和子程序15代碼實(shí)現(xiàn):代碼實(shí)現(xiàn):-包集文件包集文件parity_gen.vhd-library ieee;use ieee.std_logic_1164.all;entity parity_gen is GENERIC (n: integer :=7); -default is 7 ; port (input: in bit_vector (n downto 0); output: out bit_vector (n+1 downto 0); end parity_gen;architecture parity of parity_gen isbegin process (input) v

24、ariable temp1: bit; variable temp2: bit_vector (outputrange); begin temp1:=0; for i IN inputrange loop temp1:=temp1 XOR input(i); temp2(i):=input(i); end loop; temp2(outputhigh):=temp1; output=temp2; end process;end parity;-主文件主文件my_code.vhd-library ieee;use ieee.std_logic_1164.all;entity my_code is

25、 GENERIC (n: positive :=2); -2 will overwrite 7 ; port (inp: in bit_vector (n downto 0); outp: out bit_vector (n+1 downto 0); end my_code;architecture my_arch of my_code is-聲明元件聲明元件parity_gen- component parity_gen is generic (n: positive) ; port (input: in bit_vector (n downto 0); output: out bit_ve

26、ctor (n+1 downto 0); end component;-begin c1: parity_gen generic map (n) port map (inp, outp);end my_arch;-缺省值將被主文件中g(shù)eneric映射時(shí)提供的新參數(shù)覆蓋須再聲明一次,但不必聲明默認(rèn)值元件實(shí)例化第第8 8講講 包集、元件和子程序包集、元件和子程序16 子程序子程序 函數(shù)函數(shù)(function)(function)和過(guò)程和過(guò)程(procedure)(procedure)統(tǒng)稱為子程序統(tǒng)稱為子程序(subprogram)(subprogram)。 子程序與進(jìn)程的相同點(diǎn)子程序與進(jìn)程的相同點(diǎn)

27、: 內(nèi)部包含的內(nèi)部包含的都是順序描述代碼都是順序描述代碼,使用相同的順序描述,使用相同的順序描述語(yǔ)句,如語(yǔ)句,如if,caseif,case和和loop loop (wait(wait語(yǔ)句除外語(yǔ)句除外) )。 子程序與進(jìn)程語(yǔ)句的區(qū)別子程序與進(jìn)程語(yǔ)句的區(qū)別: 在使用目的上在使用目的上:進(jìn)程可以直接在主代碼中使用;而子:進(jìn)程可以直接在主代碼中使用;而子程序一般在建庫(kù)時(shí)使用,以便代碼重用和代碼共享。當(dāng)程序一般在建庫(kù)時(shí)使用,以便代碼重用和代碼共享。當(dāng)然子程序也是可以在主代碼中直接建立和使用的。然子程序也是可以在主代碼中直接建立和使用的。 在使用方法上在使用方法上:1 1、子程序不能從結(jié)構(gòu)體的其余部分、

28、子程序不能從結(jié)構(gòu)體的其余部分直接讀寫信號(hào),所有通信都是通過(guò)直接讀寫信號(hào),所有通信都是通過(guò)子程序的接口子程序的接口來(lái)完成來(lái)完成的;進(jìn)程可以直接讀寫結(jié)構(gòu)體內(nèi)的其它信號(hào)。的;進(jìn)程可以直接讀寫結(jié)構(gòu)體內(nèi)的其它信號(hào)。 2 2、子程序中不允許使用、子程序中不允許使用waitwait語(yǔ)句。語(yǔ)句。 第第8 8講講 包集、元件和子程序包集、元件和子程序17子程序的存放位置子程序的存放位置: Package、 Architecture、 Process子程序與硬件規(guī)模子程序與硬件規(guī)模: 與普通軟件中子程序調(diào)用的區(qū)別: 普通軟件子程序調(diào)用增加處理時(shí)間;普通軟件子程序調(diào)用增加處理時(shí)間; VHDLVHDL中每調(diào)用一次子程

29、序,其綜合后都將中每調(diào)用一次子程序,其綜合后都將對(duì)應(yīng)一個(gè)相應(yīng)的電路模塊。子程序調(diào)用次數(shù)與綜對(duì)應(yīng)一個(gè)相應(yīng)的電路模塊。子程序調(diào)用次數(shù)與綜合后的電路規(guī)模成正比。合后的電路規(guī)模成正比。 設(shè)計(jì)中應(yīng)嚴(yán)格控制子程序調(diào)用次數(shù)。設(shè)計(jì)中應(yīng)嚴(yán)格控制子程序調(diào)用次數(shù)。第第8 8講講 包集、元件和子程序包集、元件和子程序18子程序的類型:子程序的類型: 過(guò)程(過(guò)程(ProcedureProcedure):): 0 0 個(gè)或多個(gè)個(gè)或多個(gè) in in、inoutinout、 或或 out out 參數(shù)??色@得多個(gè)返回值。參數(shù)??色@得多個(gè)返回值。 函數(shù)(函數(shù)(FunctionFunction):): 0 0 個(gè)或多個(gè)個(gè)或多個(gè)

30、in in 參數(shù),一個(gè)參數(shù),一個(gè) return return 值。值。 只能獲得一個(gè)返回值。只能獲得一個(gè)返回值。 過(guò)程可作為一種獨(dú)立的語(yǔ)句結(jié)構(gòu)而單獨(dú)存在,函數(shù)通常作為表達(dá)式的一部分來(lái)調(diào)用。子程序包含兩部分:子程序聲明和子程序主體。子程序包含兩部分:子程序聲明和子程序主體。第第8 8講講 包集、元件和子程序包集、元件和子程序19 每次調(diào)用子程序時(shí),都要首先對(duì)其進(jìn)行初始每次調(diào)用子程序時(shí),都要首先對(duì)其進(jìn)行初始化,即一次執(zhí)行結(jié)束后再調(diào)用需再次初始化。化,即一次執(zhí)行結(jié)束后再調(diào)用需再次初始化。因此,因此,子程序內(nèi)部的值是不能保持的子程序內(nèi)部的值是不能保持的。第第8 8講講 包集、元件和子程序包集、元件和子

31、程序20 函數(shù)函數(shù)(function)(function)n 一個(gè)函數(shù)就是一段順序描述的代碼。一個(gè)函數(shù)就是一段順序描述的代碼。對(duì)于一些經(jīng)常遇到的具有共性的設(shè)計(jì)問(wèn)題,如數(shù)據(jù)類型轉(zhuǎn)換、算術(shù)運(yùn)算等,希望將其功能實(shí)現(xiàn)的代碼被共享和重用,使主代碼簡(jiǎn)潔并易于理解-函數(shù)。注意:注意:由于在于每次調(diào)用函數(shù)時(shí),都要首先對(duì)其進(jìn)由于在于每次調(diào)用函數(shù)時(shí),都要首先對(duì)其進(jìn)行初始化,即一次執(zhí)行結(jié)束后再調(diào)用需再次初始化,行初始化,即一次執(zhí)行結(jié)束后再調(diào)用需再次初始化,即函數(shù)內(nèi)部的值是不能保持的,因此即函數(shù)內(nèi)部的值是不能保持的,因此在函數(shù)中禁止在函數(shù)中禁止進(jìn)行信號(hào)聲明和元件實(shí)例化。進(jìn)行信號(hào)聲明和元件實(shí)例化。n 函數(shù)的使用過(guò)程函數(shù)

32、的使用過(guò)程:先創(chuàng)建函數(shù),再調(diào)用函數(shù)。先創(chuàng)建函數(shù),再調(diào)用函數(shù)。第第8 8講講 包集、元件和子程序包集、元件和子程序21n 函數(shù)的存放函數(shù)的存放函數(shù)和過(guò)程的函數(shù)和過(guò)程的存放位置存放位置包集(包集(+包體)包體)主代碼主代碼LIBRARYARCHITECTURE(聲明部分)(聲明部分)實(shí)體實(shí)體必須!必須!第第8 8講講 包集、元件和子程序包集、元件和子程序22例例1: 在在主代碼中主代碼中定義函數(shù)定義函數(shù), 可以出現(xiàn)在可以出現(xiàn)在entity中,也可以出中,也可以出現(xiàn)在現(xiàn)在architecture中中。如存放于。如存放于architecture中的聲明:中的聲明:library ieee;use ie

33、ee.std_logic_1164.all;entity dff is port (d, clk, rst: in std_logic; q:out std_logic);end dff;architecture my_arch of dff is function positive_edge (signal s: std_logic) return boolean is begin return (sevent and s=1); end positive_edge;begin process (clk, rst) begin if (rst=1) then q=0; elsif posit

34、ive_edge(clk) then q=d; end if; end process;end my_arch; 第第8 8講講 包集、元件和子程序包集、元件和子程序23例例 2 (1): 在包集中定義函數(shù),可以方便地被其它設(shè)計(jì)所重用和在包集中定義函數(shù),可以方便地被其它設(shè)計(jì)所重用和共享。共享。注意:函數(shù)在注意:函數(shù)在package中聲明,在中聲明,在package body中定義中定義。-在包集中定義函數(shù)在包集中定義函數(shù)- library ieee;use ieee.std_logic_1164.all;package my_package is function positive_edge

35、(signal s: std_logic) return boolean;end my_package;package body my_package is function positive_edge(signal s: std_logic) return boolean is begin return (sevent and s=1); end positive_edge;end my_package;要先聲明要先聲明再定義再定義第第8 8講講 包集、元件和子程序包集、元件和子程序24例例 2(2): 在主代碼中調(diào)用在包集中定義的函數(shù)。在主代碼中調(diào)用在包集中定義的函數(shù)。-在主代碼中調(diào)用包集

36、中定義的函數(shù)在主代碼中調(diào)用包集中定義的函數(shù)- library ieee;use ieee.std_logic_1164.all;use work.my_package.all;entity dff is port(d, clk, rst: in std_logic; q: out std_logic );end dff;architecture my_arch of dff isbegin process (clk, rst) begin if (rst=1) then q=0; elsif positive_edge(clk) then q=d; end if; end process;en

37、d my_arch;第第8 8講講 包集、元件和子程序包集、元件和子程序25例例 3: 在包集中定義在包集中定義conv_integer()函數(shù)()函數(shù) library ieee;use ieee.std_logic_1164.all;package my_package is function conv_integer(signal vector: std_logic_vector) return integer;end my_package;package body my_package is function conv_integer (signal vector: std_logic_

38、vector) return integer is variable result: integer range 0 to 2*vectorlength-1;begin if (vector(vectorhigh)=1) then result:=1; else result:=0; end if; for i in (vectorhigh-1) downto (vectorlow) loop result:=result*2; if (vector(i)=1) then result:=result+1; end if; end loop; return result; end conv_i

39、nteger;end my_package;第第8 8講講 包集、元件和子程序包集、元件和子程序26-在主代碼中調(diào)用包集中定義的函數(shù)在主代碼中調(diào)用包集中定義的函數(shù)- library ieee;use ieee.std_logic_1164.all;use work.my_package.all;entity conv_int2 is port(a: in std_logic_vector(0 to 3); y: out integer range 0 to 15 );end conv_int2;architecture my_arch of conv_int2 is begin y=conv_

40、integer(a);end my_arch;第第8 8講講 包集、元件和子程序包集、元件和子程序27例例 4: “+”函數(shù):函數(shù): 功能描述:功能描述:擴(kuò)展預(yù)定義的擴(kuò)展預(yù)定義的“+”操作符,進(jìn)行操作符,進(jìn)行std_logic_vector類型數(shù)據(jù)的類型數(shù)據(jù)的加法運(yùn)算。加法運(yùn)算。實(shí)現(xiàn)方式:實(shí)現(xiàn)方式:在包集中定義函數(shù),在主代碼中調(diào)用。在包集中定義函數(shù),在主代碼中調(diào)用。-在包集中定義函數(shù)在包集中定義函數(shù)-library ieee;use ieee.std_logic_1164.all;package my_package is function “+” (a, b: std_logic_vecto

41、r) return std_logic_vector;end my_package;package body my_package is function “+” (a, b: std_logic_vector) return std_logic_vector is variable result: std_logic_vector (3 downto 0); variable carry: std_logic;begin carry:=0; for i in areverse_range loop result (i):= a(i) XOR b(i) XOR carry; carry:= (

42、a(i) AND b(i) OR (a(i) AND carry) OR (b(i) AND carry); end loop; return result; end “+”;end my_package;比較特殊的函數(shù)比較特殊的函數(shù)名稱名稱第第8 8講講 包集、元件和子程序包集、元件和子程序28-在主代碼中調(diào)用包集中定義的函數(shù)在主代碼中調(diào)用包集中定義的函數(shù)- library ieee;use ieee.std_logic_1164.all;use work.my_package.all;entity add_bit is port(a: in std_logic_vector(3 downt

43、o 0); y: out std_logic_vector( 3 downto 0) );end add_bit;architecture my_arch of add_bit is CONSTANT b: std_logic_vector(3 downto 0) :=“0011”; CONSTANT c:std_logic_vector(3 downto 0) :=“0110”;begin y= a + b + c; -重載重載“+”操作符操作符end my_arch;與通常的函數(shù)形式與通常的函數(shù)形式funcfunc( )有所不同?。┯兴煌?!第第8 8講講 包集、元件和子程序包集、元件和子

44、程序29 過(guò)程過(guò)程(procedure)(procedure)n 過(guò)程與函數(shù)的使用目的相似,過(guò)程與函數(shù)的使用目的相似,也是希望將其也是希望將其功能實(shí)現(xiàn)的代碼被功能實(shí)現(xiàn)的代碼被共享和重用,使主代碼簡(jiǎn)潔并易共享和重用,使主代碼簡(jiǎn)潔并易于理解于理解。n 過(guò)程通常用來(lái)定義一個(gè)算法,而函數(shù)用來(lái)產(chǎn)過(guò)程通常用來(lái)定義一個(gè)算法,而函數(shù)用來(lái)產(chǎn)生一個(gè)具有特定意義的值;生一個(gè)具有特定意義的值;n注意:注意:過(guò)程與函數(shù)的主要差別就是過(guò)程與函數(shù)的主要差別就是過(guò)程可以有多過(guò)程可以有多個(gè)返回值。個(gè)返回值。n過(guò)程的使用過(guò)程過(guò)程的使用過(guò)程:先定義過(guò)程,再調(diào)用過(guò)程。:先定義過(guò)程,再調(diào)用過(guò)程。第第8 8講講 包集、元件和子程序包集、

45、元件和子程序30u過(guò)程的存放過(guò)程的存放 函數(shù)和過(guò)程的存放位置包集+包體主代碼LIBRARYARCHITECTURE(聲明部分)(聲明部分)實(shí)體實(shí)體與函數(shù)相同!第第8 8講講 包集、元件和子程序包集、元件和子程序31例 1:過(guò)程存放在主代碼中min_maxinp1inp2min_outmax_outena多個(gè)輸出,宜采多個(gè)輸出,宜采用過(guò)程方式用過(guò)程方式過(guò)程sort的功能描述:對(duì)輸入兩個(gè)8位的無(wú)符號(hào)整數(shù)進(jìn)行比較,數(shù)值小的從min_out輸出,數(shù)值大的從max_out輸出。第第8 8講講 包集、元件和子程序包集、元件和子程序32代碼實(shí)現(xiàn):代碼實(shí)現(xiàn): -在主代碼中存放過(guò)程在主代碼中存放過(guò)程librar

46、y ieee;use ieee.std_logic_1164.all;entity min_max is generic(limit: integer :=255); port ( ena: in bit; inp1, inp2: in integer range 0 to limit; min_out, max_out: out integer range 0 to limit);end min_max;architecture my_arch of min_max is procedure sort (signal in1, in2: in integer range 0 to limit

47、; signal min, max: out integer range 0 to limit) is begin if (in1in2) then max=in1; min=in2; else max=in2; minin2) then max=in1; min=in2; else max=in2; min=當(dāng)前層當(dāng)前層次端口名、信號(hào)名次端口名、信號(hào)名。例:例: component inverter iscomponent inverter is port (a: in std_logic; b:out std_logic); port (a: in std_logic; b:out std

48、_logic); end component; end component; . . u1: inverter port map (x=a, y=b); u1: inverter port map (x=a, y=b);一般說(shuō)來(lái),位置映射方法書(shū)寫較為簡(jiǎn)單,而名稱映射方一般說(shuō)來(lái),位置映射方法書(shū)寫較為簡(jiǎn)單,而名稱映射方法則不容易出錯(cuò)法則不容易出錯(cuò)! 對(duì)于不需要使用的端口則可以斷開(kāi),但需使用關(guān)鍵字OPEN,例: u1: inverter port map (x=a, y=u1: inverter port map (x=a, y=openopen,z=d);z=d);返回返回第第8 8講講 包集、元

49、件和子程序包集、元件和子程序41n 函數(shù)的創(chuàng)建:函數(shù)的創(chuàng)建:Function 函數(shù)名函數(shù)名 return 數(shù)據(jù)類型數(shù)據(jù)類型 IS 聲明聲明 BEGIN (順序描述代碼順序描述代碼) END 函數(shù)名;函數(shù)名; = constant = constant 常量名:常量類型;常量名:常量類型; =SIGNAL =SIGNAL 信號(hào)名:信號(hào)類型;信號(hào)名:信號(hào)類型;參數(shù)列表指明函數(shù)的參數(shù)列表指明函數(shù)的輸入輸入?yún)?shù)參數(shù):輸入?yún)?shù)的個(gè)數(shù)是任意的,也可以沒(méi)有參數(shù);輸入?yún)?shù)的個(gè)數(shù)是任意的,也可以沒(méi)有參數(shù);輸入?yún)?shù)的類型:變量不能作為參數(shù),可以是常輸入?yún)?shù)的類型:變量不能作為參數(shù),可以是常量和信號(hào),語(yǔ)法如下:量和

50、信號(hào),語(yǔ)法如下:第第8 8講講 包集、元件和子程序包集、元件和子程序42 在在VHDLVHDL語(yǔ)言中,語(yǔ)言中,F(xiàn)UNCTIONFUNCTION語(yǔ)句只能計(jì)算數(shù)值,語(yǔ)句只能計(jì)算數(shù)值,不不能改變其參數(shù)的值能改變其參數(shù)的值,所以,所以其參數(shù)的模式只能是其參數(shù)的模式只能是ININ,通??梢允÷圆粚憽Mǔ?梢允÷圆粚?。FUNCTIONFUNCTION的的輸入值輸入值由調(diào)用者拷由調(diào)用者拷貝到輸入?yún)?shù)中,如果沒(méi)有特別指定,在貝到輸入?yún)?shù)中,如果沒(méi)有特別指定,在FUNCTIONFUNCTION語(yǔ)句中語(yǔ)句中按常數(shù)或信號(hào)處理按常數(shù)或信號(hào)處理。因此。因此輸入?yún)?shù)不能為變輸入?yún)?shù)不能為變量類型量類型。 另外,由于另外,

51、由于FUNCTIONFUNCTION的的輸入值由調(diào)用者拷貝到輸入值由調(diào)用者拷貝到輸入?yún)?shù)中輸入?yún)?shù)中,因此,因此輸入?yún)?shù)不能指定取值范圍輸入?yún)?shù)不能指定取值范圍。第第8 8講講 包集、元件和子程序包集、元件和子程序43函數(shù)的輸出:函數(shù)的輸出: 使用使用RETURN語(yǔ)句,語(yǔ)法結(jié)構(gòu)如下:語(yǔ)句,語(yǔ)法結(jié)構(gòu)如下: return 表達(dá)式表達(dá)式; return return 語(yǔ)句只能用于子程序(函數(shù)或過(guò)程)語(yǔ)句只能用于子程序(函數(shù)或過(guò)程)中,中,并用來(lái)終止一個(gè)子程序的執(zhí)行并用來(lái)終止一個(gè)子程序的執(zhí)行。當(dāng)用于函數(shù)時(shí),。當(dāng)用于函數(shù)時(shí),必須返回一個(gè)值。必須返回一個(gè)值。返回值的類型由返回值的類型由returnretu

52、rn后面的數(shù)后面的數(shù)據(jù)類型指定據(jù)類型指定。第第8 8講講 包集、元件和子程序包集、元件和子程序44創(chuàng)建一個(gè)函數(shù)的例子:創(chuàng)建一個(gè)函數(shù)的例子: 創(chuàng)建名為創(chuàng)建名為f1f1的函數(shù),有的函數(shù),有3 3個(gè)輸入?yún)?shù)個(gè)輸入?yún)?shù)a,b,ca,b,c,其中,其中a,ba,b是是常量(常量(關(guān)鍵字關(guān)鍵字constantconstant可以省略可以省略),),c c為信號(hào)。輸出參數(shù)為信號(hào)。輸出參數(shù)(只能有一個(gè)只能有一個(gè)),是),是booleanboolean類型的類型的。function f1 (a, b: integer; signal c: std_logic_vector) return boolean IS

53、BEGIN ( 順序描述代碼順序描述代碼 ) END f1;不能指定不能指定范圍范圍不能有變量不能有變量類型類型第第8 8講講 包集、元件和子程序包集、元件和子程序45 函數(shù)的調(diào)用:函數(shù)的調(diào)用: 函數(shù)可以函數(shù)可以單獨(dú)構(gòu)成表達(dá)式單獨(dú)構(gòu)成表達(dá)式,也可以作為,也可以作為表達(dá)式的一部分表達(dá)式的一部分被調(diào)用。被調(diào)用。例:例: x=conv_integer(a); -xmax(a,b). -if xmax(a,b). -表達(dá)式的一部分;表達(dá)式的一部分;第第8 8講講 包集、元件和子程序包集、元件和子程序46例例 1: positive_edge()函數(shù)()函數(shù) 時(shí)鐘上升沿檢測(cè)函數(shù),可用于時(shí)鐘上升沿檢測(cè)函數(shù),可用于D觸發(fā)器的設(shè)計(jì):觸發(fā)器的設(shè)計(jì):-函數(shù)的創(chuàng)建函數(shù)的創(chuàng)建- function positive_edge (signal s: std_logic) return boolean is begin return (sevent and s=1); end positive_edge;-函數(shù)的調(diào)用函數(shù)的調(diào)用-.if positive_edge (clk) then . 第第8 8講講 包集、元件和子程序包集、元件和子程序47例例 2: conv_integer()函數(shù)()函數(shù), 將將std_logic_vector類型的數(shù)據(jù)轉(zhuǎn)類型的數(shù)據(jù)轉(zhuǎn)換為換為intege

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論