VHDL語(yǔ)言設(shè)計(jì)入門_第1頁(yè)
VHDL語(yǔ)言設(shè)計(jì)入門_第2頁(yè)
VHDL語(yǔ)言設(shè)計(jì)入門_第3頁(yè)
VHDL語(yǔ)言設(shè)計(jì)入門_第4頁(yè)
VHDL語(yǔ)言設(shè)計(jì)入門_第5頁(yè)
已閱讀5頁(yè),還剩75頁(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)介

VHDL入門需掌握的根本知識(shí)一、信號(hào)〔signal〕的含義和信號(hào)的2種最常 用類型:std_logic和td_logic_vector二、四種常用語(yǔ)句的根本用法 賦值語(yǔ)句、if語(yǔ)句、case語(yǔ)句和process語(yǔ)句三、實(shí)體〔entity〕、結(jié)構(gòu)體〔architecture)和一個(gè)實(shí) 體和一個(gè)結(jié)構(gòu)體組成的設(shè)計(jì)實(shí)體。四、層次結(jié)構(gòu)的設(shè)計(jì)掌握元件〔component〕語(yǔ)句和端口映射〔portmap〕語(yǔ)句。五、庫(kù)〔library〕和程序包〔pachage〕的根本使用。有了上述的入門知識(shí),一般的設(shè)計(jì)沒(méi)有什么問(wèn)題。

信號(hào)和變量信號(hào)〔signal)是硬件中連線的抽象描述,信號(hào)在元件的端口連接元件。變量(varable)在硬件中沒(méi)有類似的對(duì)應(yīng)關(guān)系,它們主要用于硬件特性的高層次建模所需的計(jì)算中。信號(hào)在邏輯電路

設(shè)計(jì)中最常用的數(shù)據(jù)類型在VHDL語(yǔ)言中有10種數(shù)據(jù)類型,但是在邏輯電路設(shè)計(jì)中最常用的是std_logic和std_logic-vector提供的數(shù)據(jù)類型。Std_logic類型分為布爾〔boolean〕型、位〔bit〕型、位矢量(bit_vector)型。信號(hào)在邏輯電路

設(shè)計(jì)中最常用的數(shù)據(jù)類型Std_logic有9種狀態(tài),常用的是三種狀態(tài):‘0’高電平‘1’低電平‘z’ 高阻

高阻狀態(tài)是為了雙向總線的描述信號(hào)的說(shuō)明

一個(gè)信號(hào)只有說(shuō)明語(yǔ)句說(shuō)明后才能使用。用VHDL語(yǔ)言進(jìn)行設(shè)計(jì)就是寫一系列語(yǔ)句。一個(gè)語(yǔ)句用分號(hào)結(jié)束。設(shè)計(jì)說(shuō)明形式如下:Signalclock,T1,T2:std_logic;Signalr0,r1,r2,r3:std_logic_vector(15downto0);Signalr0,r1,r2,r3:std_logic_vector(0upto15);信號(hào)的說(shuō)明整數(shù)不能看作矢量,不能按位運(yùn)算。整數(shù)不能進(jìn)行邏輯運(yùn)算,只能進(jìn)行算術(shù)運(yùn)算。從信號(hào)說(shuō)明看不出一個(gè)信號(hào)是組合邏輯還是時(shí)序邏輯〔例如存放器〕,這與ABEL語(yǔ)言是不同的。邏輯運(yùn)算符有6種邏輯運(yùn)算符:NOT、OR、AND、NAND、NOR、XOR。常用的為前三種。

signala,b:std_logic;signalc,d:std_logic_vector(7downto0);aandb aorb nota正確

canddcxord notc

正確

aandc錯(cuò)誤

2個(gè)進(jìn)行邏輯運(yùn)算的信號(hào),類型必須相同。這些邏輯運(yùn)算符優(yōu)先級(jí)相同。

算術(shù)運(yùn)算符常用的算術(shù)運(yùn)算符有:+

-

Signala,b:std_logic_vector(15downto0);a+ba+‘1’A+“01”并置運(yùn)算符

&并置運(yùn)算符用于位的連接,形成矢量。也可連接矢量形成更大的矢量。Signala,b:std_logic_vector(3downto0);Signalc,d:a,b:std_logic_vector(2downto0);aand(‘1’&c)c&a

關(guān)系運(yùn)算符關(guān)系運(yùn)算符有以下幾種:=等于 /=不等于<小于 >大于<=小于等于 >=大于等于等于、不等于運(yùn)算符適用于所有的數(shù)據(jù)類型,其他的運(yùn)算符適用于整數(shù)、位及矢量等。在進(jìn)行關(guān)系運(yùn)算時(shí),兩邊的數(shù)據(jù)類型必須相同,但位長(zhǎng)度可以不同。關(guān)系運(yùn)算的結(jié)果為“真”或者“假”。

常用的4種語(yǔ)句VHDL有許多類型的語(yǔ)句,我們這里講4種。一、賦值語(yǔ)句

signala,b,c:std_logic;signald,e,q:std_logic_vector;c<=not(aandb);q<=dorq;常用的4種語(yǔ)句二、if語(yǔ)句1、if語(yǔ)句的三種形式?if條件then假設(shè)干語(yǔ)句endif;?if條件then假設(shè)干語(yǔ)句else假設(shè)干語(yǔ)句endif;常用的4種語(yǔ)句二、if語(yǔ)句1、if語(yǔ)句的三種形式?if條件1then假設(shè)干語(yǔ)句elsif條件2then假設(shè)干語(yǔ)句┆

else條件nthen假設(shè)干語(yǔ)句endif;

常用的4種語(yǔ)句二、if語(yǔ)句2、例子1—16位存放器--Signalreset,clk,wen:std_logic;--Signald,q:std_logic_vector(15downto0);Ifreset=‘0’thenq<=x”0000”;Elsifclock’eventandclock=‘1’thenifwen=‘1’thenq<=d;else q<=q;endif;Endif;說(shuō)明:--是注釋開(kāi)始的標(biāo)志,signal語(yǔ)句的存在只是為了說(shuō)明這些信號(hào)的類型,供閱讀方便使用。

常用的4種語(yǔ)句二、if語(yǔ)句3、例子2—16位存放器的另一種形式--Signalreset,clk,wen:std_logic;--Signald,q:std_logic_vector(15downto--0);Ifreset=‘0’thenq<=x”0000”;Elsifclock’eventandclock=‘1’thenifwen=‘1’thenq<=d; endif;Endif;常用的4種語(yǔ)句二、if語(yǔ)句4、例子3—16位存放器的第三種形式--Signalreset,clk,wen:std_logic;--Signald,q:std_logic_vector(15downto--0);Ifreset=‘0’thenq<=”0000000000000000”;Elsifclock’eventandclock=‘1’thenifwen=‘1’thenq<=d;endif;Endif;常用的4種語(yǔ)句二、if語(yǔ)句5、信號(hào)沿的幾種表示方法clock’eventandclock=‘1’上升沿clock’eventandclock=‘0’下降沿rising_edge〔clock〕上升沿falling_edge(clock)下降沿

常用的4種語(yǔ)句二、if語(yǔ)句6、例子4—時(shí)鐘下降沿觸發(fā)的16位存放器--Signalreset,clk,wen:std_logic;--Signald,q:std_logic_vector(15downto--0);Ifreset=‘0’thenq<=X”0000”;Elsiffalling_edge(clock)thenifwen=‘1’thenq<=d;endif;Endif;常用的4種語(yǔ)句二、if語(yǔ)句7、例子5—二選一多路開(kāi)關(guān)

--Signalsel:std_logic;--Signala,b,c:std_logic_vector(15--downto0);Ifsel=‘0’thenc<=a;Elsec<=b;Endif;常用的4種語(yǔ)句三、進(jìn)程〔process〕語(yǔ)句PROCESS語(yǔ)句是VHDL語(yǔ)言中描述硬件系統(tǒng)行為的最根本的語(yǔ)句。本質(zhì)上描述了一個(gè)功能獨(dú)立的電路塊。1、process語(yǔ)句的根本形式PROCESS[〔敏感信號(hào)1,敏感信號(hào)2,…〕]BEGIN┇ENDPROCESS;常用的4種語(yǔ)句三、process語(yǔ)句2、說(shuō)明敏感信號(hào)表中的任何一個(gè)發(fā)生變化,都啟動(dòng)process語(yǔ)句工作。敏感信號(hào)表中的信號(hào)是一局部輸入信號(hào),或者在process語(yǔ)句中形成的反響信號(hào);純粹輸出的信號(hào)或者在本語(yǔ)句中不發(fā)生變化的信號(hào)不能放入敏感信號(hào)表。常用的4種語(yǔ)句三、process語(yǔ)句我們?cè)趇f語(yǔ)句中介紹的電路如果不和PROCESSS語(yǔ)句結(jié)合起來(lái),不能構(gòu)成一個(gè)功能獨(dú)立的電路,編譯時(shí)就會(huì)出錯(cuò)。下面是改造后的16位存放器和2選1多路開(kāi)關(guān)。3、改造后的16位存放器--Signalreset,clk,wen:std_logic;

--Signald,q:std_logic_vector(15downto0);

register_pro:process(reset,clock)

begin

Ifreset=‘0’then

q<=x”0000”;

Elsifclock’eventandclock=‘1’then

ifwen=‘1’then

q<=d;

endif;

Endif;

endprocess;

注意:敏感信號(hào)表中沒(méi)有信號(hào)D,因?yàn)橹恍枰猺eset和clock啟動(dòng)這個(gè)process語(yǔ)句;信號(hào)q是個(gè)輸出信號(hào),因此不能放入process語(yǔ)句的敏感信號(hào)表中。

Register_pro:表示一個(gè)標(biāo)號(hào),標(biāo)號(hào)可有可無(wú)。

常用的4種語(yǔ)句三、process語(yǔ)句4、改造后的2選一多路開(kāi)關(guān)--Signalsel:std_logic;

--Signala,b,c:std_logic_vector(15

--downto0);

process(sel,a,b)

begin

Ifsel=‘0’then

c<=a;

Else

c<=b;

Endif;

endprocess;

常用的4種語(yǔ)句三、process語(yǔ)句5、程序計(jì)數(shù)器PC的一種設(shè)計(jì)--signalpc,zjmp_pc,cjmp_pc:

--std_logic_vector(15downhto0);

--signalt,zj_flag,cj_flag,dw_flag,reset:std_logic;

pc_proc:process(pc,zjmp_pc,cjmp_pc,t,zj_flag,cj_flag,

dw_flag,reset)

begin

ifreset=‘0’then

pc<=x”0000”;

elsift’eventandt=‘1’then

ifzj_flag=‘1’then

pc<=zjmp_pc;

elsifcj_flag=‘1’then

pc<=cjmp_pc;

elsifdw_flag=‘1’then

pc<=pc+“10”;

else

pc<=pc+‘1’;

endif;

endif;

endprocess;常用的4種語(yǔ)句三、process語(yǔ)句6、1000000計(jì)數(shù)器設(shè)計(jì)--signalcounter:std_logic_vector(19downto0);

--signalcounterclk,reset:std_logic;

--16進(jìn)制f423f等于10進(jìn)制999999

process(reset,clk)

begin

ifreset=‘0’then

counter<=x”00000”;

elsifclk’eventandclk=‘1’then

ifcounter/=x”f423f”then

counter<=counter+‘1’;

else

counter<=x”00000”;

endif;

endif;

endprocess;

常用的4種語(yǔ)句三、process語(yǔ)句7、鎖存器設(shè)計(jì)--signalreset,set,clk:std_logic;

--siganld,q:std_logic_vector(15downto0);

process(reset,set,clk)

ifreset=‘0’then

q<=x”0000”;

elsifset=‘0’then

q<=x”ffff”;

elsifclk=‘1’then

q<=d;

endif;

endprocess;常用的4種語(yǔ)句四、CASE語(yǔ)句1、CASE語(yǔ)句的書寫格式CASE條件表達(dá)式ISWHEN條件表達(dá)式值1=〉假設(shè)干語(yǔ)句 ┆WHEN條件表達(dá)式n=〉 假設(shè)干語(yǔ)句WHENOTHERS=〉 假設(shè)干語(yǔ)句ENDCASE;常用的4種語(yǔ)句四、CASE語(yǔ)句2、例子1—運(yùn)算器設(shè)計(jì)

一個(gè)有加、減、與、或功能的16位運(yùn)算器。其中,cin是原來(lái)的進(jìn)位值,cout是運(yùn)算后的進(jìn)位值,q是運(yùn)算的結(jié)果,a和b是2個(gè)操作數(shù),sel是個(gè)2位的運(yùn)算選擇碼。

--signala,b,q:std_logic_vector(15downto0);

--signalsel:std_logic_vector(1downto0);

--signalcin,cout:std_logic;

--signalresult:std_logic_vector(16downto0);

process(a,b,sel,cin)

begin

caseselis

when“00”=>

result<=‘0’&a+‘0’&b;

q<=result(15downto0);

cout<=result(16);

when“01”=>

result<=‘0’&a+‘0’&b;

q<=result(15downto0);

cout<=result(16);

when“10”=>

q<=aandb;

cout<=cin

whenothers=>

q<=aorb;

cout<=cin;

endcase;

endprocess;常用的4種語(yǔ)句四、CASE語(yǔ)句3、例子2—一個(gè)2與非門--signal

a:std_logic_vector(1downto0);

--signalc:std_logic;

process(a)

begin

caseselis

when“00”|“01”|“10”=>

c<=‘1’;

when“11”=>

c<=‘0’;

whenothers=>

null;

endcase;

endprocess;

在本例子中,第一個(gè)when中的“|“代表或者,即三個(gè)條件中的任何一個(gè)滿足,都執(zhí)行c<=‘1’。實(shí)際上與非門很少這樣設(shè)計(jì)。

Null是個(gè)什么也不做的空語(yǔ)句。常用的4種語(yǔ)句四、CASE語(yǔ)句4、例子3—一個(gè)狀態(tài)機(jī)設(shè)計(jì)該狀態(tài)機(jī)可用于指令cache的在不命中時(shí)的控制。指令cache容量是8x8字。每個(gè)字16位。存儲(chǔ)器數(shù)據(jù)總線是16位。Miss是不命中標(biāo)志。

--signalstate,next_state:std_logic_vector(3downto0);

--signalreset,clk,miss:std_logic;

proceee(reset,clk)

begin

ifreset=‘0’then

state<=“0000”;

elsifclk’eventandclk=‘1’then

state<=next_state;

endif;

endprocess;

process(miss,state)

begin

casestateis

when“0000”=>

ifmiss=‘1’then

next_state<=“0001”;

else

next_state<=“0000”;

endif;

when“0001”=>--1

next_state<=“0011”;

when“0011”=>--2

next_state<=“0010”;

when“0010”=>--3

next_state<=“0110”;

when“0110”=>--4

next_state<=“0111”;

when“0111”=>--5

next_state<=“0100”;

when“0100”=>--6

next_state<=“1100”;

when“1100”=>--7

next_state<=“1000”;

when“1000”=>--8

next_state<=“0000”;

whenothers=>

next_state<=“0000”;

endcase;

endprocess;設(shè)計(jì)實(shí)體VHDL適合做大型工程的設(shè)計(jì)。除了極少數(shù)十分簡(jiǎn)單的工程外,根本上都采用層次結(jié)構(gòu)的設(shè)計(jì)。在層次結(jié)構(gòu)的設(shè)計(jì)中,設(shè)計(jì)實(shí)體是一個(gè)根本單元。使用VHDL語(yǔ)言設(shè)計(jì)一個(gè)工程的過(guò)程中,經(jīng)常要使用廠家提供各種庫(kù),庫(kù)中存放的是供用戶使用的已經(jīng)設(shè)計(jì)好的設(shè)計(jì)實(shí)體。因此可以認(rèn)為,一個(gè)工程就是用戶設(shè)計(jì)的各個(gè)設(shè)計(jì)實(shí)體和庫(kù)中提供的設(shè)計(jì)實(shí)體通過(guò)適當(dāng)?shù)男盘?hào)連接完成的。設(shè)計(jì)實(shí)體在一個(gè)工程中除了最高層的設(shè)計(jì)實(shí)體外,其他設(shè)計(jì)實(shí)體都是子系統(tǒng),或者稱為元件。這里的元件是廣義的,不是市場(chǎng)上賣的現(xiàn)成的元件。最高層的設(shè)計(jì)實(shí)體就是系統(tǒng)總體。

設(shè)計(jì)實(shí)體一個(gè)設(shè)計(jì)實(shí)體由三局部構(gòu)成:實(shí)體〔entity〕定義系統(tǒng)對(duì)外聯(lián)系的信號(hào),信號(hào)的方向和數(shù)據(jù)類型。相當(dāng)于電子器件的引腳。結(jié)構(gòu)體(architecture)完成設(shè)計(jì)實(shí)體規(guī)定的功能,就是子系統(tǒng)的內(nèi)部電路結(jié)構(gòu)。庫(kù)(library)和程序包(package)設(shè)計(jì)實(shí)體前面要寫明該設(shè)計(jì)實(shí)體用到的庫(kù)和程序包。實(shí)體〔entity〕Entity定義流出、流入設(shè)計(jì)實(shí)體的信號(hào)。Entity的書寫形式如下:

Entity

實(shí)體名is

端口說(shuō)明;

end實(shí)體名;實(shí)體〔entity〕下面舉一個(gè)實(shí)體的例子:ENTITYmuxISPORT(d0,d1,sel:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux;

其中,MUX是實(shí)體名。PORT〔端口〕說(shuō)明的是端口信號(hào)的數(shù)據(jù)類型的和流動(dòng)方向。在本例中,d0、d1和sel是STD_LOGIC數(shù)據(jù)類型,是流入實(shí)體的信號(hào);q是STD_LOGIC數(shù)據(jù)類型,是流出實(shí)體的信號(hào)。實(shí)體〔entity〕Port(端口的書寫形式)

PORT(端口名,…,端口名:模式數(shù)據(jù)類型; 端口名,…,端口名:模式數(shù)據(jù)類型;

. . .

端口名,…,端口名:模式數(shù)據(jù)類型);

實(shí)體說(shuō)明中的每一個(gè)輸出/輸入被稱為一個(gè)端口。一個(gè)端口實(shí)際上表示一個(gè)或者一組具有相同模式和數(shù)據(jù)類型的負(fù)責(zé)與外部通訊的信號(hào),相當(dāng)于元件的引腳。實(shí)體〔entity〕下面是一個(gè)PORT語(yǔ)句的例子:PORT (reset,cs: in std_logic; rd,wr in std_logic; a1,a0: in std_logic; pa,pb inout std_logic_vector(7downto0); pc out std_logic_vector(17downto0));

端口的模式用來(lái)說(shuō)明信號(hào)通過(guò)端口的方向和通過(guò)方式,有以下幾種方式:實(shí)體〔entity〕IN〔流入實(shí)體〕OUT〔從實(shí)體流出〕INOUT〔雙向端口,即可流入實(shí)體,又可從實(shí)體流出〕BUFFER〔雙向端口,可從實(shí)體流出,也能用于內(nèi)部反響〕

OUT模式的端口不能用于被設(shè)計(jì)實(shí)體的內(nèi)部反響。BUFFER模式的端口能夠用于被設(shè)計(jì)實(shí)體的內(nèi)部反響。INOUT模式可以代替IN、INOUT、BUFFER模式,INOUT模式允許內(nèi)部反響。雖然INOUT模式能代替其他模式,但在設(shè)計(jì)時(shí),除非真正需要雙向端口時(shí),建議不要使用INOUT模式。慣例是把輸入端口指定為IN模式,把輸出端口指定為OUT模式,把雙向端口指定INOUT模式。這一良好的設(shè)計(jì)習(xí)慣,從端口的名稱和端口模式就可以一目了然地判定信號(hào)的用途、性質(zhì)、來(lái)源和去向,十分方便。對(duì)于一個(gè)大型設(shè)計(jì)任務(wù),大家協(xié)同工作,這樣的描述不會(huì)引起歧義。另一方面,指定滿足端口性能的最根本模式,可以減少占用的器件內(nèi)部的資源。結(jié)構(gòu)體(architecture)完成設(shè)計(jì)實(shí)體規(guī)定的功能,就是子系統(tǒng)的內(nèi)部電路結(jié)構(gòu)。結(jié)構(gòu)體的書寫形式如下:ARCHITECTURE結(jié)構(gòu)體名OF實(shí)體名IS內(nèi)部信號(hào),常量,數(shù)據(jù)類型,函數(shù)等的定義;BEGIN 假設(shè)干并行執(zhí)行語(yǔ)句;END結(jié)構(gòu)體名;注意:實(shí)體名一定要與對(duì)應(yīng)的實(shí)體名完全一致。ARCHITECTURE后面的結(jié)構(gòu)體名與END后的結(jié)構(gòu)體名完全一致。結(jié)構(gòu)體的名字可以隨便起,因?yàn)閯e的地方都用不著這個(gè)名字。結(jié)構(gòu)體內(nèi)要求并行執(zhí)行語(yǔ)句,類似IF之類的順序執(zhí)行語(yǔ)句,只要將它們放在并行語(yǔ)句〔如process)之內(nèi)即可。結(jié)構(gòu)體(architecture)一個(gè)實(shí)體可以對(duì)應(yīng)幾個(gè)結(jié)構(gòu)體,我們這里只介紹一個(gè)實(shí)體只對(duì)應(yīng)一個(gè)結(jié)構(gòu)體的情況。結(jié)構(gòu)體有許多構(gòu)成的方法,就是把各類的并行語(yǔ)句加以不同的組合方式形成各種構(gòu)成方法。我們使用賦值語(yǔ)句、PROCESS語(yǔ)句和COMPONENT〔元件語(yǔ)句〕構(gòu)成結(jié)構(gòu)體的方法,這是初學(xué)者最常使用的方法,也是很管用的方法。庫(kù)在層次結(jié)構(gòu)設(shè)計(jì)中,程序包〔PACKAGE〕和庫(kù)(LIBRARY)都是很重要的工具,即使是由一個(gè)設(shè)計(jì)實(shí)體構(gòu)成的設(shè)計(jì),也要用到庫(kù)。VHDL的庫(kù)是用來(lái)存儲(chǔ)可編譯的設(shè)計(jì)單元的地方,也就是用來(lái)存放可編譯的程序包的地方,這樣它就可以在其他設(shè)計(jì)中被調(diào)用。庫(kù)中的設(shè)計(jì)單元〔實(shí)體說(shuō)明、結(jié)構(gòu)體、配置說(shuō)明、程序包說(shuō)明和程序包體等〕可以用作其他VHDL設(shè)計(jì)的資源。VHDL語(yǔ)言的庫(kù)分為兩種,一種是設(shè)計(jì)庫(kù),一種是資源庫(kù)。被IEEE認(rèn)可的資源庫(kù)稱為IEEE庫(kù)。VHDL工具廠商和EDA工具專業(yè)公司都有自己的資源庫(kù),有的自行參加到各自的開(kāi)發(fā)工具IEEE庫(kù)中,也有自行建庫(kù),另行獨(dú)立調(diào)用的資源庫(kù)。庫(kù)IEEE庫(kù)是最常用的資源庫(kù),其中包含的程序包是:Std_logic_1164 一些常用函數(shù)和數(shù)據(jù)類型程 序包Numeric_bit bit類型程序包 Numeric_Std 用于綜合的數(shù)值類型和算術(shù) 函數(shù)程序包Math_Real 實(shí)數(shù)的算術(shù)函數(shù)程序包Math_Complex 復(fù)數(shù)的算術(shù)函數(shù)程序包Vital_Timing Vital時(shí)序程序包Vital_Primitives Vital元件程序包

上述程序包中,不是每一個(gè)EDA軟件都全部提供。使用時(shí)應(yīng)該詳細(xì)了解EDA軟件的功能,看有無(wú)相應(yīng)的程序包,或者找出替代的程序包。

庫(kù)除了IEEE標(biāo)準(zhǔn)資源庫(kù)外,各可編程器件的廠家提供的EDA軟件提供自己獨(dú)特的資源程序包。由于這些程序包是為它們制造的器件效勞的,往往更有針對(duì)性。QartusⅡ中提供了一個(gè)LPM庫(kù),庫(kù)中有許多稱之為MegaFunctions的功能強(qiáng)大的函數(shù)。在QartusⅡ中使用菜單命令Tools→MegaWizardPlug-InManager能夠很容易地掌握QartusⅡ提供的許多元件和函數(shù)的使用。使用Cyclone芯片中的存儲(chǔ)器時(shí),Altera公司強(qiáng)烈推薦通過(guò)Tools→MegaWizardPlug-InManager進(jìn)行設(shè)計(jì)。一個(gè)設(shè)計(jì)實(shí)體例子

libraryieee;useieee.std_logic_1164.all;

ENTITYand_gateIS PORT(op1,op2:instd_logic; and_result:outstd_logic);ENDand_gate;

ARCHITECTUREbehavOFand_gateISBEGIN and_result<=op1ANDop2;ENDbehav;

庫(kù)使用庫(kù)中的元件和函數(shù)之前,需要使用LIBRARY子句和USE子句予以說(shuō)明。沒(méi)有說(shuō)明的庫(kù)中的元件通常不能使用。如果一個(gè)設(shè)計(jì)實(shí)體中使用了某個(gè)庫(kù)中的元件和函數(shù),就要使用相應(yīng)的LIBRARY子句和USE子句,LIBRARY子句和USE子句放在總是放在設(shè)計(jì)文件的最前面〔可以放在注釋之后〕,LIBRARY子句的作用是使該庫(kù)在當(dāng)前文件中“可見(jiàn)”。LIBRARY子句說(shuō)明使用哪個(gè)庫(kù),它的格式是 LIBRARY庫(kù)名1,庫(kù)名2,…,庫(kù)名n;USE子句說(shuō)明使用哪個(gè)庫(kù)中的哪個(gè)程序包中的元件或者函數(shù)。它的格式是: USE庫(kù)名.程序包名.ALL;下面是使用,LIBRARY子句和USE子句的例子:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;對(duì)于一般使用而言,這些庫(kù)的說(shuō)明語(yǔ)句夠用了。

component〔元件〕語(yǔ)句

和portmap〔端口映射〕語(yǔ)句在層次化結(jié)構(gòu)設(shè)計(jì)中,要經(jīng)常用到component〔元件〕語(yǔ)句和portmap〔端口映射〕語(yǔ)句。component語(yǔ)句的作用是說(shuō)明設(shè)計(jì)實(shí)體中使用的哪個(gè)低層設(shè)計(jì)實(shí)體和該低層設(shè)計(jì)實(shí)體的端口。該低層設(shè)計(jì)實(shí)體在本設(shè)計(jì)實(shí)體中作為現(xiàn)成的元件使用。component〔元件〕語(yǔ)句一般放在結(jié)構(gòu)體中architecture語(yǔ)句和首次出現(xiàn)的begin之間,給人以一目了然的感覺(jué)。portmap語(yǔ)句完成低層設(shè)計(jì)實(shí)體的端口信號(hào)和本設(shè)計(jì)實(shí)體其他局部的信號(hào)連接問(wèn)題。它必須放在結(jié)構(gòu)體內(nèi)首次出現(xiàn)的begin之后。component〔元件〕語(yǔ)句

和portmap〔端口映射〕語(yǔ)句高層的設(shè)計(jì)實(shí)體可以把低層設(shè)計(jì)實(shí)體當(dāng)作元件來(lái)引用稱作例化。在一個(gè)高層設(shè)計(jì)實(shí)體中可以對(duì)一個(gè)元件例化屢次。component〔元件〕語(yǔ)句

和portmap〔端口映射〕語(yǔ)句COMPONENT語(yǔ)句的書寫形式是:COMPONENT元件名--指定調(diào)用元件PORT 說(shuō)明--被調(diào)用元件端口ENDCOMPONENT;端口的說(shuō)明和被調(diào)用元件〔設(shè)計(jì)實(shí)體〕中ENTITY中的說(shuō)明要完全一致〔次序可以改變〕。component〔元件〕語(yǔ)句

和portmap〔端口映射〕語(yǔ)句PORT語(yǔ)句的書寫格式如下: [標(biāo)號(hào)]:POETMAP(MS1=>S1,MS2=>S2,…,MSn=>Sn); 其中,MS1,MS2,…,MSn和S1,S2,…,Sn都是信號(hào)名。標(biāo)號(hào)是可選的,即可有可無(wú)。S1,S2,…,Sn是高層設(shè)計(jì)實(shí)體中使用的信號(hào)名;MS1,MS2,…,MSn是低層建立元件時(shí)使用的端口信號(hào)名〔引腳名〕。這種映射方式稱為顯式映射方式,它把元件端口的信號(hào)和高層中使用的信號(hào)顯式對(duì)應(yīng)起來(lái),書寫的順序不受任何限制。請(qǐng)注意:高層中使用的信號(hào)名和元件端口對(duì)應(yīng)的信號(hào)名可以相同,也可以不同;但是完全相同有時(shí)根本做不到。component〔元件〕語(yǔ)句

和portmap〔端口映射〕語(yǔ)句每次引用該元件都要使用portmap〔端口映射〕語(yǔ)句例化一次。標(biāo)號(hào)是可選的。然而我主張,為了區(qū)別同一個(gè)元件在一個(gè)設(shè)計(jì)實(shí)體內(nèi)的屢次例化,最好使用標(biāo)號(hào)將屢次例化加以區(qū)分。在一個(gè)設(shè)計(jì)實(shí)體的獨(dú)立電路〔如process〕原那么上都應(yīng)該有標(biāo)號(hào),以便閱讀。一個(gè)層次結(jié)構(gòu)設(shè)計(jì)的例子設(shè)計(jì)一個(gè)由2個(gè)與門、1個(gè)或門構(gòu)成的與或門低層的設(shè)計(jì)實(shí)體“與門”

libraryieee;

useieee.std_logic_1164.all;

ENTITYand_gateIS

PORT(op1,op2:instd_logic;

and_result:outstd_logic);

ENDand_gate;

ARCHITECTUREbehavOFand_gateIS

BEGIN

and_result<=op1ANDop2;

ENDbehav;低層的設(shè)計(jì)實(shí)體“或門”

libraryieee;

useieee.std_logic_1164.all;

ENTITYor_gateIS

PORT(op1,op2:instd_logic;

or_result:outstd_logic);

ENDor_gate;

ARCHITECTUREbehavOFor_gateIS

BEGIN

or_result<=op1ORop2;

ENDbehav;高層設(shè)計(jì)中使用元件and_gate和or_gate設(shè)計(jì)與或門

libraryieee;

useieee.std_logic_1164.all;

ENTITYand_or_gateIS

PORT(a1,a2,a3,a4:instd_logoc;

and_or_result:outstd_logic);

ENDand_or_gate;

ARCHITECTUREstructOFand_or_gateIS

SIGNALb1,b2:std_logic;--高層設(shè)計(jì)中使用的內(nèi) --部信號(hào)

COMPONENTand_gate--說(shuō)明元件“與門”and_gate

PORT(op1,op2:instd_logic;

and_result:outstd_logic);

ENDCOMPONENT;

COMPONENTor_gate--說(shuō)明元件“或門”or_gate

PORT(op1,op2:instd_logic;

or_result:outstd_logic);

ENDCOMPONENT;

BEGIN

--對(duì)“與門”and_gate的一次例化

G1:and_gate

PORTMAP(op1=>a1,op2=>a2,

and_result=>b1);

--對(duì)“與門”and_gate的一次例化

G2:and_gatePORTMAP(op1=>a3,op2=>a4,

and_result=>b2);

--對(duì)“或門”or_gate的一次例化

G3:or_gatePORTMAP(op1=>b1,or_result=>

and_or_result,op2=>b2);

ENDstruct;

Pachage(程序包)

和工作庫(kù)work在上面與或門的構(gòu)建中,我們會(huì)覺(jué)察一個(gè)問(wèn)題:如果每個(gè)高層設(shè)計(jì)實(shí)體在使用同一個(gè)低層設(shè)計(jì)實(shí)體時(shí)都要對(duì)引用的低層設(shè)計(jì)實(shí)體進(jìn)行說(shuō)明豈不是太麻煩?解決這個(gè)問(wèn)題的的方法是使用package(程序包)和工作庫(kù)work。程序包〔PACKAGE〕是一種使包體中的類型、常量、元件和函數(shù)對(duì)其他模塊〔文件〕是可見(jiàn),可以調(diào)用的設(shè)計(jì)單元。程序包是公用的存儲(chǔ)區(qū),在程序包內(nèi)說(shuō)明的數(shù)據(jù),可以被其他模塊〔文件〕使用。程序包由包頭和包體2局部組成。WORK庫(kù)是設(shè)計(jì)庫(kù),在任何設(shè)計(jì)文件中隱含都是“可見(jiàn)”的,不需要特別說(shuō)明。也就是說(shuō),每一個(gè)設(shè)計(jì)文件中總是隱含以下不可見(jiàn)的行: LIBRARY WORK;下面仍將與或門的設(shè)計(jì)為例,說(shuō)明pachage和庫(kù)work的使用。與門和活門的設(shè)計(jì)不變,增加一個(gè)PACKAGE的設(shè)計(jì),對(duì)與或門設(shè)計(jì)進(jìn)行修改。LIBRARYieee;

USEieee.std_logic_1164.all;

PACKAGEand_or_componentsIS

COMPONENTor_gate--說(shuō)明元件“或門”or_gate

PORT(op1,op2:instd_logic;

or_result:outstd_logic);

ENDCOMPONENT;

COMPONENTand_gate --說(shuō)明元件“與門”and_gate

PORT(op1,op2:instd_logic;

and_result:outstd_logic);

ENDCOMPONENT;

ENDand_or_components;LIBRARYieee;

USEieee.std_logic_1164.all;

USEwork.and_or_components.all;--指明調(diào)用的程序包,使其成為可用

ENTITYand_or_gateIS

PORT(a1,a2,a3,a4:instd_logoc;

and_or_result:outstd_logic);

ENDand_or_gate;

ARCHITECTUREstructOFand_or_gateIS

SIGNALb1,b2:std_logic;--高層設(shè)計(jì)中使用的內(nèi)部信號(hào)

BEGIN

--對(duì)“與門”and_gate的一次例化

G1:and_gate PORTMAP(op1=>a1,op2=>a2,and_result=>b1);

--對(duì)“與門”and_gate的一次例化

G2:and_gatePORTMAP(op1=>a3,op2=>a4,and_result=>b2);

--對(duì)“或門”or_gate的一次例化

G3:or_gatePORTMAP(op1=>b1,or_result=>and_or_result,op2=>b2);

ENDstruct;一個(gè)存放器堆的設(shè)計(jì)要求:1、設(shè)計(jì)4個(gè)16位的存放器堆2、當(dāng)reset信號(hào)為低時(shí),使所有存放器復(fù)位。3、用rd〔2位〕選擇寫入的存放器。當(dāng)寫允許信號(hào)write為高時(shí),在時(shí)鐘信號(hào)clk的上升沿將數(shù)據(jù)d_input寫入rd選中的存放器。4、用rs〔2位〕信號(hào)選擇讀出的存放器,讀出的內(nèi)容送q_out。一個(gè)存放器堆的設(shè)計(jì)設(shè)計(jì)方案:1、低層設(shè)計(jì)實(shí)體有3個(gè):16位的存放器register_162—4譯碼器decoder2_to_44選1多路開(kāi)關(guān)mux4_to_12、使用上述元件的高層設(shè)計(jì)實(shí)體regfile16位存放器register_16LIBRARYieee;USEieee.std_logic_1164.all;ENTITYregiister_16IS PORT ( reset :IN STD_LOGIC; d_input :IN STD_LOGIC_vector(15downto0); clk :IN STD_LOGIC; write :IN STD_LOGIC; sel :IN STD_LOGIC; q_output :OUT STD_LOGIC_vector(15downto0) );

ENDregister_16;ARCHITECTUREaOFregister_16IS

BEGIN

PROCESS(reset,clk)

BEGIN

IFreset='0'then

q_output<=x"0000";

elsif(clk'EVENTANDclk='1')THEN

IFsel='1'andwrite='1'THEN

q_output<=d_input;

ENDIF;

ENDIF;

ENDPROCESS;

ENDa;

2-4譯碼器decoder2_to_4LibraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitydecoder2_to_4is port( rd:instd_logic_vector(1downto0); sel00:outstd_logic; sel01:outstd_logic; sel02:outstd_logic; sel03:outstd_logic);enddecoder2_to_4;architectureBehavioralofdecoder2_to_4isbegin sel00 <=(notrd(1))and(notrd(0)); sel01 <=(notrd(1))andrd(0); sel02 <=rd(1)and(notrd(0)); sel03 <=rd(1)andrd(0);endBehavioral;4選1多路開(kāi)關(guān)mux4_to_1libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitymux4_to_1isport( Input0,Input1,Input2,Input3 :instd_logic_vector(15downto0); Sel :instd_logic_vector(1downto0); Out_put:outstd_logic_vector(15downto0));endmux4_to_1;architectureBehavioralofmux4_to_1isbeginmux:process(Sel,Input0,Input1,Input2,Input3)begincaseSelis when"00"=>Out_put<=Input0; when"01"=>Out_put<=Input1; when"10"=>Out_put<=Input2; when"11"=>Out_put<=Input3; endcase;endprocess;endBehavioral;存放器堆regfile高層設(shè)計(jì)實(shí)體libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;

entityregfileis

Port( rs:instd_logic_vector(2downto0);

rd:instd_logic_vector(2downto0);

reset :instd_logic;

write :instd_logic;

clk :instd_logic;

d_input:instd_logic_vector(5downto0);

q_out:outstd_logic_vector(5downto0)

);

endregfile;architecturestructureofregfileis

componentregister_16PORT(--16bit存放器

reset,clk,write,sel:INSTD_LOGIC;

d_input :IN STD_LOGIC_vector(15downto0);

q_output:OUTSTD_LOGIC_vector(15downto0));

endcomponent;

comp

溫馨提示

  • 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)論