VHDL基本點【精解】


VHDL描述硬件實體

結構

舉例

  1. Entity()實體

    Enitiy 實體名 is

            PORT(端口名1,端口名N:方向:類型)

            [端口說明]

        End Entity;

    Port的方向有: IN , OUT, INOUT, BUFFER, LINKAGE

    In 信號只能被引用,不能被賦值;不可以出現在<= 或 : = 的左邊

    out 信號只能被賦值,不能被引用;不可以出現在<= 或 : = 的右邊

    buffer 信號可以被引用,也可以被賦值;可以出現在<= 或 : = 的兩邊

     

    Entity的內部結構將由Architecture來描述

     

  2. Arcthitecture(構造體)

        Arcthitecture 構造體名 of 實體名 is

    [定義語句] 內部信號、常數、元件、數據類型、函數等的定義

    begin

    [並行處理語句和block、process、function、procedure]

    end 構造體名;

            例如:

    下面讓我們來看一看如何將一個實體(FULLADD)構造為一個內部能實現功能的構造體(STRUCT):

     

  3. 其他設計單元

除了entity(實體)和architecture(構造體)外還有另外三個可以獨立進行編譯的設計單元

Package(包集合)屬於庫結構的一個層次,存放信號定義、常數定義、數據類型、元件語句、函數定義和過程定義。

Package Body: 具有獨立對端口(port)的package

configuration(配置)描述層與層之間的連接關系以及實體與構造體之間關系

4、Library(庫)

庫: 數據的集合。內含各類包定義、實體、構造體等

  • STD庫 --VHDL的標准庫
  • IEEE庫 -- VHDL的標准庫的擴展
  • 面向ASIC的庫 --不同的工藝
  • 不同公司自定義的庫
  • 普通用戶自己的庫 --當VHDL文件被編譯后,編譯的結果儲存在特定的目錄下,這個目錄的邏輯名稱即Library,此目錄下的內容亦即是這個Library的內容。

  1. Package(包)

  2. 這些結構之間的關系

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

  1. 定義自己的類型

通用格式

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;

  1. 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;

 

  1. VHDL中的操作符

    (1)邏輯操作符有:

(2)邏輯操作符的應用例子

(3)關系運算符有

(4)關系運算符的應用

(5)數學運算符

注意:上述運算符應用於 integer,real,time 類型,不能用於vector(如果希望用於vector,可以使用庫IEEE的std_logic_unsigned包,它對算術運算符進行了擴展)

(6)VHDL中的操作符應用要點

VHDL屬於強類型,不同類型之間不能進行運算和賦值,可以進行數據類型轉換

vector不表示number

array 不表示number

 

VHDL中的控制語句及模塊

  1. 基本概念
    1. 並行處理(concurrent):語句的執行與書寫順序無關,並行塊內的語句時同時執行的
    2. 順序處理(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是順序處理的

 

  1. 順序執行語句(sequential statement)

    Wait語句

    assert語句

    If 語句

    case語句

    for loop語句

    while 語句

 

 

  1. 並行處理語句(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中;

 

  1. 其它語句

    例子:

    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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM