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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

Altera:MAX+PLUSII、

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

4、OTP器件編程

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

開發過程:

一、建立設計工程

二、源文件輸入

三、編譯(設計處理)

四、仿真驗證

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

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

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

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

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

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

步驟4:連線

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

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

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

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

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

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

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

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

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

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

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

將設計項目設置成可調用元件

File---Create/Update---CreatesymbolFilesforCurrentFile設計頂層文件

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

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

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

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

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

新建工程點擊“Next”按鈕,出現新建工程概要界面,顯示新建工程名、目標芯片等信息,點擊“Finish”按鈕,完成工程創建,新建工程界面如圖所示。3.4.2

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

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

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

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

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

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

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

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

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

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

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

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

波形仿真——波形仿真參數設置在工程管理區點擊“SIMULATION”下的“RunSimulation”圖標,在顯示列表中選擇RunBehavioralSimulation選項,波形仿真結果如圖所示。3.4.4

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

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

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

管腳定義下載配置過程包括生成比特流文件,啟動編程工具將生成的比特流文件下載到FPGA內部,或將生成的比特流文件轉換成EEPROM文件,并下載到FPGA的配置存儲芯片中。下面介紹JTAG下載模式下將比特流文件直接下載到FPGA內部的流程。3.4.6

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

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

下載配置——下載第4章VHDL語言基礎常見的HDL有ABEL、AHDL、VHDL、VerilogHDL和SystemC等。HDLIEEE工業標準硬件描述語言VHDL、Verilog超高速集成電路硬件描述語言VHDL,美國國防部研究計劃硬件描述語言HDL第4章VHDL語言基礎覆蓋面廣,描述能力強,多層次硬件描述語言VHDL有良好的可讀性,既是程序又是文件VHDL的移植性很強VHDL生命周期長,硬件描述與器件工藝無關代碼量大,書寫煩瑣VHDL第4章VHDL語言基礎基本組成語言要素本章內容:4.1基本結構參數部分實體部分結構體例:2選1多路選擇器的VHDL描述4.1基本結構sy0a1b2選1多路選擇器的VHDL描述4.1基本結構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基本結構實體結構體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基本結構sy0a1b【例4-1】

LIBRARYieee;--庫程序包調用

USEieee.std_logic_1164.ALL;

USEieee.std_logic_unsigned.ALL;

4.1基本結構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基本結構ARCHITECTUREbehaveOFcntm16IS--結構體

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基本結構模塊結構

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

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

結構體(ARCHITECTURE):賦值、進程(PROCESS-IF)。

4.1基本結構4.1基本結構調用程序包語句實體及實體聲明語句結構體1結構體2結構體n標準程序包標準程序包定義程序包定義程序包進程1進程2進程nVHDL程序設計約定

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

存放已經編譯的實體、結構體、程序包和配置,用于設計共享,是編程資源。

library<庫名>;

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

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

USEieee.std_logic_1164.ALL;實體(ENTITY)

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

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

:;

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

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

4.1.2實體部分GENERIC類屬參數

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

GENERIC(cntwidth:integer:=4);

4.1.2實體部分PORT端口

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

4.1.2實體部分CICONRESETQCNT[3..0]CLKCNTM16端口模式端口模式說明(以設計實體為主體)IN輸入,只讀模式,將變量或信號信息通過該端口讀入OUT輸出,單向賦值模式,將信號通過該端口輸出BUFFER具有讀功能的輸出模式,可以讀或寫,只能有一個驅動源INOUT雙向,可以通過該端口讀入或寫出信息PORT端口模式端口數據類型VHDL數據類型:預定義數據類型、自定義數據類型只能使用已經定義的數據類型例4-1中數據類型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;結構體(ARCHITECTURE)

結構體主要用來描述實體的內部結構,即描述一個實體的功能。描述方式行為描述方式、數據流描述方式、結構描述方式、混合描述方式4.1.3結構體部分結構體格式ARCHITECTURE結構體名OF實體名IS[結構體說明部分];BEGIN

結構體描述部分;END結構體名;4.1.3結構體部分結構體組成4.1.3結構體部分行為描述

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

結構體描述風格例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;

行為描述結構描述

描述該設計單元的硬件結構,調用庫中的元件或是設計模塊,主要使用元件說明語句及元件例化語句

結構體描述風格例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);

結構描述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;

結構描述數據流描述從信號到信號的數據流的路徑形式進行描述。使用并行的信號賦值語句,既顯式表示了該設計單元的行為,也隱式表示了該設計單元的結構。

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

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

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

2、以字母開頭;

3、下劃線不能放在結尾;

4、下劃線不能連用;

5、不能使用保留字;

6、VHDL不區分大小寫。4.2.1文字規則數值表示(1)整數表示

整數表示十進制數值,如:

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

(2)實數表示

實數也表示十進制數值,必須帶有小數點,如:

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

有5部分組成:十進制數表示數值的基數;隔離符號“#”;該基數下對應的數值;隔離符號“#”;十進制表示的指數部分。

2#1110#--二進制表示數值14

8#120#--八進制表示數值80

16#A0#--十六進制表示數值160

10#12#E2--十進制表示數值1200

16#D#E1--十六進制表示數值2084.2.1文字規則字符串

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

如:‘R’,‘a’,‘*’,‘Z’,‘-’

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

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

2、語句格式分別為:

名(表達式);

名(表達式1to/downto表達式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數據對象數據對象類似于一種容器,接受不同數據類型的賦值

常量變量信號對象種類:

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

常量:不對應電路中的物理量,但可以說明全局量。在結構體、實體、程序包、進程、函數、過程中均可使用。

變量:程序運算的中間量,并不對應電路中的物理量。變量說明局部量,用于進程、函數、過程。

信號:電路中的物理量,對應于電路的連線和節點。信號說明全局量,用于描述結構體、實體、程序包。

4.2.2數據對象對象特點:

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

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

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

對象種類對象名:數據類型[:=表達式];

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

2、表達式用于設定初始值,是可選項。

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

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

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

。VHDL中的數據類型引用方式有:預定義、自定義

和類型轉換等。標準數據類型(可直接引用)在VHDL標準程序包STANDARD中定義的,在實際使用中,已自動包含進VHDL的源文件中,因而不必通過USE語句以顯式調用。

4.2.3數據類型標準數據類型(1)整數(INTEGER)

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

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

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

標準數據類型(4)位矢量(BIT_VECTOR)

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

標準數據類型(5)布爾(BOOLEAN)

布爾數據類型實際上是一個二值枚舉型數據類型,它的取值有FALSE和TRUE兩種。可以進行關系運算和邏輯運算,不能用于算術運算。IFa=b

標準數據類型(6)

字符(CHARACTER)

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

非約束型字符數組,或稱為字符串數組。字符串必須用雙引號標明。

VARIABLESTRING_VAR﹕STRING(1TO7);

…STRING_VAR:=“ABCD”;標準數據類型

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

ps=1000fs; --皮秒

ns=1000ps; --納秒

us=1000ns; --微秒

ms=1000us;--毫秒

sec=1000ms;--秒

min=60sec; --分

hr=60min; --時enduntis;標準數據類型(9)錯誤等級(SEVERITY_LEVEL)

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

TYPESEVERITY_LEVEIS(NOTE,WARNING,ERROR,FAILURE);

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

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

SUBTYPENATURALISINTEGERRANGE0TOINTEGER'HIGH;

SUBTYPEPOSITIVEISINTEGERRANGE1TOINTEGER'HIGH;標準數據類型

IEEE預定義標準邏輯類型

在IEEE庫的程序包STD_LOGIC_1164中,定義了兩個非常重要的數據類型,即標準邏輯位STD_LOGIC

和標準邏輯矢量STD_LOGIC_VECTOR。使用時用USE語句顯式調用。(1)標準邏輯位STD_LOGIC

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

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

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

Signaltoday:week;

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

枚舉類型

應用

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

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

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

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

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

ARRAY

范圍

OF原數據類型名;數組類型

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

數組賦值與引用:以單個元素、段元素或數組整體為單位。【例4-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);數組類型

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

元素名:數據類型名;

元素名:數據類型名;

::ENDRECORD;記錄類型

記錄賦值:可以整體或指定單元素“記錄性對象.元素名”進行個別賦值。【例4-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是強類型語言,不同數據類型的對象,不能直接運算和代入。一般用類型轉換函數實現轉換。數據類型的變換函數通常由“STD_LOGIC_1164”、“STD_LOGIC_ARITH”、“STD_LOGIC_UNSIGNED”、“STD_LOGIC_OPS”等程序包提供。

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

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

ENDIF;

ENDPROCESS;ENDARCHITECTUREART;數據類型轉換

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

LIBRARYieee;--庫程序包調用

USEieee.std_logic_1164.ALL;

USEieee.std_logic_unsigned.ALL;

4.1基本結構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基本結構ARCHITECTUREbehaveOFcntm16IS--結構體

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基本結構VHDL的各種表達式由操作數和操作符組成,其中,操作數是各種運算的對象,而操作符則規定運算的方式。在VHDL中,一般有四類操作符,即邏輯操作符(LogicaOperator)、關系操作符(RelationaOperator)、算術操作符(ArithmeticOperator)和符號操作符(SignOperator),

4.2.4運算符邏輯運算符

種類

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

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

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

注意:一個表達式中有兩個以上的運算符時,要用括號將其分組。如果運算符是AND、OR、XOR中的某一種運算符的組合,則不需要加括號。【例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;邏輯運算符

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

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

h<=iANDjORk;

a<=bANDe;

h<=iORl;

...算術運算符

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

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

并置運算連接方式:

【例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);求積類

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

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

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

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

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

關系運算符

關系運算符包括:

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

應用:【例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符號運算符

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

重載:

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

重載函數

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

因此只要引用這些程序包,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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論