VHDL語言的程序結(jié)構(gòu)與數(shù)據(jù)類型
第2節(jié) VHDL語言的程序結(jié)構(gòu)與數(shù)據(jù)類型 [學(xué)習(xí)要求] 掌握VHDL硬件描述語言的基本語法和源文件的結(jié)構(gòu),學(xué)會用VHDL硬件描述語言設(shè)計(jì)典型數(shù)字邏輯電路。 [重點(diǎn)與難點(diǎn)] 重點(diǎn):VHDL語言的程序結(jié)構(gòu);VHDL語言的數(shù)據(jù)類型及數(shù)據(jù)對象。 難點(diǎn):VHDL的數(shù)據(jù)對象中的變量和信號的區(qū)別。 [理論內(nèi)容] 一、VHDL的程序結(jié)構(gòu) 圖1 VHDL的程序結(jié)構(gòu)圖 圖1中是VHDL的全部結(jié)構(gòu),但實(shí)際上并不需要全部的結(jié)構(gòu),就像在許多設(shè)計(jì)項(xiàng)目中,大部分工程師只用到VHDL其中的30%的語法。通常圖2的結(jié)構(gòu)才是基本和必需的。 USE定義區(qū) ENTITY定義區(qū) ARCHITECTURE定義區(qū) 圖2 VHDL程序的基本結(jié)構(gòu) 由于VHDL已是IEEE規(guī)定的標(biāo)準(zhǔn),所以只是CPLD、FPGA等芯片公司,它們都會提供這個標(biāo)準(zhǔn)的定義庫(Library IEEE),而且由于這里面寫了許多的定義和參數(shù),初學(xué)者一時之間也不容易全部了解,所以全部寫上以減輕負(fù)擔(dān),后面的章節(jié)的程序默認(rèn)也這么寫。 程序如: USE IEEE.STD_LOGIC_1164.ALL; 代表本程序引用IEEE標(biāo)準(zhǔn)定義庫的STD_LOGIC_1164全部定義。 VHDL語言編寫是屬于自由格式,所以在一個完整命令敘述寫完時,必須為它加上“;”,作為前后命令的分界,如上述的Use定義命令。程序的注釋采用“--” Entity部分是用來定義電路的輸入和輸出所用。定義區(qū)的命令格式為: Architecture部分是描述這個電路的功能部分,其書寫的語法因具體電路的功能而定,下一節(jié)將詳細(xì)介紹。_ 以下是一個簡單的例子: library ieee; --采用ieee標(biāo)準(zhǔn)庫 use ieee.std_logic_1164.all; --使用其中的定義包,以后照著寫即可 use IEEE.STD_LOGIC_UNSIGNED.all; --同上 use IEEE.STD_LOGIC_ARITH.all; --同上 entity test is --定義實(shí)體名 port( --以下是定義輸入輸出端口 pin1 : in std_logic; --pin1為輸入端口,數(shù)據(jù)類型為std_logic pin2 : in std_logic; --同上 pin3 : out std_logic --pin3為輸出端口,數(shù)據(jù)類型為std_logic ); --端口定義完成 end test; --實(shí)體描述完成 architecture behavior of test is --定義結(jié)構(gòu)體 begin --結(jié)構(gòu)體開始 pin3<=pin1 and pin2; --該語法表示將pin1和pin2相與送至pin3 end behavior; --結(jié)構(gòu)體描述完成 其實(shí)VHDL語言在書寫上和高級語言的描述十分相似(風(fēng)格更似于Ada語言),與C語言的比較如圖3所示,大家不要把它看得很神秘。VHDL語言本質(zhì)上區(qū)別于高級語言是,作為硬件的描述語言其語句具有一定的硬件特性,但描述過程卻像軟件的方式。 VHDL語言的編寫、編譯和調(diào)試方式與前面所介紹的圖形方式基本類似,這里不再介紹,相信大家會很快熟悉。 #include <stdio.h> int sample(int foo) { int bar; bar=0; while(bar<foo) bar=bar+1; return(bar); } library ieee; use ieee.std_logic_1164.all; entity sample is port( foo: in integer range 0 to 3; ret: out integer ranger 0 to 3 ); end sample architecture behavior of sample is begin process(foo) variable bar : integer range 0 to 3; begin bar:=0; label1: while bar<foo loop bar:=bar+1; end loop label1; ret:=bar; end process; end behavior; 圖3 C語言與VHDL語言的比較 二、VHDL語言的基本數(shù)據(jù)類型 在數(shù)字電路里的信號大致可分成邏輯信號和數(shù)值信號,而針對VHDL所提供的基本數(shù)據(jù)類型而言,可進(jìn)行如下分類。 1、邏輯信號 ⑴ 布爾代數(shù)(Boolean) VHDL的布爾代數(shù)信號定義是:Type BOOLEAN is (FALSE,TRUE); 也就是說它的信號形式包含兩種:FALSE,TRUE。在應(yīng)用上可以資助這種信號來代表某種動作是否完成,即代表某種情況的標(biāo)志信號。 ⑵ 位(Bit) VHDL的位信號定義是:Type Bit is (‘0’,’1’); 也就是說它的信號形式包含兩種:0,1類型。 這種信號類型0可視為數(shù)字電路里所謂的低電位,而1代表高電位。 ⑶ 標(biāo)準(zhǔn)邏輯(Std_Logic) 在VHDL的“標(biāo)準(zhǔn)邏輯”信號形式定義是: ⑷ 邏輯序列信號 以數(shù)字電路而言,有許多時侯是將幾個信號全成一組代表特定功能的騙子列信號,例如:數(shù)據(jù)總線(Data Bus)、地址總線(Address Bus)等。實(shí)際上從電路的觀點(diǎn)上,圖4里的CE信號看成一條信號,而Data信號是由8條線合的排線信號。 圖4 序列信號在電路上的表示意義 VHDL針對這種序列信號的表示,提供了以下功能: Bit_Vector : 位序列 Std_Logic_Vector : 標(biāo)準(zhǔn)邏輯序列 兩種邏輯序列,以方便在程序設(shè)計(jì)上的處理。例如針對圖4的信號定義,則可寫成以下的程序: Signal Data : std_logic_vector(7 downto 0); --數(shù)據(jù)輸出 Signal Address : std_logic_vector(0 to 3); --地址 Signal CE : std_logic; --電路使能 由上述表示可知,Data信號共由8條線組俁而成(因?yàn)槭?至0),而且依照它的定義,第1條線應(yīng)是Data(7),第2條線應(yīng)是Data(6),然后依序第8條線是Data(0)。而對于Address序列信號的定義是“0 TO 3”,所以第1條是Address(0),第2條是Address(1),然后最后是Address(3)。在序列信號的表示時,除了序列的范圍大小須注意外,還須特別留意序列的編號須序。 ⑸ 序列信號的分解與合并 在序列信號的處理上,VHDL的語法是接愛分解與合并,以圖5而言,它們在處理的命令語句上,可以寫成下面的程序,其中“&”符號代表執(zhí)行信號合并動作。 圖5序列信號的分解與合并 ⑹ 邏輯信號的運(yùn)算 配合邏輯信號的基本運(yùn)算符,通常包含有兩種:邏輯運(yùn)算與關(guān)系運(yùn)算。具體的運(yùn)算如下表中所示。 2、數(shù)值信號 一般來說,在VHDL的程序里,將信號定義成數(shù)值,這是為了方便作數(shù)值方面的運(yùn)算,比如說“模6計(jì)數(shù)器”、“10分頻器”等。所以有了這樣的數(shù)值信號,后續(xù)作加減等運(yùn)算就盯對容易許多。 ⑴ 整數(shù)(Integer) VHDL的整數(shù)信號形式定義為: type Integer is ragne -2147483648 to 2147483647。 實(shí)際上一個整數(shù)是由32位的BIT_VECTOR構(gòu)成,所以數(shù)值圍也可以看成是從-231~231-1。 不過通常不會用到這么大的數(shù)值,這時若不考慮適當(dāng)調(diào)整其范圍,將造成硬件的不必要的浪費(fèi)。數(shù)值范圍的限制方法,是以range…to…命令來達(dá)成。例如,下面A、B、C信號的定義,原本都是32位的整數(shù),但經(jīng)range…to…命令的限制結(jié)果,將有效控制B,C的位長 度。 數(shù)據(jù)類型討論,接著來說明 VHDL 所提供的幾種數(shù)據(jù)對象。 常數(shù),是希望該常數(shù)所代表的數(shù)據(jù)部分不會被改變,如此一業(yè), 三、VHDL 的數(shù)據(jù)對象 有了上一部分的基本 不這這里所謂的數(shù)據(jù),是依該數(shù)據(jù)對象被定義成何種數(shù)據(jù)類型來區(qū)分。這樣的數(shù)據(jù)對象共分成三種:常數(shù)(Constant)、信號(Signal)和變量(Variable)。下面開始討論,如何定義這些數(shù)據(jù)對象與它們的使用范圍。 1、常數(shù)(Constant) 將數(shù)據(jù)對象定義為 程序的可讀性和維護(hù)性就會相對提高。 定義語法: Constant 常數(shù)名稱: 數(shù)據(jù)類型:=設(shè)置值 e)長的常數(shù),可分別烈軍 stant Zero_4 : std_logic_vector(3 downto 0) :=”0000”; ”; 2、信號( 數(shù)據(jù)對象,是為了指定電路內(nèi)部某一節(jié)點(diǎn)。而這種 “信號”的數(shù)據(jù)對 nal 信號名稱:數(shù)據(jù)類型:=設(shè)置值; --設(shè)置值可省略不寫。 管腳, F 對象。 圖 6 “信號”數(shù)據(jù)對象 D 和 E 信號的定義一般在架構(gòu) A 出現(xiàn)在方塊(BLOCK)或過 ( 用于過程(Process)里,它的使用通常只是為了程序運(yùn)算的方便, 比如定義一個4位(Nibble)長的常數(shù)和一個8位(Byt 屬成: Con Constant Zero_8: std_logic_vector(7 downto 0):=”00000000 Signal) 定義“信號”的 象的定義方式是: 定義語法: Sig 比如圖6的方塊來表示一個CPLD或FPGA,這時A、B、C是視為電路的輸入 而是輸出管腳。這時的D、E就是所謂的電路內(nèi)部節(jié)瞇,也就是這里定義的“信號”數(shù)據(jù) RCHITECTURE處,當(dāng)然也可以 程PROCESS)等中。 3、變量(Variable) 這種數(shù)據(jù)對象僅限 而且它和信號(Signal)對象在電路上的最大不同點(diǎn)是,它并不代表實(shí)際電路的某一組件值卻是一條信號線的物理意義,所以它在運(yùn)算處理上,會有立即的結(jié)果。而信號對象卻是代表電路的寄存器效果。這一點(diǎn)請大家仔細(xì)體會。 |
|