vhdl介紹:
VHDL翻譯成中文就是超高速集成電路硬件描述語(yǔ)言,主要是應(yīng)用在數(shù)字電路的設(shè)計(jì)中。它在中國(guó)的應(yīng)用多數(shù)是用在FPGA/CPLD/EPLD的設(shè)計(jì)中。當(dāng)然在一些實(shí)力較為雄厚的單位,它也被用來(lái)設(shè)計(jì)ASIC。
VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu),行為,功能和接口。除了含有許多具有硬件特征的語(yǔ)句外,VHDL的語(yǔ)言形式、描述風(fēng)格以及語(yǔ)法是十分類(lèi)似于一般的計(jì)算機(jī)高級(jí)語(yǔ)言。VHDL的程序結(jié)構(gòu)特點(diǎn)是將一項(xiàng)工程設(shè)計(jì),或稱(chēng)設(shè)計(jì)實(shí)體(可以是一個(gè)元件,一個(gè)電路模塊或一個(gè)系統(tǒng))分成外部(或稱(chēng)可視部分,及端口)和內(nèi)部(或稱(chēng)不可視部分),既涉及實(shí)體的內(nèi)部功能和算法完成部分。在對(duì)一個(gè)設(shè)計(jì)實(shí)體定義了外部界面后,一旦其內(nèi)部開(kāi)發(fā)完成后,其他的設(shè)計(jì)就可以直接調(diào)用這個(gè)實(shí)體。這種將設(shè)計(jì)實(shí)體分成內(nèi)外部分的概念是VHDL系統(tǒng)設(shè)計(jì)的基本點(diǎn)。
vhdl特點(diǎn):
1.功能強(qiáng)大、設(shè)計(jì)靈活
VHDL具有功能強(qiáng)大的語(yǔ)言結(jié)構(gòu),可以用簡(jiǎn)潔明確的源代碼來(lái)描述復(fù)雜的邏輯控制。它具有多層次的設(shè)計(jì)描述功能,層層細(xì)化,最后可直接生成電路級(jí)描述。VHDL支持同步電路、異步電路和隨機(jī)電路的設(shè)計(jì),這是其他硬件描述語(yǔ)言所不能比擬的。VHDL還支持各種設(shè)計(jì)方法,既支持自底向上的設(shè)計(jì),又支持自頂向下的設(shè)計(jì);既支持模塊化設(shè)計(jì),又支持層次化設(shè)計(jì)。
2.支持廣泛、易于修改
由于VHDL已經(jīng)成為IEEE標(biāo)準(zhǔn)所規(guī)范的硬件描述語(yǔ)言,大多數(shù)EDA工具幾乎都支持VHDL,這為VHDL的進(jìn)一步推廣和廣泛應(yīng)用奠定了基礎(chǔ)。在硬件電路設(shè)計(jì)過(guò)程中,主要的設(shè)計(jì)文件是用VHDL編寫(xiě)的源代碼,因?yàn)閂HDL易讀和結(jié)構(gòu)化,所以易于修改設(shè)計(jì)。
3.強(qiáng)大的系統(tǒng)硬件描述能力
VHDL具有多層次的設(shè)計(jì)描述功能,既可以描述系統(tǒng)級(jí)電路,又可以描述門(mén)級(jí)電路。而描述既可以采用行為描述、寄存器傳輸描述或結(jié)構(gòu)描述,也可以采用三者混合的混合級(jí)描述。另外,VHDL支持慣性延遲和傳輸延遲,還可以準(zhǔn)確地建立硬件電路模型。VHDL支持預(yù)定義的和自定義的數(shù)據(jù)類(lèi)型,給硬件描述帶來(lái)較大的自由度,使設(shè)計(jì)人員能夠方便地創(chuàng)建高層次的系統(tǒng)模型。
4.獨(dú)立于器件的設(shè)計(jì)、與工藝無(wú)關(guān)
設(shè)計(jì)人員用VHDL進(jìn)行設(shè)計(jì)時(shí),不需要首先考慮選擇完成設(shè)計(jì)的器件,就可以集中精力進(jìn)行設(shè)計(jì)的優(yōu)化。當(dāng)設(shè)計(jì)描述完成后,可以用多種不同的器件結(jié)構(gòu)來(lái)實(shí)現(xiàn)其功能。
5.很強(qiáng)的移植能力
VHDL是一種標(biāo)準(zhǔn)化的硬件描述語(yǔ)言,同一個(gè)設(shè)計(jì)描述可以被不同的工具所支持,使得設(shè)計(jì)描述的移植成為可能。
6.易于共享和復(fù)用
VHDL采用基于庫(kù)(Library)的設(shè)計(jì)方法,可以建立各種可再次利用的模塊。這些模塊可以預(yù)先設(shè)計(jì)或使用以前設(shè)計(jì)中的存檔模塊,將這些模塊存放到庫(kù)中,就可以在以后的設(shè)計(jì)中進(jìn)行復(fù)用,可以使設(shè)計(jì)成果在設(shè)計(jì)人員之間進(jìn)行交流和共享,減少硬件電路設(shè)計(jì)。
vhdl優(yōu)勢(shì):
(1)與其他的硬件描述語(yǔ)言相比,VHDL具有更強(qiáng)的行為描述能力,從而決定了他成為系統(tǒng)設(shè)計(jì)領(lǐng)域最佳的硬件描述語(yǔ)言。強(qiáng)大的行為描述能力是避開(kāi)具體的器件結(jié)構(gòu),從邏輯行為上描述和設(shè)計(jì)大規(guī)模電子系統(tǒng)的重要保證。
?。?)VHDL豐富的仿真語(yǔ)句和庫(kù)函數(shù),使得在任何大系統(tǒng)的設(shè)計(jì)早期就能查驗(yàn)設(shè)計(jì)系統(tǒng)的功能可行性,隨時(shí)可對(duì)設(shè)計(jì)進(jìn)行仿真模擬。
?。?)VHDL語(yǔ)句的行為描述能力和程序結(jié)構(gòu)決定了他具有支持大規(guī)模設(shè)計(jì)的分解和已有設(shè)計(jì)的再利用功能。符合市場(chǎng)需求的大規(guī)模系統(tǒng)高效,高速的完成必須有多人甚至多個(gè)開(kāi)發(fā)組共同并行工作才能實(shí)現(xiàn)。
?。?)對(duì)于用VHDL完成的一個(gè)確定的設(shè)計(jì),可以利用EDA工具進(jìn)行邏輯綜合和優(yōu)化,并自動(dòng)的把VHDL描述設(shè)計(jì)轉(zhuǎn)變成門(mén)級(jí)網(wǎng)表。
(5)VHDL對(duì)設(shè)計(jì)的描述具有相對(duì)獨(dú)立性,設(shè)計(jì)者可以不懂硬件的結(jié)構(gòu),也不必管理最終設(shè)計(jì)實(shí)現(xiàn)的目標(biāo)器件是什么,而進(jìn)行獨(dú)立的設(shè)計(jì)。
8位移位寄存器vhdl代碼:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
PORT (
data_in : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --輸入的數(shù)據(jù)
n : IN STD_LOGIC_VECTOR(2 DOWNTO 0); --移位的數(shù)量
dir : IN STD_LOGIC; --移動(dòng)的方向 0:左 1:右
kind : IN STD_LOGIC_VECTOR(1 DOWNTO 0); --移動(dòng)類(lèi)型 00:算術(shù)移 01:邏輯移 10:循環(huán)移
clock : IN BIT; --手動(dòng)時(shí)鐘PULSE
data_out : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --移位的結(jié)果
?。?
END shifter;
ARCHITECTURE behav of shifter IS
BEGIN
PROCESS (data_in, n, dir, kind)
VARIABLE x,y : STD_LOGIC_VECTOR(7 DOWNTO 0);
VARIABLE ctrl0,ctrl1,ctrl2 : STD_LOGIC_VECTOR (3 DOWNTO 0);
BEGIN
IF (clock‘EVENT AND clock = ’1‘)THEN
--產(chǎn)生控制向量ctrl
ctrl0 := n(0) & dir & kind(1) & kind(0);
ctrl1 := n(1) & dir & kind(1) & kind(0);
ctrl2 := n(2) & dir & kind(1) & kind(0);
CASE ctrl0 IS
WHEN “0000” | “0001” | “0010” | “0100” | “0101” | “0110” =》 x := data_in; --n=0時(shí)不移動(dòng)
WHEN “1000” =》 x := data_in(6 DOWNTO 0) & data_in(0); --算術(shù)左移1位
WHEN “1001” =》 x := data_in(6 DOWNTO 0) & ’0‘; --邏輯左移1位
WHEN “1010” =》 x := data_in(6 DOWNTO 0) & data_in(7); --循環(huán)左移1位
WHEN “1100” =》 x := data_in(7) & data_in(7 DOWNTO 1); --算術(shù)右移1位
WHEN “1101” =》 x := ’0‘ & data_in(7 DOWNTO 1); --邏輯右移1位
WHEN “1110” =》 x := data_in(0) & data_in(7 DOWNTO 1); --循環(huán)右移1位
WHEN others =》 null;
END CASE;
CASE ctrl1 IS
WHEN “0000” | “0001” | “0010” | “0100” | “0101” | “0110” =》 y := x; --n=0時(shí)不移動(dòng)
WHEN “1000” =》 y := x(5 DOWNTO 0) & x(0) & x(0); --算術(shù)左移2位
WHEN “1001” =》 y := x(5 DOWNTO 0) & “00”; --邏輯左移2位
WHEN “1010” =》 y := x(5 DOWNTO 0) & x(7 DOWNTO 6); --循環(huán)左移2位
WHEN “1100” =》 y := x(7) & x(7) & x(7 DOWNTO 2); --算術(shù)右移2位
WHEN “1101” =》 y := “00” & x(7 DOWNTO 2); --邏輯右移2位
WHEN “1110” =》 y := x(1 DOWNTO 0) & x(7 DOWNTO 2); --循環(huán)右移2位
WHEN others =》 null;
END CASE;
CASE ctrl2 IS
WHEN “0000” | “0001” | “0010” | “0100” | “0101” | “0110” =》 data_out 《= y; --n=0時(shí)不移動(dòng)
WHEN “1000” =》 data_out 《= y(3 DOWNTO 0) & y(0) & y(0) & y(0) & y(0); --算術(shù)左移
評(píng)論