版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
硬體描述語言VHDLVHSICHardwareDescriptionLanguageVHSIC(VeryHighSpeedIntegratedCircuit)1983年由美國國防部(DOD)發起創建1987年被採納為IEEE1076-19871993年被更新為IEEE1076-1993VHDL最新版本是IEEE1076-2002硬體描述語言VHDLHDL的出現是為了適應電子系統設計的日益複雜性。若以電腦軟體的設計與電路設計做個類比:機器碼好比電晶體/MOS管;組合語言好比網表;則HDL語言就如同高級語言,VHDL畢竟描述的是硬體,它包含許多硬體特有的結構。硬體描述語言VHDL編譯器和綜合功能比較
硬體描述語言VHDL特點硬體描述功能強仿真語句和庫函數豐富標準規範易於共用和複用與硬體工藝無關支持大規模設計的分解和已有設計的再利用硬體描述語言VHDL設計過程:1.代碼編寫;2.由綜合器(如Synplify,FPGACompiler等)綜合成門級網表;3.前仿真/功能仿真;4.佈局/佈線至某一類CPLD/FPGA中;5.後仿真/時序仿真;6.下載。VHDL基本構成VHDL設計VHDL檔庫(Library)程式包(Packages)聲明在設計或實體中將用到的常數,數據類型,元件及副程式等實體(Entities)
聲明到其他實體及其他設計的介面,即定義本設計的輸入/出端口結構體(Architectures)
定義了實體的實現。即電路的具體描述簡單組合電路的VHDL描述2-1多路選擇器mux21a實體
mux21a結構體
簡單組合電路的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表達的所有設計均與實體有關,實體是設計中最基本的模組。設計的最頂層是頂層實體。如果設計分層次,那麼在頂級實體中將包含較低級別的實體。
實體中定義了該設計所需的輸入/輸出信號,信號的輸入/輸出類型被稱為端口模式,同時,實體中還定義他們的數據類型。實體(Entity)
實體的格式如下:
entity<entity_name實體名>is
port<portlistforyourdesign,列出設計的輸入/輸出信號端口>
end<entity_name>;實體(Entity)例:
ENTITYcntm16IS --實體
PORT (ci :IN std_logic; nreset :IN std_logic;--每一句結尾均為;
clk :IN std_logic;co :out std_logic; qcnt :bufferstd_logic_vector(3downto0)–最後一句無;
);ENDcntm16;信號名端口類型端口模式實體:端口模式(MODE)端口模式(MODE)有以下幾種類型:
IN;OUT;INOUT;BUFFER
端口模式可用下圖說明:(黑框代表一個設計或模組)
INOUTBUFFERINOUT實體:端口類型(TYPE)端口類型(TYPE)定義端口的數據類型,包括以下幾種:integer
用作迴圈的指針或常數,通常不用於I/O信號,例如:count:integerrange0to255bit
可取值‘0’或‘1’std_logic
工業標準的邏輯類型,取值‘0’,‘1’,‘X’,和‘Z’--由IEEEstd1164標準定義std_logic_vectorstd_logic的組合,工業標準的邏輯類型實體:端口類型(TYPE)std_logic_vectorstd_logic的組合,定義匯流排,如:
data:instd_logic_vector(7downto0);data<=“01011010”;
data(3)<=‘1’;--一位用單引號‘’
data(6downto4)<=“101”;--字串用雙引號“”實體:端口類型(TYPE)
可枚舉類型Enumeration常用於定義狀態機的狀態,type<type_name類型名>is
(<valuelist值列表>);typetrafficis(red,green,yellow);present_state,next_state :traffic;結構體(Architecture)
所有能被仿真的實體都由一個結構體描述,結構體描述實體的行為功能。即設計的功能,是實體中的具體邏輯。結構體是VHDL設計中最主要部分結構體(Architecture)結構體(Architecture)聲明區(Declarations)信號聲明;聲明用於該結構體的類型,常數,元件,副程式。並行語句信號賦值(SignalAssignments計算結果,並賦值給信號元件例化(ComponentInstantiations)調用另一個實體所描述的電路。即元件調用過程調用(ProcedureCalls調用一個預先定義好的一個演算法。進程(Processes)定義一個新演算法實現電路功能。在過程中賦值順序語句。語句按放置的順序執行。結構體(Architecture)一般格式如下:architecture<結構體名>of<實體名>is
--結構體聲明區域
--聲明結構體所用的內部信號及數據類型
--如果使用元件例化,則在此聲明所用的元件
begin--以下開始結構體,用於描述設計的功能
--concurrentsignalassignments並行語句信號賦值
--processes進程(順序語句描述設計)
--componentinstantiations元件例化
end<結構體名>;程式包(Package)/庫(Library)
程式包定義了一組數據類型說明、常量說明、元件說明和副程式說明。以供其他多個設計實體引用。
庫是專門存放預先編譯好的程式包的地方,這樣它們就可以在其他設計中被調用。
程式包(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觸發器
簡單時序電路的VHDL描述D觸發器VHDL描述的語言現象說明
ENTITYCOMP_BADISPORT(a1,b1:INBIT;q1:OUTBIT);END;ARCHITECTUREoneOFCOMP_BADISBEGINPROCESS(a1,b1)BEGINIFa1>b1THENq1<='1';ELSIFa1<b1THENq1<='0';--未提及當a1=b1時,q1作何操作ENDIF;ENDPROCESS;END;簡單時序電路的VHDL描述D觸發器VHDL描述的語言現象說明
簡單時序電路的VHDL描述D觸發器VHDL描述的語言現象說明
...IFa1>b1THENq1<='1';ELSEq1<='0';ENDIF;...
簡單時序電路的VHDL描述非同步時序電路設計
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描述非同步時序電路設計
含有層次結構的VHDL描述半加器描述和CASE語句
半加器h_adder電路圖及其真值表
含有層次結構的VHDL描述半加器描述和CASE語句
全加器f_adder電路圖及其實體模組含有層次結構的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;含有層次結構的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;含有層次結構的VHDL描述LIBRARYIEEE;--1位二進位全加器頂層設計描述
USEIEEE.STD_LOGIC_1164.ALL;ENTITYf_adderISPORT(ain,bin,cin:INSTD_LOGIC;cout,sum:OUTSTD_LOGIC);ENDENTITYf_adder;ARCHITECTUREfd1OFf_adderISCOMPONENTh_adder--調用半加器聲明語句
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個信號作為內部的連接線。
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;含有層次結構的VHDL描述1.
CASE語句
CASE<運算式>ISWhen<選擇值或識別字>=><順序語句>;...;<順序語句>;When<選擇值或識別字>=><順序語句>;...;<順序語句>;...WHENOTHERS=><順序語句>;ENDCASE;含有層次結構的VHDL描述全加器描述和例化語句
COMPONENT元件名PORT(端口名表);ENDCOMPONENT檔案名;COMPONENTh_adderPORT(c,d:INSTD_LOGIC;e,f:OUTSTD_LOGIC);例化名
:元件名
PORTMAP([端口名
=>]連接端口名,...);計數器設計ENTITYCNT4ISPORT(CLK:INBIT;Q:BUFFERINTEGERRANGE15DOWNTO0);END;ARCHITECTUREbhvOFCNT4ISBEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ<=Q+1;ENDIF;ENDPROCESS;ENDbhv;
計數器設計計數器設計的另一種表述
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;計數器設計計數器設計的另一種表述
4位加法計數器RTL電路(Synplify綜合)
一般加法計數器設計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;--允許計數,檢測是否小於9ELSECQI:=(OTHERS=>'0');--大於9,計數值清零
ENDIF;ENDIF;ENDIF;IFCQI=9THENCOUT<='1';--計數大於9,輸出進位信號
ELSECOUT<='0';ENDIF;CQ<=CQI;--將計數值向端口輸出
ENDPROCESS;ENDbehav;
一般加法計數器設計1.變數
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,列出設計的輸入/輸出信號端口>
end<entity_name>;實體(Entity)
ENTITYcntm16IS --實體
PORT (ci :IN std_logic; nreset :IN std_logic;--每一句結尾均為;
clk :IN std_logic;co :out std_logic; qcnt :bufferstd_logic_vector(3downto0));ENDcntm16;信號名端口類型端口模式結構體(Architecture)architecture<結構體名>of<實體名>is
--結構體聲明區域
--聲明結構體所用的內部信號及數據類型
--如果使用元件例化,則在此聲明所用的元件
begin--以下開始結構體,用於描述設計的功能
--concurrentsignalassignments並行語句信號賦值
--processes進程(順序語句描述設計)
--componentinstantiations元件例化
end<結構體名>;結構體(Architecture)結構體(Architecture)聲明區(Declarations)信號聲明;聲明用於該結構體的類型,常數,元件,副程式。並行語句信號賦值(SignalAssignments計算結果,並賦值給信號元件例化(ComponentInstantiations)調用另一個實體所描述的電路。即元件調用過程調用(ProcedureCalls調用一個預先定義好的一個演算法。進程(Processes)定義一個新演算法實現電路功能。在過程中賦值順序語句。語句按放置的順序執行。結構體(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;數據對象:信號(Signal)
用於聲明內部信號,其在元件之間起互聯作用,可以賦值給外部信號。
信號定義格式:Signal信號名:數據類型[:=初始值];信號賦值:目標信號名<=運算式;例:signalgnd1:bit:’0’;signalhalfsum:std_logic_vector(7downto0);數據對象:變數(variable)
變數只在給定的進程中用於聲明局部值或用於副程式中。變數定義格式:variable
變數名:數據類型[:=初始值];變數賦值:目標變數名:=運算式;例:variablea:integer:=0variablevabc:std_logic_vector(2downto0);數據對象常量(constant)常量在設計描述中保持某一規定類型的特定值不變。常量定義格式:
Constant常數名:數據類型:=初始值;常量在定義時賦初值constantallis1:std_logic_vector(2downto0):=“111”;constantbuswidth:integer:=8;信號與變數比較
信號SIGNAL變數VARIABLE基本用法用於作為電路中的信號連線用於作為進程中局部數據存儲單元適用範圍在整個結構體內的任何地方都能適用只能在所定義的進程中使用行為特性在進程中的最後才對信號賦值,在一個進程中多次為一個信號賦值,只有最後一個值會起作用立即賦值數據對象:信號和變數的賦值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)事件並且包含在結構中。一個結構體可以包含多個進程語句。進程在結構體的位置結構體(Architecture)聲明區(Declarations)信號聲明;聲明用於該結構體的類型,常數,元件,副程式。併發語句信號賦值(SignalAssignments計算結果,並賦值給信號元件例化(ComponentInstantiations)調用另一個實體所描述的電路。即元件調用過程調用(ProcedureCalls調用一個預先定義好的一個演算法。進程(Processes)定義一個新演算法實現電路功能。在過程中賦值順序語句。語句按放置的順序執行。進程(PROCESS)進程(Process)聲明區(Declarations)聲明內部變數;用於該進程的常數;元件;副程式。順序語句信號賦值(<=)過程調用變數賦值(:=)if語句case語句loop語句(迴圈)next語句(跳過剩餘迴圈)exit語句(退出迴圈)wait語句(等待時鐘信號)null語句(空語句,值保持不變)進程PROCESS[標號:]process
(<sensitivitylist敏感信號表>)[聲明區];begin
--進程開始
[順序語句];
endprocess[標號];--進程結束
敏感表(Sensitivitylist)包括進程的一些信號,當敏感表中的某個信號變化時進程才被啟動。進程的敏感信號表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)的幾點說明進程語句是一個複合語句,有一段程式組成在進程內的所有語句都是順序語句進程本身是並行語句一個結構體可以包含多個進程語句進程中的說明部分不允許定義信號進程必須由敏感信號的變化來啟動不能將變數引入敏感表,因為進程只對信號敏感多進程間的通信依靠(SIGNAL)來傳遞PROCESS中信號與變數的比較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;進程中的信號與變數比較ARCHITECTUREbhvOFDFF3IS
SIGNALQQ:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQQ<=D1;ENDIF; Q1<=QQ;--可以放到進程外
ENDPROCESS;END;PROCESS中信號與變數的比較 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)的外部。所有並行語句都是並行執行的,即與它們出現的先後次序無關。順序語句(Sequential):
順序語句總是處於進程(PROCESS)的內部,並且從仿真的角度來看是順序執行的。並行語句並行(Concurrent)語句並行語句之間值的更新是同時進行的,與語句所在的順序無關。進程語句並行信號賦值語句元件例化語句生成語句並行過程調用語句並行信號賦值:WHEN-ELSE語句賦值目標<=運算式WHEN賦值條件ELSE<=運算式WHEN賦值條件ELSE……
運算式;
architecturearchmuxofmux4isbegin
y<=a0whens="00"else a1whens=“01”else a2whens="10"else a3;endarchmux;
並行信號賦值:WITH-SELECT-WHEN語句WITH選擇信號SELECT賦值目標信號<=運算式WHEN選擇信號值1,運算式WHEN選擇信號值2,
……
運算式WHEN選擇值N;architecturearchmuxofmux4isbegin
withsselecty<=a0when"00", a1when“01”, a2when"10", a3when
others;endarchmux;
順序(Sequential)語句順序語句總是處於進程(PROCESS)的內部,並且從仿真的角度來看是順序執行的順序賦值語句;IF語句;CASE語句;過程調用語句;此外還有“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進制計數器
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語句結構: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語句[標號:]FOR迴圈變數IN迴圈次數範圍LOOP
順序語句
ENDLOOP[標號];process(databus)
variabletmp :std_logic;
begintmp:='0';
foriin0to7looptmp:=tmpxordatabus(i);
endloop;odd_num<=tmp;even_num<=nottmp;
endprocess;endbehave; 常見錯誤:隱含觸發器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; ?
此代碼能否生成一個二輸入的與門?即:常見錯誤:隱含觸發器
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;
有的綜合器綜合時會出現如下類似錯誤資訊:“ElseClausefollowingaClockedgemustholdthestateofsignal”VHDLD屬性
屬性指的是關於實體、結構體、類型、信號的一些特徵。有些屬性對綜合(設計)非常有用,如:
值類屬性 範圍類屬性 信號類屬性
值類、範圍類屬性值類屬性分為’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屬性,其生成一個限制性數據對象的範圍。
signaldata_bus:std_logic_vector(15downto0);
data_bus’range=15downto0; 信號類屬性’event,它的值為布爾型,信號有變,則其取值為Ture,否則為False。signalclk:instd_logic;
clk’eventandclk=’1’:時鐘的上升沿
clk’eventandclk=’0’:時鐘的下降沿可利用預定義好的兩個函數來表示時鐘的邊沿。
rising_edge(clk)表示時鐘的上升沿
falling_edge(clk)表示時鐘的下降沿CLK必須是STD_LOGIC類型二進位計數器設計ENTITYCNT4ISPORT(CLK:INBIT;
Q:BUFFERINTEGERRANGE15DOWNTO0);END;ARCHITECTUREbhvOFCNT4ISBEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ<=Q+1;ENDIF;ENDPROCESS;ENDbhv;
二進位計數器設計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;二進位計數器設計4位加法計數器RTL電路(Synplify綜合)
十進位加法計數器設計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;
十進位加法計數器設計
省略賦值操作符(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;優先編碼器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;--置數
when
others=>null;--“NULL”表示無操作
end
case; end
if;END
IF;END
PROCESS;
END
behave;三態輸出電路表示法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; 三態輸出電路表示法2architecturebehaveoftrioutisbeginprocess(oe_en,data_in)beginifoe_en=‘1’thendata_out<=data_in;elsedata_out<=“ZZZZZZZZ”;endif;endprocess;endbehave; 三態輸出的寄存器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;三態匯流排電路設計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;三態匯流排電路設計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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年银行同业部经理竞聘面试问题
- 2025年检察院法律辩论赛辩题库及答案
- 狂犬病预防接种的依从性提升护理
- 2026年公文加盖公章考试试题及答案及答案
- 2026年小升初数学招生考试试题及答案
- 2026年护士静脉输液考试试题及答案
- 2025-2026学年甘肃定西市岷县第一中学高一下学期5月期中物理试题 含答案
- 胆胀病心理护理与康复指导
- 特定范畴的专属承诺书3篇范文
- 合作续约事宜商洽函(8篇)
- 2024年浙江省单独考试招生文化考试语文试卷真题(含答案详解)
- 学校购买铁床合同协议书
- 《钓鱼人聪明幽默永不老:一位垂钓迷的顿悟、趣事和人生教训》笔记
- 《生物安全培训》课件-2024鲜版
- 生命哲学:爱、美与死亡智慧树知到期末考试答案章节答案2024年四川大学
- 智能云台监控摄像机
- 兴业证券行业分析
- 2023年高考语文练习(上海)01 社科类文本阅读训练 含解析
- 最常用2000个英语单词-电子表格版
- 人教版四年级数学下册第四单元《小数的意义和性质》完整版课件
- 门面装修合同下载
评论
0/150
提交评论