




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
硬體描述語言VHDLVHSICHardwareDescriptionLanguageVHSIC(VeryHighSpeedIntegratedCircuit)1983年由美國國防部(DOD)發(fā)起創(chuàng)建1987年被採納為IEEE1076-19871993年被更新為IEEE1076-1993VHDL最新版本是IEEE1076-2002硬體描述語言VHDLHDL的出現(xiàn)是為了適應(yīng)電子系統(tǒng)設(shè)計的日益複雜性。若以電腦軟體的設(shè)計與電路設(shè)計做個類比:機器碼好比電晶體/MOS管;組合語言好比網(wǎng)表;則HDL語言就如同高級語言,VHDL畢竟描述的是硬體,它包含許多硬體特有的結(jié)構(gòu)。硬體描述語言VHDL編譯器和綜合功能比較
硬體描述語言VHDL特點硬體描述功能強仿真語句和庫函數(shù)豐富標(biāo)準(zhǔn)規(guī)範(fàn)易於共用和複用與硬體工藝無關(guān)支持大規(guī)模設(shè)計的分解和已有設(shè)計的再利用硬體描述語言VHDL設(shè)計過程:1.代碼編寫;2.由綜合器(如Synplify,F(xiàn)PGACompiler等)綜合成門級網(wǎng)表;3.前仿真/功能仿真;4.佈局/佈線至某一類CPLD/FPGA中;5.後仿真/時序仿真;6.下載。VHDL基本構(gòu)成VHDL設(shè)計VHDL檔庫(Library)程式包(Packages)聲明在設(shè)計或?qū)嶓w中將用到的常數(shù),數(shù)據(jù)類型,元件及副程式等實體(Entities)
聲明到其他實體及其他設(shè)計的介面,即定義本設(shè)計的輸入/出端口結(jié)構(gòu)體(Architectures)
定義了實體的實現(xiàn)。即電路的具體描述簡單組合電路的VHDL描述2-1多路選擇器mux21a實體
mux21a結(jié)構(gòu)體
簡單組合電路的VHDL描述2-1多路選擇器的VHDL描述(1)
ENTITYmux21aISPORT(a,b:INBIT;s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINy<=aWHENs='0'ELSEb;ENDARCHITECTUREone;簡單組合電路的VHDL描述2-1多路選擇器的VHDL描述(2)
ENTITYmux21aISPORT(a,b:INBIT;s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISSIGNALd,e:BIT;BEGINd<=aAND(NOTS);e<=bANDs;y<=dORe;ENDARCHITECTUREone;簡單組合電路的VHDL描述2-1多路選擇器的VHDL描述(3)
ENTITYmux21aISPORT(a,b,s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINPROCESS(a,b,s)BEGINIFs='0'THENy<=a;ELSEy<=b;ENDIF;ENDPROCESS;ENDARCHITECTUREone;
實體(Entity)VHDL表達的所有設(shè)計均與實體有關(guān),實體是設(shè)計中最基本的模組。設(shè)計的最頂層是頂層實體。如果設(shè)計分層次,那麼在頂級實體中將包含較低級別的實體。
實體中定義了該設(shè)計所需的輸入/輸出信號,信號的輸入/輸出類型被稱為端口模式,同時,實體中還定義他們的數(shù)據(jù)類型。實體(Entity)
實體的格式如下:
entity<entity_name實體名>is
port<portlistforyourdesign,列出設(shè)計的輸入/輸出信號端口>
end<entity_name>;實體(Entity)例:
ENTITYcntm16IS --實體
PORT (ci :IN std_logic; nreset :IN std_logic;--每一句結(jié)尾均為;
clk :IN std_logic;co :out std_logic; qcnt :bufferstd_logic_vector(3downto0)–最後一句無;
);ENDcntm16;信號名端口類型端口模式實體:端口模式(MODE)端口模式(MODE)有以下幾種類型:
IN;OUT;INOUT;BUFFER
端口模式可用下圖說明:(黑框代表一個設(shè)計或模組)
INOUTBUFFERINOUT實體:端口類型(TYPE)端口類型(TYPE)定義端口的數(shù)據(jù)類型,包括以下幾種:integer
用作迴圈的指針或常數(shù),通常不用於I/O信號,例如:count:integerrange0to255bit
可取值‘0’或‘1’std_logic
工業(yè)標(biāo)準(zhǔn)的邏輯類型,取值‘0’,‘1’,‘X’,和‘Z’--由IEEEstd1164標(biāo)準(zhǔn)定義std_logic_vectorstd_logic的組合,工業(yè)標(biāo)準(zhǔn)的邏輯類型實體:端口類型(TYPE)std_logic_vectorstd_logic的組合,定義匯流排,如:
data:instd_logic_vector(7downto0);data<=“01011010”;
data(3)<=‘1’;--一位用單引號‘’
data(6downto4)<=“101”;--字串用雙引號“”實體:端口類型(TYPE)
可枚舉類型Enumeration常用於定義狀態(tài)機的狀態(tài),type<type_name類型名>is
(<valuelist值列表>);typetrafficis(red,green,yellow);present_state,next_state :traffic;結(jié)構(gòu)體(Architecture)
所有能被仿真的實體都由一個結(jié)構(gòu)體描述,結(jié)構(gòu)體描述實體的行為功能。即設(shè)計的功能,是實體中的具體邏輯。結(jié)構(gòu)體是VHDL設(shè)計中最主要部分結(jié)構(gòu)體(Architecture)結(jié)構(gòu)體(Architecture)聲明區(qū)(Declarations)信號聲明;聲明用於該結(jié)構(gòu)體的類型,常數(shù),元件,副程式。並行語句信號賦值(SignalAssignments計算結(jié)果,並賦值給信號元件例化(ComponentInstantiations)調(diào)用另一個實體所描述的電路。即元件調(diào)用過程調(diào)用(ProcedureCalls調(diào)用一個預(yù)先定義好的一個演算法。進程(Processes)定義一個新演算法實現(xiàn)電路功能。在過程中賦值順序語句。語句按放置的順序執(zhí)行。結(jié)構(gòu)體(Architecture)一般格式如下:architecture<結(jié)構(gòu)體名>of<實體名>is
--結(jié)構(gòu)體聲明區(qū)域
--聲明結(jié)構(gòu)體所用的內(nèi)部信號及數(shù)據(jù)類型
--如果使用元件例化,則在此聲明所用的元件
begin--以下開始結(jié)構(gòu)體,用於描述設(shè)計的功能
--concurrentsignalassignments並行語句信號賦值
--processes進程(順序語句描述設(shè)計)
--componentinstantiations元件例化
end<結(jié)構(gòu)體名>;程式包(Package)/庫(Library)
程式包定義了一組數(shù)據(jù)類型說明、常量說明、元件說明和副程式說明。以供其他多個設(shè)計實體引用。
庫是專門存放預(yù)先編譯好的程式包的地方,這樣它們就可以在其他設(shè)計中被調(diào)用。
程式包(Package)/庫(Library)例:
LIBRARYieee;USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.ALL;std庫,ieee庫中的程式包LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF1ISPORT(CLK:INSTD_LOGIC;D:INSTD_LOGIC;Q:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFDFF1ISBEGINPROCESS(CLK,Q)BEGINIFCLK'EVENTANDCLK='1'THENQ<=D;ENDIF;ENDPROCESS;ENDbhv;
簡單時序電路的VHDL描述D觸發(fā)器
簡單時序電路的VHDL描述D觸發(fā)器VHDL描述的語言現(xiàn)象說明
ENTITYCOMP_BADISPORT(a1,b1:INBIT;q1:OUTBIT);END;ARCHITECTUREoneOFCOMP_BADISBEGINPROCESS(a1,b1)BEGINIFa1>b1THENq1<='1';ELSIFa1<b1THENq1<='0';--未提及當(dāng)a1=b1時,q1作何操作ENDIF;ENDPROCESS;END;簡單時序電路的VHDL描述D觸發(fā)器VHDL描述的語言現(xiàn)象說明
簡單時序電路的VHDL描述D觸發(fā)器VHDL描述的語言現(xiàn)象說明
...IFa1>b1THENq1<='1';ELSEq1<='0';ENDIF;...
簡單時序電路的VHDL描述非同步時序電路設(shè)計
ARCHITECTUREbhvOFMULTI_DFFISSIGNALQ1,Q2:STD_LOGIC;BEGINPRO1:PROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ1<=NOT(Q2ORA);ENDIF;ENDPROCESS;PRO2:PROCESS(Q1)BEGINIFQ1'EVENTANDQ1='1'THENQ2<=D;ENDIF;ENDPROCESS;QQ<=Q2;
...簡單時序電路的VHDL描述非同步時序電路設(shè)計
含有層次結(jié)構(gòu)的VHDL描述半加器描述和CASE語句
半加器h_adder電路圖及其真值表
含有層次結(jié)構(gòu)的VHDL描述半加器描述和CASE語句
全加器f_adder電路圖及其實體模組含有層次結(jié)構(gòu)的VHDL描述半加器描述(1):布爾方程描述方法LIBRARYIEEE;--USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDENTITYh_adder;ARCHITECTUREfh1OFh_adderisBEGINso<=NOT(aXOR(NOTb));co<=aANDb;ENDARCHITECTUREfh1;含有層次結(jié)構(gòu)的VHDL描述LIBRARYIEEE;--半加器描述(2):真值表描述方法USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDENTITYh_adder;ARCHITECTUREfh1OFh_adderisSIGNALabc:STD_LOGIC_VECTOR(1DOWNTO0);BEGINabc<=a&b;--a相並b,即a與b並置操作PROCESS(abc)BEGINCASEabcIS--類似於真值表的CASE語句
WHEN"00"=>so<='0';co<='0';WHEN"01"=>so<='1';co<='0';WHEN"10"=>so<='1';co<='0';WHEN"11"=>so<='0';co<='1';WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;ENDARCHITECTUREfh1;含有層次結(jié)構(gòu)的VHDL描述LIBRARYIEEE;--1位二進位全加器頂層設(shè)計描述
USEIEEE.STD_LOGIC_1164.ALL;ENTITYf_adderISPORT(ain,bin,cin:INSTD_LOGIC;cout,sum:OUTSTD_LOGIC);ENDENTITYf_adder;ARCHITECTUREfd1OFf_adderISCOMPONENTh_adder--調(diào)用半加器聲明語句
PORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDCOMPONENT;
COMPONENTor2aPORT(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALd,e,f:STD_LOGIC;--定義3個信號作為內(nèi)部的連接線。
BEGINu1:h_adderPORTMAP(a=>ain,b=>bin,co=>d,so=>e);u2:h_adderPORTMAP(a=>e,
b=>cin,
co=>f,so=>sum);u3:or2aPORTMAP(a=>d,
b=>f,
c=>cout);ENDARCHITECTUREfd1;含有層次結(jié)構(gòu)的VHDL描述1.
CASE語句
CASE<運算式>ISWhen<選擇值或識別字>=><順序語句>;...;<順序語句>;When<選擇值或識別字>=><順序語句>;...;<順序語句>;...WHENOTHERS=><順序語句>;ENDCASE;含有層次結(jié)構(gòu)的VHDL描述全加器描述和例化語句
COMPONENT元件名PORT(端口名表);ENDCOMPONENT檔案名;COMPONENTh_adderPORT(c,d:INSTD_LOGIC;e,f:OUTSTD_LOGIC);例化名
:元件名
PORTMAP([端口名
=>]連接端口名,...);計數(shù)器設(shè)計ENTITYCNT4ISPORT(CLK:INBIT;Q:BUFFERINTEGERRANGE15DOWNTO0);END;ARCHITECTUREbhvOFCNT4ISBEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ<=Q+1;ENDIF;ENDPROCESS;ENDbhv;
計數(shù)器設(shè)計計數(shù)器設(shè)計的另一種表述
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT4ISPORT(CLK:INSTD_LOGIC;Q:OUTSTD_LOGIC_VECTOR(3DOWNTO0));END;ARCHITECTUREbhvOFCNT4ISSIGNALQ1:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ1<=Q1+1;ENDIF;ENDPROCESS;Q<=Q1;ENDbhv;計數(shù)器設(shè)計計數(shù)器設(shè)計的另一種表述
4位加法計數(shù)器RTL電路(Synplify綜合)
一般加法計數(shù)器設(shè)計LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT10ISPORT(CLK,RST,EN:INSTD_LOGIC;CQ:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:OUTSTD_LOGIC);ENDCNT10;ARCHITECTUREbehavOFCNT10ISBEGINPROCESS(CLK,RST,EN)VARIABLECQI:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFRST='1'THENCQI:=(OTHERS=>'0');--計數(shù)器非同步複位
ELSIFCLK'EVENTANDCLK='1'THEN--檢測時鐘上升沿
IFEN='1'THEN--檢測是否允許計數(shù)(同步使能)
IFCQI<9THENCQI:=CQI+1;--允許計數(shù),檢測是否小於9ELSECQI:=(OTHERS=>'0');--大於9,計數(shù)值清零
ENDIF;ENDIF;ENDIF;IFCQI=9THENCOUT<='1';--計數(shù)大於9,輸出進位信號
ELSECOUT<='0';ENDIF;CQ<=CQI;--將計數(shù)值向端口輸出
ENDPROCESS;ENDbehav;
一般加法計數(shù)器設(shè)計1.變數(shù)
VARIABLECQI:STD_LOGIC_VECTOR(3DOWNTO0)
2.省略賦值操作符(OTHERS=>X)SIGNALd1:STD_LOGIC_VECTOR(4DOWNTO0);VARIABLEa1:STD_LOGIC_VECTOR(15DOWNTO0);...d1<=(OTHERS=>'0');
a1:=(OTHERS=>'0');d1<=(1=>e(3),3=>e(5),OTHERS=>e(1));
f<=e(1)&e(5)&e(1)&e(3)&e(1);
程式包(Package)/庫(Library)
LIBRARYieee;USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.ALL;
實體(Entity)
entity<entity_name實體名>is
port<portlistforyourdesign,列出設(shè)計的輸入/輸出信號端口>
end<entity_name>;實體(Entity)
ENTITYcntm16IS --實體
PORT (ci :IN std_logic; nreset :IN std_logic;--每一句結(jié)尾均為;
clk :IN std_logic;co :out std_logic; qcnt :bufferstd_logic_vector(3downto0));ENDcntm16;信號名端口類型端口模式結(jié)構(gòu)體(Architecture)architecture<結(jié)構(gòu)體名>of<實體名>is
--結(jié)構(gòu)體聲明區(qū)域
--聲明結(jié)構(gòu)體所用的內(nèi)部信號及數(shù)據(jù)類型
--如果使用元件例化,則在此聲明所用的元件
begin--以下開始結(jié)構(gòu)體,用於描述設(shè)計的功能
--concurrentsignalassignments並行語句信號賦值
--processes進程(順序語句描述設(shè)計)
--componentinstantiations元件例化
end<結(jié)構(gòu)體名>;結(jié)構(gòu)體(Architecture)結(jié)構(gòu)體(Architecture)聲明區(qū)(Declarations)信號聲明;聲明用於該結(jié)構(gòu)體的類型,常數(shù),元件,副程式。並行語句信號賦值(SignalAssignments計算結(jié)果,並賦值給信號元件例化(ComponentInstantiations)調(diào)用另一個實體所描述的電路。即元件調(diào)用過程調(diào)用(ProcedureCalls調(diào)用一個預(yù)先定義好的一個演算法。進程(Processes)定義一個新演算法實現(xiàn)電路功能。在過程中賦值順序語句。語句按放置的順序執(zhí)行。結(jié)構(gòu)體(Architecture)ARCHITECTUREbehaveOFcntm16ISBEGINco<=‘1’when(qcnt=“1111”andci=‘1’)else‘0’;
PROCESS(clk,nreset) --進程
BEGIN
IF(nreset='0')THEN
--順序語句
qcnt<="0000";
ELSIF(clk'EVENTANDclk='1')THEN
if(ci='1')then qcnt<=qcnt+1;
endif;
ENDIF;--endif_reset
ENDPROCESS;
ENDbehave;數(shù)據(jù)對象:信號(Signal)
用於聲明內(nèi)部信號,其在元件之間起互聯(lián)作用,可以賦值給外部信號。
信號定義格式:Signal信號名:數(shù)據(jù)類型[:=初始值];信號賦值:目標(biāo)信號名<=運算式;例:signalgnd1:bit:’0’;signalhalfsum:std_logic_vector(7downto0);數(shù)據(jù)對象:變數(shù)(variable)
變數(shù)只在給定的進程中用於聲明局部值或用於副程式中。變數(shù)定義格式:variable
變數(shù)名:數(shù)據(jù)類型[:=初始值];變數(shù)賦值:目標(biāo)變數(shù)名:=運算式;例:variablea:integer:=0variablevabc:std_logic_vector(2downto0);數(shù)據(jù)對象常量(constant)常量在設(shè)計描述中保持某一規(guī)定類型的特定值不變。常量定義格式:
Constant常數(shù)名:數(shù)據(jù)類型:=初始值;常量在定義時賦初值constantallis1:std_logic_vector(2downto0):=“111”;constantbuswidth:integer:=8;信號與變數(shù)比較
信號SIGNAL變數(shù)VARIABLE基本用法用於作為電路中的信號連線用於作為進程中局部數(shù)據(jù)存儲單元適用範(fàn)圍在整個結(jié)構(gòu)體內(nèi)的任何地方都能適用只能在所定義的進程中使用行為特性在進程中的最後才對信號賦值,在一個進程中多次為一個信號賦值,只有最後一個值會起作用立即賦值數(shù)據(jù)對象:信號和變數(shù)的賦值signalsig1:std_logic;beginprocess(d1,d2,d3)variablevar1:std_logic;beginsig1<=d1;--ignoredres2<=d3xorsig1;sig1<=d2;--overwritevar1:=d1;res4<=d3xorvar1;var1:=d2; endprocess;進程(PROCESS)
進程(PROCESS)用於描述順序(sequential)事件並且包含在結(jié)構(gòu)中。一個結(jié)構(gòu)體可以包含多個進程語句。進程在結(jié)構(gòu)體的位置結(jié)構(gòu)體(Architecture)聲明區(qū)(Declarations)信號聲明;聲明用於該結(jié)構(gòu)體的類型,常數(shù),元件,副程式。併發(fā)語句信號賦值(SignalAssignments計算結(jié)果,並賦值給信號元件例化(ComponentInstantiations)調(diào)用另一個實體所描述的電路。即元件調(diào)用過程調(diào)用(ProcedureCalls調(diào)用一個預(yù)先定義好的一個演算法。進程(Processes)定義一個新演算法實現(xiàn)電路功能。在過程中賦值順序語句。語句按放置的順序執(zhí)行。進程(PROCESS)進程(Process)聲明區(qū)(Declarations)聲明內(nèi)部變數(shù);用於該進程的常數(shù);元件;副程式。順序語句信號賦值(<=)過程調(diào)用變數(shù)賦值(:=)if語句case語句loop語句(迴圈)next語句(跳過剩餘迴圈)exit語句(退出迴圈)wait語句(等待時鐘信號)null語句(空語句,值保持不變)進程PROCESS[標(biāo)號:]process
(<sensitivitylist敏感信號表>)[聲明區(qū)];begin
--進程開始
[順序語句];
endprocess[標(biāo)號];--進程結(jié)束
敏感表(Sensitivitylist)包括進程的一些信號,當(dāng)敏感表中的某個信號變化時進程才被啟動。進程的敏感信號表PROCESS
(clk,nreset) --進程(敏感表)
BEGIN
IF(nreset='0')THEN--順序語句非同步清零
qcnt<="0000";
ELSIF(clk'EVENTANDclk='1')THEN
if(ci='1')then qcnt<=qcnt+1;
endif;
ENDIF;--endif_reset
ENDPROCESS;進程的敏感信號表
PROCESS
(clk) --進程(敏感表)
BEGIN
IF(clk'EVENTANDclk='1')THEN--順序語句
IF(nreset='0')THEN--
同步清零
qcnt<="0000";
elsif(ci='1')then qcnt<=qcnt+1;
ENDIF;--endif_reset
ENDIF; ENDPROCESS;對進程(PROCESS)的幾點說明進程語句是一個複合語句,有一段程式組成在進程內(nèi)的所有語句都是順序語句進程本身是並行語句一個結(jié)構(gòu)體可以包含多個進程語句進程中的說明部分不允許定義信號進程必須由敏感信號的變化來啟動不能將變數(shù)引入敏感表,因為進程只對信號敏感多進程間的通信依靠(SIGNAL)來傳遞PROCESS中信號與變數(shù)的比較process(d1) variablevar1:std_logic; begin sig1<=d1; res1<=sig1; var1:=d1; res2<=var1; endprocess;ARCHITECTUREbhvOFDFF3ISBEGINPROCESS(CLK)
VARIABLEQQ:STD_LOGIC;
BEGINIFCLK'EVENTANDCLK='1'THENQQ:=D1;ENDIF; Q1<=QQ;--不能放到進程外
ENDPROCESS;END;進程中的信號與變數(shù)比較ARCHITECTUREbhvOFDFF3IS
SIGNALQQ:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQQ<=D1;ENDIF; Q1<=QQ;--可以放到進程外
ENDPROCESS;END;PROCESS中信號與變數(shù)的比較 process(clk,d1) variablevar1:std_logic; begin if(clk'eventandclk='1')then sig1<=d1; res1<=sig1; var1:=d1; res2<=var1; endif; endprocess;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(i0,i1,i2,i3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux4;ARCHITECTUREbody_mux4OFmux4ISsignalmuxval:integerrange7downto0;BEGINprocess(i0,i1,i2,i3,a,b)beginmuxval<=0;if(a='1')thenmuxval<=muxval+1;endif;if(b='1')thenmuxval<=muxval+2;endif;casemuxvaliswhen0=>q<=i0;when1=>q<=i1;when2=>q<=i2;when3=>q<=i3;whenothers=>null;endcase;endprocess;ENDbody_mux4;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(i0,i1,i2,i3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux4;ARCHITECTUREbody_mux4OFmux4ISBEGINprocess(i0,i1,i2,i3,a,b)variablemuxval:integerrange7downto0;beginmuxval:=0;if(a='1')thenmuxval:=muxval+1;endif;if(b='1')thenmuxval:=muxval+2;endif;casemuxvaliswhen0=>q<=i0;when1=>q<=i1;when2=>q<=i2;when3=>q<=i3;whenothers=>null;endcase;endprocess;ENDbody_mux4;RTL電路(Synplify綜合)
RTL電路(Synplify綜合)
錯誤的工作時序正確的工作時序VHDL常用語句並行語句(Concurrent):
並行語句總是處於進程(PROCESS)的外部。所有並行語句都是並行執(zhí)行的,即與它們出現(xiàn)的先後次序無關(guān)。順序語句(Sequential):
順序語句總是處於進程(PROCESS)的內(nèi)部,並且從仿真的角度來看是順序執(zhí)行的。並行語句並行(Concurrent)語句並行語句之間值的更新是同時進行的,與語句所在的順序無關(guān)。進程語句並行信號賦值語句元件例化語句生成語句並行過程調(diào)用語句並行信號賦值:WHEN-ELSE語句賦值目標(biāo)<=運算式WHEN賦值條件ELSE<=運算式WHEN賦值條件ELSE……
運算式;
architecturearchmuxofmux4isbegin
y<=a0whens="00"else a1whens=“01”else a2whens="10"else a3;endarchmux;
並行信號賦值:WITH-SELECT-WHEN語句WITH選擇信號SELECT賦值目標(biāo)信號<=運算式WHEN選擇信號值1,運算式WHEN選擇信號值2,
……
運算式WHEN選擇值N;architecturearchmuxofmux4isbegin
withsselecty<=a0when"00", a1when“01”, a2when"10", a3when
others;endarchmux;
順序(Sequential)語句順序語句總是處於進程(PROCESS)的內(nèi)部,並且從仿真的角度來看是順序執(zhí)行的順序賦值語句;IF語句;CASE語句;過程調(diào)用語句;此外還有“for-loop”語句,以及WAIT、NEXT、EXIT、RETURN、NULL語句等。
IF語句(1)
IF條件句
Then
順序語句
ENDIF;
(2)IF條件句
Then順序語句
ELSE
順序語句
ENDIF;
(3)IF條件句
Then
順序語句ELSIF條件句
Then順序語句...ELSE
順序語句ENDIF
Process(clk)Begin
if(clk’eventandclk=‘1’)then
q<=d;Endif;Endprocess;Process(a,b,s)Begin
if(s=‘1’)then
c<=a;
Else
c<=b;Endif;Endprocess;process(s,a0,a1,a2,a3)begin
ifs="00"theny<=a0;
elsifs="01"theny<=a1;
elsifs="10"theny<=a2;else
y<=a3;
endif;endprocess;PROCESS(clk,nreset)—60進制計數(shù)器
BEGIN
IF(clk'EVENTANDclk='1')THEN if(ci='1')then
if(ql=9)then
ql<="0000";if(qh=5)then qh<="0000";
elseqh<=qh+1;
endif;
else ql<=ql+1;
endif;
endif;
ENDIF; ENDPROCESS;CASE語句CASE語句結(jié)構(gòu):CASE運算式ISWHEN條件選擇值=>順序語句;WHEN條件選擇值=>順序語句;
…
…ENDCASECASE語句process(s,a0,a1,a2,a3)begin
casesis
when"00"=>y<=a0;
when"01"=>y<=a1;
when"10"=>y<=a2;
when
others=>y<=a3;
endcase;endprocess;
for-loop語句[標(biāo)號:]FOR迴圈變數(shù)IN迴圈次數(shù)範(fàn)圍LOOP
順序語句
ENDLOOP[標(biāo)號];process(databus)
variabletmp :std_logic;
begintmp:='0';
foriin0to7looptmp:=tmpxordatabus(i);
endloop;odd_num<=tmp;even_num<=nottmp;
endprocess;endbehave; 常見錯誤:隱含觸發(fā)器entityand2is
port(a,b :instd_logic;c :outstd_logic);endand2;architecturebehaveofand2is
begin
process(a,b)
begin
if(a='1'andb='1')thenc<='1';
end
if;
endprocess;endbehave; ?
此代碼能否生成一個二輸入的與門?即:常見錯誤:隱含觸發(fā)器
process(a,b)
begin
if(a='1'andb='1')thenc<='1';
end
if;
改正後:process(a,b)
begin
if(a='1'andb='1')thenc<='1';elsec<=’0’;
end
if;常見錯誤:時鐘處理IF(clk'EVENTANDclk='1')THEN qcnt<=qcnt+1;elseqcnt<=datain;ENDIF;
有的綜合器綜合時會出現(xiàn)如下類似錯誤資訊:“ElseClausefollowingaClockedgemustholdthestateofsignal”VHDLD屬性
屬性指的是關(guān)於實體、結(jié)構(gòu)體、類型、信號的一些特徵。有些屬性對綜合(設(shè)計)非常有用,如:
值類屬性 範(fàn)圍類屬性 信號類屬性
值類、範(fàn)圍類屬性值類屬性分為’left,‘right,‘low,‘high,length。sdown :instd_logic_vector(8downto0);
sup :instd_logic_vector(0to8);
則這兩個信號的各屬性值如下:
sdown’left=8;sdown’right=0;sdown’low=0;sdown’high=8;sdown’length=9;
sup’left=0;sup’right=8;sup’low=0;sup’high=8;sup’length=9;
‘range屬性,其生成一個限制性數(shù)據(jù)對象的範(fàn)圍。
signaldata_bus:std_logic_vector(15downto0);
data_bus’range=15downto0; 信號類屬性’event,它的值為布爾型,信號有變,則其取值為Ture,否則為False。signalclk:instd_logic;
clk’eventandclk=’1’:時鐘的上升沿
clk’eventandclk=’0’:時鐘的下降沿可利用預(yù)定義好的兩個函數(shù)來表示時鐘的邊沿。
rising_edge(clk)表示時鐘的上升沿
falling_edge(clk)表示時鐘的下降沿CLK必須是STD_LOGIC類型二進位計數(shù)器設(shè)計ENTITYCNT4ISPORT(CLK:INBIT;
Q:BUFFERINTEGERRANGE15DOWNTO0);END;ARCHITECTUREbhvOFCNT4ISBEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ<=Q+1;ENDIF;ENDPROCESS;ENDbhv;
二進位計數(shù)器設(shè)計LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT4ISPORT(CLK:INSTD_LOGIC;
Q:OUTSTD_LOGIC_VECTOR(3DOWNTO0));END;
ARCHITECTUREbhvOFCNT4ISSIGNALQ1:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ1<=Q1+1;ENDIF;ENDPROCESS;Q<=Q1;ENDbhv;二進位計數(shù)器設(shè)計4位加法計數(shù)器RTL電路(Synplify綜合)
十進位加法計數(shù)器設(shè)計LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT10ISPORT(CLK,RST,EN:INSTD_LOGIC; CQ:OUTSTD_LOGIC_VECTOR(3DOWNTO0); COUT:OUTSTD_LOGIC);ENDCNT10;ARCHITECTUREbehavOFCNT10ISBEGINPROCESS(CLK,RST,EN)
VARIABLECQI:STD_LOGIC_VECTOR(3DOWNTO0);
BEGINIFRST='1'THENCQI:=(OTHERS=>'0');ELSIFCLK'EVENTANDCLK='1'THEN IFEN='1'THEN IFCQI<9THENCQI:=CQI+1; ELSECQI:=(OTHERS=>'0');ENDIF;ENDIF;ENDIF;IFCQI=9THENCOUT<='1'; ELSECOUT<='0';ENDIF;CQ<=CQI;ENDPROCESS;ENDbehav;
十進位加法計數(shù)器設(shè)計
省略賦值操作符(OTHERS=>X)SIGNALd1:STD_LOGIC_VECTOR(4DOWNTO0);VARIABLEa1:STD_LOGIC_VECTOR(15DOWNTO0);...d1<=(OTHERS=>'0');
a1:=(OTHERS=>'0');d1<=(1=>e(3),3=>e(5),OTHERS=>e(1));
f<=e(1)&e(5)&e(1)&e(3)&e(1);
architecturebehaveofdecoder48isbegin
process(en,adr)begin
ifen=‘0’then
decodeout<=“0000000’;
else
caseadris
when“0000’=>decodeout<=“1111110”;
when“0001’=>decodeout<=“0110000”;
…….
whenothers=>decodeout<=“1111011”;endcase;endif;endprocess;endbehave;4線-8段16進制解碼器WITHadrselect decodeout<="11111100"WHEN"0000", "01100000"WHEN"0001", "11011010"WHEN"0010", "11110010"WHEN"0011", "01100110"WHEN"0100", "10110110"WHEN"0101", "10111110"WHEN"0110", "11100000"WHEN"0111", "11111110"WHEN"1000", "11110110"WHEN"1001", "11101110"WHEN"1010", "00111110"WHEN"1011", "10011100"WHEN"1100", "01111010"WHEN"1101", "10011110"WHEN"1110", "10001110"WHENOTHERS;優(yōu)先編碼器libraryieee;useieee.std_logic_1164.all;entityencoderis
port(a,b,c,d,e,f,g,h :instd_logic;codeout :outstd_logic_vector(2downto0));endencoder;architecturebehaveofencoderisbegincodeout<="111"whenh='1'else"110"wheng='1'else"101"whenf='1'else"100"whene='1'else"011"whend='1'else"010"whenc='1'else"001"whenb='1'else"000"whena='1'else"000";endbehave;移位寄存器libraryieee;useieee.std_logic_1164.all;ENTITYshifterIS
PORT (data :instd_logic_vector(7downto0);sl_in,sr_in,reset,clk:IN std_logic;mode :instd_logic_vector(1downto0); qout :bufferstd_logic_vector(7downto0));ENDshifter;移位寄存器ARCHITECTUREbehaveOFshifterISBEGINPROCESS(clk)
BEGIN
IF(clk'EVENT
ANDclk='1')THEN
if(reset='1')then
qout<=(others=>'0');--同步清零
else casemodeis
when"01"=>qout<=sr_in&qout(7downto1);--右移
when"10"=>qout<=qout(6downto0)&sl_in;--左移
when"11"=>qout<=data;--置數(shù)
when
others=>null;--“NULL”表示無操作
end
case; end
if;END
IF;END
PROCESS;
END
behave;三態(tài)輸出電路表示法1libraryieee;useieee.std_logic_1164.all;entitytrioutisport(data_in :instd_logic_vector(7downto0);oe_en :instd_logic;data_out:outstd_logic_vector(7downto0));endtriout;architecturebehaveoftrioutisbegindata_out<=data_inwhenoe_en='1'else(others=>'Z');--注意此處的“Z”要大寫;endbehave; 三態(tài)輸出電路表示法2architecturebehaveoftrioutisbeginprocess(oe_en,data_in)beginifoe_en=‘1’thendata_out<=data_in;elsedata_out<=“ZZZZZZZZ”;endif;endprocess;endbehave; 三態(tài)輸出的寄存器libraryieee;useieee.std_logic_1164.all;entitytrilatchisport(data_in :instd_logic_vector(7downto0);en,clk :instd_logic;q:outstd_logic_vector(7downto0));endtrilatch;architecturebehaveoftrilatchis
signalqint:std_logic_vector(7downto0);beginprocess(clk,data_in)beginif(clk’eventandclk=‘1’)thenqint<=data_in;
endif;endprocess;
q<=qintwhenen=‘0’else“ZZZZZZZZ”;endbehave;雙向匯流排緩衝器libraryieee;useieee.std_logic_1164.all;entitybitrioutisport(a,b:inoutstd_logic_vector(7downto0);en:instd_logic;dr:instd_logic);endbitriout;雙向匯流排緩衝器architecturebehaveofbitrioutis
signalaout,bout:std_logic_vector(7downto0);beginp1:process(a,r,en)beginif(en=‘0’anddr=‘1’)thenbout<=a;elsebout<=“ZZZZZZZZ”;endif;
b<=bout;endprocessp1;p2:process(a,r,en)beginif(en=‘0’anddr=‘0’)thenaout<=b;elseaout<=“ZZZZZZZZ”;endif;
a<=aout;endprocessp2;endbehave;三態(tài)匯流排電路設(shè)計libraryieee;useieee.std_logic_1164.all;entitytribusisport(ctl:instd_logic_vector(1downto0);data1,data2,data3,data4:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0));endtribus;三態(tài)匯流排電路設(shè)計architecturebehaveoftribusisbegin
q<=data1whenctl=“00”else(others=>’Z’);q<=data2whenctl=“01”else(others=>’Z’);
q<=data3whenctl=“10”else(others=>’Z’);q<=data4whenctl=“11”else(others=>’Z’);endbehave;architecturebehaveoftribus1isbeginprocess(ctl,data1,data2,data3,data4)beginifctl="00"thenq<=data1;elseq<=(others=>'Z');endif;
ifc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 烤肉調(diào)料出售合同范本
- 合同范本有作用
- 烏市購房合同范本
- 墓地個人協(xié)議合同范本
- 合租鋪子轉(zhuǎn)讓合同范本
- 個人間合作合同范本
- 2025年防腐導(dǎo)靜電材料項目合作計劃書
- 危廢收購合同范例
- 勞改農(nóng)場收購合同范本
- 其他類合同范本
- 小學(xué)三年級每日英語單選題100道及答案解析
- 咨詢公司顧問崗位聘用協(xié)議
- 2024年糖尿病指南解讀
- 環(huán)衛(wèi)應(yīng)急預(yù)案8篇
- 《與顧客溝通的技巧》課件
- 2024年大學(xué)生創(chuàng)業(yè)投資意向書
- 【蘇寧易購建設(shè)財務(wù)共享服務(wù)中心的現(xiàn)存問題及優(yōu)化建議探析(論文)13000字】
- 《現(xiàn)代家政導(dǎo)論》電子教案 5.3模塊五項目三我國家政服務(wù)業(yè)發(fā)展認(rèn)知
- 人教統(tǒng)編版高中歷史選擇性必修一第三單元-法律與教化-復(fù)習(xí)課件
- 成語故事-鄭人買履-課件
- 化學(xué)實驗室安全培訓(xùn)課件
評論
0/150
提交評論