VHDL描述硬件實體
結構
舉例
-
Entity()實體
Enitiy 實體名 is
PORT(端口名1,端口名N:方向:類型)
[端口說明]
End Entity;
Port的方向有: IN , OUT, INOUT, BUFFER, LINKAGE
In 信號只能被引用,不能被賦值;不可以出現在<= 或 : = 的左邊
out 信號只能被賦值,不能被引用;不可以出現在<= 或 : = 的右邊
buffer 信號可以被引用,也可以被賦值;可以出現在<= 或 : = 的兩邊
Entity的內部結構將由Architecture來描述
-
Arcthitecture(構造體)
Arcthitecture 構造體名 of 實體名 is
[定義語句] 內部信號、常數、元件、數據類型、函數等的定義
begin
[並行處理語句和block、process、function、procedure]
end 構造體名;
例如:
下面讓我們來看一看如何將一個實體(FULLADD)構造為一個內部能實現功能的構造體(STRUCT):
-
其他設計單元
除了entity(實體)和architecture(構造體)外還有另外三個可以獨立進行編譯的設計單元
Package(包集合)屬於庫結構的一個層次,存放信號定義、常數定義、數據類型、元件語句、函數定義和過程定義。
Package Body: 具有獨立對端口(port)的package
configuration(配置)描述層與層之間的連接關系以及實體與構造體之間關系
4、Library(庫)
庫: 數據的集合。內含各類包定義、實體、構造體等
-
STD庫 --VHDL的標准庫
-
IEEE庫 -- VHDL的標准庫的擴展
-
面向ASIC的庫 --不同的工藝
-
不同公司自定義的庫
-
普通用戶自己的庫 --當VHDL文件被編譯后,編譯的結果儲存在特定的目錄下,這個目錄的邏輯名稱即Library,此目錄下的內容亦即是這個Library的內容。
-
Package(包)
-
這些結構之間的關系
VHDL對象、操作符、數據類型
1、VHDL中的對象(對客觀實體的抽象和概括)有:
Constant(常量)在程序中不可以被賦值
Variable(變量)在程序中可以被賦值(用": ="),賦值后立即變化為新值。
Signal(信號)在程序中可以被賦值(用"<=") ,但不立即更新,當進程掛起后,才開始更新。
例如:
variable
x,y:integer;--定義了整數型的變量對象x,y
constant
Vcc:real;--定義了實數型的常量對象Vcc
signal
clk,reset:bit;--定義了位類型的信號對象clk,reset
注意:
1、variable只能定義在process和subprogram(包括function和procedure)中,不可定以在其外部。
2、signal不能定義在process和subprogram(包括function和procedure)中,只可定以在其外部。
對象的屬性(類似於其它面向對象的編程語言如VB、VC、DELPHI):
用法格式:對象 ' 屬性
例子:clk'event --表明信號clk的event屬性
常用的屬性:
Signal 對象的常用屬性有:
event : 返回boolean值,信號發生變化時返回true
last_value:返回信號發生此次變化前的值
last_event:返回上一次信號發生變化到現在變化的間隔時間
delayed[(時延值)]: 使信號產生固定時間的延時並返回
stable[(時延值)]: 返回boolean, 信號在規定時間內沒有變化返回true
transaction: 返回bit類型,信號每發生一次變化,返回值翻轉一次
例子:A<=B'delayed(10 ns); --B延時10ns后賦給A;
if(B'Stable(10 ns)); --判斷B在10ns中是否發生變化
應用:
信號的event和last_value屬性經常用來確定信號的邊沿
例子:
判斷clk的上升沿
if ( (clk'event)and (clk='1') and(clk'last_value='0')) then
判斷clk的下降沿
if ( (clk'event)and (clk='0') and(clk'last_value='1')) then
2、VHDL的基本(數據)類型
bit(位): `0` 和`1`
bit-Vector(位矢量): 例如:``00110``
Boolean " ture"和"false"
time 例如:1 us、100 ms,3 s
character 例如:'a'、'n'、'1'、 '0'
string 例如:"sdfsd"、"my design"
integer 32位例如:1、234、-2134234
real 范圍-1.0E38~+1.0E38 例如:1.0、2.834、3.14、0.0
natural 自然數 和 positive 正整數
senverity level (常和assert語句配合使用)包含有:note、warning、error、failure
以上十種類型是VHDL中的標准類型,在編程中可以直接使用。使用這十種以外的類型,需要自行定義或指明所引用的Library(庫)和Package(包)集合
例子:
(1)
(2)
(3)
信號Z有兩個驅動A和B;Z必須定義為一種新的數據類型,否則Z將無法決定取值,語句視為非法。
(4)
(5)
要點:賦值語句中的方向應和聲明中的方向一樣
3、常用操作
連接操作符---&
集合操作---()
集合操作---序號
集合操作--采用others
-
定義自己的類型
通用格式
TYPE 類型名 IS 數據類型定義
用戶可以定義的數據類型:
枚舉類型enumberated、整數型integer、
實數型real、數組類型array、
紀錄類型record、時間類型time、
文件類型file、存取類型access
(1)
-
枚舉類型enumberated
-
格式
type 數據類型名 is (元素,元素…...);
-
例子
type week is (sun,mon,tue,thu,fri,sat);
type std_logic is ('1','0','x','z');
(2)
-
整數類integer和實數類real
-
格式
type 數據類型名 is 數據類型定義 約束范圍;
-
例子
type week is integer range 1 to 7;
type current is real range -1E4 to 1E4
(3)
-
數組類型array
-
格式
type 數據類型名 is array 范圍 of 元數據類型名
-
例子
type week is array (1 to 7) of integer;
type deweek is array (1 to 7) of week;
(4)
-
時間類型time
-
格式
type 數據類型名 is 范圍
units 基本單位;
單位;
end units
-
例子
type time is range -1E18 to 1E18
units
us;
ms=1000 us;
sec=1000 ms;
min=60 sec;
end units
注意:引用時間時,有的編譯器要求量 與單位 之間應有一個空格如:1 ns;不能寫為1ns
(5)
-
紀錄類型record
-
格式
type 數據類型名 is record
元素名:數據類型名;
元素名:數據類型名;
….
end record;
-
例子
type order is record
id:integer;
date:string;
security:boolean;
end record;
引用:signal flag:boolean;
signal order1:order;
order1<=(3423,"1999/07/07",true);
flag<=order1.security;
-
IEEE 1164中定義的類型
(1)std_ulogic 是對位(bit)類型的擴展,只允許一個驅動源
(2)Std_logic同std_ulogic 一樣有九個狀態,允許一個或多個驅動源
與std_ulogic的區別
(3)Std_unlogic_vector和std_logic_vector
Std_unlogic、std_ulogic_vector
std_logic_vector和 std_unlogic_vector 類型
均定義在package(包) standard_logic_1164中
在使用這四種類形時應加以說明,
例如:library ieee;
use ieee.std_logic_1164.all;
-
VHDL中的操作符
(1)邏輯操作符有:
(2)邏輯操作符的應用例子
(3)關系運算符有
(4)關系運算符的應用
(5)數學運算符
注意:上述運算符應用於 integer,real,time 類型,不能用於vector(如果希望用於vector,可以使用庫IEEE的std_logic_unsigned包,它對算術運算符進行了擴展)
(6)VHDL中的操作符應用要點
VHDL屬於強類型,不同類型之間不能進行運算和賦值,可以進行數據類型轉換
vector不表示number
array 不表示number
VHDL中的控制語句及模塊
-
基本概念
-
並行處理(concurrent):語句的執行與書寫順序無關,並行塊內的語句時同時執行的
-
順序處理(sequential): 語句的執行按書寫的先后次序,從前到后順序執行。這種方式和其他普通編程語言(如c,pascal)是一樣的。
-
2、並行和順序處理在vhdl中的應用
(1)Architecture 中的語句及子模塊之間是並行處理的
(2)子模塊block中的語句是並行處理的
(3)子模塊process中的語句是順序處理的
-
process例子-值的更新
分析:
當A、B、C、D中任一信號發生變化時,進程將開始執行,當執行 Z <= A and B 后, Z 的值不會立即變化 ;同理執行 Z <= C and D 后Z 的值也不會立即變化。當執行end process后, Z 的值才開始更新,同時系統掛起開始等待敏感信號。
-
Process中敏感信號列表的普遍原則是:
在process中,其值被引用的信號應當出現在敏感信號列表中
反例:
可見不符和設計要求
(4)子模塊subprogram中的function和procedure是順序處理的
-
順序執行語句(sequential statement)
Wait語句
assert語句
If 語句
case語句
for loop語句
while 語句
-
並行處理語句(concurrent statement)
並行操作中的信號賦值
-
信號賦值操作
-
符號"<="進行信號賦值操作的,
-
它可以用在順序執行語句中,
-
也可以用在並行處理語句中
-
注意
*用在並行處理語句中時,符號<=右邊的值是此條語句的敏感信號,即符號<=右邊的值發生變化就會重新激發此條賦值語句,也即符號<=右邊的值不變化時,此條賦值語句就不會執行。如果符號<=右邊是常數則賦值語句一直執行。
*用在順序執行語句中時,沒有以上說法。
- 選擇信號帶入語句格式
with 表達式 select
目的信號量 <= 表達式1 when 條件1,
表達式2 when 條件2,
…..
表達式n when 條件n;
-
選擇信號帶入語句例子
-
順序執行語句和並行處理語句總結
1、順序執行語句 wait、assert、if -else 、case、for-loop、while語句只能用在process、function 和 procedure 中;
2、並行處理語句(條件信號帶入和選擇信號帶入)只能用在architecture、block中;
-
其它語句
例子:
entity testand2 is
port(ain,bin: in nit ; cout:out bit);
end testand2;
architecture behav of testand2 is
component and2
generic(rise:time); port(a,b: in nit ; c:out bit);
end component;
begin
c<=(a xor b) after (rise);
u0:and2 generic map(20 ns) port map(ain,bin,cout);
end behav