EDA技術(shù)與FPGA應(yīng)用設(shè)計 第三版 課件 第3-5章 常用EDA軟件、VHDL語言基礎(chǔ)、VHDL基本描述語句_第1頁
EDA技術(shù)與FPGA應(yīng)用設(shè)計 第三版 課件 第3-5章 常用EDA軟件、VHDL語言基礎(chǔ)、VHDL基本描述語句_第2頁
EDA技術(shù)與FPGA應(yīng)用設(shè)計 第三版 課件 第3-5章 常用EDA軟件、VHDL語言基礎(chǔ)、VHDL基本描述語句_第3頁
EDA技術(shù)與FPGA應(yīng)用設(shè)計 第三版 課件 第3-5章 常用EDA軟件、VHDL語言基礎(chǔ)、VHDL基本描述語句_第4頁
EDA技術(shù)與FPGA應(yīng)用設(shè)計 第三版 課件 第3-5章 常用EDA軟件、VHDL語言基礎(chǔ)、VHDL基本描述語句_第5頁
已閱讀5頁,還剩238頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第3章常用EDA軟件Lattice:ispEXPERT、LatticeDiamond

Altera:MAX+PLUSII、

QuartusIIXilinx:Foundation、ISE、Vivado本章內(nèi)容:原理圖/VHDL文本編輯綜合FPGA/CPLD適配FPGA/CPLD編程下載FPGA/CPLD器件和電路系統(tǒng)時序與功能門級仿真1、功能仿真2、時序仿真邏輯綜合器結(jié)構(gòu)綜合器1、isp方式下載2、JTAG方式下載3、針對SRAM結(jié)構(gòu)的配置

4、OTP器件編程

功能仿真FPGA/CPLD設(shè)計流程3.2QuartusII操作指南

開發(fā)過程:

一、建立設(shè)計工程

二、源文件輸入

三、編譯(設(shè)計處理)

四、仿真驗證

五、器件編程(下載)1.QuartusⅡ軟件啟動2.創(chuàng)建工程3.選擇FPGA器件3.2.1建立設(shè)計工程步驟1:軟件啟動圖4-1進(jìn)入MAX+plusII,建立一個新的設(shè)計文件步驟2:創(chuàng)建工程步驟3:選擇FPGA器件EP1C12Q240C8Assignments--Device1.建立原理圖文件2.輸入基本單元符號3.放置輸入輸出引腳符號4.連線5.為引線和引腳命名6.保存設(shè)計文件3.2.2源文件輸入

(以原理圖文件為例)步驟1:建立原理圖文件

步驟2:輸入基本單元符號

步驟2:輸入基本單元符號

(1)在圖形編輯器窗口的工作區(qū)中雙擊鼠標(biāo)左鍵,或單擊工具欄的符號按鈕步驟2:輸入基本單元符號

(2)選擇所需要的圖元或符號步驟3:放置輸入輸出引腳符號

步驟4:連線

符號之間的連線包括信號線NodeLine和總線BusLine。Quartus?Ⅱ軟件會自動根據(jù)端口是單信號端口還是總線端口畫出信號線或總線。連線:將鼠標(biāo)移動到其中一個端口上,這時鼠標(biāo)指示符自動變?yōu)椤?”形狀,按住鼠標(biāo)的左鍵并拖動鼠標(biāo)到達(dá)第二個端口,放開左鍵即可。連線拐彎:在需要拐彎處放開鼠標(biāo)左鍵,然后再繼續(xù)按下左鍵拖動即可。連線刪除:單擊這根連接線并按Del鍵即可。步驟5:為引線和引腳命名步驟6:保存設(shè)計文件1.編譯過程:選擇Tools菜單的CompilerTool項3.2.3編譯

2.分析綜合(Analysis&Synthesis)1.建立波形仿真文件2.功能仿真和時序仿真設(shè)置3.啟動仿真器3.2.4仿真驗證

步驟1:建立波形仿真文件

(1)創(chuàng)建一個新的矢量波形文件步驟1:建立波形仿真文件

(1)創(chuàng)建一個新的矢量波形文件(2)在矢量波形文件中加入輸入、輸出節(jié)點選擇View的UtilityWindows下的NodeFinder命令,彈出NodeFinder界面,查找要加入波形文件中的節(jié)點名;在Filter列表中選擇Pins:all,在Named欄中鍵入“*”,然后點擊List按鈕,在NodesFound欄即列出設(shè)計中的所有節(jié)點名;選擇要加入波形文件中的節(jié)點,然后按住鼠標(biāo)左鍵,拖動到波形編輯器左邊Name列的空白處放開。

步驟1:建立波形仿真文件

(3)編輯波形步驟2:功能仿真和時序仿真設(shè)置

(1)選擇Assignments的Settings…命令,在Settings對話框的Category列表中選擇Simulator,顯示仿真器頁面(2)功能仿真類型選擇Functional,選擇Processing的GenerateFunctionalSimulationNetlist命令,產(chǎn)生功能仿真網(wǎng)表文件;時序仿真類型選Timing,編譯設(shè)計產(chǎn)生時序仿真的網(wǎng)表文件。步驟3:啟動仿真器

在完成上面的仿真器設(shè)置以后,選擇Processing的StartSimulation命令即可啟動仿真器。同時狀態(tài)窗口和仿真報告窗口自動打開,并在狀態(tài)窗口中顯示仿真進(jìn)度以及所用時間。仿真結(jié)束后,在仿真報告窗口顯示輸出節(jié)點的仿真波形。1.引腳分配

(1)選擇Assignments/AssignmentEditor菜單命令,在分配編輯器的類別(Category)列表中選擇Locationspin,或直接選擇Assignments的Pins菜單命令。(2)用鼠標(biāo)左鍵雙擊To單元,將彈出包含所有引腳的下拉框,從中選擇一個引腳名。(3)用鼠標(biāo)左鍵雙擊Location單元,從下拉框中可以指定目標(biāo)器件的引腳號。(4)完成所有設(shè)計中引腳的指定,關(guān)閉AssignmentEditor界面,保存分配。(5)在進(jìn)行編譯之前,檢查引腳分配是否合法。選擇Processing→Start→StartI/OAssignmentAnalysis菜單命令,當(dāng)提示I/O分配分析成功時,點擊OK按鈕關(guān)閉提示。3.2.5器件編程

2.編程(1)全局編譯選擇Processing/StartCompilation,全局編譯成功后,可以進(jìn)行編程下載。(2)打開編程器窗口選擇Tool/Programer命令,打開編程器窗口。(3)設(shè)置下載形式第一次使用下載時,需要選擇下載形式。在編程器窗口,點擊HardwareSetup按鈕,打開HardwareSetup對話框,然后點擊AddHardware,選擇USB-Blaster[USB-0]后單擊SelectHardware,則把下載形式設(shè)置為USB-Blaster[USB-0](4)下載下載可以選擇JTAG方式和AS方式。JTAG方式把文件直接下載到FPGA里面,AS方式把文件下載到配置芯片里面。選擇AddFile,添加.sof文件,選中Program/Configure,點擊Start后開始下載。3.2.5器件編程

將設(shè)計項目設(shè)置成可調(diào)用元件

File---Create/Update---CreatesymbolFilesforCurrentFile設(shè)計頂層文件

File---new---blockdiagram/schematicFile;

保存在相同目錄;設(shè)置成頂層文件:PROJECT/SETASTOP—LEVELENTITY;

分析綜合;建立仿真文件,進(jìn)行仿真。3.2.6層次設(shè)計講解張三3.4Vivado軟件操作Vivado為Xilinx公司2012年推出的新一代可編程邏輯器件集成開發(fā)工具,支持XilinxZynq系列產(chǎn)品。Vivado包含綜合、實現(xiàn)、仿真、調(diào)試等工具,同時還支持高層次綜合(HLS)功能,使FPGA設(shè)計更加高效。Vivado軟件已由最初的2012版更新到2022版。本教程將基于Vivado2017.4版本,以設(shè)計一個4位二進(jìn)制加法計數(shù)器為例,介紹該軟件的基本開發(fā)使用流程。3.4.1Vivado簡介在Vivado啟動界面的菜單欄中選擇“File”→“NewProject”命令,或點擊“QuickStart”欄下的“CreateProject”新建工程,在新建工程設(shè)置界面,輸入工程名“cnt_4”,工程名通常為設(shè)計程序的實體名,工程存放路徑選擇為E:/FPGA/vivado_test,如圖所示。3.4.2

新建工程單擊“Next”按鈕,彈出新建工程類型選擇界面,默認(rèn)選擇RTLProject;單擊“Next”按鈕,出現(xiàn)編程語言選擇界面,本例將Targetlanguage設(shè)置為VHDL,Simulatorlanguage也設(shè)置為VHDL,如圖所示。3.4.2

新建工程點擊“Next”按鈕,出現(xiàn)約束文件添加界面,本例暫不添加約束文件,繼續(xù)點擊“Next”按鈕,出現(xiàn)目標(biāo)芯片選擇界面,本例選擇Zynq-7000系列下的型號為xc7z020clg400-2的FPGA芯片,如圖所示。3.4.2

新建工程點擊“Next”按鈕,出現(xiàn)新建工程概要界面,顯示新建工程名、目標(biāo)芯片等信息,點擊“Finish”按鈕,完成工程創(chuàng)建,新建工程界面如圖所示。3.4.2

新建工程在工程管理區(qū)點擊PROJECTMANAGER欄下的AddSources圖標(biāo),彈出新建文件類型選擇界面,選擇默認(rèn)的“Addorcreatedesignsources”選項;點擊“Next”按鈕,在彈出界面中選擇“CreateFile”按鈕;在文件名設(shè)置窗口輸入文件名cnt_4,如圖所示。3.4.3

新建VHDL源文件點擊“OK”按鈕,顯示源文件添加完成界面,如圖所示。3.4.3

新建VHDL源文件點擊“Finish”按鈕,顯示端口定義對話框,如圖所示。可以在該對話框中定義端口信號名及端口類型,也可不用定義端口信息,在后面程序設(shè)計時輸入端口信號名及類型,本例不在該對話框中定義端口,直接單擊“OK”按鈕,在彈出的對話框中選擇“Yes”。3.4.3

新建VHDL源文件在文件管理區(qū)顯示出新建的源文件“cnt_4.vhd”,如圖所示,雙擊該文件,在界面右邊編輯區(qū)顯示新建源文件模板,定義了庫、程序包、實體名、結(jié)構(gòu)體名。3.4.3

新建VHDL源文件在模板中輸入程序代碼,輸入完成后的代碼如圖所示。程序編輯完成后,點擊保存按鈕進(jìn)行保存。3.4.3

新建VHDL源文件在界面左邊工程管理區(qū)“SYNTHESIS”下點擊“RunSynthesis”綜合工具對輸入的源文件進(jìn)行綜合,若輸入程序沒有語法錯誤,則綜合通過,彈出綜合完成對話框,如圖所示。若輸入程序有語法錯誤,則綜合不通過,需根據(jù)錯誤提示信息對程序進(jìn)行修改,修改后再次綜合,直至程序綜合完成,確保程序無語法錯誤。在綜合完成對話框中,點擊Cancel按鈕,暫不執(zhí)行Implementation實現(xiàn)操作。3.4.3

新建VHDL源文件程序綜合正確表明無語法錯誤,程序邏輯功能是否正確不能確定,需要通過波形仿真來測試。下面對上述程序描述的4位二進(jìn)制加法計數(shù)器進(jìn)行波形仿真,驗證其邏輯功能是否正確。本例將使用VHDL硬件描述語言編寫波形測試激勵文件,設(shè)置輸入信號的波形。3.4.4

波形仿真在工程管理區(qū)點擊PROJECTMANAGER欄下的AddSources圖標(biāo),彈出新建文件類型選擇界面,選擇“Addorcreatesimulationsources”選項;點擊“Next”按鈕,在彈出界面中選擇“CreateFile”;在文件名設(shè)置窗口輸入文件名cnt_4_tb,如圖所示。3.4.4

波形仿真——創(chuàng)建波形文件點擊“OK”按鈕,在顯示的源文件添加界面點擊“Finish”按鈕;端口定義對話框可定義端口信號名及端口類型,也可暫不定義端口信息,在后面程序設(shè)計時輸入端口信號名及類型,本例不在該對話框中定義端口,直接單擊“OK”按鈕,在彈出的對話框中選擇“Yes”,則完成波形激勵文件的創(chuàng)建,如圖所示。3.4.4

波形仿真——創(chuàng)建波形文件點擊“OK”按鈕,在顯示的源文件添加界面點擊“Finish”按鈕;端口定義對話框可定義端口信號名及端口類型,也可暫不定義端口信息,在后面程序設(shè)計時輸入端口信號名及類型,本例不在該對話框中定義端口,直接單擊“OK”按鈕,在彈出的對話框中選擇“Yes”,則完成波形激勵文件的創(chuàng)建,如圖所示。3.4.4

波形仿真——編輯波形文件在文件管理區(qū)“SimulationSources”的“sim_1”下顯示新建波形激勵文件cnt_4_tb.vhd,雙擊該文件,在界面右邊編輯區(qū)顯示新建文件模板,在模板中輸入程序代碼,輸入完成后的波形激勵文件代碼如圖所示。程序編輯完成后,點擊保存按鈕進(jìn)行保存。3.4.4

波形仿真——創(chuàng)建波形文件在工程管理區(qū)右鍵點擊“SIMULATION”,在顯示列表中選擇SimulationSettings選項;在仿真參數(shù)設(shè)置界面,點擊“Simulation”圖標(biāo),在xsim.simulate.runtime欄設(shè)置仿真時間,本例仿真時間設(shè)置為1000ns,如圖所示,設(shè)置完成后點擊OK按鈕。3.4.4

波形仿真——波形仿真參數(shù)設(shè)置在工程管理區(qū)點擊“SIMULATION”下的“RunSimulation”圖標(biāo),在顯示列表中選擇RunBehavioralSimulation選項,波形仿真結(jié)果如圖所示。3.4.4

波形仿真由仿真波形圖可以看出,在復(fù)位信號有效時間內(nèi),計數(shù)器cnt值為0,復(fù)位無效后,在每個時鐘信號的上升沿觸發(fā)下,計數(shù)器cnt加1,實現(xiàn)了程序設(shè)計的四位二進(jìn)制加法計數(shù)器功能。在工程管理區(qū)點擊“RTLANALYSIS”下的“OpenElaboratedDesign”圖標(biāo),在彈出的窗口中點擊“OK”按鈕,顯示RTL綜合原理圖,如圖所示。3.4.5

管腳定義在菜單欄選擇“Window”→“I/OPorts”命令;在彈出的管腳定義界面設(shè)置輸入輸出信號連接的FPGA芯片管腳,如圖所示。3.4.5

管腳定義管腳定義完成后,點擊保存按鈕,彈出約束文件設(shè)置對話框,輸入文件名cnt_4,文件類型默認(rèn)“XDC”格式,點擊“OK”按鈕,則在文件管理區(qū)Constraints欄下顯示新建的約束文件cnt_4.xdc。雙擊打開cnt_4.xdc約束文件,在文本編輯區(qū)顯示文件內(nèi)容,如圖所示,根據(jù)約束文件管腳定義格式,也可通過新建約束源文件,輸入管腳約束代碼,實現(xiàn)管腳定義功能。3.4.5

管腳定義下載配置過程包括生成比特流文件,啟動編程工具將生成的比特流文件下載到FPGA內(nèi)部,或?qū)⑸傻谋忍亓魑募D(zhuǎn)換成EEPROM文件,并下載到FPGA的配置存儲芯片中。下面介紹JTAG下載模式下將比特流文件直接下載到FPGA內(nèi)部的流程。3.4.6

下載配置在工程管理區(qū)點擊“PROGRAMANDDEBUG”下的“GenerateBitstream”圖標(biāo),在彈出的窗口中點擊“OK”按鈕,執(zhí)行結(jié)束后將在工程目錄下生成cnt_4.bit下載文件,如圖所示。3.4.6

下載配置——生成下載文件在工程管理區(qū)點擊“PROGRAMANDDEBUG”下的“OpenHardwareManager”圖標(biāo),彈出下載管理界面,如圖所示。使用下載電纜連接開發(fā)板與計算機,開發(fā)板上電,點擊下載管理界面中的“AutoConnect”圖標(biāo)自動連接FPGA設(shè)備,右鍵點擊掃描到的FPGA芯片xc7z020,選擇ProgramDevice,將下載文件cnt_4.bit下載到FPGA芯片內(nèi)部。3.4.6

下載配置——下載第4章VHDL語言基礎(chǔ)常見的HDL有ABEL、AHDL、VHDL、VerilogHDL和SystemC等。HDLIEEE工業(yè)標(biāo)準(zhǔn)硬件描述語言VHDL、Verilog超高速集成電路硬件描述語言VHDL,美國國防部研究計劃硬件描述語言HDL第4章VHDL語言基礎(chǔ)覆蓋面廣,描述能力強,多層次硬件描述語言VHDL有良好的可讀性,既是程序又是文件VHDL的移植性很強VHDL生命周期長,硬件描述與器件工藝無關(guān)代碼量大,書寫煩瑣VHDL第4章VHDL語言基礎(chǔ)基本組成語言要素本章內(nèi)容:4.1基本結(jié)構(gòu)參數(shù)部分實體部分結(jié)構(gòu)體例:2選1多路選擇器的VHDL描述4.1基本結(jié)構(gòu)sy0a1b2選1多路選擇器的VHDL描述4.1基本結(jié)構(gòu)2選1多路選擇器的VHDL描述方法一:

ENTITYmux21aISPORT(a,b:INBIT;s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISSIGNALd,e:BIT;BEGINd<=aAND(NOTS);e<=bANDs;y<=dORe;ENDARCHITECTUREone;4.1基本結(jié)構(gòu)實體結(jié)構(gòu)體2選1多路選擇器的VHDL描述方法二:ENTITYmux21aISPORT(a,b,s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINPROCESS(a,b,s)BEGINIFs='0'THENy<=a;ELSEy<=b;ENDIF;ENDPROCESS;ENDARCHITECTUREone;4.1基本結(jié)構(gòu)sy0a1b【例4-1】

LIBRARYieee;--庫程序包調(diào)用

USEieee.std_logic_1164.ALL;

USEieee.std_logic_unsigned.ALL;

4.1基本結(jié)構(gòu)ENTITYcntm16IS--實體cntm16

GENERIC(cntwidth:integer:=4);

PORT

(ci:INstd_logic;

nreset:INstd_logic;

clk:INstd_logic;

co:OUTstd_logic;

qcnt:BUFFERstd_logic_vector(cntwidth-1DOWNTO0)

);

ENDcntm16;

4.1基本結(jié)構(gòu)ARCHITECTUREbehaveOFcntm16IS--結(jié)構(gòu)體

BEGIN

co<=’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;

ENDPROCESS;

ENDbehave;

4.1基本結(jié)構(gòu)模塊結(jié)構(gòu)

參數(shù)部分:庫(LIBRARY)、程序包(USE);

實體(ENTITY):[類屬]、端口(PORT);

結(jié)構(gòu)體(ARCHITECTURE):賦值、進(jìn)程(PROCESS-IF)。

4.1基本結(jié)構(gòu)4.1基本結(jié)構(gòu)調(diào)用程序包語句實體及實體聲明語句結(jié)構(gòu)體1結(jié)構(gòu)體2結(jié)構(gòu)體n標(biāo)準(zhǔn)程序包標(biāo)準(zhǔn)程序包定義程序包定義程序包進(jìn)程1進(jìn)程2進(jìn)程nVHDL程序設(shè)計約定

語句結(jié)構(gòu)描述中方括號“[]”內(nèi)的內(nèi)容為可選內(nèi)容。程序文字的大小寫是不加區(qū)分的。程序中的注釋使用雙橫線“--”。建議書寫使用層次縮進(jìn)格式。建議各個源程序文件的命名均與其實體名一致。4.1基本結(jié)構(gòu)庫說明

存放已經(jīng)編譯的實體、結(jié)構(gòu)體、程序包和配置,用于設(shè)計共享,是編程資源。

library<庫名>;

4.1.1參數(shù)部分程序包引用使用USE子句指明要使用庫中某一個設(shè)計單元。

use<庫名>.<程序包名>.all;【例4-2】LIBRARYieee;

USEieee.std_logic_1164.ALL;實體(ENTITY)

實體是一個設(shè)計實體的表層設(shè)計單元,其功能是對這個設(shè)計實體與外部電路進(jìn)行接口描述。它規(guī)定了設(shè)計單元的輸入/輸出接口信號或引腳,是設(shè)計實體經(jīng)封裝后對外的一個通信界面。類似于原理圖中的一個部件符號。4.1.2實體部分實體格式ENTITY實體名IS[GENERIC(常數(shù)名:數(shù)據(jù)類型[:設(shè)定值])];--類屬表

PORT--端口表(端口名:方向(端口模式)端口類型;

:;

端口名:方向(端口模式)端口類型

);END實體名;ENTITY實體名IS

4.1.2實體部分GENERIC類屬參數(shù)

定義端口界面常數(shù)(端口寬度、器件延遲時間)。類屬參量的值可由設(shè)計實體的外部提供。書寫格式:GENERIC([常數(shù)名:數(shù)據(jù)類型[:設(shè)定值]{;常數(shù)名:數(shù)據(jù)類型[:=設(shè)定值]});例4-1

GENERIC(cntwidth:integer:=4);

4.1.2實體部分PORT端口

用于定義模塊所有的輸入/輸出信號,相當(dāng)于定義一個模塊符號需要定義端口信號名、端口模式、端口數(shù)據(jù)類型例4-1

4.1.2實體部分CICONRESETQCNT[3..0]CLKCNTM16端口模式端口模式說明(以設(shè)計實體為主體)IN輸入,只讀模式,將變量或信號信息通過該端口讀入OUT輸出,單向賦值模式,將信號通過該端口輸出BUFFER具有讀功能的輸出模式,可以讀或?qū)?,只能有一個驅(qū)動源INOUT雙向,可以通過該端口讀入或?qū)懗鲂畔ORT端口模式端口數(shù)據(jù)類型VHDL數(shù)據(jù)類型:預(yù)定義數(shù)據(jù)類型、自定義數(shù)據(jù)類型只能使用已經(jīng)定義的數(shù)據(jù)類型例4-1中數(shù)據(jù)類型Std_logic和Std_logic_vector,在ieee.std_logic_1164.all程序包中說明,使用時首先打開。實體實例【例4-3】4位全加器的實體描述。Libraryieee;Useieee.std_logic_1164.all;Entityadd4isPort(a,b:instd_logic_vector(3downto0);Ci:instd_logic;Sum:outstd_logic_vector(3downto0);Co:outstd_logic);Endadd4;結(jié)構(gòu)體(ARCHITECTURE)

結(jié)構(gòu)體主要用來描述實體的內(nèi)部結(jié)構(gòu),即描述一個實體的功能。描述方式行為描述方式、數(shù)據(jù)流描述方式、結(jié)構(gòu)描述方式、混合描述方式4.1.3結(jié)構(gòu)體部分結(jié)構(gòu)體格式ARCHITECTURE結(jié)構(gòu)體名OF實體名IS[結(jié)構(gòu)體說明部分];BEGIN

結(jié)構(gòu)體描述部分;END結(jié)構(gòu)體名;4.1.3結(jié)構(gòu)體部分結(jié)構(gòu)體組成4.1.3結(jié)構(gòu)體部分行為描述

描述該設(shè)計單元的功能,主要使用函數(shù)、過程和進(jìn)程語句,以算法形式描述數(shù)據(jù)的變換和傳送

結(jié)構(gòu)體描述風(fēng)格例4-4Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Useieee.std_logic_arith.all;Entityeqcomp4isPort(a,b:instd_logic_vector(3downto0);equals:outstd_logic);Endeqcomp4;Architecturebehavioralofeqcomp4isBeginComp:process(a,b)BeginIfa=bthenEquals<=’1’;ElseEquals<=’0’;Endif;Endprocesscomp;Endbehavioral;

行為描述結(jié)構(gòu)描述

描述該設(shè)計單元的硬件結(jié)構(gòu),調(diào)用庫中的元件或是設(shè)計模塊,主要使用元件說明語句及元件例化語句

結(jié)構(gòu)體描述風(fēng)格例4-5U0xnor2x(0)a(0)b(0)U1xnor2x(1)a(1)b(1)U2xnor2x(2)a(2)b(2)U3xnor2x(3)a(3)b(3)U4and4equalsabcdyArchitecturestructofeqcomp4isComponentxnor2--元件說明

Port(a,b:instd_logic;X:outstd_logic);Endcomponent;Componentand4--Port(a,b,c,d:instd_logic;y:outstd_logic);Endcomponent;Signalx:std_logic_vector(0to3);

結(jié)構(gòu)描述BeginU0:xnor2portmap(a(0),b(0),x(0));--元件例化

U1:xnor2portmap(a(1),b(1),x(1));U2:xnor2portmap(a(2),b(2),x(2));U3:xnor2portmap(a(3),b(3),x(3));U4:and4portmap(x(0),x(1),x(2),x(3),equals);Endstruct;

結(jié)構(gòu)描述數(shù)據(jù)流描述從信號到信號的數(shù)據(jù)流的路徑形式進(jìn)行描述。使用并行的信號賦值語句,既顯式表示了該設(shè)計單元的行為,也隱式表示了該設(shè)計單元的結(jié)構(gòu)。

結(jié)構(gòu)體描述風(fēng)格例4-6Architecturedataflowofeqcomp4isBeginEquals<=’1’when(a=b)else‘0’;并行信號賦值語句Enddataflow;

一個實體可有多種方案的結(jié)構(gòu)體,但仿真和綜合時要用configuration配置語句選擇一個結(jié)構(gòu)體映射到硬件電路,即為實體選擇、指定或者激活一個結(jié)構(gòu)體。

結(jié)構(gòu)體配置4.1.3結(jié)構(gòu)體部分4.1.4語法小結(jié)數(shù)據(jù)類型信號賦值屬性庫和程序包實體結(jié)構(gòu)體端口定義端口模式邏輯操作符IF語句變量對象進(jìn)程語句順序語句并行語句說明部分元件說明元件例化信號對象類屬定義CASE語句條件操作符配置條件信號賦值數(shù)字文字規(guī)則運算符運算符重載類型定義4.2VHDL語言要素文字規(guī)則數(shù)據(jù)對象數(shù)據(jù)類型運算符屬性4.2.1文字規(guī)則標(biāo)示符數(shù)值字符串下標(biāo)4.2.1文字規(guī)則標(biāo)示符1、標(biāo)識符由字母、數(shù)字及下劃線組成;

2、以字母開頭;

3、下劃線不能放在結(jié)尾;

4、下劃線不能連用;

5、不能使用保留字;

6、VHDL不區(qū)分大小寫。4.2.1文字規(guī)則數(shù)值表示(1)整數(shù)表示

整數(shù)表示十進(jìn)制數(shù)值,如:

11,123,135E2(=13500),12_345_678(=12345678)

(2)實數(shù)表示

實數(shù)也表示十進(jìn)制數(shù)值,必須帶有小數(shù)點,如:

1.252.01.56E-3(0.00156)1_120.123_678(11120.123678)數(shù)值表示(3)數(shù)制基數(shù)表示

有5部分組成:十進(jìn)制數(shù)表示數(shù)值的基數(shù);隔離符號“#”;該基數(shù)下對應(yīng)的數(shù)值;隔離符號“#”;十進(jìn)制表示的指數(shù)部分。

2#1110#--二進(jìn)制表示數(shù)值14

8#120#--八進(jìn)制表示數(shù)值80

16#A0#--十六進(jìn)制表示數(shù)值160

10#12#E2--十進(jìn)制表示數(shù)值1200

16#D#E1--十六進(jìn)制表示數(shù)值2084.2.1文字規(guī)則字符串

字符、字符串:單引號引起來的ASCII字符(數(shù)值、符號或字母);雙引號中的一維的字符數(shù)組。

如:‘R’,‘a(chǎn)’,‘*’,‘Z’,‘-’

,‘0’;“ERROR”,“NOTE”

兩種類型字符串:文字字符串和數(shù)位字符串(位矢量,是BIT數(shù)據(jù)類型的一維數(shù)組)。B“1_0101_1010”--二進(jìn)制數(shù)數(shù)組,長度是9O“17”--八進(jìn)制數(shù)數(shù)組,長度為6X“A2E0”--十六進(jìn)制數(shù)數(shù)組,位矢數(shù)組長度是164.2.1文字規(guī)則下標(biāo)名及下標(biāo)段名1、用于指示數(shù)組型變量或信號的某一元素或某一段元素

2、語句格式分別為:

名(表達(dá)式);

名(表達(dá)式1to/downto表達(dá)式2);

3、signala,b:bit_vector(7downto0);

signalc,d:bit;

a<=“01000111”;--給a(7)到a(0)賦值為“01000111”

c<=a(6);--把a(6)值’1’

賦值給c

b(7downto4)<=a(3downto0);--a的低4位賦給b的高4位

b(0to3)<=a(4to7);--a的高4位賦給b的低4位

d<=a(0);--把a(0)值’1’

賦值給d

4.2.2數(shù)據(jù)對象數(shù)據(jù)對象類似于一種容器,接受不同數(shù)據(jù)類型的賦值

常量變量信號對象種類:

信號signal、變量variable、常量constant、文件file。

常量:不對應(yīng)電路中的物理量,但可以說明全局量。在結(jié)構(gòu)體、實體、程序包、進(jìn)程、函數(shù)、過程中均可使用。

變量:程序運算的中間量,并不對應(yīng)電路中的物理量。變量說明局部量,用于進(jìn)程、函數(shù)、過程。

信號:電路中的物理量,對應(yīng)于電路的連線和節(jié)點。信號說明全局量,用于描述結(jié)構(gòu)體、實體、程序包。

4.2.2數(shù)據(jù)對象對象特點:

1、信號和變量可以被連續(xù)地賦值;

2、常量只能被賦值一次;

3、信號和變量的賦值形式和執(zhí)行過程不同:變量是立即賦值(:=),沒有延遲,而信號賦值要有一定的延遲(<=)。4.2.2數(shù)據(jù)對象對象說明的格式

對象種類對象名:數(shù)據(jù)類型[:=表達(dá)式];

1、對象種類:Constant(常數(shù))、Signal(信號)、Variable(變量)、File(文件)

2、表達(dá)式用于設(shè)定初始值,是可選項。

4.2.2數(shù)據(jù)對象【例4-8】常量說明實例:CONSTANTDBUS﹕BIT_VECTOR:=“01011010”;定義BIT_VECTOR位矢量型常量DBUS,取值“01011010”。CONSTANTVCC﹕REAL:=5.0;定義REAL實數(shù)型常量VCC,取值5.0。CONSTANTDELY﹕TIME:=25ns;定義TIME時間型常量DELY,取值25ns。4.2.2數(shù)據(jù)對象【例4-9】變量說明實例:VARIABLEx,y:INTEGER;定義變量x和y,整數(shù)類型。VARIABLEcount:INTEGERRANGE0TO255:=10;定義變量count,整數(shù)類型,取值在0-255,初始值為10。4.2.2數(shù)據(jù)對象【例4-10】信號說明實例:SIGNALsys_clk:BIT:=’0’;

SIGNALdata_bus:Std_Logic_Vector(7Downto0):=(others=>’1’);

4.2.2數(shù)據(jù)對象【例4-12】

libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;

entitybcdadderisport(op1,op2:inintegerrange0to9;result:outintegerrange0to31);endbcdadder;4.2.2數(shù)據(jù)對象architecturebehaveofbcdadderisconstantajustnum:integer:=6;signalbinadd:integerrange0to18;beginbinadd<=op1+op2;process(binadd)variabletmp:integer:=0beginifbinadd>9thentmp:=adjustnum;elsetmp:=0;endif;result<=binadd+tmp;endprocess;endbehave;4.2.2數(shù)據(jù)對象4.2.3數(shù)據(jù)類型VHDL是一種強類型語言,要求設(shè)計實體中的每一個常數(shù)、信號、變量、函數(shù)以及設(shè)定的各種參量都必須具有確定的數(shù)據(jù)類型,并且只有數(shù)據(jù)類型相同的量才能互相傳遞和作用。VHDL中的數(shù)據(jù)類型:標(biāo)量(整數(shù)、浮點、枚舉、物理)、復(fù)合(數(shù)組、記錄)、文件、存取

。VHDL中的數(shù)據(jù)類型引用方式有:預(yù)定義、自定義

和類型轉(zhuǎn)換等。標(biāo)準(zhǔn)數(shù)據(jù)類型(可直接引用)在VHDL標(biāo)準(zhǔn)程序包STANDARD中定義的,在實際使用中,已自動包含進(jìn)VHDL的源文件中,因而不必通過USE語句以顯式調(diào)用。

4.2.3數(shù)據(jù)類型標(biāo)準(zhǔn)數(shù)據(jù)類型(1)整數(shù)(INTEGER)

整數(shù)類型的數(shù)代表正整數(shù)、負(fù)整數(shù)和零。整數(shù)在硬件電路中是用二進(jìn)制表示的,但其不能被看作位矢量(枚舉型),不能使用邏輯操作符。整數(shù)常量的書寫方式示例如下:2--十進(jìn)制整數(shù)10E4--十進(jìn)制整數(shù)16#D2#--十六進(jìn)制整數(shù)2#11011010#--二進(jìn)制整數(shù)標(biāo)準(zhǔn)數(shù)據(jù)類型(2)實數(shù)

VHDL的實數(shù)類型類似于數(shù)學(xué)上的實數(shù),或稱浮點數(shù),取值范圍為-1.0E38~+1.0E38。書寫時一定要有小數(shù)。僅能在VHDL仿真器中使用,VHDL綜合器不支持實數(shù),因為實數(shù)類型的實現(xiàn)相當(dāng)復(fù)雜,目前在電路規(guī)模上難以承受。實數(shù)常量的書寫方式舉例如下:65971.333333 --十進(jìn)制浮點數(shù)8#43.6#E+4--八進(jìn)制浮點數(shù)43.6E-4 --十進(jìn)制浮點數(shù)(3)位(BIT)

位數(shù)據(jù)類型也屬于枚舉型,取值‘1’或‘0’。可以進(jìn)行邏輯運算,運算結(jié)果仍是位數(shù)據(jù)類型。VHDL綜合器用一個二進(jìn)制位表示BIT。在程序包STANDARD中定義的源代碼是:TYPEBITIS(‘0’,‘1’);例:signala,b,c:bit;c<=aandb;

標(biāo)準(zhǔn)數(shù)據(jù)類型(4)位矢量(BIT_VECTOR)

位矢量是基于BIT數(shù)據(jù)類型的數(shù)組。在程序包STANDARD中定義的源代碼是:TYPEBIT_VECTORISARRAY(NATURALRANGE<>)OFBIT;位矢量是用雙引號括起來的一組位數(shù)據(jù)。Signala:bit_vector(7downto0):=”11001010”;

標(biāo)準(zhǔn)數(shù)據(jù)類型(5)布爾(BOOLEAN)

布爾數(shù)據(jù)類型實際上是一個二值枚舉型數(shù)據(jù)類型,它的取值有FALSE和TRUE兩種??梢赃M(jìn)行關(guān)系運算和邏輯運算,不能用于算術(shù)運算。IFa=b

標(biāo)準(zhǔn)數(shù)據(jù)類型(6)

字符(CHARACTER)

字符類型通常用單引號引起來,如‘A’。字符類型區(qū)分大小寫,如‘B’不同于‘b’。(7)字符串(STRING)

非約束型字符數(shù)組,或稱為字符串?dāng)?shù)組。字符串必須用雙引號標(biāo)明。

VARIABLESTRING_VAR﹕STRING(1TO7);

…STRING_VAR:=“ABCD”;標(biāo)準(zhǔn)數(shù)據(jù)類型

標(biāo)準(zhǔn)數(shù)據(jù)類型(8)時間(TIME)VHDL中唯一預(yù)定義物理類型,由整數(shù)和物理量單位兩部分組成,之間至少留一個空格,如55ms。STANDARD程序包中時間型定義如下:TYPETIMEISRANGE-2147483647TO2147483647unitsfs; --飛秒,VHDL中的最小時間單位

ps=1000fs; --皮秒

ns=1000ps; --納秒

us=1000ns; --微秒

ms=1000us;--毫秒

sec=1000ms;--秒

min=60sec; --分

hr=60min; --時enduntis;標(biāo)準(zhǔn)數(shù)據(jù)類型(9)錯誤等級(SEVERITY_LEVEL)

在VHDL仿真器中,錯誤等級用來指示設(shè)計系統(tǒng)的工作狀態(tài),共有四種可能的狀態(tài)值:NOTE(注意)、WARNING(警告)、ERROR(出錯)、FAILURE(失敗)。其定義如下:

TYPESEVERITY_LEVEIS(NOTE,WARNING,ERROR,F(xiàn)AILURE);

(10)自然數(shù)(NATURAL)和正整數(shù)(POSITIVE)

整數(shù)的子類型,即非負(fù)的整數(shù)、正整數(shù)它們在STANDARD程序包中定義的源代碼如下:

SUBTYPENATURALISINTEGERRANGE0TOINTEGER'HIGH;

SUBTYPEPOSITIVEISINTEGERRANGE1TOINTEGER'HIGH;標(biāo)準(zhǔn)數(shù)據(jù)類型

IEEE預(yù)定義標(biāo)準(zhǔn)邏輯類型

在IEEE庫的程序包STD_LOGIC_1164中,定義了兩個非常重要的數(shù)據(jù)類型,即標(biāo)準(zhǔn)邏輯位STD_LOGIC

和標(biāo)準(zhǔn)邏輯矢量STD_LOGIC_VECTOR。使用時用USE語句顯式調(diào)用。(1)標(biāo)準(zhǔn)邏輯位STD_LOGIC

STD_LOGIC數(shù)據(jù)類型的定義如下所示:TYPESTD_LOGICIS('U','X',‘0’,'1','Z','W','L','H','-');各值的含義是:'U'--未初始化的,'X'--強未知的,‘0’--強0,'1'--強1,'Z'--高阻態(tài),'W'--弱未知的,'L'--弱0,'H'--弱1,'-'--忽略。IEEE預(yù)定義標(biāo)準(zhǔn)邏輯類型(2)標(biāo)準(zhǔn)邏輯矢量(STD_LOGIC_VECTOR)STD_LOGIC_VECTOR類型定義如下:TYPESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC;例如:Signala:std_logic_vector(7downto0);a<=”11001010”;IEEE預(yù)定義標(biāo)準(zhǔn)邏輯類型其它預(yù)定義數(shù)據(jù)類型VHDL綜合工具配帶的擴展程序包中,定義了一些有用的類型。如Synopsys公司在IEEE庫中加入的程序包STD_LOGIC_ARITH中定義了如下的數(shù)據(jù)類型:無符號型(UNSIGNED)、有符號型(SIGNED)和小整型(SMALL_INT)。NUMERIC_STD程序包和NUMERIC_BIT程序包中也分別定義了針對STD_LOGIC型和BIT型的UNSIGNED、SIGNED數(shù)據(jù)類型。使用這些數(shù)據(jù)類型時,必須首先打開相應(yīng)的程序包。(1)無符號數(shù)據(jù)類型(UNSIGNEDTYPE)UNSIGNED數(shù)據(jù)類型代表一個無符號的數(shù)值,在綜合器中,這個數(shù)值被解釋為一個二進(jìn)制數(shù),這個二進(jìn)制數(shù)的最左位是其最高位?!纠?-13】UNSIGNED型舉例:VARIABLEvar:UNSIGNED(0TO9);定義變量var為10位二進(jìn)制數(shù),最高位是var(0)。SIGNALsig:UNSIGNED(3TO0);定義信號sig為4位二進(jìn)制數(shù),最高位為sig(3)。其它預(yù)定義數(shù)據(jù)類型(2)有符號數(shù)據(jù)類型(SIGNEDTYPE)SIGNED數(shù)據(jù)類型表示一個有符號的數(shù)值,補碼表示,例如:SIGNED(“0101”)代表+5;SIGNED(“1011”)代表-5。【例4-14】SIGNED型舉例:VARIABLEvar:SIGNED(0TO9);定義變量var為10位二進(jìn)制數(shù),最高位var(0)是符號位。SIGNALsig:SIGNED(3TO0);定義信號sig為4位二進(jìn)制數(shù),最高位sig(3)是符號位。其它預(yù)定義數(shù)據(jù)類型用戶自定義數(shù)據(jù)類型包括自定義的新類和子類即有約束范圍的類;可以自定義的數(shù)據(jù)類型有:整數(shù)、實數(shù)、枚舉、物理、數(shù)組、記錄等。一般格式為:TYPE數(shù)據(jù)類型名{,數(shù)據(jù)類型名}IS數(shù)據(jù)類型定義;用戶自定義數(shù)據(jù)類型枚舉類型

VHDL中的枚舉數(shù)據(jù)類型是用文字符號來表示一組實際的二進(jìn)制數(shù)的類型(若直接用數(shù)值來定義,則必須使用單引號)。用戶自定義數(shù)據(jù)類型定義格式:TYPE數(shù)據(jù)類型名IS(元素1、元素2、…);編碼:枚舉類型的文字元素在綜合時會自動編碼,其編碼順序默認(rèn)最左邊元素為0,向右依次加1,即在枚舉列表中,最左邊值最小,最右邊值最大,可以使用比較運算。例:

TYPEweekIS(Sun,Mon,Tue,wed,Thu,Fri,Sat);

Signaltoday:week;

result<=‘1’whentoday>=Frielse‘0’;

枚舉類型

應(yīng)用

TYPEM_STATEIS(STATE1,STATE2,STATE3,STATE4,STATE5);

SIGNALCURRENT_STATE,NEXT_STATE:M_STATE;信號CURRENT_STATE和NEXT_STATE的數(shù)據(jù)類型定義為M_STATE,它們的取值范圍是可枚舉的,即從STATE1~STATE5共五種,而這些狀態(tài)代表五組唯一的二進(jìn)制數(shù)值。枚舉類型

在綜合中,整數(shù)和實數(shù)非枚舉型數(shù)據(jù)類型的取值定義范圍太大,綜合器無法進(jìn)行綜合。需要定義其約束范圍,綜合時將負(fù)數(shù)編碼為二進(jìn)制補碼,正數(shù)編碼為二進(jìn)制原碼。整數(shù)和實數(shù)子類型

定義格式:TYPE數(shù)據(jù)類型名IS數(shù)據(jù)類型定義約束范圍;SUBTYPE子類型名基本類型RANGE約束范圍;【例4-17】TYPEcurrentISREALRANGE-1E4TO1E4;TYPEdigit1ISINTEGERRANGE0TO9;SUBTYPEdigit2INTEGERRANGE-9TO9;綜合時digit1為4位二進(jìn)制原碼;digit2為5位二進(jìn)制補碼。整數(shù)和實數(shù)子類型

VHDL支持兩種復(fù)合類數(shù)據(jù)類型:數(shù)組和記錄。數(shù)組是相同類型元素的組合,記錄則是不同類型元素的組合。綜合器只支持一維數(shù)組或者線性記錄。數(shù)組的元素可以是任何一種數(shù)據(jù)類型,用以定義數(shù)組元素的下標(biāo)范圍子句決定了數(shù)組中元素的個數(shù)以及元素的排序方向,即下標(biāo)數(shù)是由低到高,或是由高到低。定義格式:TYPE數(shù)據(jù)類型名IS

ARRAY

范圍

OF原數(shù)據(jù)類型名;數(shù)組類型

數(shù)組定義示例【例4-18】TYPEwordISARRAY(1TO8)OFSTD_LOGIC;TYPEwordISARRAY(INTEGER1TO8)OFSTD_LOGIC;TYPEinstructionIS(ADD,SUB,INC,SRL,SRF,LDA,LDB);SUBTYPEdigitISINTEGER0TO9;TYPEindflagISARRAY(instructionADDTOSRF)OFdigit;數(shù)組類型

數(shù)組賦值與引用:以單個元素、段元素或數(shù)組整體為單位?!纠?-19】typebyteisarray(7downto0)ofbit;signala,b:byte;signalc:bit;signald:bit_vector(0to3);賦值:a<=“01000111”;等效于:a(7)<=‘0’;a(6)<=‘1’;……a(0)<=‘1’;引用:b<=a;c<=a(0);d<=a(7downto4);數(shù)組類型

線性記錄是指記錄中的元素是標(biāo)量,即不能含有復(fù)合型元素。定義格式:TYPE數(shù)組類型名ISRECORD

元素名:數(shù)據(jù)類型名;

元素名:數(shù)據(jù)類型名;

::ENDRECORD;記錄類型

記錄賦值:可以整體或指定單元素“記錄性對象.元素名”進(jìn)行個別賦值?!纠?-20】利用記錄類型定義的一個微處理器命令信息表。TYPEREGNAMEIS(AX,BX,CX,DX);TYPEOPERATIONISRECORDOPSTR﹕STRING(1TO10);OPCODE﹕BIT_VECTOR(3DOWNTO0);OP1,OP2,RES:REGNAME;ENDRECORDOPERATION;記錄類型

VARIABLEINSTR1,INSTR2:OPERATION;…INSTR1:=("ADDAX,BX","0001",AX,BX,AX);INSTR2:=("ADDAX,BX",“0010",OTHERS=>BX);VARIABLEINSTR3﹕OPERATION;…INSTR3.OPSTR:="MULAX,BX";INSTR3.OP1:=AX;記錄類型

VHDL是強類型語言,不同數(shù)據(jù)類型的對象,不能直接運算和代入。一般用類型轉(zhuǎn)換函數(shù)實現(xiàn)轉(zhuǎn)換。數(shù)據(jù)類型的變換函數(shù)通常由“STD_LOGIC_1164”、“STD_LOGIC_ARITH”、“STD_LOGIC_UNSIGNED”、“STD_LOGIC_OPS”等程序包提供。

數(shù)據(jù)類型轉(zhuǎn)換數(shù)據(jù)類型轉(zhuǎn)換表4-1常用類型轉(zhuǎn)換函數(shù)函數(shù)名定義程序包功能TO_STDLOGICVECTOR(A)STD_LOGIC_1164BIT_VECTOR轉(zhuǎn)STD_LOGIC_VECTORTO_BITVECTOR(A)STD_LOGIC_1164STD_LOGIC_VECTOR轉(zhuǎn)BIT_VECTORTO_STDLOGIC(A)STD_LOGIC_1164BIT轉(zhuǎn)STD_LOGICTO_BIT(A)STD_LOGIC_1164STD_LOGIC轉(zhuǎn)BITCONV_STD_LOGIC_VECTOR(a,位長)STD_LOGIC_ARITHINTEGER,UNSIGNED,SIGNED轉(zhuǎn)STD_LOGIC_VECTORCONV_INTEGER(a)STD_LOGIC_ARITHUNSIGNED,SIGNED轉(zhuǎn)INTEGERCONV_INTEGER(a)STD_LOGIC_UNSIGNEDSTD_LOGIC_VECTOR轉(zhuǎn)INTEGERTO_VECTOR(a,位長)DATAIO庫STD_LOGIC_OPSINTEGER轉(zhuǎn)STD_LOGIC_VECTORTO_INTEGER(a)STD_LOGIC_VECTOR轉(zhuǎn)INTEGER【例4-21】類型轉(zhuǎn)換函數(shù)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYCNT4ISPORT(CLK﹕INSTD_LOGIC;

P﹕BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));ENDENTITYCNT4;數(shù)據(jù)類型轉(zhuǎn)換LIBRARYDATAIO;USEDATAIO.STD_LOGIC_OPS.ALLARCHITECTUREARTOFCNT4ISBEGINPROCESS(CLK)ISBEGINIFCLK=‘1’ANDCLK'EVENTTHENP<=TO_VECTOR(TO_INTEGER(P)+1,4);

ENDIF;

ENDPROCESS;ENDARCHITECTUREART;數(shù)據(jù)類型轉(zhuǎn)換

此例中利用了DATAIO庫中的程序包STD_LOGIC_OPS中的兩個數(shù)據(jù)類型轉(zhuǎn)換函數(shù):TO_VECTOR和TO_INTEGER(前者將INTEGER轉(zhuǎn)換成STD_LOGIC_VECTOR,后者將STD_LOGIC_VECTOR轉(zhuǎn)換成INTEGER)。數(shù)據(jù)類型轉(zhuǎn)換【例4-1】

LIBRARYieee;--庫程序包調(diào)用

USEieee.std_logic_1164.ALL;

USEieee.std_logic_unsigned.ALL;

4.1基本結(jié)構(gòu)ENTITYcntm16IS--實體cntm16

GENERIC(cntwidth:integer:=4);

PORT

(ci:INstd_logic;

nreset:INstd_logic;

clk:INstd_logic;

co:OUTstd_logic;

qcnt:BUFFERstd_logic_vector(cntwidth-1DOWNTO0)

);

ENDcntm16;

4.1基本結(jié)構(gòu)ARCHITECTUREbehaveOFcntm16IS--結(jié)構(gòu)體

BEGIN

co<=’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;

ENDPROCESS;

ENDbehave;

4.1基本結(jié)構(gòu)VHDL的各種表達(dá)式由操作數(shù)和操作符組成,其中,操作數(shù)是各種運算的對象,而操作符則規(guī)定運算的方式。在VHDL中,一般有四類操作符,即邏輯操作符(LogicaOperator)、關(guān)系操作符(RelationaOperator)、算術(shù)操作符(ArithmeticOperator)和符號操作符(SignOperator),

4.2.4運算符邏輯運算符

種類

AND(與邏輯)、OR(或邏輯)、NAND(與非邏輯)、NOR(或非邏輯)、XOR(異或邏輯)、XNOR(同或邏輯)、NOT(非邏輯)。優(yōu)先級

NOT的優(yōu)先級高于其他6個,其他6個優(yōu)先級別相同。適用類型

Std_Logic、Bit、Boolean;std_logic_vector、bit_vector邏輯運算符

注意:一個表達(dá)式中有兩個以上的運算符時,要用括號將其分組。如果運算符是AND、OR、XOR中的某一種運算符的組合,則不需要加括號?!纠?-22】SIGNALa,b,c:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALd,e,f,g:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALh,I,j,k:STD_LOGIC;SIGNALl,m,n,o,p:BOOLEAN;邏輯運算符

...a<=bANDc;d<=eORfORg;--兩個操作符OR相同,不需括號

h<=(iNANDj)NANDk;l<=(mXORn)AND(oXORp);h<=iANDjANDk;

h<=iANDjORk;

a<=bANDe;

h<=iORl;

...算術(shù)運算符

求和類求積類混合類移位類求和類

求和類算術(shù)運算符包括:+(加)、-(減)、&(并置)。加、減運算的操作數(shù)是整數(shù)型,其他類型的數(shù)據(jù)加減時,則需要對運算符進(jìn)行重載。并置運算用于將多個對象或矢量連接成維數(shù)更大的矢量。連接時可采用位置關(guān)聯(lián)或序號關(guān)聯(lián)。求和類

并置運算連接方式:

【例4-23】signala,b,c,d:std_logic;signalq:std_logic_vector;q<=a&b&c&d;q<=(a,b,c,d);q<=(3=>a,0=>d,2=>b,1=>c);OTHERS使用

Q<=A&A&C&D;Q<=(1=>C,0=>D,OTHERS=>A);求積類

求積類算術(shù)運算符包括:*(乘)、/(除)、MOD(取模)、REM(取余)。VHDL規(guī)定,乘與除的數(shù)據(jù)類型是整數(shù)和實數(shù),而取模和取余的操作數(shù)及運算結(jié)果都是整數(shù)。求積類運算符只能有條件地被綜合,比如QuartusII規(guī)定乘、除右邊的操作數(shù)必須是2的冪,不支持MOD和REM運算?;旌项?/p>

混合類算術(shù)運算符包括:**(乘方)、ABS(取絕對值)。VHDL規(guī)定,混合運算的操作數(shù)一般為整數(shù)類型。而綜合器對乘方運算也有一定的限制。移位類

移位運算符包括:SLL(邏輯左移)、SRL(邏輯右移);(補0)SLA(算術(shù)左移)、SRA(算術(shù)右移);(不變)ROL(邏輯循環(huán)左移)、ROR(邏輯循環(huán)右移)。適用類型:

BIT或BOOLEAN數(shù)組;重載使其也支持STD_LOGIC_VECTOR和INTEGER。移位類

語句格式標(biāo)識符移位操作符移位位數(shù);移位操作符左邊是支持的類型,右邊必須是整數(shù)。舉例:

關(guān)系運算符

關(guān)系運算符包括:

=(等于)、/=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。比較結(jié)果:對相同數(shù)據(jù)類型的數(shù)據(jù)進(jìn)行數(shù)值比較,為BOOLEAN型常數(shù)TRUE或FALSE。關(guān)系運算符

應(yīng)用:【例4-25】Signala:std_logic_vector(3downto0):=”1010”;Signalb:std_logic_vector(3downto0):=”1011”;Signalc:std_logic_vector(3downto0):=”1010;Signald:Boolean;Signale:Boolean;d<=(a=b);--由于a和b不等,所以d的值為falsee<=(a=c);--由于a和c相等,所以e的值為TRUE符號運算符

符號操作符+(正號)和-(負(fù)號)的操作數(shù)只有一個,操作數(shù)的數(shù)據(jù)類型是整數(shù)?!?”符號對操作數(shù)不作任何改變,“—”符號用于返回操作數(shù)的反碼,使用時加括號,如:x:=y*(-z)運算順序

重載:

VHDL規(guī)定了每種運算符的適用數(shù)據(jù)類型,要想擴大其適用范圍,必須對原有的基本操作符重新定義,賦予新的含義和功能,從而建立一種新的操作符,這就是重載操作符,定義這種操作符的函數(shù)稱為重載函數(shù)。運算符重載

重載函數(shù)

STD_LOGIC_ARITH、STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包中為許多類型的運算重載了算術(shù)運算符和關(guān)系運算符;使用:

因此只要引用這些程序包,SINGEND、UNSIGEND、STD_LOGIC和INTEGER之間;INTEGER、STD_LOGIC和STD_LOGIC_VECTOR之間可以混合運算。運算符重載

【例4-26】libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycnt10is port(rst:instd_logic; clk:instd_logic; cnt:bufferstd_logic_vector(3downto0) );endcnt10;

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論