目錄 1.2.結(jié)構(gòu)體 (Architecture) 1.VHDL基本結(jié)構(gòu)
VHDL的基本設(shè)計的基本設(shè)計單元結(jié)構(gòu):程序包說明 、實體說明和結(jié)構(gòu)體說明三部分:
1.1.實體(Entity)實體描述了設(shè)計單元的輸入輸出接口信號或引腳 ,是設(shè)計實體經(jīng)封裝后對外的一個通信界面。 定義方式: ENTITY 實體名 IS
類屬為設(shè)計實體與外界通信的靜態(tài)信息提供通道 ,用來規(guī)定端口的大小、實體中子元件的數(shù)目和實體的定時特性等。 格 式 :
OUT” 和“BUFFER”都可定義輸出端口; 注意:若實體內(nèi)部需要反饋輸出信號 ,則輸出端口必須被設(shè)置為為“BUFFER”, 而不能為能為“OUT”。
1.2.結(jié)構(gòu)體 (Architecture)結(jié)構(gòu) 體定義了設(shè)計單元具體的功能,描述了該基本設(shè)計單元的行為、 元件和內(nèi)部的連接關(guān)系 . 定義方式: ARCHITECTURE 結(jié)構(gòu)體名 OF 實體名 IS
1.3.庫、程序包的調(diào)用方法: LIBRARY 庫名;
1.4.VHDL語句1.4.1.并行語句在結(jié)構(gòu)體中的執(zhí)行是同時進(jìn)行, 執(zhí)行順序與書寫順序無關(guān)。如下圖所示
例子: 實現(xiàn)一個4X1多路選擇器,當(dāng)選擇信號為00則輸出信號為Data0的數(shù)據(jù),選擇為01輸出Data1的信號,依次類推: 程序如下: library ieee;use ieee.std_logic_1164.all;entity mux isport(Data0,Data1,Data2,Data3:IN std_logic_Vector(7 downto 0);Sel : IN std_logic_vector(1 downto 0);Dout: out std_logic_vector(7 downto 0));end;architecture DataFolw of mux isbeginwith Sel selectDout<= Data0 WHEN "00",Data1 WHEN "01",Data2 WHEN "10",Data3 WHEN "11","00000000" WHEN OTHERS;end; 進(jìn)行仿真測試:
例子: 實現(xiàn)8輸入優(yōu)先編碼器: 程序如下: library ieee;use ieee.std_logic_1164.all;entity Priority_Encoder isport(I : in std_logic_vector(7 downto 0);A : out std_logic_vector(2 downto 0));end;architecture DataFlow of priority_Encoder isbeginA<="111" WHEN I(7)='1' ElSE"110" WHEN I(6)='1' ElSE"101" WHEN I(5)='1' ElSE"100" WHEN I(4)='1' ElSE"011" WHEN I(3)='1' ElSE"010" WHEN I(2)='1' ElSE"001" WHEN I(1)='1' ElSE"000" WHEN I(0)='1' ElSE"111";end; 進(jìn)行仿真測試: 1.4.2.進(jìn)程語句進(jìn)程語句定義順序語句模塊 ,用于將從外部獲得的信號值 ,或內(nèi)部的運(yùn)算數(shù)據(jù)向其他的信號進(jìn)行賦值 。
語法:
在每個上升沿啟動一次進(jìn)程( 執(zhí)行進(jìn)程內(nèi)所有的語句 ) 。 描述方法: 上升沿描述: Clock’ EVENT AND Clock='1’ 例子1: 把clock設(shè)為敏感信號,當(dāng)clock上升沿時,輸出時鐘就進(jìn)行取反一次。 程序如下: library ieee;use ieee.std_logic_1164.all;entity FreDevider isport(Clock: in std_logic;Clkout:out std_logic);end;architecture Behavior of FreDevider isSignal Clk:std_logic;beginprocess(Clock)beginif rising_edge(Clock) THENClk<=NOT Clk;end if;end process;Clkout<=Clk;end; 仿真波形如下: 例子2: 本例子做一個自加器,沒遇到一個clock的上升沿,num就自加1,加到3就自動清零,重新開始,循環(huán)進(jìn)行,還有一個復(fù)位按鈕,只要檢測是reset的值為1,num的數(shù)值就清零,重新開始計數(shù)。 代碼如下: library ieee;use ieee.std_logic_1164.all;entity Counter isport(reset: in std_logic; --異步時鐘復(fù)位信號clock: in std_logic; --時鐘信號num :buffer integer range 0 to 3); --設(shè)置一個整形變量,范圍從0到3end;architecture Behavior of Counter isbeginprocess(reset,clock) --將復(fù)位,和時鐘作為進(jìn)程的敏感信號beginif reset='1' THENnum<=0; --當(dāng)檢測到reset=1時,num清零elsif rising_edge(clock) THENif num=3 THENnum<=0; --如果num=3就,清零elsenum<=num+1; --否則自加1end if;end if;end process;end; 仿真結(jié)果如下: 例子:
1.5.元件例化語句
舉例:把元件比喻成要插在電路系統(tǒng)板上的芯片,端口比喻成準(zhǔn)備接受芯片的插座。 元件例化的方式:
例子: 設(shè)計一個四輸入的與非門,如下圖所示: 此時我們需要設(shè)計一個2輸入的與非門,然后通過元件例化這個二輸入的與非門,實現(xiàn)四輸入與非門的功能。 1.在電腦本地新建兩個文件夾,分別用于存放二輸入與非門的文件,另一個是實現(xiàn)這個與非門例化實現(xiàn)功能的元件。 在我們電腦本地目錄下:D:\QuartusII_Test,新建兩個文件夾如下所示: 2.然后再Q(mào)uartusII新建一個VHDL文件,實現(xiàn)二輸入與非門的功能,具體代碼如下: library ieee;use ieee.std_logic_1164.all;entity nd2 isport(a,b :in std_logic;c :out std_logic);end;architecture nd2bhv of nd2 isbeginc<=a nand b;end; 3.然后保存到D:\QuartusII_Test\nd2中,工程也要命名為:nd2 4.編輯成功后,新建一個仿真波形圖,如下功能仿真正確 5.新建一個工程,工程保存到D:\QuartusII_Test\ord41 ,然后命名為ord41 6.新建一個VHDL文件,使用二輸入與非門的元件例化,代碼編輯如下: library ieee;use ieee.std_logic_1164.all;entity ord41 isport(a1,b1,c1,d1 :in std_logic;z1 :out std_logic);end ord41;architecture ord41bhv of ord41 iscomponent nd2port(a,b:in std_logic;c :out std_logic);end component;signal x,y:std_logic;beginu1:nd2 port map(a1,b1,x);u2:nd2 port map(a=>c1,c=>y,b=>d1);u3:nd2 port map(x,y,c=>z1);end ord41bhv; 附錄:對上面例子的說明 7.保存,文件名為ord41 8.這一步很重要,如果沒有這一步編譯將會報錯!??! 添加庫剛剛nd2的庫到這個工程。 點(diǎn)擊assignment下拉菜單中的settings選項,并選中user libraries選項,則下圖所示: 點(diǎn)擊library name 后面的“…” 按鈕,找到nd2文件夾,點(diǎn)擊Add, 如下圖所示: 9.點(diǎn)擊編譯按鈕,對ord41工程進(jìn)行編譯,如果設(shè)置好第8步,而且語法沒有錯的話不會報錯。 10.編譯成功后,然后新建仿真圖進(jìn)行仿真,仿真結(jié)果如下: |
|