第3章 組合電路的VHDL設計_第1頁
第3章 組合電路的VHDL設計_第2頁
第3章 組合電路的VHDL設計_第3頁
第3章 組合電路的VHDL設計_第4頁
第3章 組合電路的VHDL設計_第5頁
已閱讀5頁,還剩101頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章組合電路的VHDL設計組合電路的VHDL設計3.1多路選擇器及其VHDL描述3.2半加器及其VHDL描述3.34選1多路選擇器及其VHDL描述3.4全加器及其VHDL表述3.5乘法器及其VHDL描述

本章首先給出幾種大家熟知的簡單而典型的組合電路實例,然后按以下幾個步驟,由淺入深地引領大家進入“VHDL語言”與“電路情景”之間的對話——

(1)電路實例作為情景(Episode)探討其性能特點和設計方法;(2)針對電路情景的具體對象,給出對應的VHDL表述;(3)對VHDL表述中出現(xiàn)的語句含義作詳細解釋,力圖從整體和實用角度把握VHDL與電路情景的對應關系,以及程序的基本結構,表述特點和設計方法,快速進入VHDL世界;(4)隨后將學到的知識在QuartusII和FPGA平臺上加以驗證和自主發(fā)揮,鞏固學習效果、提高學習興趣、強化理論與工程實際的結合。組合電路的VHDL設計3.1多路選擇器及其VHDL描述

2選1多路選擇器具備組合邏輯電路的簡單性和典型性的特征。3.1多路選擇器及其VHDL描述

例3-1給出的是mux21a所對應的VHDL完整描述之一。此描述展示了可綜合的VHDL程序的模塊結構。對于此程序,可使用VHDL綜合器直接綜合出實現(xiàn)此模塊功能的邏輯電路,其電路功能見圖3-3所示的時序波形??梢哉J為,圖3-1的模塊與圖3-3的波形功能表述具有唯一對應關系,而其電路結構表述卻沒有唯一性。即對于既定的電路功能描述,對應的電路結構并不唯一,它可以對應不同的電路構建方式,這取決于:VHDL綜合器的基本元件庫的來源、優(yōu)化方向和約束的選擇,以及目標器件(如FPGA)的結構特點等。其實,基于EDA的數(shù)字系統(tǒng)設計更注重最終完成的電路功能和性能(包括系統(tǒng)速度,資源利用率等)而非電路構建形式。3.1多路選擇器及其VHDL描述

3.1多路選擇器及其VHDL描述

VHDL描述的兩大組成部分——

(1)實體:以關鍵詞(或關鍵字)ENTITY引導,ENDENTITYmux21a結尾的語句部分。例3-1中的mux21a稱為實體名,。VHDL的實體描述電路器件的外部情況及各信號端口的基本性質,如信號流動方向、流動信號的數(shù)據(jù)類型等。圖3-1可以認為是此實體的圖形表述。

(2)結構體:以關鍵詞ARCHITECTURE引導,ENDARCHITECTUREbhv結尾的語句部分。例3-1中的bhv稱為結構體名。結構體負責描述電路器件的內部邏輯功能和電路結構。圖3-2所示的是此結構體的某種可能的電路結構表達。下面對例3-1中出現(xiàn)的相關語句結構和語法含義作出說明。3.1多路選擇器及其VHDL描述

1.條件語句

VHDL結構體中,用于描述邏輯功能和電路結構的語句分為順序語句和并行語句兩部分。

●順序語句:按照語句的前后排列方式逐條順序執(zhí)行。

●并行語句:無論有多少行語句,都同時執(zhí)行,與次序無關。

★“IF_THEN_ELSE”語句屬于順序語句

——

由關鍵詞IF引導,首先通過條件語句判斷:表達式(s=‘1’),即s為高電平,執(zhí)行賦值語句y<=a,即將a端口的數(shù)據(jù)向y輸出;否則(即ELSE),即s為低電平,則執(zhí)行賦值語句y<=b。最后以“ENDIF;”結束。

用于條件語句的判斷表達式可以是一個值,也可以是更復雜的邏輯或運算表達式。如例3-1中的(s=‘1’)或以下IF語句表述中的a或(s1=‘0’)AND(s2=‘1’)OR(c<b+1)。其表達形式不同,但本質上都輸出一個用于作邏輯判斷的布爾值:“真”或“偽”。3.1多路選擇器及其VHDL描述

2.數(shù)據(jù)類型

PORT語句中端口信號a、b、s和y的數(shù)據(jù)類型都為BIT。

VHDL規(guī)定:任何一種數(shù)據(jù)對象的應用都必須對其傳輸或存儲的數(shù)據(jù)的類型要作明確的界定。因此,在VHDL設計中,必須預先定義好要使用的數(shù)據(jù)類型,這對于大規(guī)模電路描述的排錯十分有利。數(shù)據(jù)類型:整數(shù)類型INTEGER、布爾類型BOOLEAN和標準邏輯類型STD_LOGIC等。

BIT數(shù)據(jù)類型:信號規(guī)定的取值范圍是邏輯位‘1’和‘0’。在VHDL中,邏輯位0和1的表達必須加單引號;否則,VHDL綜合器將其解釋為整數(shù)數(shù)據(jù)類型INTEGER,即:將1理解為1、2、3的1,而非二進制0、1的1,或邏輯位的1。3.1多路選擇器及其VHDL描述

2.數(shù)據(jù)類型

BIT數(shù)據(jù)類型:可參與邏輯運算,結果仍是邏輯位的數(shù)據(jù)類型。

VHDL綜合器:用1個二進制位表示BIT類型或BOOLEAN類型。例如:將例3-1中的端口信號a、b、s和y的數(shù)據(jù)類型都定義為BIT,即表示它們的取值范圍,或者說數(shù)據(jù)范圍都被限定在邏輯位‘1’和‘0’兩個值的范圍內。條件語句中判斷表達式,如(s1=‘0’),輸出的是判斷結果,分別是“TURE”或“FALSE”,其數(shù)據(jù)類型是BOOLEAN,在數(shù)值上分別對應‘1’(真)或‘0’(偽)。即如果s1為低電平,則在綜合器(s1=‘0’)=‘1’。注:這個由條件判斷式計算出來的值‘1’的數(shù)據(jù)類型是BOOLEAN(代表“真”或“偽”的判斷結果),不是二進制的‘1’(其類型可以是BIT)。3.1多路選擇器及其VHDL描述

3.進程語句和順序語句

進程語句:由PROCESS引導的語句。在VHDL中,所有順序描述語句都必須放在進程語句中(也包括放在過程語句中)。例3-1可見,順序語句“IF_THEN_ELSE_ENDIF;”是放在由PROCESS至ENDPROCESS引導的語句結構中的。

敏感信號表:PROCESS旁的(a,b,s)。通常要求將進程中所有的輸入信號都放在敏感信號表中。例如例3-1中的輸入信號a、b和s出現(xiàn)在了進程語句中,所以須將它們全部列入敏感信號表中。

PROCESS語句的執(zhí)行依賴于敏感信號的變化(或稱發(fā)生事件),當某一敏感信號有變,如a,從‘1’跳變到‘0’,或從‘0’跳變到‘1’時,就將啟動此進程語句,于是該PROCESS至ENDPROCESS引導的語句(包括其中的順序語句)被執(zhí)行一遍;然后返回進程的起始端,進入等待狀態(tài),直到下一次敏感信號表中某一信號或某些信號發(fā)生事件后才再次進入“啟動-運行”狀態(tài)。

★1個結構體可包含任意個進程語句結構,所有的進程語句本身都是并行語句,而由任1進程PROCESS引導的語句屬于順序語句。

3.1多路選擇器及其VHDL描述

4.端口語句和端口信號名

描述電路的端口及其端口信號必須用端口語句PORT()來引導,并在語句結尾處加分號“;”。

在例3-1的實體描述中——

IN:定義端口a、b和s為信號輸入端口。

OUT:定義端口y為信號輸出端口。端口模式用于定義端口上數(shù)據(jù)的流動方向和方式,有如圖3-4所示的4種:3.1多路選擇器及其VHDL描述

5.端口模式

(1)IN:輸入端口。定義的通道為單向只讀模式,即規(guī)定數(shù)據(jù)只能由此端口被讀入實體中。

(2)OUT:輸出端口。定義的通道為單向輸出模式,即規(guī)定數(shù)據(jù)只能通過此端口從實體向外流出,或者說可以將實體中的數(shù)據(jù)向此端口賦值。

(3)INOUT:雙向端口。定義的通道確定為輸入輸出雙向端口,即從端口的內部看,可以對此端口進行賦值,或通過此端口讀入外部的數(shù)據(jù)信息;而從端口的外部看,信號既可由此端口流出,也可向此端口輸入信號,如RAM的數(shù)據(jù)口、單片機的I/O口等。

(4)BUFFER:緩沖端口。其功能與INOUT類似,區(qū)別在于當需要輸入數(shù)據(jù)時,只允許內部回讀輸出的信號,即允許反饋。如計數(shù)器設計,可將計數(shù)器輸出的計數(shù)信號回讀,以作為下一計數(shù)值的初值。與INOUT模式相比,BUFFER回讀的信號不是由外部輸入的,而是由內部產生、向外輸出的信號。3.1多路選擇器及其VHDL描述

6.關鍵字

關鍵詞(KeyWord):指VHDL中預定義的有特殊含義的英文詞語?!馰HDL程序設計者不能用關鍵字命名自用對象(如標識符等)。如例3-1中的ENTITY、ARCHITECTURE、END、IF、ELSE、OUT和IN等,還有AND、OR等邏輯操作符,這些都屬于關鍵字。

●現(xiàn)在多數(shù)VHDL文本編輯器,包括QuartusII的編輯器,都是關鍵字敏感型的(遇到關鍵字會以特定顏色顯示),所以在編輯程序時通常不會誤用關鍵字?!咀⒁狻浚阂膊灰`將EDA軟件工具庫中已定義好的關鍵詞或元件名當做普通標識符來用。

●VHDL的關鍵字對大小寫不敏感,即在同一程序中,關鍵字大小寫可以混用。3.1多路選擇器及其VHDL描述

7.標識符

標識符(Identifier)是設計者在VHDL程序中自定義的,用于標識不同名稱的詞語。例如用作實體名、結構體名、端口名或信號名等。如例3-1中出現(xiàn)過的mux21a、b、one等。

●標識符也不區(qū)分大小寫。例如在同一VHDL程序中,標識符A和a、y和Y分別表示同一信號。

●標識符不應用數(shù)字、數(shù)字起頭的文字或中文來表述。

●符號“--”是注釋符號。注釋符號可用于隔離程序,添加程序說明文字。因此注釋符號“--”后的文字僅僅是為了使對應的數(shù)據(jù)或語句更容易被看懂,它們本身沒有功能含義,也不參加邏輯綜合。3.2半加器及其VHDL描述

半加器(設此模塊的器件名是h_adder)的電路原理圖如圖3-5所示,半加器對應的邏輯真值表如圖3-6所示。此電路模塊由兩個基本邏輯門元件構成,即與門和異或門。

A和B:

加數(shù)和被加數(shù)的數(shù)據(jù)輸入端口;

SO:是和值的數(shù)據(jù)輸出端口;

CO:

是進位數(shù)據(jù)的輸出端口。根據(jù)圖3-5的電路結構,很容易獲得半加器的邏輯表述是:

圖3-7是此半加器電路的時序波形,它反映了此模塊的邏輯功能。根據(jù)這些敘述可以給出對應的VHDL描述,即例3-2所示的半加器電路模塊的VHDL表述。此描述展示了可綜合的VHDL程序的模塊結構。3.2半加器及其VHDL描述圖3-8所示:VHDL程序最常用結構框圖例3-2右側的文字說明:

可看出,例3-2程序雖簡單,但卻包含了VHDL

完整的程序結構和必要的語句元素。

由例3-2和圖3-8可見——

VHDL程序結構分三大部分:庫與程序包的調用語句、由ENTITY引導的描述電路端口的實體,以及由ARCHITECTURE引導的描述電路功能的結構體。不過,后兩個部分是必須存在的,例3-1就是一個例子。3.2半加器及其VHDL描述3.2半加器及其VHDL描述1.實體表達與實體名

下面在3.1節(jié)中已展示的VHDL相關知識的基礎上,針對例3-2中新出現(xiàn)的VHDL語句結構、語法規(guī)則和程序設計規(guī)范作出說明。VHDL完整的、可綜合的程序結構必須能完整地表達一個數(shù)字電路功能模塊的端口形式和電路功能,即無論是一片74LS138還是一片CPU,都必須包含實體和結構體兩個最基本的語言結構。

設計實體:含有完整程序結構(即圖3-8所示的結構)的VHDL表述。實體描述的是:電路器件的端口構成(有哪些端口),端口類型(信號的流動方向和方式)和端口上流動的信號的屬性,它的一般表述格式如下:3.2半加器及其VHDL描述

關鍵詞:

ENTITY、IS、PORT和ENDENTITY都是描述實體的關鍵詞,在實體描述中必須包含在內;

data_type:

是定義port_m等端口的數(shù)據(jù)類型名;

e_name:

是實體名。實體名屬于標識符,具體取名由設計者自定。由于實體名實際上表達的應該是設計電路的器件名,所以通常根據(jù)相應電路的功能來確定。如4位二進制計數(shù)器,實體名可取為counter4b;8位二進制加法器,實體名可取為ADDER8B等。

★不能用與EDA軟件工具庫中已定義好的元件名作為實體名,如or2、latch等,也不能用數(shù)字起頭的實體名,如74LS160。3.2半加器及其VHDL描述2.結構體表達結構體的一般表述格式如下:

其中,ARCHITECTURE、OF、IS、BEGIN和ENDARCHITECTURE都是描述結構體的關鍵詞,在描述中必須包含它們。arch_name是結構體名,是標識符。

“說明語句”:包括在結構體中,用以說明和定義數(shù)據(jù)對象、數(shù)據(jù)類型、元件調用聲明等。描述中并非必需。

“功能描述語句”:在結構體中給出的相應的電路功能描述語句,可以是并行語句、順序語句或它們的混合。描述中必須存在。3.2半加器及其VHDL描述2.結構體表達

一個可綜合的、完整的VHDL程序有比較固定的結構,如圖3-8所示。

(1)各類庫及其程序包的使用聲明。包括未以顯式表達的工作庫WORK庫的使用聲明;

(2)實體描述;

(3)結構體描述。而在結構體中可以含有不同的邏輯表達語句結構。

★例3-2的實體和結構體分別是以“ENDENTITYxxx;”和“ENDARCHITECTURExxx;”語句結尾的,這符合VHDL的IEEESTD1076-1993版的語法要求。若根據(jù)VHDL’87版本,即IEEESTD1076-1987的語法要求,這兩條結尾語句只需寫成“END;”或“ENDxx;”。★絕大多數(shù)常用的EDA工具中的VHDL綜合器都兼容兩種VHDL版本的語法規(guī)則。但對于不同的EDA工具,仍需根據(jù)設計程序不同的VHDL版本表述,在綜合前作相應的設置。3.2半加器及其VHDL描述3.標準邏輯位數(shù)據(jù)類型STD_LOGIC

就數(shù)字系統(tǒng)設計來說,類型STD_LOGIC比BIT包含的內容豐富和完整得多,而且此數(shù)據(jù)類型也包含BIT類型VHDL的BIT數(shù)據(jù)類型定義語句——VHDL的STD_LOGIC數(shù)據(jù)類型包含BIT類型,其定義語句——STD_LOGIC所定義的九種數(shù)據(jù)的含義是——

‘U’表示未初始化的;‘X’表示強未知的;‘0’表示強邏輯0;‘1’表示強邏輯1;‘Z’表示高阻態(tài);‘W’表示弱未知的;‘L’表示弱邏輯0;‘H’表示弱邏輯1;‘-’表示忽略。3.2半加器及其VHDL描述3.標準邏輯位數(shù)據(jù)類型STD_LOGIC

完整地概括了數(shù)字系統(tǒng)中所有可能的數(shù)據(jù)表現(xiàn)形式,因而其描述與實際電路有更好更實用的適應性。在仿真和綜合中,將端口信號或其他數(shù)據(jù)對象定義為STD_LOGIC數(shù)據(jù)類型是非常重要且最為常用的,它可以使設計者精確地模擬一些未知的和具有高阻態(tài)的線路情況。對于綜合器,高阻態(tài)‘Z’和忽略態(tài)‘-’(有的綜合器用‘X’)可用于三態(tài)的描述。

STD_LOGIC型數(shù)據(jù)只有其中的四五種值在數(shù)字器件中可實現(xiàn)的(即綜合器可接受的)

——‘X’(或/和‘-’)、‘0’、‘1’和‘Z’。其他類型不可綜合,只能用于VHDL仿真。

STD_LOGIC數(shù)據(jù)類型中的取值多數(shù)可在現(xiàn)實電路中找到對應現(xiàn)象。如由74LS04某反相器輸出高電平,則此端口對應強邏輯‘1’;若此端口串接一個100k電阻,其輸出則對應弱邏輯‘H’;若此端口串接一大于1M電阻的輸出則基本對應高阻態(tài)邏輯‘Z’;而‘X’或‘-’與數(shù)字電路教材中卡諾圖中的任意值有對應關系。

3.2半加器及其VHDL描述4.賦值符號和邏輯操作符

例3-2中的表達式CO<=AANDB和SO<=AXORB表示輸入端口A、B兩信號分別作邏輯與和邏輯異或運算后,再分別將結果向輸出端口CO和SO傳輸,或解釋為向信號CO和SO賦值。這里,A和B是邏輯操作對象。VHDL要求賦值符“<=”兩邊信號的數(shù)據(jù)類型必須一致。

信號賦值的常用表述:即當?shù)忍栍覀鹊尿寗颖磉_式中的任一信號變量發(fā)生變化時,此表達式即被計算一遍,并將獲得的數(shù)據(jù)賦給等號左側的變量名所標示的目標變量。

驅動的含義:強調這一表達式的本質是對于目標變量的激勵源,或賦值源,它為左側的目標變量提供運算操作后的結果。3.2半加器及其VHDL描述4.賦值符號和邏輯操作符VHDL共有七種基本邏輯操作符,如表3-1所示,它們分別是AND(與)、OR(或)、NAND(與非)、NOR(或非)、XOR(異或)、XNOR(同或)和NOT(取反)。信號在這些操作符的作用下可構成組合邏輯。

操作數(shù)(操作對象)的數(shù)據(jù)類型有3種:BIT、BOOLEAN和STD_LOGIC。即:僅此三種數(shù)據(jù)類型的數(shù)值或變量相互間可以進行邏輯操作。3.2半加器及其VHDL描述5.設計庫和標準程序包表3-1

匕邏輯操作符5.設計庫和標準程序包

有許多數(shù)據(jù)類型的說明,以及類似的函數(shù)是預先放在VHDL綜合器(或仿真器)附帶的設計庫和程序包中的。如BIT數(shù)據(jù)類型的定義是包含在VHDL標準程序包STANDARD中的,而程序包STANDARD包含于VHDL標準庫STD中。

為了使用BIT類型,應該在例3-1的程序上面增加以下三句說明語句:

LIBRARY:是關鍵詞,LIBRARYWORK表示打開工作庫WORK庫;

LIBRARYSTD:表示打開STD庫;

USB和ALL:是關鍵詞,全句表示允許使用STD庫中STANDARD程序包中的所有內容(.ALL),如類型定義、函數(shù)、過程、常量等。

LIBRARYWORK:VHDL設計文件保存在某一文件夾,如d:\myfile中,并指定為工程PROJECT的文件所在的目錄,VHDL工具就將此路徑指定的文件夾默認為工作庫(WORKLIBRARY)。于是,在VHDL程序前面還應該增加“WORKLIBRARY;”語句,VHDL工具才能調用此路徑中相關的元件和程序包。3.2半加器及其VHDL描述5.設計庫和標準程序包使用庫和程序包的一般定義表達式如下:

STD_LOGIC數(shù)據(jù)類型定義在被稱為STD_LOGIC_1164的程序包中,此包由IEEE庫定義,而且此程序包所在的程序庫的庫名被取名為IEEE。由于IEEE庫不屬于VHDL標準庫,所以在使用其庫中內容前,必須事先給予聲明。正是出于此需要,即定義端口信號的數(shù)據(jù)類型為STD_LOGIC的目的,例3-2使用了以下兩句語句:

即利用LIBRARY語句和USE語句,打開IEEE庫的程序包STD_LOGIC_1164。

★在VHDL程序中根據(jù)實際情況也可以定義為BIT類型或其他數(shù)據(jù)類型,但一般應用中推薦盡可能使用STD_LOGIC類型。3.2半加器及其VHDL描述6.文件取名和存盤

當編輯好VHDL程序后,需要保存文件時,必須賦給一個正確的文件名。對于多數(shù)綜合器,文件名可以由設計者任意給定。文件后綴擴展名必須是“.vhd”,如mux21a.vhd??紤]到某些EDA軟件的限制、VHDL程序的特點,以及調用的方便性,建議程序的文件名盡量與該程序的模塊名一致。對于QuartusII,則必須滿足這一規(guī)定!如例3-1和例3-2的存盤文件名必須分別是mux21a.vhd和h_adder.vhd

。與Verilog不同,VHDL文件取名大小寫不敏感,即存盤的文件名與此文件程序中的模塊名的大小寫不必一致。

VHDL程序必須存入某文件夾中(要求非中文文件夾名),不要存在根目錄內或桌面上。

3.2半加器及其VHDL描述7.規(guī)范的程序書寫格式

VHDL程序書寫格式要求十分寬松,可以在一行寫多條語句(只要能寫下),也可分行書寫。但良好的,規(guī)范的VHDL源程序書寫習慣是高效的電路設計者所必備的。規(guī)范的書寫格式能使自己或別人更容易閱讀和檢査錯誤。

例3-2給出了近似規(guī)范的書寫格式:最頂層的LIBRARY、ENTITY、ENDENTITY實體描述語句放在最左側;比它低一層次的描述語句(如PORT)向右靠一個Tab鍵距離,即4個小寫字母的間隔。同一語句的關鍵詞要對齊,如ENTITY和ENDENTITY、PROCESS和ENDPROCESS、IF和ENDIF等。

★說明:為了在書中放入更多的內容而節(jié)省篇幅、降低成本,教材中的多數(shù)程序都未能嚴格按照規(guī)范書寫。

3.3.1四選一多路選擇器及CASE語句表述方式3.3四選一多路選擇器及其

VHDL描述

4選1多路選擇器的電路模型如圖3-9所示,當s1和s0取值分別為00、01、10和11時,輸出端y將分別輸出來自輸入口a、b、c、d的數(shù)據(jù)。圖3-10是此模塊的時序波形。圖中的S是選通信號s1和s0的矢量或總線表達信號,它可以在仿真激勵文件中由設計者設置。3.3四選一多路選擇器及其

VHDL描述

3.3.1四選一多路選擇器及CASE語句表述方式3.3.2CASE語句3.3四選一多路選擇器及其

VHDL描述

CASE語句屬于順序語句,因此必須放在進程語句PROCESS中使用。CASE語句的一般表述如下:3.3.2CASE語句3.3四選一多路選擇器及其

VHDL描述

當執(zhí)行到CASE語句時,首先計算<表達式>的值,然后根據(jù)WHEN條件句中與之相同的<選擇值或標識符>,執(zhí)行對應的<順序語句>,最后結束CASE語句。條件句中的“=>”不是操作符,它的含義相當于THEN(或“于是”)。CASE語句使用中應該注意以下幾點:(1)WHEN條件句中的選擇值或標識符所代表的值必須在CASE的<表達式>的取值范圍內,且數(shù)據(jù)類型也必須匹配。(2)除非所有條件句中的選擇值能完整覆蓋CASE語句中表達式的取值,否則最末一個條件句中的選擇必須加上最后一句“WHENOTHERS=><順序語句>;”。關鍵詞OTHERS表示以上已列的所有條件句中未能列出的其他可能的取值。【注】:OTHERS只能出現(xiàn)一次,且只能作為最后一種條件取值。關鍵詞NULL表示不做任何操作。(3)CASE語句中的選擇值只能出現(xiàn)一次,不允許有相同選擇值的條件語句出現(xiàn)。(4)CASE語句執(zhí)行中必須選中,且只能選中所列條件語句中的一條。3.3四選一多路選擇器及其

VHDL描述

3.3.2CASE語句

例3-3中的CASE語句的功能——

當CASE語句的表達式S由輸入信號s1和s0分別獲得‘0’和‘0’時,即當S=“00”時,執(zhí)行賦值語句y<=a,即y輸出來自a的數(shù)據(jù);當S=“01”時,執(zhí)行賦值語句y<=b,即y輸出來自b的數(shù)據(jù);……;以此類推。

CASE語句多條件選擇值的一般表達式如下:選擇值[|選擇值]

選擇值可以有四種不同的表達方式:

(1)單個普通數(shù)值,如6。

(2)數(shù)值選擇范圍,如(2TO4),表示取值為2、3或4。

(3)并列數(shù)值,如3|5,表示取值為3或者5。

(4)混合方式,以上三種方式的混合。3.3四選一多路選擇器及其

VHDL描述

3.3.2CASE語句例3-4給出了以上用法的示例,示例中的對應處給出了詳細說明。3.3四選一多路選擇器及其

VHDL描述

3.3.2CASE語句例3-5給出了CASE語句使用中幾種容易發(fā)生的錯誤。3.3四選一多路選擇器及其

VHDL描述

3.3.2CASE語句

當條件句中的選擇值未能完整覆蓋CASE語句中表達式的取值時,例如例3-5中第一個CASE語句示例,未列全2~15的值的情況,要注意三點:

(1)如果不加OTHERS語句,綜合器通常將判為錯。(2)如果加WHENOTHERS=>NULL語句,則可能在輸出口綜合出時序模塊(鎖存器),應該避免。

(3)只能在WHENOTHERS=>語句后加上順序語句,如out1<=‘0’;而不是NULL語句!這時才能綜合出純組合電路。所以盡量不要用NULL語句。3.3四選一多路選擇器及其

VHDL描述

3.3.2CASE語句

與IF語句相比,CASE語句的程序可讀性更好,因為它把條件中所有可能出現(xiàn)的情況全部列出,一目了然。

CASE語句的條件性獨立、排它,條件句的次序不重要,它的執(zhí)行過程更接近于并行方式。

IF語句有一個逐項條件順序比較的過程(向上相與的邏輯過程)。

★對相同的邏輯功能,CASE語句比IF語句的描述耗用更多的硬件資源。

★對于有的邏輯,CASE語句無法描述,只能用IF語句來描述,這是因為IF-THEN-ELSIF語句具有條件相與的功能和自動將邏輯值“-”包括進去的功能(邏輯值“-”有利于邏輯的化簡),而CASE語句只有條件相或的功能3.3.3IEEE庫預定義標準邏輯位與矢量3.3四選一多路選擇器及其

VHDL描述

標準邏輯位矢量STD_LOGIC_VECTOR數(shù)據(jù)類型與STD_LOGIC一樣,都定義在STD_LOGIC_1164程序包中(而此程序包的所在庫是IEEE庫)。

STD_LOGIC:屬于標準邏輯位類型;

STD_LOGIC_VECTOR:屬于標準一維矢量數(shù)組,數(shù)組中的每一個元素的數(shù)據(jù)類型都是標準邏輯位STD_LOGIC。

★使用STD_LOGIC_VECTOR,可以表達電路中并列的多通道端口或節(jié)點,或者總線。

★使用STD_LOGIC_VECTOR,必須注明其數(shù)組寬度,即位寬,如定義:3.3.3IEEE庫預定義標準邏輯位與矢量3.3四選一多路選擇器及其

VHDL描述

上句表明,標識符B的數(shù)據(jù)類型被定義為一個具有8位位寬的矢量或總線端口信號,它的最左位,即最高位是B(7)。通過數(shù)組元素排列指示關鍵詞“DOWNTO”向右依次遞減為B(6),B(5),…,B(0)。第二條語句定義A的數(shù)據(jù)類型為4位位寬總線,數(shù)據(jù)對象是信號SIGNAL,其最左位是A(1),通過關鍵詞“TO”向右依次遞增為A(2)、A(3)和A(4)。于是根據(jù)以上兩式的定義,對B的賦值方式如下:

其中“01100010”表示二進制數(shù)。VHDL規(guī)定:多于一位的二進制數(shù)必須加雙引號,如“01”;而單一二進制數(shù)則用單引號,如‘1’。3.3.3IEEE庫預定義標準邏輯位與矢量3.3四選一多路選擇器及其

VHDL描述

與STD_LOGIC_VECTOR對應的是BIT_VECTOR位矢量數(shù)據(jù)類型,其每一個元素的數(shù)據(jù)類型都是邏輯位BIT,使用方法同STD_LOGIC_VECTOR。

例3-3中的內部信號S被定義為二元素的STD_LOGIC_VECTOR數(shù)據(jù)類型,高位是S(1),低位是S(0)。標準邏輯矢量(STD_LOGIC_VECTOR)類型定義語句如下:

在使用中,向STD_LOGIC_VECTOR數(shù)據(jù)類型的數(shù)據(jù)對象賦值的方式與普通的一維數(shù)組是一樣的,即必須嚴格考慮位矢的寬度。同位寬、同數(shù)據(jù)類型的矢量間才能進行賦值。3.3.4其他預定義標準數(shù)據(jù)類型3.3四選一多路選擇器及其

VHDL描述

VHDL綜合工具配備的擴展程序包中定義了一些有用的類型。如Synopsys公司在IEEE庫中加入的程序包STD_LOGIC_ARITH【arithmetic】中定義了如下的數(shù)據(jù)類型:無符號型(UNSIGNED)、有符號型(SIGNED)、小整型(SMALL_INT)。如果將信號或變量定義為這幾個數(shù)據(jù)類型,就可以使用本程序包中定義的運算符。

★在使用這些數(shù)據(jù)類型之前,請注意必須加入下面的語句:

UNSIGNED用于無符號數(shù)的運算,SIGNED用于有符號數(shù)的運算。在IEEE庫中,NUMERIC_STD和NUMERIC_BIT程序包中也定義了UNSIGNED型及SIGNED型,NUMERIC_STD是針對STD_LOGIC型定義的,而NUMERIC_BIT是針對BIT型定義的。在程序包中還定義了相應的運算符重載函數(shù)。3.3.4其他預定義標準數(shù)據(jù)類型3.3四選一多路選擇器及其

VHDL描述

★有些綜合器沒有附帶STD_LOGIC_ARITH程序包(QUARTUSII有此程序包),只能使用NUMERIC_STD和NUMERIC_BIT程序包。

(1)無符號數(shù)據(jù)類型。UNSIGNED數(shù)據(jù)類型代表一個無符號的數(shù)值,在綜合器中,這個數(shù)值被解釋為一個二進制數(shù),這個二進制數(shù)的最左位是其最高位。例如,十進制的8可以表示如下:

若一個變量或信號的數(shù)據(jù)類型為UNSIGNED,則其位矢長度越長,所能代表的數(shù)值就越大。如一個4位變量的最大值為15,一個8位變量的最大值則為255,0是其最小值。不能用UNSIGNED定義負數(shù)。以下是兩個無符號數(shù)據(jù)定義的示例:3.3.4其他預定義標準數(shù)據(jù)類型3.3四選一多路選擇器及其

VHDL描述

其中變量var有11位數(shù)值,最高位是var(0),而非var(10);信號sig有6位數(shù)值,最高位是sig(5)。

(2)有符號數(shù)據(jù)類型。SIGNED數(shù)據(jù)類型表示一個有符號的數(shù)值,綜合器將其解釋為補碼,此數(shù)的最高位是符號位,例如:SIGNED’(“0101”)代表+5,5SIGNED’(“1101”)代表-5

若將上例的var定義為SIGNED數(shù)據(jù)類型,則數(shù)值意義就不同了,如:其中,變量var有11位,最左位var(0)是符號位。3.3.4其他預定義標準數(shù)據(jù)類型3.3四選一多路選擇器及其

VHDL描述

★特別注意:定義為數(shù)據(jù)類型UNSIGNED或SIGNED的數(shù)據(jù)具有雙重性:

(1)這類數(shù)據(jù)可以像整數(shù)類型的數(shù)據(jù)一樣直接進行各種算術運算(如加法),且不能進行邏輯運算;它們的取值范圍也與整數(shù)類型相同:SIGNED類型的取值范圍是-2147483647?+2147483647,UNSIGNED類型的取值范圍是0?+2147483647。(2)它們本質上不屬于整數(shù)類型INTEGER,而是被定義為STD_LOGIC的數(shù)組類型。它們在程序包STD_LOGIC_ARITH中的定義原文是:3.3.5信號定義和數(shù)據(jù)對象3.3四選一多路選擇器及其

VHDL描述

例3-3(P67)中第8行的語句表示在描述的器件MUX41A內部定義標識符S的數(shù)據(jù)對象為信號SIGNAL,其數(shù)據(jù)類型為標準邏輯矢量STD_LOGIC_VECTOR(1DOWNTO0),其中元素S(1)和S(0)都為標準邏輯位類型STD_LOGIC。若要定義標識符e的數(shù)據(jù)對象為信號,數(shù)據(jù)類型為標準邏輯位,則可表示為:

其中的SIGNAL是定義某標識符為信號的關鍵詞。信號屬于數(shù)據(jù)對象(DataObjects)。在VHDL中,數(shù)據(jù)對象類似于一種容器,它接受不同數(shù)據(jù)類型的賦值。3.3.5信號定義和數(shù)據(jù)對象3.3四選一多路選擇器及其

VHDL描述

數(shù)據(jù)對象有三類:信號(SIGNAL)、變量(VARIABLE)和常量(CONSTANT)。定義標識符:通常須確定為某類數(shù)據(jù)對象(規(guī)定該標識符的行為方式和功能特點),在此基礎上還必須被定義為某種數(shù)據(jù)類型(限定取值范圍)。

VHDL規(guī)定:標識符e的數(shù)據(jù)對象作為信號,它可以如同一根導線那樣在整個結構體中傳遞信息,但傳遞或存儲的數(shù)據(jù)類型(取值范圍)只能包含在STD_LOGIC定義的元素中。對于端口信號也一樣,所有端口的數(shù)據(jù)對象都默認為信號SIGNAL,其數(shù)據(jù)類型則根據(jù)需要另作顯式定義。

譬如:例3-3中所有端口默認數(shù)據(jù)對象是信號,其數(shù)據(jù)類型被顯式定義為STD_LOGIC,取值類型最多可達九種,如‘1’、‘Z’或‘X’等。3.3.6并置操作符

3.3四選一多路選擇器及其

VHDL描述

在例3-3中的操作符&表示將信號或是數(shù)組合并起來形成新的數(shù)組矢量。例如“VH”&“DL”的結果為“VHDL”;‘0’&‘1’&‘1’的結果為“011”。顯然語句S<=s1&s0的作用是令:S(1)<=s1;S(0)<=s0。利用并置符可以有多種方式來建立新的數(shù)組——

(1)將一個單元素并置于一個數(shù)的左端或右端形成更長的數(shù)組;(2)將兩個數(shù)組并置成一個新數(shù)組等。

★在實際運算過程中,要注意并置操作前后的數(shù)組長度應一致。3.3.7四選一多路選擇器的VHDL不同描述方式3.3四選一多路選擇器及其

VHDL描述

例3-6至例3-8(此三例中的S賦值語句以上的部分與例3-3【P66-67】的對應部分相同)給出了另外三種不同的VHDL描述方式,所描述的都是4選1多路選擇器,其端口結構和仿真波形都與圖3-9和圖3-10(P66)相同。以下分別給予討論.

例3-6的語句表述結構其實與例3-1相似,只是IF語句的條件判斷式的變量變成了兩位二進制數(shù),所以就有了四種可能的選擇。于是程序使用了能進行更多判斷條件的IF語句,其形式如下:3.3四選一多路選擇器及其

VHDL描述

IF_THEN_ELSIF_ELSIF_…ELSE_ENDIF3.3.7四選一多路選擇器的VHDL不同描述方式

例3-6中的IF語句是一條完整的條件句。其中的關鍵詞ELSIF包含了ELSE和IF二者的含義,即有“否則假如…”的含義。它起到了在不滿足前述條件的情況下,開辟另一條件判斷分支的作用。由此構建了當條件多于兩個時完成判斷的語句結構。1.WHEN_ELSE條件信號賦值語句

3.3四選一多路選擇器及其

VHDL描述

3.3.7四選一多路選擇器的VHDL不同描述方式

與例3-3和例3-6不同,例3-7和例3-8中使用了并行語句,以下分別給予說明。

例3-7中出現(xiàn)的語句形式稱為條件信號賦值語句,屬于并行語句,它不需要進程語句引導。此類語句也稱為并行賦值語句(相對于進程中的賦值語句),其一般表達式如下:

3.3四選一多路選擇器及其

VHDL描述

3.3.7四選一多路選擇器的VHDL不同描述方式

在結構體中的條件信號賦值語句的功能與在進程中的IF語句類同。在執(zhí)行條件信號語句時,每一“賦值條件”是按書寫的先后關系逐項測定的,一旦發(fā)現(xiàn)賦值條件為TURE,立即將“表達式”的值賦給“賦值目標”信號。但應注意由于條件測試的順序性,條件信號賦值語句中的第一子句具有最高賦值優(yōu)先級,第二句其次,依此類推。例如在以下程序中,如果當p1和p2同時為‘1’時,z獲得的賦值是a而不可能是b★在整個條件賦值語句中,只有最后一個“表達式”后有一個分號。2.選擇信號賦值語句

3.3四選一多路選擇器及其

VHDL描述

與例3-7相同,例3-8中也使用了相似的并行語句,稱為選擇信號賦值語句,其一般語句格式如下:

選擇信號賦值語句不能在進程中應用,但其功能卻與進程中的CASE語句的功能十分相似。

CASE語句:執(zhí)行依賴于進程中敏感信號的改變而啟動進程,各子句的條件不能有重疊,必須包容所有的條件。

選擇信號賦值語句:也有敏感量,即關鍵詞WITH旁的選擇表達式。不允許有條件重疊、條件涵蓋不全情況。

★當選擇信號賦值語句在條件句中未能覆蓋所有條件選擇時,要求在末尾加上與NULL類似涵義的關鍵詞UNAFFECTED。

3.4全加器及其VHDL表述3.4.1全加器設計及例化語句應用

全加器可以由兩個半加器和一個或門連接而成,其經典的電路結構如圖3-11所示,其整個設計過程和表述方式都可以用VHDL來描述。

半加器元件的邏輯功能和VHDL表述已在3.2節(jié)中給出,程序是例3-2(P61),文件名即其實體名h_adder.vhd;或門元件的VHDL表述如例3-10(P75)所示,文件名是or2a.vhd。例3-9為全加器的VHDL頂層描述。3.4.1全加器設計及例化語句應用3.4全加器及其VHDL表述3.4全加器及其VHDL表述3.4.1全加器設計及例化語句應用3.4全加器及其VHDL表述3.4.1全加器設計及例化語句應用

為了實現(xiàn)連接底層元件形成更高層次的電路設計結構,文件中使用了例化語句。

例3-9

在實體中首先定義全加器頂層設計元件的端口信號,然后在ARCHITECTURE和BEGIN之間加入調用元件的聲明語句,即利用COMPONENT語句對準備調用的元件(或門和半加器)做了聲明,并定義net1、net2和net3三個信號作為全加器內部的連接線,具體連接方式見圖3-11左圖。最后利用端口映射語句PORTMAP()將兩個半加器模塊和一個或門模塊連接起來構成一個完整的全加器(例3-9)。

【注意】:這里是假設參與設計的半加器文件、或門文件和全加器頂層設計文件都存放于同一個文件夾中。

元件例化就是引入一種連接關系,將預先設計好的設計實體定義為一個元件,然后利用特定的語句將此元件與當前的設計實體中的指定端口相連接,從而為當前設計實體引進一個新的低一級的設計層次。

3.4全加器及其VHDL表述3.4.1全加器設計及例化語句應用

當前設計實體(如例3-9描述的全加器)相當于一個較大的電路系統(tǒng),所定義的例化元件相當于一個要插在這個電路系統(tǒng)板上的芯片,而當前設計實體中指定的端口則相當于這塊電路板上準備接受此芯片的一個插座?!镌鞘筕HDL設計實體構成自上而下層次化設計的一種重要途徑?!镌强梢远鄬哟蔚?。一個調用了較低層次元件的頂層設計實體本身也可以被更高層次設計實體所調用,成為該設計實體中的一個元件。任何一個被例化語句聲明并調用的設計實體可通過不同的形式出現(xiàn),它可以是一個設計好的VHDL設計文件(即一個設計實體),也可來自FPGA元件庫中的元件或是FPGA器件中的嵌入式宏元件功能塊,或是以別的硬件描述語言,如VerilogHDL設計的元件,還可以是IP核。3.4全加器及其VHDL表述3.4.2VHDL例化語句

例化語句由兩部分組成,第一部分是將一個現(xiàn)成的設計實體定義為一個元件,語句的功能是對待調用的這個元件做出調用聲明。命名方式與實體中的PORT()語句一致,只需將ENTITY改寫為COMPONENT。它的最簡表達式如下:

元件定義語句必須放在結構體的ARCHITECTURE和BEGIN之間。另外應注意,盡管例3-9中對或門和半加器的調用聲明的端口說明中使用與原來元件(VHDL描述)相同的端口符號,但這并非是唯一的表達方式,亦可以做如下表達:

注意端口信號的數(shù)據(jù)類型的定義必須與原設計實體文件一致,且信號排列方式也要與原來的一致,包括端口模式、數(shù)據(jù)類型、功能定義等。3.4全加器及其VHDL表述3.4.2VHDL例化語句

元件例化語句的第二部分則是此元件與當前設計實體(頂層文件)中元件間及端口的連接說明。即所謂的“端口名關聯(lián)法”,表達方式為:

其中,“例化名”必須存在,它類似于PCB板設計時標在當前系統(tǒng)(電路板)中的一個插座編號名;而“元件名”則是準備在此插座上插入的、己定義好的元件名,也即待調用的VHDL設計實體的實體名。例如一塊PCB板上可能插有三片相同的A74LS161,它們分別對應例化名IC1、IC2、IC3三個插座位置,而元件名都是A74LS161。

PORTMAP是端口映射,或端口連接的意思。其中的“端口名”是在元件定義語句中的端口名表中已定義好的元件端口的名字,或者說是頂層文件中待連接的各個元件本身的端口名;“連接端口名”則是頂層系統(tǒng)中準備與接入的元件的端口相連的通信線名,或者是頂層系統(tǒng)的端口名。因此端口名關聯(lián)法也稱端口名映射法。3.4全加器及其VHDL表述3.4.2VHDL例化語句★符號“=>”是連接符號,其左面放置內部元件的端口名,右面放置內部元件以外需要連接的端口名或信號名,這種位置排列方式是固定的;然而,連接表達式在PORTMAP語句中的位置是任意的?!锓枴?>”僅代表連接關系,不代表信號流動方向,即符號“=>”不限制信號數(shù)據(jù)的流動方向。還有一種對應的連接表述方法稱為位置關聯(lián)法。即:以位置的對應關系連接相應的端口。譬如:例3-2及例3-9中,半加器的端口信號排列順序都是(A,B,CO

,SO);當它作為元件u2在圖3-11中連接時,其對應的連接信號就是(net1,cin,net3,sum

)。于是與此半加器u2的端口按順序對應起來,就得到例3-9中關于u2的位置關聯(lián)法例化表述。對于位置關聯(lián)法(或稱位置映射法),關聯(lián)表述的信號位置十分重要,不能放錯;而且,一旦位置關聯(lián)例化語句確定,被連接元件的源文件中的端口表內的信號排列位置就不能再變動。如例3-2,這時只能把端口改成以下形式:

3.4全加器及其VHDL表述3.4.38位加法器設計及算術操作符應用3.4全加器及其VHDL表述

例3-11的仿真波形圖如圖3-12所示。從圖3-13它的RTL圖(寄存器傳輸級)中可以清晰看到8位數(shù)相加的和再加進位值的硬件方式。★由于圖3-13—類RTL圖直接來自NetlistViewers的RTLViewers生成器,主要用來了解VHDL描述電路的大致結構,不拘泥細節(jié),所以包括其中的小字不清楚都無關緊要。因為詳細功能主要是通過仿真來了解。3.4.38位加法器設計及算術操作符應用★為方便獲得兩個8位數(shù)據(jù)A和B相加后的進位值,這里首先定義一個9位信號DATA,然后用并位符&在A和B的高位并位一個‘0’,將其都擴為9位。

VHDL規(guī)定,賦值符號兩邊的數(shù)據(jù)類型必須一致,且若為矢量類型,兩端值的位數(shù)也必須相等。

3.4全加器及其VHDL表述★在算式中直接使用并位操作符&時,必須對并位式加上括號,如(“00000000”&CIN)。這是因為不同的操作符其優(yōu)先級別不同,例如乘除的優(yōu)先級別一定高于加減,而加減與并位&操作級別相等。對于平級的情況,在前的操作符則具有較高的優(yōu)先級,其運算將優(yōu)先進行。例如,若(‘0’&B)項不加括號,則賦值語句右邊最后的運算結果有17位,與左邊的DATA不符;而若(“00000000”&CIN)不加括號,則運算結果有10位,因為在最后并位CIN前的運算結果己經有9位了?!锢?-11中,使用了IEEE庫中另一程序包:STD_LOGIC_UNSIGNED。

【原因】:VHDL只允許加減乘除(+、-、*、/)算術操作的操作數(shù)的數(shù)據(jù)類型是整數(shù)類型(INTEGER類型,如1、2、3、4等),且算術結果仍然是整數(shù)類型;而例3-11中,加號“+”兩邊的操作數(shù)的類型都是標準位矢類型,相加后賦值的DATA也是標準位矢類型。顯然不符合VHDL的語法要求。3.4.38位加法器設計及算術操作符應用3.4全加器及其VHDL表述【解決方法】:

(1)運算符重載:調用一個具有特定功能的函數(shù)(運算符重載函數(shù)),以便賦予加號“+”具備新的數(shù)據(jù)類型的操作功能。

(2)重新定義運算符:VHDL允許用戶對原有的基本操作符重新定義,賦予新的含義和功能,從而建立一種新的操作符。

VHDL的IEEE庫中的STD_LOGIC_UNSIGNED程序包中預定義的操作符{加(+)、乘(*)、小于等于(<=)、不等于(/=)、邏輯與(AND)…}對相應的數(shù)據(jù)類型INTEGER、STD_LOGIC和STD_LOGIC_VECTOR的操作做了重載,允許被重載的運算符對新的數(shù)據(jù)類型進行操作,或者允許不同的數(shù)據(jù)類型之間用此運算符進行運算。即:完成標準矢量(或整數(shù)與標準矢量)間的各種運算,并使計算結果自動轉換為標準邏輯矢量類型STD_LOGIC_VECTOR,向DATA進行賦值。

3.4.38位加法器設計及算術操作符應用3.5乘法器及其VHDL表述

3.5.1統(tǒng)計位矢中含‘1’個數(shù)的電路模塊設計

下面通過幾則實用電路模塊,即乘法器及相關電路的VHDL設計程序,進一步展示常用的新的VHDL語句、程序結構、數(shù)據(jù)類型和電路設計方法。

例3-12所描述的電路是一個統(tǒng)計輸入的8位位矢中含‘1’個數(shù)的程序,其仿真波形如圖3-14所示。這是一則與移位相加型乘法器程序結構十分相似的電路模型。3.5乘法器及其VHDL表述

3.5.1統(tǒng)計位矢中含‘1’個數(shù)的電路模塊設計3.5乘法器及其VHDL表述

3.5.1統(tǒng)計位矢中含‘1’個數(shù)的電路模塊設計

例3-12的程序中有如下三點值得注意的語句結構:

(1)變量關鍵詞VARIABLE的用法。這包括變量的定義方式、定義位置和賦值特點等。變量VARIABLE與信號SIGNAL一樣,都屬于數(shù)據(jù)對象,在此程序中的功能與信號相似。但變量的賦值符號與信號的賦值符號是不同的,信號的賦值符號是“<=”,而變量的賦值符號是“:=”。例如若a定義為變量,對其賦值可以寫為a:=‘1’。與信號不同,變量的功能主要用于數(shù)據(jù)的暫存,而且只能在進程中定義變量,所以,變量無法將數(shù)據(jù)傳遞出進程。例3-12中的語句CNTH<=Q

則能幫助變量Q將數(shù)據(jù)傳出去。

(2)程序中的IF語句沒有用關鍵詞ELSE。這種用法是一種條件響應不完整的現(xiàn)象,即沒有表達當條件(DIN(n)=‘0’)時作何處理。第5章中將會進一步給予說明。

(3)程序使用了循環(huán)語句,即LOOP語句的一種類型。3.5乘法器及其VHDL表述

3.5.2FOR_LOOP循環(huán)語句用法

例3-12程序中使用的FOR_LOOP循環(huán)語句是LOOP語句的一種類型。LOOP語句屬于可綜合的循環(huán)語句,它可以使所包含的一組順序語句被循環(huán)執(zhí)行,其執(zhí)行次數(shù)可由設定的循環(huán)參數(shù)決定。LOOP語句的常用表達方式有以下兩種:

這種循環(huán)方式是一種最簡單的語句形式,它的循環(huán)方式需引入其他控制語句(如EXIT語句)后才能確定跳出;“LOOP標號”可任選。用法示例如下:3.5乘法器及其VHDL表述

3.5.2FOR_LOOP循環(huán)語句用法

FOR后面的“循環(huán)變量”是一個臨時變量,如n,屬LOOP語句的局部變量,不必事先定義。這個變量只能作為賦值源,不能被賦值,它由LOOP語句自動定義。【注意】:在LOOP語句范圍內不要再使用其他同名的標識符。

“循環(huán)次數(shù)范圍”規(guī)定了LOOP語句中的順序語句被執(zhí)行的次數(shù)(以常數(shù)表示),否則在LOOP體內的邏輯可以重復任何可能的范圍,這將導致耗費過大的硬件資源,綜合器不支持沒有約束條件的循環(huán)。例3-12中,循環(huán)語句中的順序語句是一個IF語句。當測到DIN的某一個位為1時,則通過賦值語句Q:=Q+1作累加。

VHDL中的循環(huán)語句與C等軟件描述語言中的循環(huán)語句大有不同:前者每一次循環(huán)都將產生一個硬件模塊,隨著循環(huán)次數(shù)的增加,耗用硬件資源,但工作時間未必增加;后者的每次循環(huán)損失的是運行時間。3.5乘法器及其VHDL表述

3.5.3移位相加型乘法器的VHDL表述方法

例3-13所示的是基于移位相加原理的4×4位乘法器的VHDL程序,其仿真波形如圖3-15所示(注意圖中所有變量的數(shù)據(jù)類型都被設置成十進制類型)。此例的程序結構與例3-12基本相同。主要不同之處是,這個乘法器可以僅僅通過改變其中的參數(shù)S,即能增加此乘法器的位數(shù)。不但如此,這個參數(shù)S的數(shù)值可以從外部,即頂層設計中傳送進入,從而能在頂層設計中通過例化語句輕易改變此乘法器的尺寸?!锢?-13中涉及的新的語法知識比較多,以下分別以分節(jié)的形式敘述之。3.5乘法器及其VHDL表述

3.5.3移位相加型乘法器的VHDL表述方法1011×)1001101100000000

+)101111000111111(A)×)1101(B)1111000011111111110000114位×4位乘法器的結果最多為8位——00001111(A0)×)1101(B)00001111

000000000

0000111100

00001111000

00011000011假設:A=1111,B=1101;A0=00001111;R1.0=00000000R1.1=R1+00001111=00001111;R1.2=R1.1+00111100=01001011;R1.3=R1.2+01111000=11000011;R1<=R1.3;R<=R13.5乘法器及其VHDL表述

3.5.3移位相加型乘法器的VHDL表述方法3.5乘法器及其VHDL表述

3.5.4GENERIC參數(shù)定義語句

實體中定義的端口:連接設計實體與外部電路信號和數(shù)據(jù)的有形通道。

類似端口的參數(shù)的通道:這是一種無形的通道,但卻能像普通端口一樣,在綜合或仿真編譯中接受外部的數(shù)據(jù),以改變電路的規(guī)模或時序性質。

★參數(shù)傳遞說明語句(GENERIC語句)常以一種說明的形式放在實體或塊結構體前的說明部分,為所說明的環(huán)境提供一種靜態(tài)信息(時間參數(shù)或總線寬度)通道。被傳遞的參數(shù),或稱類屬參量(類屬值或類屬變量)與普通常數(shù)不同,常數(shù)只能從設計實體的內部得到賦值,且不能再改變;而作為參數(shù)傳遞的類屬值可由設計實體外部提供。因此,設計者可從外面通過類屬參量的重新設定,十分方便地改變一個設計實體或一個元件的內部電路結構和規(guī)模。3.5乘法器及其VHDL表述

3.5.4GENERIC參數(shù)定義語句參數(shù)傳遞說明語句的一般書寫格式如下:

參數(shù)傳遞說明語句以關鍵詞GENERIC引導一個類屬參量表,在表中提供時間參數(shù)或總線寬度等靜態(tài)信息。此語句用于設計實體和其外部電路環(huán)境通信的參數(shù)和傳遞信息。GENERIC語句在所定義的環(huán)境中的地位與常數(shù)相似,但卻能(在編譯過程中)從外部動態(tài)地接受賦值,因此其行為類似于端口PORT。因此常如實體定義語句那樣,將GENERIC語句的說明放在其中,且放在端口說明語句的前面。3.5乘法器及其VHDL表述

3.5.5整數(shù)數(shù)據(jù)類型

例3-13的GENERIC語句中,定義參數(shù)S的數(shù)據(jù)類型是整數(shù)類型INTEGER。整數(shù)數(shù)據(jù)類型INTEGER的元素包含正整數(shù)、負整數(shù)和零。在VHDL中,整數(shù)的取值范圍是-2147483647?+2147483647,即可用32位有符號的二進制數(shù)表示。應該特別注意的是,通常VHDL仿真器將INTEGER類型作為有符號數(shù)處理,而VHDL綜合器則將INTEGER作為無符號數(shù)處理。在定義整數(shù)類型時VHDL綜合器通常要求使用關鍵詞RANGE構成的子句限定數(shù)的范圍,然后根據(jù)所限定的范圍來決定表示此信號或變量的二進制數(shù)的位數(shù)。

VHDL綜合器無法綜合未限定范圍的整數(shù)類型的信號或變量。如:

定義Q的數(shù)據(jù)對象是信號,數(shù)據(jù)類型是整數(shù),限定Q的取值范圍是0?15,共16個值,可用4位二進制數(shù)來表示。因此,VHDL綜合器自動將Q綜合成由四條信號線構成的總線方式信號:Q(3)、Q(2)、Q(1)和Q(0)。3.5乘法器及其VHDL表述

3.5.5整數(shù)數(shù)據(jù)類型整數(shù)常量的書寫方式示例如下:【注意】:整數(shù)的表達不加引號,如1、0、25等;“#”類似于“()”的功能。16E3等于十進制整數(shù)“16的3次冪”3.5乘法器及其VHDL表述

3.5.5整數(shù)數(shù)據(jù)類型

自然數(shù)類型NATURAL是整數(shù)類型的一個子類型,包含0和所有正整數(shù)。若將Q定義為NATURAL類型,綜合結果與INTEGER相同,示例如下:即將Q定義為NATURAL類型的BUFFER端口,取值范圍是整數(shù)0?15。

正整數(shù)類型POSITIVE也是整數(shù)類型的一個子類型,比NATURAL類型少一個0。對于許多綜合器,如果定義上例的Q定義為POSITIVERANGE15DOWNTO0,仍然能綜合出相同的電路來。與BIT、BIT_VECTOR一樣,數(shù)據(jù)類型INTEGER、NATURAL和POSITIVE都定義在VHDL標準程序包SDANDARD中。

由于此程序包是默認打開的,所以不必為定義整數(shù)類型而以顯式打開STD庫和程序包SDANDARD。3.5乘法器及其VHDL表述

3.5.6省略賦值操作符

例3-13中的語句“R1:=(others=>‘0’);”等效于向變量R1賦值“00000000”,即:R1:=“00000000”,實際是為R1賦初始值0。如果將例3-13作為一個可被外部電路調用和參量控制的模塊,則當前程序中的參數(shù)S是一個不定值,于是對R1所賦的值的二進制位數(shù)也是不定的。一般地,為了簡化表達和位數(shù)不定情況下的賦值,可使用短語“(OTHERS=>X)”,這是一個省略賦值操作符,它可以在較多位的位矢量賦值中作省略化的賦值,如有:

最下的語句則等同于:d1<=“11111”;a1:=“0000000000000000”。其優(yōu)點是在給大的位矢量賦值時簡化了表述,明確了含義,特別是這種表述與位矢量長度無關。3.5乘法器及其VHDL表述

3.5.6省略賦值操作符

利用“(OTHERS=>X)”還可給位矢量的某一部分位賦值之后再使用OTHERS給剩余的位賦值,如d2<=(1=>‘1’,4=>‘1’,OTHERS=>‘0’)。此句意義是給位矢量d2的第1位和第4位賦值為‘1’,而其余位賦值‘0’。下例是用省略賦值操作符“(OTHERS=>X)”給d1賦其

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論