EDA技術(shù)與FPGA應(yīng)用設(shè)計(jì) 第三版 課件 第3-5章 常用EDA軟件、VHDL語(yǔ)言基礎(chǔ)、VHDL基本描述語(yǔ)句_第1頁(yè)
EDA技術(shù)與FPGA應(yīng)用設(shè)計(jì) 第三版 課件 第3-5章 常用EDA軟件、VHDL語(yǔ)言基礎(chǔ)、VHDL基本描述語(yǔ)句_第2頁(yè)
EDA技術(shù)與FPGA應(yīng)用設(shè)計(jì) 第三版 課件 第3-5章 常用EDA軟件、VHDL語(yǔ)言基礎(chǔ)、VHDL基本描述語(yǔ)句_第3頁(yè)
EDA技術(shù)與FPGA應(yīng)用設(shè)計(jì) 第三版 課件 第3-5章 常用EDA軟件、VHDL語(yǔ)言基礎(chǔ)、VHDL基本描述語(yǔ)句_第4頁(yè)
EDA技術(shù)與FPGA應(yīng)用設(shè)計(jì) 第三版 課件 第3-5章 常用EDA軟件、VHDL語(yǔ)言基礎(chǔ)、VHDL基本描述語(yǔ)句_第5頁(yè)
已閱讀5頁(yè),還剩238頁(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)介

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

Altera:MAX+PLUSII、

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

4、OTP器件編程

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

開(kāi)發(fā)過(guò)程:

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

二、源文件輸入

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

四、仿真驗(yàn)證

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

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

步驟2:輸入基本單元符號(hào)

步驟2:輸入基本單元符號(hào)

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

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

步驟4:連線

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

下載配置——下載第4章VHDL語(yǔ)言基礎(chǔ)常見(jiàn)的HDL有ABEL、AHDL、VHDL、VerilogHDL和SystemC等。HDLIEEE工業(yè)標(biāo)準(zhǔn)硬件描述語(yǔ)言VHDL、Verilog超高速集成電路硬件描述語(yǔ)言VHDL,美國(guó)國(guó)防部研究計(jì)劃硬件描述語(yǔ)言HDL第4章VHDL語(yǔ)言基礎(chǔ)覆蓋面廣,描述能力強(qiáng),多層次硬件描述語(yǔ)言VHDL有良好的可讀性,既是程序又是文件VHDL的移植性很強(qiáng)VHDL生命周期長(zhǎng),硬件描述與器件工藝無(wú)關(guān)代碼量大,書(shū)寫煩瑣VHDL第4章VHDL語(yǔ)言基礎(chǔ)基本組成語(yǔ)言要素本章內(nèi)容:4.1基本結(jié)構(gòu)參數(shù)部分實(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)實(shí)體結(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;--庫(kù)程序包調(diào)用

USEieee.std_logic_1164.ALL;

USEieee.std_logic_unsigned.ALL;

4.1基本結(jié)構(gòu)ENTITYcntm16IS--實(shí)體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ù)部分:庫(kù)(LIBRARY)、程序包(USE);

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

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

4.1基本結(jié)構(gòu)4.1基本結(jié)構(gòu)調(diào)用程序包語(yǔ)句實(shí)體及實(shí)體聲明語(yǔ)句結(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è)計(jì)約定

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

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

library<庫(kù)名>;

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

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

USEieee.std_logic_1164.ALL;實(shí)體(ENTITY)

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

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

:;

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

);END實(shí)體名;ENTITY實(shí)體名IS

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

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

GENERIC(cntwidth:integer:=4);

4.1.2實(shí)體部分PORT端口

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

4.1.2實(shí)體部分CICONRESETQCNT[3..0]CLKCNTM16端口模式端口模式說(shuō)明(以設(shè)計(jì)實(shí)體為主體)IN輸入,只讀模式,將變量或信號(hào)信息通過(guò)該端口讀入OUT輸出,單向賦值模式,將信號(hào)通過(guò)該端口輸出BUFFER具有讀功能的輸出模式,可以讀或?qū)?,只能有一個(gè)驅(qū)動(dòng)源INOUT雙向,可以通過(guò)該端口讀入或?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程序包中說(shuō)明,使用時(shí)首先打開(kāi)。實(shí)體實(shí)例【例4-3】4位全加器的實(shí)體描述。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)體主要用來(lái)描述實(shí)體的內(nèi)部結(jié)構(gòu),即描述一個(gè)實(shí)體的功能。描述方式行為描述方式、數(shù)據(jù)流描述方式、結(jié)構(gòu)描述方式、混合描述方式4.1.3結(jié)構(gòu)體部分結(jié)構(gòu)體格式ARCHITECTURE結(jié)構(gòu)體名OF實(shí)體名IS[結(jié)構(gòu)體說(shuō)明部分];BEGIN

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

描述該設(shè)計(jì)單元的功能,主要使用函數(shù)、過(guò)程和進(jìn)程語(yǔ)句,以算法形式描述數(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è)計(jì)單元的硬件結(jié)構(gòu),調(diào)用庫(kù)中的元件或是設(shè)計(jì)模塊,主要使用元件說(shuō)明語(yǔ)句及元件例化語(yǔ)句

結(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--元件說(shuō)明

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

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

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

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

2、以字母開(kāi)頭;

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ù)表示

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

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

有5部分組成:十進(jìn)制數(shù)表示數(shù)值的基數(shù);隔離符號(hào)“#”;該基數(shù)下對(duì)應(yīng)的數(shù)值;隔離符號(hào)“#”;十進(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ī)則字符串

字符、字符串:?jiǎn)我?hào)引起來(lái)的ASCII字符(數(shù)值、符號(hào)或字母);雙引號(hào)中的一維的字符數(shù)組。

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

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

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

2、語(yǔ)句格式分別為:

名(表達(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(bǔ)(6)值’1’

賦值給c

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

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

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

賦值給d

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

常量變量信號(hào)對(duì)象種類:

信號(hào)signal、變量variable、常量constant、文件file。

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

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

信號(hào):電路中的物理量,對(duì)應(yīng)于電路的連線和節(jié)點(diǎn)。信號(hào)說(shuō)明全局量,用于描述結(jié)構(gòu)體、實(shí)體、程序包。

4.2.2數(shù)據(jù)對(duì)象對(duì)象特點(diǎn):

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

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

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

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

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

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

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

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

4.2.2數(shù)據(jù)對(duì)象【例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ù)對(duì)象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ù)對(duì)象4.2.3數(shù)據(jù)類型VHDL是一種強(qiáng)類型語(yǔ)言,要求設(shè)計(jì)實(shí)體中的每一個(gè)常數(shù)、信號(hào)、變量、函數(shù)以及設(shè)定的各種參量都必須具有確定的數(shù)據(jù)類型,并且只有數(shù)據(jù)類型相同的量才能互相傳遞和作用。VHDL中的數(shù)據(jù)類型:標(biāo)量(整數(shù)、浮點(diǎn)、枚舉、物理)、復(fù)合(數(shù)組、記錄)、文件、存取

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

和類型轉(zhuǎn)換等。標(biāo)準(zhǔn)數(shù)據(jù)類型(可直接引用)在VHDL標(biāo)準(zhǔn)程序包STANDARD中定義的,在實(shí)際使用中,已自動(dòng)包含進(jìn)VHDL的源文件中,因而不必通過(guò)USE語(yǔ)句以顯式調(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ù)常量的書(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í)數(shù)

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

位數(shù)據(jù)類型也屬于枚舉型,取值‘1’或‘0’??梢赃M(jìn)行邏輯運(yùn)算,運(yùn)算結(jié)果仍是位數(shù)據(jù)類型。VHDL綜合器用一個(gè)二進(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;位矢量是用雙引號(hào)括起來(lái)的一組位數(shù)據(jù)。Signala:bit_vector(7downto0):=”11001010”;

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

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

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

字符(CHARACTER)

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

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

VARIABLESTRING_VAR﹕STRING(1TO7);

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

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

ps=1000fs; --皮秒

ns=1000ps; --納秒

us=1000ns; --微秒

ms=1000us;--毫秒

sec=1000ms;--秒

min=60sec; --分

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

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

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

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

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

SUBTYPENATURALISINTEGERRANGE0TOINTEGER'HIGH;

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

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

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

和標(biāo)準(zhǔn)邏輯矢量STD_LOGIC_VECTOR。使用時(shí)用USE語(yǔ)句顯式調(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'--強(qiáng)未知的,‘0’--強(qiáng)0,'1'--強(qiáng)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綜合工具配帶的擴(kuò)展程序包中,定義了一些有用的類型。如Synopsys公司在IEEE庫(kù)中加入的程序包STD_LOGIC_ARITH中定義了如下的數(shù)據(jù)類型:無(wú)符號(hào)型(UNSIGNED)、有符號(hào)型(SIGNED)和小整型(SMALL_INT)。NUMERIC_STD程序包和NUMERIC_BIT程序包中也分別定義了針對(duì)STD_LOGIC型和BIT型的UNSIGNED、SIGNED數(shù)據(jù)類型。使用這些數(shù)據(jù)類型時(shí),必須首先打開(kāi)相應(yīng)的程序包。(1)無(wú)符號(hào)數(shù)據(jù)類型(UNSIGNEDTYPE)UNSIGNED數(shù)據(jù)類型代表一個(gè)無(wú)符號(hào)的數(shù)值,在綜合器中,這個(gè)數(shù)值被解釋為一個(gè)二進(jìn)制數(shù),這個(gè)二進(jìn)制數(shù)的最左位是其最高位?!纠?-13】UNSIGNED型舉例:VARIABLEvar:UNSIGNED(0TO9);定義變量var為10位二進(jìn)制數(shù),最高位是var(0)。SIGNALsig:UNSIGNED(3TO0);定義信號(hào)sig為4位二進(jìn)制數(shù),最高位為sig(3)。其它預(yù)定義數(shù)據(jù)類型(2)有符號(hào)數(shù)據(jù)類型(SIGNEDTYPE)SIGNED數(shù)據(jù)類型表示一個(gè)有符號(hào)的數(shù)值,補(bǔ)碼表示,例如:SIGNED(“0101”)代表+5;SIGNED(“1011”)代表-5?!纠?-14】SIGNED型舉例:VARIABLEvar:SIGNED(0TO9);定義變量var為10位二進(jìn)制數(shù),最高位var(0)是符號(hào)位。SIGNALsig:SIGNED(3TO0);定義信號(hào)sig為4位二進(jìn)制數(shù),最高位sig(3)是符號(hào)位。其它預(yù)定義數(shù)據(jù)類型用戶自定義數(shù)據(jù)類型包括自定義的新類和子類即有約束范圍的類;可以自定義的數(shù)據(jù)類型有:整數(shù)、實(shí)數(shù)、枚舉、物理、數(shù)組、記錄等。一般格式為:TYPE數(shù)據(jù)類型名{,數(shù)據(jù)類型名}IS數(shù)據(jù)類型定義;用戶自定義數(shù)據(jù)類型枚舉類型

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

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

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

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

VHDL支持兩種復(fù)合類數(shù)據(jù)類型:數(shù)組和記錄。數(shù)組是相同類型元素的組合,記錄則是不同類型元素的組合。綜合器只支持一維數(shù)組或者線性記錄。數(shù)組的元素可以是任何一種數(shù)據(jù)類型,用以定義數(shù)組元素的下標(biāo)范圍子句決定了數(shù)組中元素的個(gè)數(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ù)組賦值與引用:以單個(gè)元素、段元素或數(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;記錄類型

記錄賦值:可以整體或指定單元素“記錄性對(duì)象.元素名”進(jìn)行個(gè)別賦值。【例4-20】利用記錄類型定義的一個(gè)微處理器命令信息表。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是強(qiáng)類型語(yǔ)言,不同數(shù)據(jù)類型的對(duì)象,不能直接運(yùn)算和代入。一般用類型轉(zhuǎn)換函數(shù)實(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,位長(zhǎng))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,位長(zhǎng))DATAIO庫(kù)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庫(kù)中的程序包STD_LOGIC_OPS中的兩個(gè)數(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;--庫(kù)程序包調(diào)用

USEieee.std_logic_1164.ALL;

USEieee.std_logic_unsigned.ALL;

4.1基本結(jié)構(gòu)ENTITYcntm16IS--實(shí)體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ù)是各種運(yùn)算的對(duì)象,而操作符則規(guī)定運(yùn)算的方式。在VHDL中,一般有四類操作符,即邏輯操作符(LogicaOperator)、關(guān)系操作符(RelationaOperator)、算術(shù)操作符(ArithmeticOperator)和符號(hào)操作符(SignOperator),

4.2.4運(yùn)算符邏輯運(yùn)算符

種類

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

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

Std_Logic、Bit、Boolean;std_logic_vector、bit_vector邏輯運(yùn)算符

注意:一個(gè)表達(dá)式中有兩個(gè)以上的運(yùn)算符時(shí),要用括號(hào)將其分組。如果運(yùn)算符是AND、OR、XOR中的某一種運(yùn)算符的組合,則不需要加括號(hào)。【例4-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;邏輯運(yùn)算符

...a<=bANDc;d<=eORfORg;--兩個(gè)操作符OR相同,不需括號(hào)

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

h<=iANDjORk;

a<=bANDe;

h<=iORl;

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

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

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

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

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

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

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

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

關(guān)系運(yùn)算符

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

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

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

重載:

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

重載函數(shù)

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

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

【例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. 本站所有資源如無(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)論