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