资源描述
,*,第三章,單體宣告及資料流模式描述法,3-1,單體之宣告,3-2,架構之宣告及資料流架構描述法,3-2-1,架構之宣告,3-2-2,資料流模式描述法,1,單,體及架構是VHDL語言之主要部份。單體主要的功能是描述數位電,路之輸出入界面,而架構則是描述電路內部工作的情形。在VHDL語言,中提供了單一的單體宣告方式及三種架構描述模式:資料流模式、行為,模式及結構模式。本章之主要目的即為討論單體之宣告以及以資料流模,式為主之架構描述法。其他兩種架構描述法將分別在第四及第五章說明,之。以下為本章討論之重點:,第一、,單體宣告方式:,單體宣告之主要目的為將數位電路的輸出及輸入,接腳定義於VHDL程式中,我們在第3.1節中將討論這些接腳的,定義方式。,第二、,資料流模式描述法:,以資料流模式為主之架構描述法最大的優點,是布林函數定義明確且設計快速,但其缺點為不易描述複雜的電,路。此種描述法將在第3.2節中說明之。,2,單體之宣告,單體代表一個電路的輸入及輸出界面,亦即單體描述一個電路的外觀。,從單體的宣告中我們可了解其所代表之電路有多少輸出入信號,且那些,信號是輸入、那些是輸出、那些是雙向。在VHDL程式中,對於其所描,述之電路只能有一個單體,其基本宣告之方式如下:,entity 單體名稱 is,port(,信號 1 : 模式 1 資料型態1 ;,信號 2 : 模式 2 資料型態2 ;,信號 N : 模式 N 資料型態 N ) ;,end單體名稱 ;,在單體宣告中之單體名稱需與該VHDL程式之檔案名稱一致。舉例說,明之,若我們擬設計一41之多工器,其VHDL之檔案名稱為,mux4.vhd,則單體名稱必需為mux4。,3-1,3,在上述宣告中定義了N個輸出入埠(Port),而每一個埠均宣告一個信號,物件,同時並定義了該物件之名稱、資料型態及模式。值得注意的是在,單體宣告中所列出的物件都是信號物件,而不會有其他類型之物件。這,些信號物件在單體宣告後就可以使用在程式之任何地方,而不需使用如,2.2節所討論之方式再宣告。,假如有兩個或兩個以上的輸出入埠其物件擁有相同之模式及型態,則,我們可在宣告時予以合併之。舉例說明,若第 i 及 i+1 輸出入埠擁有相同,之模式及型態,則我們可將下列之宣告,信號名稱 i : 模式 i 資料型態i ;,信號名稱 i+1 : 模式 i+1 資料型態i+1;,合併為,信號名稱 i , 信號名稱 i +1 : 模式 i 資料型態i ;,4,單體宣告之模式可有下列的五種選擇:in、out、inout、buffer及,linkage。現將這些模式中常用的三種in、out、inout簡述如下:,1.,in:,若該埠之模式為in,則表示該埠為輸入埠。因此,該埠接受單體,外信號之驅動,但不會對外輸出信號。值得注意的是輸入埠上之信號,只可讓單體外信號驅動,然而單體內信號卻不可驅動它。,2.,out:,若該埠之模式為out,則表示該埠為輸出埠。因此,該埠可驅動,單體外之信號,但不對外接受信號。輸出埠上的信號也不能用來驅動,單體內之信號。,3.,inout:,若該埠之模式為inout,則表示該埠為雙向埠,其具有接受單,體外信號之驅動,且可驅動單體外之信號驅動之功能。值得注意的是,雖然雙向埠具有較容易使用之特點,但若將單體上所有輸出入埠皆宣,告為雙向則可能降低程式之可讀性。因此,依照信號實際上被指定之,功能來宣告其模式可能是較好的作法。,5,圖3.1,41多工器之外觀,以下我們以一41之多工器(Multiplexer)來說明單體宣告之方式:,圖3.1為該多工器之外觀,其中X及S為輸入信號,而Y為輸出信號。,由於X代表四個輸入訊號,因此在程式中其為具有四個元素之矩陣,,而S由於也代表二訊號,因此為具有二個元素之矩陣。該多工器依S,之數值決定X中那一元素作為輸出Y。,6,依圖3.1所示之外觀,此多工器之單體宣告為,entity mux4 is,port (,X : in bit_vector(3 downto 0) ;,S : in bit_vector(1 downto 0) ;,Y : out bit );,end mux4;,由於 X及S均為輸入信號而Y為輸出信號,我們宣告X及S之模式為 in,而Y之模式為out。同時,X、S及Y之型態分別被宣告為bit_vector(3,downto 0)、bit_vector(1 downto 0)及bit。值得注意的是在此宣告中我們只,決定了X、S及Y之模式及型態,但並未敘述這些物件之間的關係,此一,關係會在架構描述中敘述之。,7,圖3.2,168隨機存取記憶體之外觀,接下來我們考慮一16個位元組 (168) 之隨機存取記憶體 (Random Access,Memory; RAM) 其外觀如圖3.2所示。由於該記憶體擁有16個位元組,且每一位元組之,地址由adr代表之,因此adr長度應為4位元,亦即adr為一std_logic或bit矩陣其具有四個,元素。由於adr之值是由外部輸入,物件adr之模式應為in。每一位元組之內容由,data_bus代表之,由於一個位元組是八個位元,data_bus為一矩陣其具有八個元素。由,於外界輸入可經由data_bus來設定位元組,同時位元組之值也可透過data_bus來輸出至,外界,data_bus之模式為inout。最後,該記憶體還有兩個控制訊輸入 rw 及 en,其中rw,決定記憶體之模式為讀或寫,而en決定記憶體是否在工作狀態,若記憶體不在工作狀,態,則data_bus之數值為高阻抗。因此該記憶體單體宣告為,entity ram_16 is,port(,adr : in std_logic_vector(3 downto 0);,data_bus : inout std_logic_vector(7,downto 0);,rw : in std_logic ;,en: in std_logic ) ;,end ram_16;,8,架構之宣告及資料架構描述法,架構主要目地為描述電路內部工作情形,而上一節所討論之單體則描述,電路之外觀,因此單體及架構即可組成完整之VHDL程式。由此可見架,構如同單體一樣,是VHDL程式中十分重要的部分。本節主要目的即為,討論基本架構宣告之方式,以及其資料流模式描述法。,3-2,9,架構之宣告應在單體宣告之後,基本架構之宣告方式如下:,architecture 架構名稱 of 單體名稱 is,信號物件宣告,begin,架構描述程式,end架構名稱;,在上述架構宣告內之單體名稱應與單體宣告內之單體名稱一致,且,架構描述程式應在宣告內之begin及end之間。值得注意的是在單體宣告裏,的信號物件可以直接在架構描述程式中使用,無需再另外宣告。, 3-2-1 架構之宣告,10,以下為一個簡單但完整之VHDL程式其包含了單體及架構:,entity OR2 is,port(,A, B : in bit ;,C : out bit) ;,end OR2 ;,architecture OR2_arch of OR2 is,begin,C = A or B;,end OR2_arch ;,在上面的例子中,單體名稱及架構名稱分別為 OR2及OR2_arch。從,單體宣告中我們可知此電路有兩個輸入 A 及 B,且有一個輸出 C,這些,輸入及輸出信號之型態均為 bit。從架構中我們可知輸入及輸出間關係為,輸出是兩個輸入執行邏輯or運算之結果。,11,圖3.3,OR2.vhd 之模擬結果,圖3.3顯示OR2.vhd之模擬結果,由此結果可知若輸入A或B為,1 則輸出C為 1,因此C確為A及B執行邏輯or運算之結果。,12,資料流模式描述法是VHDL程式中三種架構描述法中之一種。資料流,模式種描述法之特點為該法則並不以敘述電路結構(structure)之方式來描,述電路之功能。它是透過一些信號設定之指令來完成其描述。不僅如,此,該描述法之另一特點是所有信號設定之指令之執行應為並行處理。,以下為一個使用資料流模式描述法之VHDL程式實例:,entity FULL_ADDER_1 is,port(,A, B, CIN : in bit ;,SUM, COUT : out bit) ;,end FULL_ADDER_1 ;,architecture DATAFLOW of FULL_ADDER_1 is,begin,SUM = A xor B xor CIN ;,COUT = (A and B) or (B and CIN) or (CIN and A) ;,end DATAFLOW;, 3-2-2 資料流模式描述法,13,該程式所描述的是一位元全加器,其外觀如圖3.4所示。,在此一位元全加器中 A、B及 CIN為輸入而 SUM及 COUT為輸出,其,中SUM為A、B及 CIN之和,而COUT為執行加法後之進位。值得注意的是,在輸入信號A、B或CIN中,無論是任何一個發生變化均會讓程式中之所有,的信號設定指令同時啟動及執行。,圖3.4,一位元全加器,14,在程式中之信號設定指令為,SUM = A xor B xor CIN ;,COUT = (A and B) or (B and CIN) or (CIN and A) ;,因此無論是A、B或CIN發生變化,程式會同時執形上述指令以更新,SUM及COUT。圖3.5顯示FULL_ADDER_1.vhd 之模擬結果。由該圖可知,A、B、CIN、SUM及COUT之間的關係符合全加器之輸出入關係,因此,該程式正確的描述了全加器。,圖3.5,FULL_ADDER_,1.vhd 之模擬結果,15,由於資料流描述法具有並行處裡的特質,信號設定指令之次序並不會,影響程式執行之結果。因此若我們重新改寫上述之程式為:,entity FULL_ADDER_2 is,port(,A, B, CIN : in bit ;,SUM, COUT : out bit) ;,end FULL_ADDER_2 ;,architecture DATAFLOW_NEW of FULL_ADDER_2 is,begin,COUT = (A and B) or (B and CIN) or (CIN and A) ;,SUM = A xor B xor CIN ;,end DATAFLOW_NEW;,此一程式與上一程式之信號設定次序相反,但執行結果卻相同。,16,圖3.6顯示FULL_ADDER_2.vhd 之模擬結果,該圖之結果確實與圖3.5之,結果相同。,在資料流模式描述法中之信號設定指令,除了一般的設定方式外,尚,有下列兩種:選擇式信號設定方式 (Selected Signal Assignment) 及條件式,信號設定方式 (Conditional Signal Assignment)。,圖3.6,FULL_ADDER_2.vhd 之模擬結果,17,此種設定方式是根據 with select when 語法,而該語法之規則如下:,with 信號 S select,信號Y = 信號數值 A1 when 信號S之數值為 B1,信號數值 A2 when 信號S之數值為 B2, ,信號數值 An when 信號S之數值為 Bn;,在使用此種設定方式時,信號Y為我們想要設定的信號,而信號Y之值則,由信號S之值來決定之。若信號S之值為Bi,i=1,n, 則信號Y之值會被設,定成Ai。, 3-2-2-1 選擇式信號設定方式,18,以下為一41多工器(外觀如圖 3.1所示)完整之VHDL程式,其使用,了選擇式信號設定來完成41多工器架構之描述。,entity mux4_select is,port (,X : in bit_vector(3 downto 0) ;,S : in bit_vector(1 downto 0) ;,Y : out bit );,end mux4_select;,architecture DATAFLOW of mux4_select is,begin,with S select,Y = X(0) when 00 ,X(1) when 01 ,X(2) when 10 ,X(3) when 11 ;,end DATAFLOW ;,在此一程式中,Y之值由S決定。若S=00,則我們用X(0)來設定Y;若S=01 ,我們用X(1)來設定Y;若S=10 ,我們用X(2)來設定Y;若S=11 ,我們用X(3)來設定Y。因此該程式可實現多工器。,19,圖3.7顯示該程式之模擬結果,在圖中我們設定X=1010,因此,X(3)=1,X(2)=0,X(1)=1且X(0)=0。所以當S=“00”時Y應為0,S=“01”,時Y應為1 ,S=“10”時Y應為0,S=“11”時Y應為1。此圖之結果符合,以上的描述。,圖3.7,mux4_select.vhd 之模擬結果,20,接下來我們考慮一個 3to8解碼器(decoder),其外觀如圖3.8所示:,此解碼器之輸入為adr其長度為3位元,而輸出為Y其長度為8位元。,Y矩陣之8個元素中只能有一個元素值為 1 ,而其他均應為 0 。在Y矩,陣中數值為 1 的元素其位置由adr決定之。,圖3.8,3to8解碼器之外觀,21,此解碼器之VHDL程式設計也可使用選擇式信號設定來完成,其完整之,程式如下所示:,library ieee;,use ieee.std_logic_1164.all;,entity DECODER_3to8 is,port( adr : in std_logic_vector(2 downto 0) ;,Y : out std_logic_vector(7 downto 0),);,end DECODER_3to8;,architecture DATAFLOW of DECODER_3to8 is,begin,with adr select,Y = 00000001 when 000,00000010 when 001,00000100 when 010,00001000 when 011,00010000 when 100,00100000 when 101,01000000 when 110,10000000 when 111,00000000 when others;,end DATAFLOW;,22,在該程式中由於宣告了adr及Y均為std_logic_vector,且,std_logic_vector是定義在IEEE std_logic_1164 套件中,因此我們必需要在,程式開始時使用下列方式宣告使用該套件:,library ieee;,use ieee.std_logic_1164.all;,由該程式可觀察得,在Y矩陣中數值為 1 的元素其位置應為adr之,十進制值再加一。,23,圖3.9顯示該程式之模擬結果。由於該圖顯示的數字是十六進制,將此十,六進制轉成二進制後,我們發現輸出Y與輸入adr之間的關係與程式中描,述之關係完全相同。,圖3.9,DECODER_3to8.vhd 之模擬結果,24,在許多的應用裏我們希望一個數位電路之輸出不僅只有雙態而是要,求三態(Tri-State),也就是說輸出之數值應為 0 、 1 及 Z ,其中 Z ,代表高阻抗。若一電路之輸出為 Z ,代表該輸出中斷與外界之連接。,若我們宣告矩陣Y為bit_vector,則Y每一元素之數值需為 0 或 1 ,因,此無法達成三態之要求,所以我們應宣告Y為 std_logic_vector之型態以實,現三態輸出。在上面的程式中我們雖使用std_logic_vector,但卻沒有實現,三態輸出。,以下我們進一步修正程式以達成三態要求:,25,library ieee;,use ieee.std_logic_1164.all;,entity DECODER_3to8_new is,port ( adr : in std_logic_vector(2 downto 0);,en : in std_logic;,Y : out std_logic_vector(7 downto 0),);,end DECODER_3to8_new;,architecture DATAFLOW of DECODER_3to8_new is,signal en_adr : std_logic_vector(3 downto 0);,begin,en_adr = en ,with en_adr select,Y = 00000001 when 0000,00000010 when 0001,00000100 when 0010,00001000 when 0011,00010000 when 0100,00100000 when 0101,01000000 when 0110,10000000 when 0111,ZZZZZZZZ when others;,end DATAFLOW;,26,此程式與前一程式最大不同處為此程式又多宣告了一個輸入en,其,目的是控制Y矩陣是否要輸出 Z。若en數值為0,則此電路之輸出與前,一電路一致,但若en數值為1則無論adr之數值為何Y之每個元素輸出皆,為高阻抗 Z。圖3.10顯示此程式之模擬結果。由該圖可知若en=1 則無,論adr之值為何,輸出Y之數值為高阻抗 Z。,圖3.10,DECODER_3to8_new.vhd 之模擬結果,27,若解碼器有兩個或兩個以上的輸入信號擁有相同的輸出,我們可以,用運算子 | 將這些輸入置於相同的when敘述句中。以下為使用運算子 | 的,一個例子:,entity DECODER_3to8_share is,port ( adr : in std_logic_vector(2 downto 0);,en : in std_logic;,Y : out std_logic_vector(7 downto 0),);,end DECODER_3to8_share;,architecture DATAFLOW of DECODER_3to8_share is,signal en_adr : std_logic_vector(3 downto 0);,begin,en_adr = en ,with en_adr select,Y = 00000001 when 0000 | 0001,00000100 when 0010,00001000 when 0011,00010000 when 0100,00100000 when 0101,01000000 when 0110,10000000 when 0111,ZZZZZZZZ when others;,end DATAFLOW;,28,在此程式中,若en_adr之數值為 “0000” 或 “0001”,輸出Y之數值皆,為 00000001。圖3.11顯示此程式之模擬結果。,圖3.11,DECODER_3to8_share.vhd 之模擬結果,29,最後我們介紹如何使用VHDL描述七段顯示器的解碼電路。圖 3.12 說,明了七段顯示器每一段之信號名稱及顯示位置,而圖3.13則為七段顯示解,碼器之外觀。該顯示器裏每一段會被顯示出來假如該段之信號數值為 0 ,,反之則為 1 。我們將此解碼器之輸出及輸入關係整理於表3.1中。,表3.1,七段顯示器編碼器之輸出入關係,圖3.12,七段顯示器每一段之名稱及顯示位置,圖3.13,七段顯示器外觀,30,我們知道此解碼器也可使用選擇式信號設定來完成,其完整之程式如下所示:,library ieee;,use ieee.std_logic_1164.all;,entity SEVEN_SEG is,port( S : in std_logic_vector(3 downto 0) ;,A,B,C,D,E,F, G : out std_logic,);,end SEVEN_SEG;,architecture DATAFLOW of SEVEN_SEG is,signal Y : std_logic_vector(0 to 6);,begin,with S select,Y =0000001 when 0000,0110000 when 0001,0010010 when 0010,0000110 when 0011,1001100 when 0100,0100100 when 0101,0100000 when 0110,0001111 when 0111,0000000 when 1000,0000100 when 1001,1111111 when others;,A = Y(0);,B = Y(1);,C = Y(2);,D = Y(3);,E = Y(4);,F = Y(5);,G = Y(6);,end DATAFLOW;,31,圖3.14顯示SEVEN_SEG.vhd 之模擬結果。由此圖我們可觀察得當S之,數值分別為8、9、1及0時,輸出A至G符合表3.1所列之數值,所以此程,式正確描述了七段顯示器編碼器。,圖3.14,SEVEN_SEG.vhd 之模擬結果,32,此種設定方式是根據 when . else 語法,而基本語法之規則如下:,信號 A = 信號 B when,條件敘述,else 信號 C ;,此種信號設定之程序為:如果條件敘述成立則我們用信號B來設定信號A,,,否則使用信號C設定信號A。,以下為一 VHDL 程式,其使用條件式信號設定方式來實現21多工器。,entity mux_2 is,port ( X1, X2, S : in bit ;,Y : out bit );,end mux_2;,architecture DATAFLOW of mux_2 is,begin,Y = X1 when S = 1,else X2;,end DATAFLOW ;,在此程式中若S=1 則我們用 X1來設定 Y,否則用 X2來設定Y。圖 3.15顯示,此程式之模擬結果。, 3-2-2-2 條件式信號設定方式,33,在該圖中我們設定X1=0及X2=1,因此若S=1,則輸出Y=0,且,若S=0,則Y=1。此圖之結果符合此一描述。,圖3.15,mux_2.vhd 之模擬結果,34,條件式信號設定有一個很大的特點是它可以排列信號,設定之次序。考慮以下之語法:,信號 A = 信號 B1 when,條件敘述,1 else,信號 B2 when,條件敘述,2 else,.,信號 BN when,條件敘述,N else,信號 C ;,則信號 A之設定是有優先次序的,該次序為信號 B1最,高,B2次之,依序到最後為信號 C。,35,表,3.2,優先權編碼器之輸出入關係,B(3)B(2)B(1)B(0),A(1)A(0),Active,0000,XXX1,XX10,X100,1000,11,00,01,10,11,0,1,1,1,1,圖3.16,優先權編碼器之外觀,以下我們利用可以排列信號設定之次序之特,點來設計優先權編碼器(Priority Encoder),,其外觀如圖3.16 所示,當中B為輸入其長度,為4位元,而A為輸出其長度為2位元。在矩,陣 B之元素中以 B(0)之優先權最高,B(1)次,之,B(2)再次之,而B(3)最後。若優先權較,高之元素其值為 1 ,則無論優先權較低之,元素值為何,該優先權較高之元素可設定輸,出A之數值。若所有元素值皆為零,則我們,設定另一輸出Active 為 0 。 這些關係也整,理在表3.2中。,36,以下為此編碼器之 VHDL 程式:,entity priority_enc is,port ( B : in bit_vector( 3 downto 0);,A : out bit_vector( 1 downto 0);,Active : out bit );,end priority_enc;,architecture DATAFLOW of priority_enc is,begin,A = 00 when B(0) = 1 else,01 when B(1) = 1 else,10 when B(2) = 1 else,11 ;,Active = 0 when B = 0000 else 1 ;,end DATAFLOW;,37,圖3.17 顯示priority_enc.vhd 之模擬結果。當該圖B之數值為1及5時,B(0)=1,所以由表3.2可知A應當為00。當B之數值為2及6時,B(0)=0且B(1)=1,所以A應當為01。當B之數值為4時,B(0)=0、B(1)=0且B(2)=1,所以A應當為10。最後,當B分別為8及0時,B(0)=0、B(1)=0且B(2)=0,所以A之值應為11。,圖3.17,priority_enc.vhd 之模擬結果,38,我們已在前一小節中使用了選擇式信號設定方式來實現41多工器,,以下我們將用條件式信號設定方式來實現之。由此我們可知相同的電路,我們可以用不同的VHDL信號設定方式實現之。,entity mux4_when is,port (,X : in bit_vector(3 downto 0) ;,S : in bit_vector(1 downto 0) ;,Y : out bit );,end mux4_when;,architecture DATAFLOW of mux4_when is,begin,Y = X(0) when S = 00 else,X(1) when S = 01 else,X(2) when S = 10 else,X(3);,end DATAFLOW;,39,圖3.18顯示mux4_when.vhd 之模擬結果,該結果與圖3.7之結果相同,,因此mux4_when.vhd也正確的描述了41多工器。,圖3.18,mux4_when.vhd 之模擬結果,40,
展开阅读全文