VHDL語(yǔ)言入門
VHDL 的注釋以兩個(gè)連字符“--”開始,到該行尾自動(dòng)結(jié)束,不支持成塊的注釋語(yǔ)句。
VHDL設(shè)計(jì)實(shí)體的組成:庫(kù)和程序包(Library,Package),實(shí)體(Entity),結(jié)構(gòu)體(Architecture),配置(Configuration).
--- VHDL Example
library ieee;
use ieee.std_logic_1164.all; --庫(kù)聲明
entity TONE is
port(A,B:in std_logic; --實(shí)體定義
C:out std_logic);
end TONE;
architecture EX of TONE is --結(jié)構(gòu)體定義
begin
C<=A OR B;
end EX;
VHDL不區(qū)分大小寫
1:實(shí)體的語(yǔ)句格式
ENTITY 實(shí)體名 IS
GENERIC(------); --可選
PORT(------);
END實(shí)體名;
類屬說明的書寫格式是:
GENERIC(常數(shù)名:數(shù)據(jù)類型:設(shè)定值;
常數(shù)名:數(shù)據(jù)類型:設(shè)定值);
端口語(yǔ)句的格式:
PORT(端口信號(hào)名:端口模式數(shù)據(jù)類型;
端口信號(hào)名:端口模式數(shù)據(jù)類型);
IN 輸入
OUT 輸出
INOUT 雙向
BUFFER 緩沖
2.結(jié)構(gòu)體
結(jié)構(gòu)體的任務(wù)是:定義結(jié)構(gòu)體中的各項(xiàng)內(nèi)部使用元素,如數(shù)據(jù)類型(TYPE),常數(shù)(CONSTAND),信號(hào)(SIGNAL),元件(COMPONENT),過程(POCEDURE),變量(VARIABLE)和進(jìn)程(PROCESS)等。通過VHDL語(yǔ)句描述實(shí)體所要求的具體行為和邏輯功能。描述各元件之間的連接。
結(jié)構(gòu)體格式:
結(jié)構(gòu)體名 OF 實(shí)體名IS
說明部分(可選,課用于對(duì)結(jié)構(gòu)體中使用的信號(hào)等進(jìn)行說明,這樣做有利于提高程序的可讀性)
BEGIN
功能描述語(yǔ)句法
END 結(jié)構(gòu)體名稱
VHDL內(nèi)部是并發(fā)執(zhí)行的,但是process內(nèi)部的代碼是順序執(zhí)行的。要實(shí)現(xiàn)時(shí)序電路,必須使用順序執(zhí)行代碼。順序執(zhí)行代碼可以同時(shí)實(shí)現(xiàn)組合邏輯電路和時(shí)序邏輯電路。
從本質(zhì)上講,VHDL代碼是并發(fā)執(zhí)行的。只有PROCESS,F(xiàn)UNCTION或者PROCEDURE內(nèi)部的代碼才是順序執(zhí)行的。值得注意的是,盡管這些模塊中的代碼是順序執(zhí)行的,但是當(dāng)它們作為一個(gè)整體是,與其他模塊之間又是并發(fā)的。IF,WAIT,CASE,LOOP語(yǔ)句都是順序代碼,用在PROCESS,FUNCTION和PROCEDURE內(nèi)部。
我們將一系列的并發(fā)描述語(yǔ)句放在一個(gè)simple block中,目的僅僅是為了增強(qiáng)整個(gè)代碼的可讀性和可維護(hù)性。但是,一個(gè)特殊的例子是利用guarded BLOCK可以構(gòu)造時(shí)序電路。
類屬 GENERIC 參量是一種端口界面常數(shù),常以一種說明的形式放在實(shí)體或塊結(jié)構(gòu)體前的說明部分。
類屬參量以關(guān)鍵詞 GENERIC 引導(dǎo)一個(gè)類屬參量表,在表中提供時(shí)間參數(shù)或總線寬度等靜態(tài)信息。
一般在結(jié)構(gòu)體中,類屬的應(yīng)用與常數(shù)是一樣的,例如:當(dāng)用實(shí)體例化一個(gè)設(shè)計(jì)實(shí)體的器件時(shí),可以用類屬表中的參數(shù)項(xiàng)定制這個(gè)器件,如可以將一個(gè)實(shí)體的傳輸延遲,上升和下降延時(shí)等參數(shù)加到類屬參數(shù)表中,然后根據(jù)這些參數(shù)進(jìn)行定制,這對(duì)于系統(tǒng)仿真控制是十分方便的。其中的常數(shù)名是由設(shè)計(jì)者確定的類屬常數(shù)名,數(shù)據(jù)類型通常取INTEGER 或TIME 等類型,設(shè)定值即為常數(shù)名所代表的數(shù)值,但需注意 VHDL 綜合器僅支持?jǐn)?shù)據(jù)類型為整數(shù)的類屬值。
GENERIC詳細(xì)描述見以下網(wǎng)址
http://hi.baidu.com/rebornlinlin/item/0caedc0f8b0a058e03ce1b5a
一個(gè)元件 component是一個(gè)結(jié)構(gòu)完整的常用代碼,(包括庫(kù)聲明、實(shí)體和結(jié)構(gòu)體這些基本的組成部分)。然而如果將這些代碼聲明為component,就可以被其他電路調(diào)用,從而使代碼具有了層次化的結(jié)構(gòu)。
COMPONENT是已有元件在別的文件中已經(jīng)定義,在此聲明之后,你的程序里就可以用了
就比如我在設(shè)計(jì)文件中定義了一個(gè)實(shí)體
entity cnt6 is
port
(clr,en,clk :in std_logic;
q :out std_logic_vector(2 downto 0)
);
end entity;
然后我要在測(cè)試文件中使用它,需要例化它,但首先要使用component對(duì)它進(jìn)行聲明。
architecture rtl of cnt6_tb is
component cnt6
port(
clr,en,clk :in std_logic;
q :out std_logic_vector(2 downto 0)
);
end component;
關(guān)于VHDL 的testbench 的編寫,請(qǐng)參照以下網(wǎng)址,寫的蠻好
http://blog.csdn.net/wangjun403/article/details/6246830
http://www.cnblogs.com/zlh840/archive/2011/07/08/2101504.html
?COMPONENT語(yǔ)句
COMPONENT 元件名
【GENERIC 說明】;
PORT 說明;
END COMPONENT;
COMPONENT語(yǔ)句可以在
ARCHITECTURE,PACKAGE及BLOCK
的說明部分中使用
?COMPONENT_INSTANT語(yǔ)句
標(biāo)號(hào)名:元件名 PORT MAP(信號(hào),???)
該語(yǔ)句使得使用已有元件或模塊成為
可能,該語(yǔ)句將元件或模塊的端口信號(hào)
映射成為高層次電路中的信號(hào)。
?COMPONENT_INSTANT語(yǔ)句
標(biāo)號(hào)名:元件名 PORT MAP(信號(hào),???)
該語(yǔ)句使得使用已有元件或模塊成為
可能,該語(yǔ)句將元件或模塊的端口信號(hào)
映射成為高層次電路中的信號(hào)。
例:已有設(shè)計(jì)and2的端口說明如下
Port(a,b:in bit;
c:out bit);
元件調(diào)用
u1:and2 portmap(x,y,q);
u2: and2 port map(a=>x,b=>y,c=>q);
在輸出信號(hào)沒有連接的情況下,其對(duì)應(yīng)
端口的描述可以忽略
程序包說明格式如下:
package 程序包名 is
說明語(yǔ)句;
end 程序包名;
程序包名:設(shè)計(jì)者自定義便于記憶的標(biāo)識(shí)符
說明語(yǔ)句:包括各種類型的說明語(yǔ)句
程序包體
描述函數(shù)和過程功能的函數(shù)體與過程等的集合稱程序包體
程序包說明中,定義了數(shù)據(jù)類型和子程序中的函數(shù)、過程說明,而程序包體中才具體地描述該函數(shù)、過程功能的語(yǔ)句和數(shù)據(jù)的賦值。
程序包體格式:
package body 程序包名 is
順序語(yǔ)句;
end 程序包名;
程序包名:與程序包說明中的程序包名相同
順序語(yǔ)句:描述函數(shù)、過程及其他功能的程序流
子程序——過程
VHDL中,所謂子程序指主程序調(diào)用它后能將處理結(jié)果返回主程序的程序模塊。
VHDL語(yǔ)言中,子程序有兩種類型,過程(procedure)和函數(shù)(function)。
他們的區(qū)別:
1、過程可具有多個(gè)返回值,而函數(shù)只能有一個(gè)
2、過程通常用來定義一個(gè)算法,而函數(shù)往往用來產(chǎn)生一個(gè)特定的值
3、過程中的參數(shù)可具有3種端口模式:in、out、inout,而函數(shù)中的參數(shù)只能具有一直端口模式:in
過程的書寫結(jié)構(gòu)
對(duì)于VHDL子程序來說,它通常包括子程序說明部分和子程序定義部分。
其中,子程序說明部分定義了其他設(shè)計(jì)調(diào)用子程序的接口;子程序定義部分則描述該子程序具體功能的實(shí)現(xiàn)。
因此,通常將子程序說明部分和子程序定義部分的書寫結(jié)構(gòu)分別介紹
在VHDL中,過程說明部分的書寫結(jié)構(gòu):
procedure:過程名
(對(duì)象類型1 參數(shù)名1: 端口模式1 數(shù)據(jù)類型1;
對(duì)象類型2 參數(shù)名2:端口模式2 數(shù)據(jù)類型2;......);
其中對(duì)象類型、端口模式是可選項(xiàng)。
在VHDL語(yǔ)言中,過程定義部分
procedure 過程名
(對(duì)象類型1 參數(shù)名1: 端口模式1 數(shù)據(jù)類型1;
對(duì)象類型2 參數(shù)名2:端口模式2 數(shù)據(jù)類型2;......)is
過程說明部分;
begin
過程順序語(yǔ)句部分;
end 過程名;
參數(shù)列表中:每個(gè)參數(shù)包括它的對(duì)象類型、參數(shù)名、端口模式以及數(shù)據(jù)類型
參數(shù)的對(duì)象類型包括:常量、信號(hào)、變量
參數(shù)名是用來表示參數(shù)的唯一標(biāo)識(shí)
端口模式:包括in、out、inout
若過程中沒有指明參數(shù)的對(duì)象類型,那么參數(shù)的對(duì)象類型將默認(rèn)為一個(gè)變量
過程定義在程序包中的定義規(guī)則為:過程說明部分書寫在程序包的說明部分,過程定義部分書寫在程序包體部分
過程定義在結(jié)構(gòu)體中:即將過程定義部分書寫在結(jié)構(gòu)體的說明部分,然后在結(jié)構(gòu)體進(jìn)程語(yǔ)句里調(diào)用
函數(shù)
函數(shù)包括:函數(shù)說明部分和函數(shù)定義部分
函數(shù)說明部分定義了主程序調(diào)用函數(shù)的接口
函數(shù)定義部分描述了該函數(shù)具體邏輯功能的實(shí)現(xiàn)
函數(shù)的書寫結(jié)構(gòu)
function 函數(shù)名
(對(duì)象類型1 參數(shù)名1; in 數(shù)據(jù)類型1;
對(duì)象類型2 參數(shù)名2; in 數(shù)據(jù)類型2;......) return 數(shù)據(jù)類型;
其中對(duì)象類型和端口模式in是可選項(xiàng)
函數(shù)定義部分書寫結(jié)構(gòu)
function 函數(shù)名
(對(duì)象類型1 參數(shù)名1; in 數(shù)據(jù)類型1;
對(duì)象類型2 參數(shù)名2; in 數(shù)據(jù)類型2;......) return 數(shù)據(jù)類型is
函數(shù)說明部分:
begin
函數(shù)順序語(yǔ)句部分;
return(參數(shù)值);
end 函數(shù)名;
函數(shù)參數(shù)的對(duì)象類型只能包括常量和信號(hào):參數(shù)的端口模式只能是in,因此參數(shù)端口模式可以省略。
函數(shù)的返回值只能有一個(gè)。
函數(shù)定義在程序包中:函數(shù)說明部分書寫在程序包說明部分,函數(shù)定義部分書寫在程序包體部分。如果需要使用程序包中定義的函數(shù),那么只需要通過use語(yǔ)句使其對(duì)設(shè)計(jì)實(shí)體可見。
函數(shù)定義在結(jié)構(gòu)體中:只需將函數(shù)定義部分書寫在結(jié)構(gòu)體說明部分即可。然后在結(jié)構(gòu)體中調(diào)用這個(gè)函數(shù)。
function內(nèi)是不允許加入進(jìn)程process的。函數(shù)function的通常應(yīng)用是作邏輯組合、判決和轉(zhuǎn)移。