版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VHDL的程式結構和軟體操作
1-1VHDL程式的基本結構include“stdio.h”;include“math.h”;intmain(void){inta,b,c;a=8;b=9;c=a+b;returnc;}Librarystd;Usestd.standard.all;Entityand2isPort(a,b:inbit;c:outbit);Endand2;Architecturea1ofand2isBeginc<=aandb;Enda1;VHDL程式C程式1-1VHDL程式的基本結構(1)LIBRARY和PACHAGE聲明區;(2)ENTITY定義區;(3)ARCHITECTURE定義區;(4)CONFIGURATION定義區。Library(庫)是用於存放預先編譯好的Package(程式包)。Package(程式包)中定義了基本的常數,數據類型,元件及副程式等。
作用:聲明在實體和結構體定義中將用到的數據類型、元件或副程式等。聲明格式:
Library
庫名;
Use
庫名.PACKAGE名.All;(1)LIBRARY和PACKAGE聲明區
作用:
ENTITY(實體)用於定義電路的外觀,即I/O端口的類型和數量。定義格式:Entity
實體名
is
Port(a:
inbit;
b:inbit;
c:outbit);End
實體名;(2)ENTITY定義區端口名數據類型端口模式(2)ENTITY定義區識別字的定義原則:(1)識別字由字母、數字和下劃線組成,a7_;(2)在識別字不區分大小寫,ab和AB是一樣的;(3)第一個字元必須是字母,即a666;(4)不允許有兩個連續的下劃線,a__b錯誤;(5)末尾不能是下劃線,mname_錯誤;(6)識別字不能和關鍵字相同,如Entity,is等。端口模式(MODE)有以下幾種類型:
IN;OUT;INOUT;BUFFER
端口模式可用下圖說明:(黑框代表一個設計或模組)
INOUTBUFFERINOUT(2)ENTITY定義區(3)ARCHITECTURE定義區
定義了實體的實現。即電路的具體描述,說明電路執行什麼動作或實現功能。定義格式:
Architecture結構體名
of實體名
is
[聲明語句;(內部信號、變數、常數,元件,副程式聲明)]Begin並行描述語句;End
結構體名;(4)CONFIGURATION定義區
一個完整VHDL電路設計必須有一個實體和對應的結構體,即實體和結構體對構成一個完整的VHDL設計。一個實體可對應一個結構體或多個結構體,即一個實體可以有不同的描述方式。作用:當實體有多個結構體時,系統默認實體選用最後一個結構體,利用CONFIGURATION語句可以任意選擇採用哪一個結構體。
(4)CONFIGURATION定義區定義格式:Configuration配置名
of實體名
isfor選用的結構體名endfor;endconfiguration配置名;二輸入與門電路設計範例
abc電路真值表abc000100010111二輸入與門電路設計範例Librarystd;Usestd.standard.all;Entityand2is
Port(a:inbit;b:inbit;c:outbit);Endand2;--實體定義結束。
雙減號--為VHDL程式的注釋符,類似C語言中的//注釋符。二輸入與門電路設計範例ArchitectureNaofand2isBegin
c<=’0’whena=’0’andb=‘0’else’0’whena=’1’andb=‘0’else’0’whena=’0’andb=‘1’else‘1’;符號<=為信號直接賦值符。
EndNa;--結構體NaArchitectureNbofand2is
Beginc<=aandb;--and
為邏輯與操作EndNb;
--結構體Nb二輸入與門電路設計範例Configurations1ofand2isfornaendfor;endconfigurations1;--結構體配置結束。1-2Max+plusⅡ系統的操作
Max+plusⅡ開發工具是美國Altera公司自行設計的一種軟體工具,其全稱為MultipleArrayMatrixandProgrammableLogicUserSystem。它具有原理圖輸入和文本輸入(採用硬體描述語言)兩種輸入手段,利用該工具所配備的編輯、編譯、仿真、時序分析、晶片編程等功能,將設計電路圖或電路描述程式變成基本的邏輯單元寫入到可編程的晶片中(如CPLD或FPGA晶片),作成ASIC晶片。它是EDA設計中不可缺少的一種工具。
下麵我們介紹利用Max+plusⅡ
系統如何實現如下操作:(1)如何編寫VHDL程式(使用TextEditor);(2)如何編譯VHDL程式(使用Compiler);(3)如何仿真驗證VHDL程式(使用WaveformEditor,Simulator);(4)如何進行晶片的時序分析(使用TimingAnalyzer);(5)如何安排晶片腳位(使用FloorplanEditor);(6)如何下載程式至晶片(使用Programmer)。1-2Max+plusⅡ系統的操作(1)如何編寫VHDL程式a.打開文本編輯器;File/new/Texteditorfileb.編寫VHDL程式;c.保存檔,<1>檔案名和定義的實體名必須相同,<2>檔擴展名為VHD,<3>檔存盤的目錄不應是根目錄或桌面,建議存放在Max2work或Maxplus2目錄,或其子目錄
。(2)如何編譯VHDL程式a.打開需要編譯的檔;b.設置工程到目前打開的檔;
File/Project/SetProjecttoCurrentFile,c.打開編譯器;點擊主菜單MAX+plusⅡ/Compiler選項。
d.選定VHDL原始檔案的版本
;Interfaces/VHDLNetlistReaderSettings…e.打開編譯器進行編譯。(3)如何仿真驗證VHDL程式a.打開波形編輯器(WaveformEditor);b.確定仿真持續時間(File/EndTime);c.將輸入輸出端口名選入波形編輯器;d.編輯輸入信號波形;e.保存仿真波形檔
;f.打開仿真器MAX+plusⅡ\Simulator進行仿真。在仿真結束後打開仿真波形檔(點擊右下角的OpenSCF按鈕)即可以顯示仿真結果。(4)如何進行晶片的時序分析a.選擇要下載的器件型號;點擊主菜單的Assign/Device項得到Device對話框。在DeviceFamily框中選擇晶片系列,在Devices選擇框下選擇具體的晶片名,最後點擊OK按鈕。b.再編譯一次;c.打開時序分析器(TimingAnalyzer);d.點擊Start進行時序分析。(5)如何安排晶片腳位a.打開晶片腳位設置窗口;點擊主菜單Assign/Pin/Location/Chip,出現腳位設置對話框;
;b.將實體定義的端口名字和下載晶片的管腳進行具體對應;在NodeName框中輸入我們定義的實體端口名字,然後在Pin列表選項框中輸入下載晶片的管腳序號,再點擊對話框右下角的Add按鈕,將所有端口設置完成以後,點擊Ok按鈕,則實現實體端口和下載晶片的管腳的對應;
c.再編譯一次,將生成可以下載的檔(And2.Sof)。(6)如何下載程式至晶片a.將下載電纜與電腦並口相連,然後給晶片通電;b.打開編程器Programmer
;
Options/HardwareSetup,在HardwareType選擇ByteBlaster(MV)方式,則在ParallelPort處顯示LPT1,單擊OK鈕返回Programmer窗口。
c.下載方式選擇;d.選擇下載的晶片類型和要下載的檔(選擇JTAG/MutiDevicJTAGChainSetup)。e.點擊Configure進行下載,將程式寫入晶片中。第二章
數據類型與數據對象的定義2-1數據類型2-2數據對象的定義2-3信號運算符2-4信號屬性2-1數據類型在VHDL程式中,我們經常會遇到這樣的語句:SignalA:std_logic;VariableB:std_logic_vector(7downto0);ConstantC:integer;數據對象類型數據類型數據對象名
2-1-1邏輯數據類型
(1)布爾代數(Boolean)型;(2)位(Bit);(3)位數組類型(Bit_Vector)在std庫的standard程式包中進行定義。typeBIT_VECTORisarray(NATURALrange<>)ofBIT;typeBITis(‘0’,‘1’);typeBOOLEANis(FALSE,TRUE);
(4)標準邏輯型(Std_Logic);
TypeSTD_LOGICis(‘U’,
--Uninialized;未初始化
‘X’,
--Forcingunknown;浮接不定
‘0’,
--Forcing0;低電位
‘1’,
--Forcing1;高電位
‘Z’,
--HighImpedance;高阻抗
‘W’,
--WeakUnknown;弱浮接
‘L’,
--Weak0;弱低電位
‘H’,
--Weak1;弱高電位
‘-’,
--Don’tcare;不必理會
);(5)標準邏輯數組類型(Std_Logic_vector);在ieee庫的std_logic_1164程式包中定義。TYPEstd_logic_vectorISARRAY(NATURALRANGE<>)OFstd_logic;
2-1-2數值數據類型(1)整數(Integer);
a.正整數(POSITIVE)
b.自然數(NATURAL)在std庫的standard程式包中進行定義。subtypePOSITIVEisrange1toINTEGER’High;TypeINTEGERisrange–2147483648to2147483647;subtypeNATURALisrange0toINTEGER’High;(2)實數(Real)(3)有符號數(Signed)無符號數(Unsigned)在ieee庫的std_logic_arith程式包中定義。typeREALisrange–1.7E38to1.7E38;typeUNSIGNEDisarray(NATURALrange<>)ofSTD_LOGIC;typeSIGNEDisarray(NATURALrange<>)ofSTD_LOGIC;SIGNED
的最高位為符號位,其餘位為數值位,數值位為補數形式。如:符號數”1001”表示-7。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entitydataisport(a,b:inunsigned(3downto0);--a,b:insigned(3downto0);c:outstd_logic);enddata;architecturem1ofdataisbeginc<='1'whena<belse'0';endm1;當定義成無符號類型時,若a<=”1000”,b=’0001’,即a=8,b=1則結果c=’0’;當定義成有符號類型時,若a<=”1000”,b=’0001’,則a=-8,b=1,則結果c=’1’。
2-1-3列舉和數組數據類型
(1)列舉數據類型(EnumeratedTypes)定義格式:Type列舉名稱is(元素1,元素2,…);(2)數組數據類型(ArrayTypes)定義格式:Type數組名稱isArray(range<>)of數據類型;2-1-4數據類型的轉換
在VHDL語言裏,不同類型的數據信號之間不能互相賦值。當需要不同類型數據之間傳遞資訊時,就需要類型轉換函數將其中的一種類型數據轉換為另一中數據類型後,再進行信號的傳遞。例如:SignalY:Std_logic_vector(7downto0);
SignalX:Integerrange0to255;Y<=CONV_STD_LOGIC_VECTOR(X,8);轉換函數有兩個參數,被轉換的對象和轉換後的位數。
常用的數據類型轉換函數CONV_INTEGER
將數據類型UNSIGNED,SIGNED轉換為INTEGER類型.
CONV_UNSIGNED
將數據類型INTEGER,SIGNED轉換為UNSIGNED類型.CONV_SIGNED
將數據類型INTEGER,UNSIGNED轉換為SIGNED類型. CONV_STD_LOGIC_VECTOR
將數據類型INTEGER,UNSIGNED,SIGNED,STD_LOGIC轉換為STD_LOGIC_VECTOR類型.在庫ieee的程式包std_logic_arith中定義2-2
數據對象的定義常用的數據對象有三種:常數(Constant)信號(Signal)變數(Variable)
2-2-1常數的定義(1)將數據對象定義為常數,一方面希望該數據對象的值不會被改變;另一方面,為了提高程式的可讀性。(2)常數為全局量。(3)常數在程式包說明、實體說明、結構體描述、過程說明、函數調用中使用。(4)常數的定義格式:
Constant
常數名:數據類型:=常數值;
如:ConstantD1:Integer:=3;注意!常數定義的同時進行賦初值。常數的應用示例libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;--必需定義+entityexam1is
port(ip:instd_logic_vector(3downto0);op:outstd_logic_vector(3downto0));endexam1;architecturem1ofexam1isconstantnum:integer:=6;beginop<=ip+num;endm1;2-2-2信號的定義(1)“信號”數據對象,代表電路內部信號或連接線路,其在元件之間起互連作用。注意!信號定義的時候儘管可以直接賦初值,但系統往往忽略。建議信號對象定義後再進行賦值。(2)信號為全局量。(3)在實體說明、結構體描述和程式包說明中使用。(4)信號的定義格式:Signal信號名:數據類型;(5)信號賦值的語法格式為:信號名<=運算式;如:SignalS1:Std_logic_vector(3Downto0);S1<=“0000”;2-2-3變數的定義(1)“變數”數據對象,它用於對中間數據的臨時存儲,並不一定代表電路的某一組件。注意!變數定義的時候儘管可以直接賦初值,但系統往往忽略。建議變數對象定義後再進行賦值。(2)變數為局部量。(3)僅限於進程(Process)或副程式中使用。(4)變數的定義格式:Variable變數名:數據類型;
(5)變數賦值的語法格式為:目標信號值:=運算式;如:VariableS1:Std_logic_vector(3Downto0);S1:=“0000”;libraryieee;useieee.std_logic_1164.all;entitybcvisport(a,b,c:instd_logic;x,y:outstd_logic);endbcv;architecturem2ofbcvisbeginprocess(a,b,c)variabled:std_logic;begin
d:=a;x<=cxord;
d:=b;y<=cxord;endprocess;endm2;ABCXY例一結果:x<=cxorb,y<=cxorbx<=cxora,y<=cxorbarchitecturem1ofbcvissignald:std_logic;beginprocess(a,b,c)begin
d<=a;
--ignoredx<=cxord;
d<=b;y<=cxord;endprocess;endm1;libraryieee;useieee.std_logic_1164.all;Entitycmpisport(cp,ip:instd_logic;--cp為時鐘脈衝
op,oq:outstd_logic);--ip為輸入信號endcmp;Architecturem1ofcmpissignald:std_logic;beginprocess(cp)variablee:std_logic;beginifcp'eventandcp='1'thend<=ip;op<=d;e:=ip;oq<=e;endif;endprocess;endm1;例二D觸發器在進程中,信號賦值只有在過程結束時起作用,而變數賦值是立即進行的。2-2-4信號和變數的比較
(1)信號和變數的對應關係不同:信號代表電路內部信號或連接線路;而變數則不是。
(2)信號和變數聲明的位置不同:信號聲明在副程式、進程的外部;而變數聲明在副程式、進程的內部。
(3)信號為全局量,而變數只在定義它的域中才可見。因此,變數不能在兩個進程之間傳遞資訊。
(4)在一個進程中多次為一個信號賦值時,只有最後一個值會起作用;而變數則不同,每次賦值都會改變它的值。(5)賦值不同。在進程中,信號賦值只有在進程結束時起作用,而變數賦值是立即進行的。而且賦值符號不同:信號賦值為“<=”,變數賦值為“:=”。Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;一位BCD碼的加法器Entitybcdadder
is
Port(a,b:instd_logic_vector(3downto0);result:outstd_logic_vector(4downto0));Endbcdadder;ArchitectureNaofbcdadder
is
constantadjnum:integer:=6;--常數定義signalbinadd:std_logic_vector(4downto0);--信號
Beginbinadd<=a+b;--兩數相加process(binadd)--對兩數和進行處理variabletmp:integerrange0to6;--變數定義beginifbinadd>9thentmp:=adjnum;elsetmp:=0;endif;result<=binadd+tmp;endprocess;EndNa;
2-3信號運算符
VHDL提供了四種類型運算符號:邏輯運算符關係運算符算術運算符連接運算符VHDL運算符——邏輯運算符
and
邏輯與
or
邏輯或
nand
與非
nor
或非
xor
異或
xnor
同或
not
邏輯非上述邏輯運算在庫ieee的程式包std_logic_1164中定義。
VHDL運算符——關係運算符
= 等於
/= 不等於
< 小於
<= 小於或等於
> 大於
>= 大於或等於
注:其中‘<=’操作符也用於表示信號的賦值操作。上述運算在庫ieee的程式包std_logic_arith中定義。VHDL運算符——算術運算符
+ 加
- 減
* 乘
/ 除
** 乘方
mod 求模
rem
求餘
abs 求絕對值
在庫ieee的程式包std_logic_arith中定義。
VHDL運算符——連接運算符
&
連接符,將兩個數據對象或向量連接成維數更大的向量,它可給代碼書寫帶來方便。例如:vabc=a&b&c;如果a=‘1’,b=‘0’,c=‘1’,則vabc=“101”。(1)數值類屬性:(數組類型的數據對象)數值類屬性有‘left,‘right,‘low,‘high,‘length。其中用符號“‘”隔開對象名及其屬性。
left表示數組的左邊界;
right表示數組的右邊界;
low表示數組的下邊界;
high表示數組的上邊界;
length表示數組的長度。2-4數據對象屬性如:SignalA:std_logic_vector(7downto0);SignalB:std_logic_vector(0to3);則這兩個信號的屬性值分別為:
A’left=7;A’right=0;A’low=0;A’high=7;A’length=8;B’left=0;B’right=3;B’low=0;B’high=3;B’length=4;left表示數組的左邊界;
right表示數組的右邊界;
low表示數組的下邊界;
high表示數組的上邊界;
length表示數組的長度。(2)‘event屬性:‘event屬性,它的值為布爾型,如果剛好有事件發生在該屬性所附著的信號上(即信號有變化),則其取值為Ture,否則為False。利用此屬性可決定時鐘信號的變化情況,即時鐘是否發生。
2-4數據對象屬性(2)‘Event屬性:例如:時鐘邊沿表示
signalclk:in
std_logic;
則clk’event
andclk=’1’表示時鐘的上升沿。即時鐘變化了,且其值為1。
clk’eventandclk=’0’表示時鐘的下降沿。即時鐘變化了,且其值為0。此外,還可利用兩個函數來表示時鐘的邊沿。 rising_edge(clk)表示時鐘的上升沿
falling_edge(clk)表示時鐘的下降沿這兩個函數分別在庫ieee的程式包Std_logic_1164中定義。2-4數據對象屬性
並行語句一般處於進程(PROCESS)的外部。所有並行語句都是並行執行的,即與它們出現的先後次序無關。並行語句有三個特點:a.所有語句的執行是並行的;b.每條語句的執行和其所在的位置無關;c.並行語句的輸出僅僅依賴於輸入,沒有其他的限制條件。第三章
並行賦值語句
第三章
並行賦值語句(1)直接賦值語句:<=賦值運算符(2)條件式信號設置語句:When-Else(3)選擇式信號設置語句:With-Select-When(4)Process(進程)語句(5)Block(塊)語句(6)函數調用語句(後面章節講)(7)Component(元件)例化語句(8)For-Generate語句Generic的使用(1)直接賦值語句:<=直接賦值語句的格式:Signal_name<=expression;如:SignalA,B:std_logic_vector(7downto0);A<=”0000000”;B<=”1000000”;我們也可以這樣賦值:A<=(others=>’0’);結果信號A的每一位的值都為0。B<=(‘1’,others=>’0’);信號對象的位數很多時,採用others來賦值很方便。<=示例libraryieee;useieee.std_logic_1164.all;Entitytest1IsPort(a,b:instd_logic;c,d:outstd_logic);endtest1;architecturetest1_bodyoftest1isbegin
同時執行d<=aorb;
c<=aandb;endtest1_body;輸出僅僅依賴於輸入,沒有其他的限制條件。
每條語句的執行和其所在的位置無關。
ABCD(2)When-Else條件式信號設置語句它的語法格式為:[label:]Signal_name<=expression1Whenlogic_expression1Else{expression2Whenlogic_expression2Else}expressionn;
例如:f<=’1’whenx1=x2else‘0’;When-Else語句示例Libraryieee;Useieee.std_logic_1164.all;Entityxor2isPort(x,y:instd_logic;z:outstd_logic);Endxor2;Architectureaofxor2isBeginz<='1'when(x='0'andy='1')else'1'when(x='1'andy='0')else'0';Enda;ZXY(3)With-Select-When選擇式信號設置語句[label:]WithexpressionSelectSignal_name<=expressionWhenconstant_value{,{expressionWhenconstant_value};With-Select-When示例Libraryieee;Useieee.std_logic_1164.all;Entityxor2isPort(x,y:instd_logic;z:outstd_logic);Endxor2;Architectureaofxor2issignaltmp:std_logic_vector(1downto0);Begintmp<=x&y;Withtmp
Selectz<=‘1’when“01”,--注意結束為“,”不是“;”'1'when"10",'0'whenothers;Enda;ZXYWhen-else和With-select-When語句的區別
(1)With-select-When語句中When後的constant_value必須是互不相同的;(2)而When-else語句中When後的logic_expression則不需要這樣的嚴格條件;(3)When-else語句中When後的logic_expression的優先權次序為由先到後排列。優先編碼器示例Libraryieee;Useieee.std_logic_1164.all;EntitypriorityisPort(r1,r2,r3:instd_logic;f:outstd_logic_vector(1downto0));Endpriority;ArchitectureaofpriorityisBeginf<=‘01'when(r1='1')else'10'when(r2='1')else'11'when(r3='1')else'00';Enda;Ifr1=’1’,f=”01”;Ifr2=’1’andr1/=’1’,f=”10”;Ifr3=’1’andr1/=’1’andr2/=’1’,
f=”11”;如果三個輸入都為0,f=”00”。r1r3r2f(4)Process語句(1)一個結構體當中可以有多個Process語句,Process語句是同時執行的並行語句。(2)Process內的語句卻是順序執行的順序語句。(3)多進程之間的資訊通過信號對象來傳遞。Process語句的格式為:[Processlabel:]Process[(Sensitivitylist)][Variabledeclarations]Begin順序語句;EndProcess[Processlabel];
(4)Process語句
敏感表(Sensitivitylist)包括進程的一些信號,當敏感表中的某個信號變化時進程才被啟動,進程內的順序語句被執行。當進程結束時,進程內的輸出信號值被更新,進程進入等待(睡眠)狀態,直到敏感表中的某一信號發生變化,進程被再次啟動。對於上述電路,我們同樣可以採用Process語句來進行描述。Process語句示例architecturem2ofexam1isSignaltmp:std_logic;beginprocessbegintmp<=aandb;endprocess;d<=tmp;processbegine<=tmp
orc;endprocess;endm2;ABDCE(5)Block(塊)語句
當我們設計一個比較複雜的電路時,為了使設計簡單化,可以將其分為幾個部分分別進行設計,每個部分設計完成後,再將其組合成我們需要的電路。這種方法稱為模組化設計方法。這樣,使得整個設計工作更加容易實現,同時程式代碼的維護性、糾錯性都能得到提高。採用模組化設計時,當設計一個模組時,我們就要用到Block語句。
語法格式:BlockLabel:Block[數據對象定義部分]Begin<BlockStatementPart>EndBlock;(5)Block(塊)語句
libraryieee;useieee.std_logic_1164.all;entityexam1isport(a,b,c:instd_logic;d,e:outstd_logic);endexam1;architecturem1ofexam1isbeginBlock_1:BlockBegind<=aandb;endblock;Block_2:BlockBegine<=(aandb)orc;endblock;endm1;ABDCEBlock語句示例Component(元件)例化語句
(1)Block語句可以使VHDL程式更加模組化、功能化。但這樣的做法要求在同一程式中,若是重複使用時,必須重寫一次。Block語句解決了這樣的重複編寫問題。(2)元件也是完整的VHDL設計,作為底層設計,通過元件聲明,使之可在其他模組中被調用。(3)元件聲明可放在程式包中,也可在某個設計的結構體中聲明。
語法格式:Component元件名Port(端口定義);--同元件實現時的實體的port部分EndComponent;元件例化指元件的調用,它的語法格式為:Label:
元件名
PortMap(端口映射);Component(元件)例化語句
元件例化時端口映射或關聯有兩種方式:a.位置對應方式直接由輸入信號和元件信號的對應位置進行映射。即:元件標號:元件名
PortMap(信號A1,信號B1,…);b.名字直接對應我們使用=>映射符號進行輸入信號和元件信號之間的映射,那麼位置可以不對應。即:
元件標號:元件名
PortMap(元件信號A=>信號A1,元件信號B=>信號B1,…);
注意!元件標號是必需的。Component例化語句
Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntityfulladderisPort(Ci:instd_logic;a,b:instd_logic;s:outstd_logic;Co:outstd_logic);Endfulladder;Architecturem1offulladderisSignaltmp:std_logic_vector(1downto0);Begintmp<=('0'&a)+b+ci;s<=tmp(0);co<=tmp(1);Endm1;一位全加器
CibasCoLibraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntityadderisPort(Cin:instd_logic;x,y:instd_logic_vector(3downto0);sum:outstd_logic_vector(3downto0);Cout:outstd_logic);Endadder;四位加法器ArchitectureaofadderisSignalc:std_logic_vector(0to4);ComponentfulladderPort(ci,a,b:instd_logic;s,co:outstd_logic);endcomponent;Beginc(0)<=cin;U1:fulladderPortmap(c(0),x(0),y(0),sum(0),c(1));--U1:fulladderPortmap(ci=>c(0),a=>x(0),b=>y(0),s=>sum(0),co=>c(1));U2:fulladderPortmap(c(1),x(1),y(1),sum(1),c(2));U3:fulladderPortmap(c(2),x(2),y(2),sum(2),c(3));U4:fulladderPortmap(c(3),x(3),y(3),sum(3),c(4));Cout<=c(4);Enda;Component例化示例
For-Generate語句For-Generate語句用於生成一組信號賦值或元件例化語句。語法格式:generate_label:
--必須的forindex_variableInrangegenerate
statement;[statement;]endgenerate;則上面的四位加法器可以這樣來實現:其他相同,上面四條賦值語句可以這樣來代替:Generate_label:ForiIn0to3GenerateBitadder:fulladder
Portmap(c(i),x(i),y(i),sum(i),c(i+1));Endgenerate;For-Generate語句Generic語句
通過引入一個參數n使得我們設計的加法器更加具有通用性,參數n代表加法器中相加的位數,在VHDL中,這樣的參數稱為Generic(類屬)。
通常定義在實體描述和元件聲明中。
定義格式:Generic(參數名:數據類型[:=運算式]);例如:Generic(m:integer:=7);Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntityadderisGeneric(n:integer:=4);Port(Cin:instd_logic;x,y:instd_logic_vector(n-1downto0);sum:outstd_logic_vector(n-1downto0);Cout:outstd_logic);Endadder;Generic語句示例—N位全加器ArchitectureaofadderisSignalc:std_logic_vector(0ton);ComponentfulladderPort(ci,a,b:instd_logic;s,co:outstd_logic);Endcomponent;Beginc(0)<=cin;Generate_label:ForiIn0ton-1GenerateBitadder:fulladderPortmap(c(i),x(i),y(i),sum(i),c(i+1));Endgenerate;Cout<=c(n);Enda;Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntitynadderisPort(Cin1:instd_logic;x1,y1:instd_logic_vector(7downto0);Sum1:outstd_logic_vector(7downto0);Cout1:outstd_logic);Endnadder;帶Generic的元件例化—N位全加器ArchitectureaofnadderisComponentadderGeneric(n:integer);--也可在此進行影射Generic(n:integer:=8);Port(cin:instd_logic;x,y:instd_logic_vector(n-1downto0);sum:outstd_logic_vector(n-1downto0);cout:outstd_logic);endcomponent;BeginNadder:adderGenericmap(n=>8)Portmap(cin1,x1,y1,sum1,cout1);Enda;
--若元件聲明時已經賦值,則Nadder:adderPortmap(cin1,x1,y1,sum1,cout1);Genericmap(8)
(1)順序語句每一條語句的執行都是順序進行的。如同高級編程語言中的命令執行方式,一次一條命令,按書寫順序由上而下執行。(2)順序語句只能出現在進程和副程式內部。(3)由於順序語句的次序很重要,因此,順序語句要與並行語句分割開,這可以通過Process語句來實現。Process語句出現在結構體中,它將其內部的語句進行封裝。第四章順序賦值語句
順序語句有三個特點:
a.所有語句的執行是順序進行的;
b.每條語句的執行和其所在的位置有關;
c.順序語句的輸出不僅依賴於輸入,而且還受位置的影響。第四章順序語句(1)Process語句
(2)If-Else語句
(3)Case-When語句
(4)Null語句
(5)For-Loop語句
(6)Waituntil語句
(7)變數賦值語句
(8)Procedure(過程)調用語句
(1)Process語句Process內的順序語句可以是:[Process-label:]Process[(Sensitivitylist)][Variabledeclarations]--變數聲明Begin[waituntilstatement][variableassignmentstatements][ifstatements][casestatements][Procedure調用語句
]EndProcess;(2)If-Else語句Ifexpression1Then
statement1;[statement;][Elsif
expression2Then
statement2;{statement;}Else
statement3;[statement;]]Endif;語法格式:If-Else語句示例例如:IfSel=“01”thenf<=x1;elsif
Sel=“10”thenf<=x2;elsef<=x3;Endif;“IF”語句可嵌套使用,即在一個IF語句中可再調用另一個“IF”語句。注意!必需在Process語句中。
(3)Case-When語句CaseexpressionIsWhenconstant-value1=>
statement1;{statement;}Whenconstant_value2=>
statement2;{statement;]Whenothers=>
statement3;{statement;}Endcase;語法格式:Case-When語句示例CaseSelIsWhen“00”=>f<=x1;When“01”=>f<=x2;When“10”=>f<=x3;Whenothers=>f<=x4;endcase;
以上是四路信號選擇器。
(4)Null語句
一般類似Case-when的語句,通常會全部列出每個可能出現的選擇信號值,這樣後面必須配合有命令語句。不過實際上有些情況,是不做任何處理的,這時就可以將Null語句用上。如:
Casesiswhen2|3|4=>--s=2ors=3ors=4P<=d0;when7=>P<=d1;whenothers=>
null;Endcase;(5)For-Loop語句For-Loop為迴圈語句,可以使其所包含的順序語句被迴圈執行,它類似於並行語句中For-generate生成語句。語法格式為:[loop_label:]Forvariable_nameInrangeLoopStatement;{Statement;}EndLoop;Libraryieee;Useieee.std_logic_1164.all;Entitylpisgeneric(n:integer:=8);Port(din:instd_logic_vector(1ton);Count:outintegerrange0ton);Endlp;Architecturem1oflpisBeginprocess(din)variabletmp:integerrange0ton;begintmp:=0;forjin1tonloopifdin(j)='1'thentmp:=tmp+1;endif;endloop;count<=tmp;endprocess;endm1;統計一個多位信號中1的個數
(6)Waituntil語句
語法格式:Waituntil條件式;Libraryieee;Useieee.std_logic_1164.all;EntitywtisPort(clk,D:instd_logic;Q:outstd_logic);Endwt;Architecturem1ofwtisbeginprocessbeginwaituntilclk='1';Q<=D;endprocess;endm1;Architecturem2ofwtisbeginprocess(clk)beginifclk'eventandclk='1'thenQ<=D;endif;endprocess;endm2;(7)變數賦值語句
由於變數賦值是立即起作用的,所以在進程中變數賦值是順序語句。例如:Processvariablea,b:integer;begina:=30;b:=40;a:=b;b:=a;endprocess;由於變數的賦值是順序進行的,所以運行結果是a=b=40。
(8)Procedure調用語句
語法格式:Procedure過程名(輸入輸出參數表)IS[變數定義語句;]Begin順序語句;End過程名;
Libraryieee;Useieee.std_logic_1164.all;EntitypdisPort(D1:instd_logic;D2:instd_logic;Do:outstd_logic);Endpd;Architectureaofpdisbeginprocessprocedureand2(a,b:instd_logic;y:outstd_logic)isbeginy:=aandb;endand2;variabletmp:std_logic;beginlabel0:and2(a=>d1,b=>d2,y=>tmp);do<=tmp;endprocess;Enda;二位與的過程
第五章
組合邏輯電路的設計
任一時刻的輸出僅僅取決於當時的輸入,與電路原來的狀態無關,這樣的數字電路叫做組合邏輯電路。
5-1常用組合邏輯電路設計
(1)編碼器(2)解碼器(3)比較器(4)數據選擇器(5)三態輸出電路
(1)編碼器A6A7A5A4A3A2A1A0Y2Y1Y08×3編碼器ENA7A6A5A4A3A2A1A0Y2Y1Y00000000100000000010001000001000100000100001100010000100001000001010100000011010000000111libraryieee;useieee.std_logic_1164.all;entitybmqisport(A:instd_logic_vector(7downto0);En:instd_logic;Y:outstd_logic_vector(2downto0));endbmq;architecturem1ofbmqissignalsel:std_logic_vector(8downto0);beginProcess(En,A)BeginIfEn='1'thenifA="00000001"thenY<="000";elsifA="00000010"thenY<="001";elsifA="00000100"thenY<="010";elsifA="00001000"thenY<="011";elsifA="00010000"thenY<="100";elsifA="00100000"thenY<="101";elsifA="01000000"thenY<="110";elseY<="111";endif;ElseY<="000";endif;endprocess;endm1;libraryieee;useieee.std_logic_1164.all;entitybmqisport(A:instd_logic_vector(7downto0);En:instd_logic;Y:outstd_logic_vector(2downto0));endbmq;architecturem1ofbmqissignalsel:std_logic_vector(8downto0);beginsel<=En&A;withselselectY<="000"when"100000001","001"when"100000010","010"when"100000100","011"when"100001000","100"when"100010000","101"when"100100000","110"when"101000000","111"when"110000000","000"whenothers;endm1;(2)解碼器3×8解碼器A6A7A5A4A3A2A1A0Y2Y1Y0ENa.3×8解碼器libraryieee;useieee.std_logic_1164.all;entityymqisport(Y:instd_logic_vector(2downto0);EN:instd_logic;A:outstd_logic_vector(7downto0));endymq;architecturem1ofymqissignalsel:std_logic_vector(3downto0);beginsel<=En&Y;withselselectA<="00000001"when"1000","00000010"when"1001","00000100"when"1010","00001000"when"1011","00010000"when"1100","00100000"when"1101","01000000"when"1110","10000000"when"1111","11111111"whenothers;endm1;下麵的程式設計為:四位二進位->BCD碼,然後將BCD碼->七段顯示器碼。(1)當輸入為0~9的數時,其十位數為0,個位數=輸入。當輸入為10~15的數時,其十位數為1,個位數=輸入-10。(2)然後將十位和個位的BCD碼轉換為七段顯示器碼。
(2)解碼器b.碼制轉換
注:數碼管為共陰極數碼管。Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntitybcdisPort(A:instd_logic_vector(3downto0);bcd0,bcd1:outstd_logic_vector(3downto0);seven0,seven1:outstd_logic_vector(6downto0));Endbcd;Architectureaofbcdissignaltmp:std_logic_vector(3downto0);Beginprocess(A)--二進位轉換為十進位beginifA<10thenbcd1<="0000";bcd0<=A;seven1<=“0111111”;--十位數顯示0tmp<=A;elsebcd1<="0001";bcd0<=A-10;seven1<=“0000110”;--十位數顯示1tmp<=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 塑料厂原料验收制度
- 2025-2026学年信息安全教学设计
- 4.2人体通过非特异性免疫对抗病原体-教学设计-2025-2026学年高二上学期生物浙科·版(2019)选择性必修1
- 2025-2026学年艺术毕业歌教案
- 水泥厂环境保护准则
- 2025-2026学年小学生篮球走步教学设计
- 纺织厂布料储存准则
- 老旧厚土墙日光温室改造质量控制方案
- 建设工程安全生产管理制度
- 分布式光伏并网安全管理规范
- 2026年昆明市石林国有资本投资集团有限公司及下属公司招聘(18人)笔试参考题库及答案详解
- 2026辅警人员考试题库及答案
- 贯彻落实《全国党员教育培训工作规划(2024-2028年)》中期评估的工作报告
- 2025年一级建造师铁路工程实务真题及答案解析
- 2026年注册城乡规划师资格考试(城乡规划相关知识)综合能力测试题及答案
- 2025-2026学年对数均值不等式的专题教学设计
- 2026-2030中国四氧化三铁行业投资前景研究及销售战略分析研究报告
- 2026年石油炼制催化剂行业分析报告及未来发展趋势报告
- 2026音乐流媒体服务商业模式创新需求分析用户行为研究竞争分析
- 2025年一级建造师考试《矿业工程》真题及答案
- 水利工程建设管理培训
评论
0/150
提交评论