一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

2.VHDL的基本結(jié)構(gòu)和語法(一)...

 qingxiangwang 2021-10-09

目錄

1.VHDL基本結(jié)構(gòu)

1.1.實體(Entity)

類屬說明

端口方向:IN, OUT ,INOUT ,BUFFER

1.2.結(jié)構(gòu)體 (Architecture)

1.3.庫、程序包的調(diào)用

1.4.VHDL語句

1.4.1.并行語句

并行信號賦值

1.4.2.進(jìn)程語句

進(jìn)程的工作原理:

進(jìn)程與時鐘

進(jìn)程的啟動

進(jìn)程的注意事項

1.5.元件例化語句

實現(xiàn)元件例化的詳細(xì)步驟


1.VHDL基本結(jié)構(gòu)

  •  實體(Entity) :描述所設(shè)計的系統(tǒng)的外部接口信號 ,定義電路設(shè)計中所有的輸入和輸出端口;

  •  結(jié)構(gòu)體 (Architecture) :描述系統(tǒng)內(nèi)部的結(jié)構(gòu)和行為;

  • 包集合 (Package): 存放各設(shè)模塊能共享的數(shù)據(jù)類型 、常數(shù)和子程序等 ;

  • 配置 (Configuration):  指定實體所對應(yīng)的結(jié)構(gòu)體;

  • 庫 (Library):  存放已經(jīng)編譯的實體 、結(jié)構(gòu)體 、包集合和配置。

VHDL的基本設(shè)計的基本設(shè)計單元結(jié)構(gòu):程序包說明 、實體說明和結(jié)構(gòu)體說明三部分:

 


 1.1.實體(Entity)

實體描述了設(shè)計單元的輸入輸出接口信號或引腳 ,是設(shè)計實體經(jīng)封裝后對外的一個通信界面。

定義方式:

ENTITY    實體名   IS
[ GENERIC( 常數(shù)名 :數(shù)據(jù)類型 :設(shè)定值) ]
PORT
(  端口名1:  端口方向  端口類型;
   端口名2:  端口方向  端口類型;
  .
  .

  端口名n:  端口方向  端口類 型
); 
END [實體名]; 

注意:實體名由設(shè)計者自由命名 ,用來表示被設(shè)計電路芯片的名稱 , 但是必須與VHDL程序的程序的文件名稱相同。 要與文 件 名一 致 。


  •   類屬說明

類屬為設(shè)計實體與外界通信的靜態(tài)信息提供通道 ,用來規(guī)定端口的大小、實體中子元件的數(shù)目和實體的定時特性等。

格 式 :
GENERIC(  常數(shù)名 :數(shù)據(jù)類型 :設(shè)定值;
                     ∶
                     常數(shù)名  :數(shù)據(jù)類型 :設(shè)定值 );

例 如:

GENERIC (wide :integer:=32); -- 說明寬度為32
GENERIC (tmp :integer:=1ns); -- 說明延時1 ns


  • 端口方向:IN, OUT ,INOUT ,BUFFER

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
[聲明語句]
BEGIN
功能描述語句
END [ 結(jié)構(gòu)體名];

提示:

1.聲明語句的作用:用于聲明該結(jié)構(gòu)體將用到的信號 、數(shù)據(jù)類型 、常數(shù)、子程序和元件等 。 聲明的內(nèi)容是局部的。

2.功能描述語句:具體描述結(jié)構(gòu)體的功能和行為。

  • 一 個實體可對應(yīng)多個結(jié)構(gòu)體 , 每個結(jié)構(gòu)體代表該實體功能的不同實現(xiàn)方案或不同實現(xiàn)方式 。同一時刻只有一個結(jié)構(gòu)體起作用,通過CONFIGURATION決定用哪個結(jié)構(gòu)體進(jìn)行仿真或綜合。

  • 在結(jié)構(gòu)體描述中, 具體給出了輸入 、 輸出信號之間的邏輯關(guān)系 。


1.3.庫、程序包的調(diào)用

方法:

LIBRARY 庫名;
USE 庫名. 程序包名.項目名;

例子:

LIBRARY IEEE;
USE IEEE.Std_Logic_1164.ALL;--調(diào)用此程序包的所有資源

其他例子:

LIBRARY IEEE;
USE IEEE.Std_Logic_1164.ALL ;
USE IEEE.Std_Logic_Arith.ALL ;
USE IEEE.Std_Logic_Unsigned.ALL 


1.4.VHDL語句

1.4.1.并行語句

在結(jié)構(gòu)體中的執(zhí)行是同時進(jìn)行, 執(zhí)行順序與書寫順序無關(guān)。如下圖所示

  •  并行信號賦值

  • 簡單賦值語句

目標(biāo)信號名 <=  表達(dá)式

注意:目標(biāo)信號的數(shù)據(jù)類型與右邊表達(dá)式一 致。

  • 選擇信號賦值語句

WITH  選擇表達(dá)式 SELECT
賦值目標(biāo)信號  <=  表達(dá)式1 WHEN 選擇值 1, 
                              表達(dá)式2 WHEN 選擇值 1, 
                              表達(dá)式n WHEN OTHERS;

注意:

1.選擇值要覆蓋所有可能情況 , 若不能一一指定,用OTHERS為其他情況找個出口。

2.選擇值必須互斥 ,不能出現(xiàn)條件重復(fù)或重疊的情況。

例子:

實現(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)行仿真測試:


  •  條件信號賦值語句

賦值目標(biāo)信號  <=  表達(dá)式1 WHEN 賦值條件1 ELSE
                              表達(dá)式2 WHEN 賦值條件2 ELSE
                              表達(dá)式n WHEN 賦值條件n ELSE
                              表達(dá)式;

注意:

1.各賦值語句有優(yōu)先級的差別 , 按書寫順序從高到低排列;

2.各賦值條件可以重疊。

例子:

實現(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)程本身是并行語句, 但內(nèi)部是順序語句 ;

  • 進(jìn)程只有在特定的時刻 ( 敏感信號發(fā)生變化) 才會被激活。

語法:

[ 進(jìn)程標(biāo)號 :] ] PROCESS ( 敏感信號參數(shù)表 )
[聲明區(qū) ] ;
      BEGIN
            順序語句
      END PROCESS [進(jìn)程標(biāo)號] ;

注意:

1.一 個進(jìn)程可以有多個敏感信號 , 任一 敏感信號發(fā)生變化都會激活進(jìn)程。

2.聲明區(qū)的作用:在進(jìn)程中起作用的局部變量。

  • 進(jìn)程的工作原理:

注意事項:

1.進(jìn)程掛起:則執(zhí)行過程終止。

2.當(dāng)某個敏感信號的值發(fā)生變化時,每個進(jìn)程語句立即完成進(jìn)程內(nèi)順序語句所定義的功能行為。

3.順序語句所定義的功能行為的結(jié)果可以賦值給信號,并通過信號被其他簡稱讀取或賦值。

  • 進(jìn)程與時鐘

在每個上升沿啟動一次進(jìn)程( 執(zhí)行進(jìn)程內(nèi)所有的語句 ) 。

描述方法:

上升沿描述: Clock’ EVENT AND Clock='1’
下降沿描述: Clock’ EVENT AND Clock='0’
上升沿描述: rising_edge (Clock)
下降沿描述: falling_edge (Clock)

例子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é)果如下:


  • 進(jìn)程的啟動

  • 當(dāng)process的敏感信號參數(shù)表中沒有列出任何敏感信號時 ,進(jìn)程通過wait 語句啟動 

例子:

ARCHITECTURE Behavior OF state IS
BEGIN
           PROCESS -- 敏感信號列表為 空
           BEGIN
           wait until Clock; -- 等待clock激活進(jìn)程
                 IF ( drive='1’) THEN
                     CASE output IS
                     WHEN s1 => output <= s2;
                     WHEN s2 => output <= s3;
                     WHEN s3 => output <= s4;
                     WHEN s4 => output <= s1;
                     END CASE; 
                END IF; 
            END PROCESS;
END;


  • 進(jìn)程的注意事項

  1. 進(jìn)程本身是并行語句, 但內(nèi)部為順序語句 ;

  2. 進(jìn)程在敏感信號發(fā)生變化時被激活 ,在使用了敏感表的進(jìn)程中不能含wait 語句 ;

  3. 在同一進(jìn)程中對同一信號多次賦值 , 只有最后一次生 效 ;

  4. 在不同進(jìn)程中,不可對同一信號進(jìn)行賦值;

  5. 一個進(jìn)程不可同時對時鐘上 、下沿敏感 。

  6. 進(jìn)程中的信號賦值是在進(jìn)程掛起時生效的,而變量賦值是即時生 效。

  7. 相對于結(jié)構(gòu)體而言, 信號具有全局性 ,是進(jìn)程間進(jìn)行并行聯(lián)系的重要途徑 。

  8. 進(jìn)程為綜合器支持 ,且其建模方式直接影響仿真和綜合結(jié)果 ,綜合后對應(yīng)于進(jìn)程的硬件結(jié)構(gòu)對進(jìn)程中所有可讀入信號都是敏感的。


1.5.元件例化語句

  • 元件例化引入一種連接關(guān)系 , 將預(yù)先設(shè)計好的實體定義為元件 , 并將此元件與當(dāng)前設(shè)計實體中的端口相連接 , 從而為當(dāng)前設(shè)計實體引入一個新的低一級的設(shè)計層次 。

舉例:把元件比喻成要插在電路系統(tǒng)板上的芯片,端口比喻成準(zhǔn)備接受芯片的插座。

元件例化的方式:

元件定義語句: 

Component    元件名
port ( 端口名表); 
End component   元件名;

元件例化語句:
例化名 : 元件名 port map ( [元件端口名=>]連接端口名 , …);

注意:

1.port當(dāng)中列出對外通信的各端口名。

2.端口的關(guān)聯(lián)方式有兩種,第一:名字關(guān)聯(lián)法,port map的語句中位置可以隨意,第二:位置關(guān)聯(lián)法,端口名和關(guān)聯(lián)連接符號可以省去,連接端口名的排列方式與所需例化的元件端口定義的端口名順序相對應(yīng)。

3.連接端口名:當(dāng)前系統(tǒng)與準(zhǔn)備接入的元件對應(yīng)端口相連的通信端口。

例子:

設(shè)計一個四輸入的與非門,如下圖所示:

此時我們需要設(shè)計一個2輸入的與非門,然后通過元件例化這個二輸入的與非門,實現(xiàn)四輸入與非門的功能。

  • 實現(xiàn)元件例化的詳細(xì)步驟

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é)果如下:


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产亚洲二区精品美女久久| 午夜视频成人在线免费| 亚洲一区二区久久观看| 婷婷激情四射在线观看视频| 视频在线免费观看你懂的| 欧美中文日韩一区久久| 国产女优视频一区二区| 69老司机精品视频在线观看| 午夜小视频成人免费看| 国产午夜福利不卡片在线观看| 亚洲欧美日韩国产自拍| 欧美日韩国产亚洲三级理论片| 国产精品福利一二三区| 伊人久久五月天综合网| 国产免费黄片一区二区| 久久精品国产99精品最新| 自拍偷拍一区二区三区| 欧美黑人精品一区二区在线| 在线观看那种视频你懂的| 美女激情免费在线观看| 午夜精品久久久免费视频 | 国产免费黄片一区二区| 国产免费黄片一区二区| 亚洲国产天堂av成人在线播放| 国产毛片不卡视频在线| 欧美韩日在线观看一区| 日韩一区中文免费视频| 亚洲中文字幕视频一区二区 | 亚洲性生活一区二区三区| 日本丁香婷婷欧美激情| 高跟丝袜av在线一区二区三区| 自拍偷拍一区二区三区| 欧美成人久久久免费播放| 福利视频一区二区三区| 国产丝袜女优一区二区三区| 91精品国产综合久久精品| 亚洲欧美国产中文色妇| 国产精品刮毛视频不卡| 国产av精品高清一区二区三区| 加勒比日本欧美在线观看| 免费在线观看欧美喷水黄片|