<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      vhdl筆記

      考試真題

      一、填空題(共20分)

      1.EDA的含義是(電子設(shè)計(jì)自動化),VHDL的含義是(超高速硬件描述語言)

      2.請列出三個(gè)VHDL語言的數(shù)據(jù)類型。利于實(shí)數(shù)數(shù)據(jù)類型、位數(shù)據(jù)類型等。(整型)(字符型)(字符串型)

      3.VHDL的運(yùn)算符中,優(yōu)先級別最低的是(邏輯運(yùn)算符),優(yōu)先級別最高的是(NOT,ABS)

      4.試定義一個(gè)變量A,數(shù)據(jù)類型為4位標(biāo)準(zhǔn)矢量:(variable A:STD_LOGIC_VECRTOR(3 DOWNTO 0)??

      5.在VHDL的數(shù)據(jù)對象中,(信號)(變量)可以多次賦予不同的值,只能在定義是復(fù)值的是(常量)

      6.VHDL的子程序有(函數(shù))和(常量)兩種

      7.VHDL源程序的文件名應(yīng)當(dāng)與(實(shí)體名)相同,否則無法通過編譯

      8.設(shè)D0為‘0’,D1為‘0’,D2為‘1’,D3為‘0’,D3&D2&D1&D0的運(yùn)算表達(dá)結(jié)果是(0100)

      9.使用quartusII軟件中時(shí),文本編輯文件的后綴名是:vhd,波形仿真文件的后綴名稱是:vwf

      二、簡答題(20分,共4題,每道題5分)

      1.簡述cpld與fpga的異同,在實(shí)際應(yīng)用是該如何選擇?

      答:CPLD更加適合完成各種算法和組合邏輯,F(xiàn)PGA更加適合于完成時(shí)序邏輯。換句話說,F(xiàn)PGA更加適合于觸發(fā)器豐富的結(jié)構(gòu),而CPLD更加適合于觸發(fā)器有限而乘積項(xiàng)豐富的結(jié)構(gòu)。

      CPLD的連續(xù)式布線結(jié)構(gòu)決定了它的時(shí)序延遲是均勻的和可預(yù)測的,而FPGA的分段式補(bǔ)線結(jié)構(gòu)決定了其延遲的不可預(yù)測性。

      CPLD比FPGA使用起來更加方便。CPLD的編程采用E2PROM或者FASTFLASH技術(shù),無需外部存儲器芯片,使用簡單。而FPGA的編程信息需要存放在外部存儲器上,使用方法復(fù)雜。

      2.簡述VHDL語言和計(jì)算機(jī)C語言的區(qū)別

      答:VHDL是硬件描述語言,面向硬件的。用于CPLD、FPGA等大規(guī)模可編程邏輯器件的。而C語言主要是面向軟件的,是計(jì)算機(jī)編程。適用于普通計(jì)算機(jī)的,以及單片機(jī),DSP等等。

      3.簡述when_else條件信號賦值語句和if_else順序語句的異同。

      答:WHEN_ELSE條件信號賦值語句中無標(biāo)點(diǎn),只有最后有分號;必須成對出現(xiàn):是并行語句,必須放在結(jié)構(gòu)體中。

      IF_ELSE順序語句中有分號;是順序語句,必須放在進(jìn)程中。

      4,簡述quartusII的設(shè)計(jì)流程

      建立工作庫文件夾:輸入設(shè)計(jì)項(xiàng)目原理圖/VHDL文件;將設(shè)計(jì)項(xiàng)目設(shè)置成PROJECT;選擇目標(biāo)器件;編譯;引腳鎖定并編譯;編程下載/配置。

      :原理圖/HDL文本輸入--->功能仿真--->綜合--->適配--->時(shí)序仿真--->編程下載--->硬件測試

      三、VHDL程序設(shè)計(jì)題目(60分)

      1.用并行信號賦值語句設(shè)計(jì)4選1數(shù)據(jù)選擇器。

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      
      ENTITY DEMO IS
          PORT(
          	I0,I1,I2,I3: IN STD_LOGIC;
              CH0,CH1: IN STD_LOGIC;
              OUTPUT: OUT STD_LOGIC;
          );
      END DEMO;
          
      ARCHITECTURE BEHAVE OF DEMO IS
      SIGNAL SEL:STD_LOGIC_VECTOR(1 DOWNTO 0);
          BEGIN
           SEL<=CH1&CH0;
           OUTPUT<=I0 WHEN SEL="00" ELSE
                   I1 WHEN SEL="01" ELSE
                   I2 WHEN SEL="10" ELSE
                   I3 WHEN SEL="11" ELSE
                   '0';    
      END BEHAVE;                
      

      2.編寫一個(gè)數(shù)值比較器VHDL程序的進(jìn)程,要求使能信號g低電平時(shí)比較器開始工作,輸入信號p=q,輸出equ為‘0’,否則為‘1’

      PROCESS(P,Q,G)
          BEGIN
              IF G='0' THEN
                  IF P=Q THEN
                      EQU<='0';
                  ELSE
                      EQU<='1';
                  END IF;
              ELSE
                  EQU<='1';
              END IF;
      END PROCESS;       
      

      3.在程序包中設(shè)計(jì)一個(gè)功能為四舍五入的過程。

      函數(shù)定義應(yīng)由兩部分組成,即函數(shù)首和函數(shù)體.
      在進(jìn)程和結(jié)構(gòu)體中不必定義函數(shù)首,而在程序包中必須定義函數(shù)首.

      img

      --過程
      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      
      PACKAGE PACK IS
          PROCEDURE SUM(
          	A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);B:OUT STD_LOGIC);
              END PACK;
      
      PACKAGE BODY PACK IS
              PROCEDURE SUM(
              A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);B:OUT STD_LOGIC) IS
      BEGIN
          IF A="0100"OR A<"0100" THEN B<='0';
          ELSE B<='1';
          END IF;
      END PROCEDURE SUM;
      END PACK;    
               
      
      --函數(shù)
      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      
      PACKAGE PACK IS
          FUNCTION SUM(A:STD_LOGIC_VECTOR(3 DOWNTO 0);B:STD_LOGIC)RETURN STD_LOGIC;
      END PACKAGE;
          
      PACKAGE BODY PACK IS
          FUNCTION SUM(A:STD_LOGIC_VECTOR(3 DOWNTO 0);B:STD_LOGIC)RETURN STD_LOGIC IS
              BEGIN
                  IF A="0100" OR A<"0100" THEN B<='0';
                  ELSE B<='1';
                  END IF;
                  RETURN B;
          END FUNCTION SUM;
      END PACK;        
      

      4.設(shè)計(jì)一個(gè)異步清零的10進(jìn)制計(jì)數(shù)器,并且在數(shù)碼管上顯示

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      
      ENTITY DEMO IS
          PORT(
          	CLK,RES:IN STD_LOGIC;
              LEDOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)
          );
      END DEMO;
          
      ARCHITECTURE BEHAVE OF DEMO IS
          SIGNAL CNT :STD_LOGIC_VECTOR(3 DOWNTO 0);
      BEGIN
          PROCESS(CLK,RES)
          BEGIN
              IF RES='1' THEN
                  CNT<=(OTHERS>='0');
              ELSIF (CLK'EVENT AND CLK='1')THEN
                  IF(CNT="1001")THEN
                      CNT<="0000";
                  ELSE
                      CNT<=CNT+'1';
                  END IF;
              END IF;
           END PROCESS;
                  LEDOUT<="1110111"WHEN CNT="0000"ELSE
                          "0100100"WHEN CNT="0001"ELSE
                          "1011101"WHEN CNT="0010"ELSE
                          "1011011"WHEN CNT="0011"ELSE
                          "0111010"WHEN CNT="0100"ELSE
                          "1101011"WHEN CNT="0101"ELSE
                          "0101111"WHEN CNT="0110"ELSE
                          "1010010"WHEN CNT="0111"ELSE
                          "1111111"WHEN CNT="1000"ELSE
                          "1111101"WHEN CNT="1001"ELSE
                          "0000000";    
      END BEHAVE;    
          
          
          
          
          
          ---a---
          -     -
          b     c
          -     -
          ---d---
          -     -
          e     f
          -     -
          ---g---
      

      5.設(shè)計(jì)一個(gè)由6個(gè)觸發(fā)器構(gòu)成的一步計(jì)數(shù)器,采用元件例化的方式生成

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      ENTITY D_FF IS
          PORT(
          	D,CLK_S:IN STD_LOGIC;
              Q:OUT STD_LOGIC;
              NQ:OUT STD_LOGIC
          );
      END ENTITY D_FF;
      ARCHITECTURE A_RS_FF OF D_FF IS
      BEGIN
          BIN_P_RS_FF:PROCESS(CLK_S)
          BEGIN
              IF  CLK_S'EVENT AND CLK_S='1' THEN Q<=D;NQ<=NOT D;
              END IF;
          END PROCESS;    
      END ARCHITECTURE A_RS_FF;
      
      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      USE IEEE.STD_LOGIC_UNSIGNED.ALL;
      ENTITY demo12 IS
      PORT(
      	CLK:IN STD_LOGIC;
      	Q:OUT STD_LOGIC_VECTOR(5 DOWNTO 0)
      );
      END demo12;
      ARCHITECTURE BEHAVE OF demo12 IS
      COMPONENT D_FF IS
      PORT(
      	D,CLK_S:IN STD_LOGIC;
      	Q:OUT STD_LOGIC;
      	NQ:OUT STD_LOGIC
      );
      END COMPONENT;
      SIGNAL S:STD_LOGIC_VECTOR(5 DOWNTO 0);
      BEGIN
      U0:D_FF PORT MAP(S(0),CLK,Q(0),S(0));
      U1:D_FF PORT MAP(S(1),S(0),Q(1),S(1));
      U2:D_FF PORT MAP(S(2),S(1),Q(2),S(2));
      U3:D_FF PORT MAP(S(3),S(2),Q(3),S(3));
      U4:D_FF PORT MAP(S(4),S(3),Q(4),S(4));
      U5:D_FF PORT MAP(S(5),S(4),Q(5),S(5));
      END BEHAVE;
      

      img

      標(biāo)準(zhǔn)函數(shù),它用于將整數(shù)轉(zhuǎn)換為 std_logic_vector 類型:
      my_signal <= conv_std_logic_vector(255, 8); -- 結(jié)果為 "11111111"
      在這個(gè)例子中,整數(shù) 255 被轉(zhuǎn)換為一個(gè) 8 位寬的 std_logic_vector,結(jié)果是 "11111111"。
      
          
      將整數(shù)或?qū)崝?shù)轉(zhuǎn)換為 std_logic_vector 類型的過程:    
       to_stdlogicvector(255, my_vector); -- my_vector 將被賦值為 "11111111"
      請注意,to_stdlogicvector 過程需要在進(jìn)程內(nèi)部調(diào)用,因?yàn)樗婕暗叫盘栙x值。
          
      這個(gè)函數(shù)用于將 std_logic_vector 類型的信號轉(zhuǎn)換為 BIT_VECTOR 類型。BIT_VECTOR 是一個(gè)類似數(shù)組的類型,其中的元素可以是 '0'、'1' 或 'U'(未初始化),它通常用于表示二進(jìn)制數(shù):
        my_slv <= "10101010"; -- 將std_logic_vector初始化為特定的值
        my_bv <= TO_BITVECTOR(my_slv); -- 將std_logic_vector轉(zhuǎn)換為BIT_VECTOR   
      

      四、課本

      1.1:EDA技術(shù)與ASIC設(shè)計(jì)和FPGA開發(fā)的關(guān)系:利用EDA技術(shù)進(jìn)行電子系統(tǒng)設(shè)計(jì)的最后目標(biāo)是完成專用集成電路ASIC的設(shè)計(jì)與實(shí)現(xiàn)。

      FPGA在ASIC設(shè)計(jì)中的用途:FPGA實(shí)現(xiàn)ASIC設(shè)計(jì)的現(xiàn)場可編程器件。

      1.7:CPLD是基于乘積項(xiàng)的可編程邏輯結(jié)構(gòu),F(xiàn)PGA是基于查找表的可編程邏輯結(jié)構(gòu)

      考試學(xué)習(xí)

      第一章:EDA前言知識

      EDA:電子設(shè)計(jì)自動化(Electronic Design Automation)

      HDL:硬件描述語言(Hardware Description Language)

      ISP:在系統(tǒng)可編程(In System Programmability)

      單片機(jī)和FPGA比,不同之處在于,單片機(jī)是用已知的硬件來構(gòu)建系統(tǒng),主要是寫軟件。而FPGA是硬件“未知”(用EDA工具來設(shè)計(jì)),軟件也要自己寫。

      EDA發(fā)展階段

      1. 計(jì)算機(jī)輔助設(shè)計(jì)(Computer Assist Design,CAD)(20世紀(jì)70年代)
      2. 計(jì)算機(jī)輔助工程設(shè)計(jì)(Computer Assist Engineering Design,CAED)(20世紀(jì)80年代)
      3. 電子設(shè)計(jì)自動化(Electronic Design Automation,EDA)(20世紀(jì)90年代)
      • 超大規(guī)模可編程邏輯器件(可編程ASIC):主流器件:FPGA/CPLD
      • 半定制或全定制ASIC
      • 混合ASIC

      img

      基于EDA軟件的FPGA/CPLD設(shè)計(jì)流程:

      原理圖/HDL 文本輸入--->功能仿真--->綜合--->適配--->編程下載--->硬件測試

      PLD:可編程邏輯器件

      CPLD:復(fù)雜可編程邏輯器件

      FPGA:現(xiàn)場可編程門陣列

      FPGA:

      • 可編程邏輯單元
      • 可編程輸入/輸出單元
      • 可編程連線

      CPLD:

      • 可編程邏輯宏單元
      • 可編程輸入輸出單元
      • 可編程內(nèi)部連線

      第三章:CPLD與FPGA結(jié)構(gòu)與應(yīng)用

      1.PLD

      img
      它由輸入緩沖器、與陣列、或陣列、輸出緩沖器等4部分功能電路組成

      20世紀(jì)70年代,PLD主要是PROM和PLA

      • PROM(可編程只讀存儲器):與門陣列固定、或門陣列可編程(熔絲工藝,一次性編程使用)
      • PLA(可編程邏輯陣列):與門陣列可編程、或門陣列可編程(熔絲工藝,一次性編程使用)
      • PAL(可編程陣列邏輯):與門陣列可編程、或門陣列固定

      img
      img

      2.FPGA

      FPGA器件的內(nèi)部結(jié)構(gòu)為LCA(邏輯單元陣列)

      LCA:

      • 周邊的IOB(IO Block)(可編程輸入/輸出模塊)
      • 核心陣列的CLB(Configurable Logic Block)(可配置邏輯塊)
      • PI(可編程內(nèi)部連線)(Programmable Interconnect)

      img

      1. CLB:CLB是FPGA的基本邏輯單元,其內(nèi)部又可以分為組合邏輯和寄存器兩部分。組合邏輯電路實(shí)際上是一個(gè)多變量輸入的PROM陣列,可以實(shí)現(xiàn)多變量任意函數(shù);而寄存器電路是由多個(gè)觸發(fā)器及可編程輸入、輸出和時(shí)鐘端組成的。在FPGA中,所有的邏輯功能都是在CLB中完成的。
      2. IOB為芯片內(nèi)部邏輯和芯片外部的輸入端/輸出端提供接口,可編程為輸入、輸出和雙向I/O 3種方式。
      3. FPGA依靠對PI的編程,將各個(gè)CLB和IOB有效地組合起來,實(shí)現(xiàn)系統(tǒng)的邏輯功能。

      工作形式:采用基于SRAM的查找表邏輯形式結(jié)構(gòu)

      img

      一個(gè)N輸入的查找表,需要SRAM存儲N個(gè)輸入構(gòu)成的真值表,需要2^N個(gè)SRAM單元。

      A,B,C,D由FPGA芯片的管腳輸入后進(jìn)入可編程連線,作為地址線連到LUT,LUT中已經(jīng)事先寫入了所有可能的邏輯結(jié)果,通過地址查找到相應(yīng)的數(shù)據(jù)然后輸出,這樣組合邏輯就實(shí)現(xiàn)了

      3.CPLD

      • 邏輯陣列單元LAB
      • 可編程IO單元
      • 可編程內(nèi)部互聯(lián)資源EAB(嵌入陣列塊)

      img

      CPLD的基本結(jié)構(gòu)是由一個(gè)二維的邏輯塊陣列組成的,它是構(gòu)成CPLD器件的邏輯組成核心,還有多個(gè)I/O塊以及連接邏輯塊的互連資源。

      1715674974801

      1715675094309

      每組邏輯單元LE(Logic Element)連接到邏輯陣列塊LAB(Logic Array Block),LAB被分成行和列,每行包含一個(gè)嵌入陣列塊EAB。LAB和EAB由快速通道互相連接。I/O單元IOE(Input/Output Elements)位于行通道和列通道兩端。

      嵌入陣列由一系列嵌入陣列塊EAB構(gòu)成。實(shí)現(xiàn)存儲功能時(shí),每個(gè)EAB提供2048比特,可以用來完成RAM、ROM、雙口RAM或者FIFO功能。實(shí)現(xiàn)邏輯功能時(shí),每個(gè)EAB可以提供100~600門以實(shí)現(xiàn)復(fù)雜的邏輯功能,如實(shí)現(xiàn)乘法器、微控制器、狀態(tài)機(jī)和DSP(數(shù)字信號處理)功能。EAB可以單獨(dú)使用或多個(gè)EAB聯(lián)合使用以實(shí)現(xiàn)更強(qiáng)的功能。

      邏輯陣列由邏輯陣列塊LAB構(gòu)成。每個(gè)LAB包含8個(gè)邏輯單元和一個(gè)局部連接。一個(gè)邏輯單元有一個(gè)4輸入查找表、一個(gè)可編程觸發(fā)器和一個(gè)實(shí)現(xiàn)進(jìn)位和級聯(lián)功能的專用信號路徑。

      LAB按照行、列排序,構(gòu)成邏輯陣列,每個(gè)LAB由8個(gè)LE構(gòu)成,為行列兩端的輸入輸出單元IOE提供I/O端口。每個(gè)IOE包含一個(gè)雙向I/O緩沖器和一個(gè)可以用作輸入輸出寄存的觸發(fā)器,

      1715675503106

      XC3164 PC 84-4 C 的含義如下:

      • 第1項(xiàng):XC3164表示器件型號。

      • 第2項(xiàng):PC表示器件的封裝形式,主要有PLCC(Plastic Leaded Chip Carrier,塑料方形扁平封裝)、PQFP(Plastic Quad Flat Pack,塑料四方扁平封裝)、TQFP(Thin Quad Flat Pack,四方薄扁形封裝)、RQFP(Power Quad Flat Pack,大功率四方扁平封裝)、BGA(Bal Grid Array(Package),球形網(wǎng)狀陣列(封裝))、PGA(Ceramic Pin Grid Array(Package),陶瓷網(wǎng)狀直插陣列(封裝)等形式。

      • 第3項(xiàng):84表示封裝引腳數(shù)。一般有44、68、84、100、144、160、208、240等數(shù)種,常用的器件封裝引腳數(shù)有44、68、84、100、144、160等,最大的達(dá)596個(gè)引腳。而最大用戶I/O是指相應(yīng)器件中用戶可利用的最大輸入/輸出引腳數(shù)目,它與器件的封裝引腳不一定相同。

      • 第4項(xiàng):- 4表示速度等級。速度等級有兩種表示方法。在較早的產(chǎn)品中,用觸發(fā)器的反轉(zhuǎn)速率來表示,單位為MHz,一般分為-50、-70、-100、-125和-150;在較后的產(chǎn)品中用一個(gè)CLB的延時(shí)來表示,單位為ns,一般可分為-10、-8、- 6、-5、- 4、-3、-2、- 09。

      • 第5項(xiàng): C表示環(huán)境溫度范圍。其中又有C——商用級(0℃~85℃)、I——工業(yè)級(- 40℃~100℃)和M——軍用級(-55℃~125℃)。

      img

      選擇題

      0.若一個(gè)進(jìn)程內(nèi)同一個(gè)信號的賦值語句(<=)有多條,則前幾條不做操作,最后一條才裝載

      1.一個(gè)項(xiàng)目的輸入輸出是定義在()

      a.實(shí)體中 b.結(jié)構(gòu)體中 c.任何位置 d.進(jìn)程中

      2.描述項(xiàng)目具有邏輯功能的是()

      a.實(shí)體 B.結(jié)構(gòu)體 C.配置 D.進(jìn)程

      3.關(guān)鍵字ARCHITECTURE定義的是()

      A.結(jié)構(gòu)體 B.進(jìn)程 C,實(shí)體 D.配置

      4.MAXPLUSII中編譯VHDL源程序時(shí)要求()

      A.文件名和實(shí)體不可同名

      B.文件名和實(shí)體名無關(guān)

      C.文件名和實(shí)體名要相同

      D.不確定

      5.1987標(biāo)準(zhǔn)的VHDL語言對大小寫是

      A.敏感的 B.只能用小寫 C.只能用大寫 D.不敏感

      6.關(guān)于1987標(biāo)準(zhǔn)的VHDL語言中,標(biāo)識符描述正確的是()

      A.必須是以英文字母開頭

      B.可以使用漢字開頭

      C.可以使用數(shù)字開頭

      D.任何字符都可以

      7.關(guān)于1987標(biāo)準(zhǔn)的VHDL語言中,標(biāo)識符描述正確的是()

      A.下劃線可以連用

      B.下劃線不能連用

      C.不能使用下劃線

      D.可以使用任何字符

      8.符合1987VHDL標(biāo)準(zhǔn)的標(biāo)識符是()

      A.A_2 B.A+2 C.2A D.22

      9.符合1987VHDL標(biāo)準(zhǔn)的標(biāo)識符是

      A.a_2_3 B.a___2 C.2_2_a D.2a

      10.不符合1987VHDL標(biāo)準(zhǔn)的標(biāo)識符是

      A.a_1_in B. a_in_2 C.2_a D. asd_1

      11.不符合1987VHDL標(biāo)準(zhǔn)的標(biāo)識符是

      A.a2b2 B.a1b1 C.ad12 D.%50

      12.VHDL語言中變量中定義的位置是

      A.實(shí)體中任何位置 B.實(shí)體中特定位置 C.結(jié)構(gòu)體中任意位置 D.結(jié)構(gòu)體中特定位置

      13.VHDL語言中信號定義的位置是

      A.實(shí)體中任何位置 B.實(shí)體中特定位置 C.結(jié)構(gòu)體中任意位置 D.結(jié)構(gòu)體中特定位置

      14.變量是局部量,可以寫在

      A.實(shí)體中 B.進(jìn)程中 C.線粒體中 D. 種子體中

      15.變量和信號的描述正確的是

      A.變量賦值號是:= B.信號賦值號是:= C.變量賦值號碼是<= D. 二者沒有區(qū)別

      16.變量和信號描述正確的是

      A.變量可以帶出進(jìn)程 B.信號可以帶出進(jìn)程 C.信號不可以帶出進(jìn)程 D.二者沒有區(qū)別

      1. 關(guān)于VHDL類型,正確得是

      A.數(shù)據(jù)類型不同不能進(jìn)行運(yùn)算

      B.數(shù)據(jù)類型相同才能進(jìn)行運(yùn)算

      C.數(shù)據(jù)類型相同或者相符就可以進(jìn)行計(jì)算

      D.運(yùn)算與數(shù)據(jù)類型無關(guān)

      18.下面數(shù)據(jù)中屬于實(shí)數(shù)的是

      A. 4.2 B. 3 C. ‘1’ D. “11011”

      19.下面數(shù)據(jù)中屬于位矢量的是

      A. 4.2 B. 3 C. ‘1’ D. “11011”

      20.關(guān)于VHDL數(shù)據(jù)類型,正確的是

      A.用戶不能定義子類型 B.用戶可以定義子類型

      C.用戶可以定義任意類型的數(shù)據(jù) D.前面三個(gè)答案都是錯(cuò)誤的

      1. 可以不必聲明而直接引用的數(shù)據(jù)類型是

      A.STD_LOGIC B.STD_LOGIC_VECTOR C.BIT D.前面三個(gè)答案都是錯(cuò)誤的

      1. STD_LOGIC_1164中定義的高阻是

      A.X B. x C. z D.Z

      23.STD_LOGIC_1164中字符H定義的是

      A.弱信號1 B.弱信號0 C.沒有這個(gè)定義 D. 初始值

      1-5:ABACD 6-10:ABAAC 11-15:DDDBA

      學(xué)習(xí)基本結(jié)構(gòu)

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

      -- 庫、程序包的說明調(diào)用
      Library IEEE;
      use IEEE.Std_Logic_1164.ALL;
      -- 實(shí)體聲明
      Entity FreDevider is
      port
      (
          Clock: IN Std_logic;
          Clkout: OUT Std_logic
      );
      END;
      -- 結(jié)構(gòu)體定義
      Architecture Behavior Of FreDevider is
      signal Clk:Std_Logic; -- 中間臨時(shí)變量
      begin
          process(Clock)--進(jìn)程
          begin
              IF rising_edge(Clock) THEN
                  Clk <= NOT Clk;    
              END IF;
          END process;
          Clkout <= Clk;
      END
      

      常用的庫有IEEE庫、STD庫和WORK庫:

      • IEEE庫:是VHDL設(shè)計(jì)中最常用的資源庫,包含IEEE標(biāo)準(zhǔn)的STD_LOGIC_1164、NUMERIC_BIT、NUMERIC_STD以及其他一些支持工業(yè)標(biāo)準(zhǔn)的程序包。其中最重要和最常用的是STD_LOGIC_1164程序包,大部分程序都是以此程序包中設(shè)定的標(biāo)準(zhǔn)為設(shè)計(jì)基礎(chǔ)。
      • STD庫:是VHDL的標(biāo)準(zhǔn)庫,VHDL在編譯過程中會自動調(diào)用這個(gè)庫,所以使用時(shí)不需要用語句另外說明。
      • WORK庫:是用戶在進(jìn)行VHDL設(shè)計(jì)時(shí)的現(xiàn)行工作庫,用戶的設(shè)計(jì)成果將自動保存在這個(gè)庫中,是用戶自己的倉庫,同STD庫一樣,使用該庫不需要任何說明。

      庫的作用范圍:

        庫說明語句的作用范圍從一個(gè)實(shí)體說明開始到它所屬的構(gòu)造體、配置為止。當(dāng)一個(gè)源程序中出現(xiàn)兩個(gè)以上的實(shí)體時(shí),兩條作為使用庫的說明語句應(yīng)在每個(gè)實(shí)體說明語句前重復(fù)書寫。

      img

      ?

      程序包

      --包頭
      PACKAGE CHENGXUBAOMING IS
          --程序包頭說明語句
      END CHENGXUBAOMING;
          
      --包體
      PACKAGE BODY CHENGXUBAOMING IS
          --程序包體說明語句
      END CHENGXUBAOMING;    
      
      --調(diào)用程序包通用格式
      USE 庫名.程序包名.ALL;
      

      常用預(yù)定義程序包有以下四個(gè):

      • 1.STD_LOGIC_1164程序包
        STD_LOGIC_1164程序包定義了一些數(shù)據(jù)類型、子類型和函數(shù)。數(shù)據(jù)類型包括:STD_ULOGIC、STD_ULOGIC _VECTOR、STD_LOGIC和STD_LOGIC _VECTOR,用的最多最廣的是STD_LOGIC和STD_LOGIC_VECTOR數(shù)據(jù)類型。調(diào)用STD_LOGIC_1164程序包中的項(xiàng)目需要使用以下語句:
        LIBRARY IEEE;
        USE IEEE.STD_LOGIC_1164.ALL;
        該程序包預(yù)先在IEEE庫中編譯,是IEEE庫中最常用的標(biāo)準(zhǔn)程序包,其數(shù)據(jù)類型能夠滿足工業(yè)標(biāo)準(zhǔn),非常適合CPLD(或FPGA)器件的多值邏輯設(shè)計(jì)結(jié)構(gòu)。

      • 2.STD_LOGIC_ARITH程序包
        該程序包是美國Synopsys公司的程序包,預(yù)先編譯在IEEE庫中。主要是在STD_LOGIC_1164程序包的基礎(chǔ)上擴(kuò)展了UNSIGNED(無符號)、SIGNED(符號)和SMALL_INT(短整型)三個(gè)數(shù)據(jù)類型,并定義了相關(guān)的算術(shù)運(yùn)算符和轉(zhuǎn)換函數(shù)。

      • 3.STD_LOGIC_SIGNED程序包
        該程序包預(yù)先編譯在IEEE庫中,也是Synopsys公司的程序包。主要定義有符號數(shù)的運(yùn)算,重載后可用于INTEGER(整數(shù))、STD_LOGIC(標(biāo)準(zhǔn)邏輯位)和STD_LOGIC _VECTOR(標(biāo)準(zhǔn)邏輯位向量)之間的混合運(yùn)算,并且定義了STD_LOGIC _VECTOR到INTEGER的轉(zhuǎn)換函數(shù)。還定義了STD_LOGIC _VECTOR類型的符號數(shù)算數(shù)運(yùn)算子程序。

      • 4.STD_LOGIC_UNSIGNED程序包
        該程序包用來定義無符號數(shù)的運(yùn)算,其他功能與STD_LOGIC_SIGNED相似。

      實(shí)體

      ENTITY 實(shí)體名 IS -- 引導(dǎo)語句
      [GENERIC (常數(shù)名: 數(shù)據(jù)類型: 設(shè)定值)] -- 類屬表
      PORT -- 端口表
      (
          端口名1: 端口方向 端口類型;
          端口名2: 端口方向 端口類型;
          端口名3: 端口方向 端口類型;
          ......
          端口名n: 端口方向 端口類型 -- 最后一個(gè)一定不能加";",不然會報(bào)next process的")" expect ";" or ","
      );
      END [實(shí)體名]; -- 結(jié)束語句
          
          
          --port中端口默認(rèn)類型為signal
      

      實(shí)體中--類屬

      GENERIC (常數(shù)名:數(shù)據(jù)類型:設(shè)定值);      --類似于C中的宏定義
      								    --放在實(shí)體或者塊結(jié)構(gòu)體前面的說明部分
      
      --舉例
      ENTITY mcu1 IS
      GENERIC (addrwidth : INTEGER := 16);
      PORT(
          add_bus : OUT STD_LOGIC_VECTOR(addrwidth-1 DOWNTO 0) );
          ...
      

      實(shí)體中--端口

      PORT(端口信號名:端口模式 數(shù)據(jù)類型;
      端口信號名:端口模式 數(shù)據(jù)類型);
      
      • 端口模式有:
        • IN : 在實(shí)體中只讀,接受外來數(shù)據(jù). 只能出現(xiàn)在賦值語句的右側(cè)。
        • OUT: 在實(shí)體中只能更新,不可讀。只能出現(xiàn)在賦值語句的左側(cè)。
        • INOUT: 在實(shí)體內(nèi)部可更新、可讀,可出現(xiàn)在賦值語句的兩側(cè)。
        • BUFFER: 可用作內(nèi)部賦值,可出現(xiàn)在賦值語句的兩側(cè)。在可綜合代碼中不推薦使用。

      結(jié)構(gòu)體(并發(fā))

      1. 用于描述模型的功能
      2. 必須和一個(gè) Entity相關(guān)聯(lián)
      3. 一個(gè)Entity可有多個(gè) Architectures
      4. Architecture 語句并發(fā)執(zhí)行.
      Architecture 結(jié)構(gòu)體名 OF 實(shí)體名 IS
      定義語句法;
      BEGIN
      功能描述語句法;
      END 結(jié)構(gòu)體名稱;
      
      • 結(jié)構(gòu)描述(接近原理圖)
      • 數(shù)據(jù)流描述(并發(fā)代碼)
      • 行為描述(順序、并發(fā))

      結(jié)構(gòu) img 數(shù)據(jù)流 img

      行為 img

      --兩位相等比較器
      entity equ2 is
      port(a,b:in std_logic_vector(1 downto 0);
      equ:out std_logic);
      end equ2;
          
          
      --結(jié)構(gòu)體結(jié)構(gòu)描述:用元件例化,即網(wǎng)表形式來實(shí)現(xiàn);
      architecture netlist of equ2 is
      -- nor 或非component nor2
      port(a,b :in std_logic;
      c :out std_logic);
      end component;
      component xor2-- xor 異或
      port(a,b :in std_logic;
      c :out std_logic);
      end component;
      signal x: std_logic_vector(1 downto 0);
      begin
      U1:xor2 port map(a(0),b(0),x(0));
      U2:xor2 port map(a(1),b(1),x(1));
      U3:nor2 port map(x(0),x(1),equ);
      end netlist;
          
          
      --結(jié)構(gòu)體數(shù)據(jù)流描述:用布爾方程來實(shí)現(xiàn):
      architecture equation of equ2 is
      begin
      equ<=(a(0) xor b(0)) nor(a(1) xor b(1));
      end equation;
          
          
      --結(jié)構(gòu)體行為描述:用順序語句來實(shí)現(xiàn):
      architecture con_behave of equ2 is
      begin
      process(a,b)
      begin
      if a=b then
      equ<='1';
      else
      equ<='0';
      end if;
      end procerss;
      end con_behave;
          
          
      --結(jié)構(gòu)體行為描述:用并行語句來實(shí)現(xiàn):
      architecture seq_behave of equ2 is
      begin
      equ<='1' when a=b else '0';
      end sqq_behave;
          
          
      

      塊語句

      塊結(jié)構(gòu)名: BLOCK 
      端口說明 類屬說明
      BEGIN
      并行語句
      END BLOCK 塊結(jié)構(gòu)名;
      

      進(jìn)程語句

      進(jìn)程名: PROCESS(敏感信號表) IS
      進(jìn)程說明
      BEGIN
      順序描述語句
      END PROCESS 進(jìn)程名;    --進(jìn)程名字可省略
      
      

      配置Configuration

      • 用于實(shí)現(xiàn)模型的關(guān)聯(lián),可將一個(gè) Entity 和一個(gè)Architecture關(guān)聯(lián)起來,也可將一個(gè) component 和一個(gè) entity-architecture關(guān)聯(lián)起來。
      • 目的是為了在一個(gè)實(shí)體中靈活的使用不同的Architecture。可以在仿真環(huán)境中大量使用,但是在綜合環(huán)境中限制使用。
      Configuration 配置名 of 實(shí)體名 IS
          for 結(jié)構(gòu)體名
          end for;
      end Configuration;
      
      
      img

      子程序

      能被主程序反復(fù)調(diào)用并能將處理結(jié)果傳送到主程序的程序模塊,子程序分為過程語句(Procedure)和函數(shù)(Functure)兩種。子程序中的參數(shù)說明是局部的,只能在子程序體內(nèi)起作用。

      子程序--過程Procedure

      PROCEDURE 過程名(參數(shù)1;參數(shù)2;——) IS
          定義語句;
      BEGIN
          順序處理語句;
      END 過程名;
      
      

      子程序--函數(shù)Function

      FUNCTION 函數(shù)名(參數(shù)1;參數(shù)2;——)
          RETURN 數(shù)據(jù)類型 IS
      定義語句;
      BEGIN
          順序處理語句;
      RETURN 返回變量名;
      
      

      學(xué)習(xí)基本語法

      標(biāo)識符

      標(biāo)識符用來定義常數(shù)、變量、信號、端口、子程序或者參數(shù)的名字

      1. 首字符必須是字母
      2. 末字符不能為下劃線
      3. 不允許出現(xiàn)兩個(gè)連續(xù)的下劃線
      4. 不區(qū)分大小寫
      5. VHDL定義的保留字(關(guān)鍵字),不能用作標(biāo)識符
      6. 標(biāo)識符字符最長可以是32個(gè)字符
      7. 注釋由兩個(gè)連續(xù)的下劃線(--)引導(dǎo)

      關(guān)鍵字(不能作為標(biāo)識符)

      img

      數(shù)據(jù)對象

      • 信號SIGNAL
      • 變量VARIABLE
      • 常量CONSTAT
      --舉例信號
      SIGNAL brdy: BIT;
      SIGNAL output : INTEGER:=2;
      目標(biāo)信號名<=表達(dá)式
          
      --為全局變量,在程序包說明、實(shí)體說明、結(jié)構(gòu)體描述中使用,用于聲明內(nèi)部信號,而非外部信號(外部信號為IN、OUT、INOUT、BUFFER),其在元件之間起互聯(lián)作用,可以賦值給外部信號。    
      
      
      --舉例變量
      VARIABLE opcode:BIT_VECTOR(3 downto 0):= "0000";
      VARIABLE freq: INNTEGER;
      變量賦值符號":=",變量賦值立刻更新。
          
      --只在給定的進(jìn)程(process)中用于聲明局部值或用于子程序中,變量的賦值符號為“:=”,和信號不同,信號是實(shí)際的,是內(nèi)部的一個(gè)存儲元件(SIGNAL)或者是外部輸入(IN、OUT、INOUT、BUFFER),而變量是虛的,僅是為了書寫方便而引入的一個(gè)名稱,常用在實(shí)現(xiàn)某種算法的賦值語句當(dāng)中。    
      
      
      --常量舉例
      CONSTANT rise_fall_time: TIME:=2ns;
      CONSTANT data_bus: INTEGER:=16;
      
      --在結(jié)構(gòu)體描述、程序包說明、實(shí)體說明、過程說明、函數(shù)調(diào)用說明和進(jìn)程說明中使用,在設(shè)計(jì)中描述某一規(guī)定類型的特定值不變,如利用它可設(shè)計(jì)不同模值的計(jì)數(shù)器,模值存于一常量中,對不同的設(shè)計(jì),改變模值僅需改變此常量即可,就如參數(shù)化元件。
      
      

      數(shù)據(jù)類型

      VHDL常用的數(shù)據(jù)類型有三種:

      1. 標(biāo)準(zhǔn)定義的數(shù)據(jù)類型
      2. IEEE預(yù)定義標(biāo)準(zhǔn)邏輯位
      3. 矢量及用戶自定義的數(shù)據(jù)類型。
      • 布爾(Boolean): 取值為FALSE和TRUE,不是數(shù)值,不能運(yùn)算,一般用于關(guān)系運(yùn)算符
      • 位(Bit): 取值為0和1,用于邏輯運(yùn)算
      • 字符(character): 通常用''引號引起來,區(qū)分大小寫
      • 字符串(String): 通常用""雙引號引起來,區(qū)分大小寫
      • 整數(shù)(Integer):
      • 實(shí)數(shù)(real): 實(shí)數(shù)類型僅能在VHDL仿真器中使用,綜合器不支持
      • 時(shí)間(Time) : 物理量數(shù)據(jù),包括整數(shù)和單位兩個(gè)部分 表達(dá)方法包含數(shù)字、(空格)單位兩部分,如(10 PS) 常用單位:fs,ps,ns,us,ms,sec,min,hr
      • 錯(cuò)誤等級(severity level): 表示系統(tǒng)狀態(tài)
      Type BOOLEAN IS (FALSE,TRUE);
      TYPE BIT IS('0','1');
      TYPE BIT_VECTOR IS ARRAY(Natural range<>)OF BIT;
      SIGNAL a:BIT_VECTOR(0 TO 7);
      TYPE CHARACTER IS (NUL,SOH,STX,'','!');
      VARIABLE string_var:STING(1 TO 7); 
      string_var:="abcd";
      VARIABLE a:INTEGER -63 to 63
      
      
      
        (1)整數(shù)(INTEGER)  范圍:-2147483547~+2147483646,即可用    32位有符號的二進(jìn)制數(shù)表示。如2、10E4、16#D2#。 
         例:INTEGER RANGE 100 DOWNTO 0
        (2)實(shí)數(shù)(REAL)  范圍:-1.0E38~1.0E38,書寫時(shí)一定要有小數(shù)。  如: 65.36、 8#43.6#E+4。
        (3) 位(BIT) 取值只能是用帶單引號的‘1’和‘0’來表示。
        (4)位矢量(BIT_VECTOR)位矢量是用雙引號括起來的一組位數(shù)據(jù),如“010101”。例:SIGNAL A2:BIT_ VECTOR (3 DOWNTO 0);
        (5)布爾量(BOOLEAN) 只有“真”和“假”2個(gè)狀態(tài),可以進(jìn)行關(guān)系運(yùn)算。
        (6)字符(CHARACTER):字符通常用單引號括起來,對大小寫敏感。
        (7)字符串(STRING):字符串是雙引號括起來的一串字符,如“l(fā)aksdklakld”。
        (8)時(shí)間(TIME):完整的時(shí)間類型包括整數(shù)和物理量單位兩部分,整數(shù)和單位之間至少留一個(gè)空格,如55 ms,20 ns。 
        (9)自然數(shù)(NATURAL)和正整數(shù)(POSITIVE)數(shù)據(jù)類型
       自然數(shù)是整數(shù)的一個(gè)子類型,非負(fù)的整數(shù),即零和正整數(shù)。
       正整數(shù)也是整數(shù)的一個(gè)子類型,它包括整數(shù)中非零和非負(fù)的數(shù)值。
       (10)錯(cuò)誤等級(SEVERITY LEVEL)
         在 VHDL 仿真器中, 錯(cuò)誤等級用來指示設(shè)計(jì)系統(tǒng)的  工作狀態(tài),共有四種可能的狀態(tài)值,
      即 NOTE(注意)、WARNING(警告)、ERROR(出錯(cuò))、FAILURE(失敗)。
       (11)綜合器不支持的數(shù)據(jù)類型
        物理類型。綜合器不支持物理類型的數(shù)據(jù),如具有量綱型的數(shù)據(jù),包括時(shí)間類型,這些類型只能用于仿真過程。
             浮點(diǎn)型。如 REAL 型。
             Aceess型。綜合器不支持存取型結(jié)構(gòu),因?yàn)椴淮嬖谶@樣對應(yīng)的硬件結(jié)構(gòu)。
             File 型。綜合器不支持磁盤文件型,硬件對應(yīng)的文件僅為 RAM 和 ROM。
       (12)其他預(yù)定義數(shù)據(jù)類型
              VHDL 綜合工具配帶的擴(kuò)展程序包中,定義了一些有用的類型,如 Synopsys 公司在IEEE 庫中加入的程序包 STD_LOGIC_ARITH 中定義了如下的數(shù)據(jù)類型:無符號型(UNSIGNED)、 有符號型(SIGNED)和小整型(SMALL_INT)。
      
      
      標(biāo)準(zhǔn)邏輯位(STD_LOGIC)數(shù)據(jù)類型
       TYPE STD_LOGIC IS (‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’,‘-’);
       各值的含義是:
       ‘U’--未初始化的,
       ‘X’--強(qiáng)未知的, 
       '0'--強(qiáng)0,'1'--強(qiáng)1,
       'Z'--高阻態(tài),
       'W'--弱未知的,
       'L'--弱0,'H'--弱1,
       '-'--忽略。
       
          在程序中使用此數(shù)據(jù)類型前,需加入下面的語句:
                  LIBRARY IEEE;
                  USE IEEE.STD_LOGIC_1164.ALL;
      
      
      
      標(biāo)準(zhǔn)邏輯矢量(STD_LOGIC_VECTOR)數(shù)據(jù)類型
       STD_LOGIC_VECTOR類型定義如下:
                  TYPE STD_LOGIC_VECTOR IS ARRAY (NATURAL   RANGE<>) OF STD_LOGIC;
        顯然,STD_LOGIC_VECTOR是定義在STD_LOGIC_1164程序包中的標(biāo)準(zhǔn)一維數(shù)組,數(shù)組中的每一個(gè)元素的數(shù)據(jù)類型都是以上定義的標(biāo)準(zhǔn)邏輯位STD_LOGIC。
      
      
      
      用戶自定義數(shù)據(jù)類型
          VHDL允許用戶自行定義新的數(shù)據(jù)類型,如枚舉類型(ENUMERATION TYPE)、整數(shù)類型(INTEGER TYPE)、數(shù)組類型(ARRAY TYPE)、記錄類型(RECORD TYPE)、時(shí)間類型(TIME TYPE)、實(shí)數(shù)類型(REAL TYPE)等。用戶自定義數(shù)據(jù)類型是用類型定義語句TYPE和子類型定義語句SUBTYPE實(shí)現(xiàn)的。
           用戶自定義數(shù)據(jù)類型的一般格式:
            TYPE 數(shù)據(jù)類型名  IS  數(shù)據(jù)類型定義  [OF  基本數(shù)據(jù)類型];
            
            TYPE  digit IS INTEGER RANGE 0 TO 9;
            TYPE  current IS REAL RANGE -1E4 TO 1E4;
            TYPE word IS ARRAY (INTEGER 1 TO 8) OF STD_LOGIC; 
      (關(guān)鍵詞OF后的基本數(shù)據(jù)類型是指數(shù)據(jù)類型定義中所定義的元素的基本數(shù)據(jù)類型,一般都是取已有的預(yù)定義數(shù)據(jù)類型,如BIT、STD_LOGIC或INTEGER等。)
      
      

      img

      (TO是BIT和STD_LOGIC之間的轉(zhuǎn)化)

      (CONV是STD_LOGIC、SIGNED、INTEGER之間的轉(zhuǎn)化)

      運(yùn)算符

      算術(shù)運(yùn)算符

      • +,-,*,/
      • MOD取模
      • REM取余
      • SLL 邏輯左移
      • SRL 邏輯右移
      • SLA 算數(shù)左移
      • SRA 算數(shù)右移
      • ROL 循環(huán)左移
      • ROR 循環(huán)右移
      • ** 乘方
      • ABS() :絕對值

      關(guān)系運(yùn)算符

      • =

      • /=

      • <

      • <=

      • . >=

      邏輯運(yùn)算符

      • AND
      • OR
      • NAND
      • NOR
      • NOT
      • XNOR
      • XOR

      賦值運(yùn)算符

      • <= 信號賦值(最后賦值)
      • := 邏輯賦值(即時(shí)賦值)

      關(guān)聯(lián)運(yùn)算符

      • =>

      其他運(yùn)算符

      • & 并置運(yùn)算符

      img

      img

      img

      img

      img

      運(yùn)算符優(yōu)先級

      img

      VHDL基本語句

      并行語句

      • 每一并行語句內(nèi)部的語句運(yùn)行方式可以有兩種不同的方式,即并行執(zhí)行方式(如塊語句)和順序執(zhí)行方式(如進(jìn)程語句)。因此,VHDL并行語句勾畫出了一幅充分表達(dá)硬件電路的真實(shí)的運(yùn)行圖景。
      ARCHITECTURE NAME OF NAME2 IS
      說明語句;
      BEGIN
      		并行語句;
      END ARCHITECTURE NAME;		
      
      
      1. 并行信號賦值語句(CONCURRENT SIGNAL ASSIGNMENTS)
      2. 條件/選擇信號賦值語句(CONDITIONAL/SELECTED SIGNAL ASSIGNMENTS)
      3. 進(jìn)程語句(PROCESS STATEMENTS)
      4. 塊語句(BLOCK STATEMENTS)
      5. 元件例化語句(COMPONENT INSTANTIATIONS)
      6. 生成語句(GENERATE STATEMENTS)
      7. 并行過程調(diào)用語句(CONCURRENT PROCEDURE CALLS)

      并行信號賦值語句

      <signal_name> <= <expression>;
      
      Example:
      q <= input1 or input2;
      q <= input1 and input2;
      -- 最終執(zhí)行 q <= input1 and input2;
      
      

      條件信號賦值語句

      SIGNAL_NAME <= <SIGNAL/VALUE> WHEN <CONDITION1> else
      			   <SIGNAL/VALUE> WHEN <CONDITION2> else
      			   <SIGNAL/VALUE> WHEN <CONDITION3> else
      			   <SIGNAL/VALUE> WHEN <CONDITION4> else
      			   <SIGNAL/VALUE> WHEN <CONDITION5> else
      			   ……
      			   <SIGNAL/VALUE> WHEN <CONDITIONN> else
      			   <SIGNAL/VALUE> ;
      			   
      
      

      選擇信號賦值語句

      WITH <EXPRESSION> SELECT
      <SIGNAL_NAME> <= <SIGNAL/VALUE> WHEN <CONDITION1>,
          			 <SIGNAL/VALUE> WHEN <CONDITION2>,
                       <SIGNAL/VALUE> WHEN OTHERS;
      
      

      進(jìn)程語句

      從本質(zhì)上講VHDL的所有語句都是并行語句。進(jìn)程(process)語句是用來給并行的硬件提供順序語句,一個(gè)結(jié)構(gòu)體可以包含多個(gè)進(jìn)程,多個(gè)進(jìn)程之間并行運(yùn)行。進(jìn)程內(nèi)部的語句順序執(zhí)行。

      img

      img

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

      img

      敏感表和wait語句

      • 敏感表和WAIT語句等效,但是WAIT語句更多樣化
      • 一個(gè)進(jìn)程不可既有敏感表又有WAIT語句,但是要有一種
      • 邏輯綜合對WAIT有嚴(yán)格的限制(只有WAIT UNTILL語句可以綜合)

      img

      WAIT UNTIL CONDITION;
      --舉例說明
      architecture arc2 of process_wait is 
      begin  
      process    
      begin   
          wait until clk'event and clk = '1';    
           q<=d;  
      end process;
      end architecture;
          
      WAIT ON SENSITIVITY LIST;
      WAIT ON (A,B,C);--敏感表,任意一個(gè)發(fā)生變化才會執(zhí)行 
      
      
      • 進(jìn)程內(nèi)部,對同一信號多次賦值,只最后一次起作用,即最靠近end process;的
      process(a,b,s)  
      begin   
          --final results: s<=a+b y<=a+b+1              
          y<=s+1;    
          s<=a;              
          s<=a+b;  
      end process;
      
      
      • 進(jìn)程內(nèi)部,對同一變量多次賦值,立即執(zhí)行。
      process(a,b)  
      variable ss: std_logic_vector(3 downto 0); 
      begin  
          ss:=a;  
          y<=ss+1;
          ss:=a+b; 
      end process;
      --結(jié)果:由于y<=ss+1寫在ss:=a之后,所以將a+1的值賦給y
      
      

      塊語句

      塊(BLOCK)語句是一種將結(jié)構(gòu)體中的并行描述語句進(jìn)行組合的方法,它的主要目的是改善并行語句及其結(jié)構(gòu)的可讀性,或是利用BLOCK的保護(hù)表達(dá)式關(guān)閉某些信號。

      塊標(biāo)號:BLOCK [(塊保護(hù)表達(dá)式)] [IS]
      接口說明;
      類屬說明;
      BEGIN
      并行語句;
      END BLOCK [塊標(biāo)號];
      
      

      元件例化語句

      • 元件例化就是將預(yù)先設(shè)計(jì)號的設(shè)計(jì)實(shí)體定義為一個(gè)元件,然后利用特定的語句將此元件與當(dāng)前的設(shè)計(jì)實(shí)體中的指定端口相連接,從而為當(dāng)前設(shè)計(jì)實(shí)體引入一個(gè)新的低一級的設(shè)計(jì)層次

      • 元件例化語句由兩部分組成前一部分是將一個(gè)現(xiàn)成的設(shè)計(jì)實(shí)體定義為一個(gè)元件的語句,第二部分則是此元件與當(dāng)前設(shè)計(jì)實(shí)體中的連接說明。

      • COMPONENT 元件名 IS
        [GENERIC(類屬表)說明;]
        [PORT(端口名表)說明;]
        END COMPONENT 元件名;    
        
        

      生成語句

      • 生成語句作用:復(fù)制
      • 根據(jù)某些條件設(shè)置好某一原件或設(shè)計(jì)單位,可以用生成語句復(fù)制一組完全相同的并行元件或設(shè)計(jì)單元電路
      [標(biāo)號:] FOR 循環(huán)變量 IN 取值范圍 GENERATE
      [說明部分]
       并行語句;
      END GENERATE [標(biāo)號];
      
      --取值范圍: 表達(dá)式 to 表達(dá)式   或者    表達(dá)式 downto 表達(dá)式 
      
      

      并行過程調(diào)用語句

      • 并行過程調(diào)用語句作為并行語句直接出現(xiàn)在結(jié)構(gòu)體中0
      • 調(diào)用語句可以為:過程(Procedure)或者函數(shù)(Function)
      • 調(diào)用的語法格式:過程名/函數(shù)名(關(guān)聯(lián)參數(shù)表)
      • 函數(shù)和過程統(tǒng)稱子函數(shù)子程序

      過程

        • 參數(shù)可以是 in, out, inout 模式
          • 輸入?yún)?shù)(in)的默認(rèn)數(shù)據(jù)類型是constant
          • 輸出參數(shù)(out)或者inout參數(shù)默認(rèn)數(shù)據(jù)類型variable
          • 參數(shù)對象可為 constant, variable and signal
          • 過程調(diào)用參數(shù)需要一一對應(yīng),形參為constant, 實(shí)參可以為signal、constant或variable;形參若 為signal或variable,則實(shí)參需對應(yīng)一致的類型
        • 其特征是過程中可以修改參數(shù)值(out,inout模式 參數(shù))
        • 不需要RETURN語句
      PROCEDURE NAME IS
          [聲明部分]
      BEGIN
          順序語句;
      END PROCEDURE NAME;    
          
         
      
      

      函數(shù) --函數(shù)一般定義在包中(聲明及實(shí)現(xiàn))

      • 產(chǎn)生一個(gè)返回值。
      • 參數(shù)只能為in模式。
      • 傳遞的參數(shù)在函數(shù)內(nèi)部只能使用不能修改(因?yàn)閰?shù)為in)。
      • 允許的參數(shù)數(shù)據(jù)類型為 constant或signal,默認(rèn)constant。
      • 形參和實(shí)參必須匹配。形參為constant,則實(shí)參可以是variable、signal、 constant或表達(dá)式;形參為signal,實(shí)參要為 signal。
      • 需要一個(gè)RETURN 語句 。
      FUNCTION NAME 
      RETURN data_type IS
          [聲明部分];
      BEGIN
          順序語句;
      RETURN 聲明名;
      END FUNCTION NAME;    
          --函數(shù)一般定義在包中(聲明及實(shí)現(xiàn))
      
      

      過程與函數(shù)的區(qū)別:

      • 函數(shù)參數(shù)只能使用IN。過程中參數(shù)為IN、 INOUT、OUT三種。
      • 函數(shù)只有一個(gè)返回值。過程可以通過參數(shù)返回 多個(gè)返回值。

      順序語句

      • 順序信號/變量賦值語句
      • IF-THEN語句
      • CASE語句
      • LOOP語句
      • RETURN語句
      • NULL語句

      順序信號/變量賦值語句

      進(jìn)程中的順序信號賦值語句
          signal<=expression;
          END PROCESS時(shí)更新
          多次賦值,以最后一次賦值為準(zhǔn)
              
      進(jìn)程中的順序變量賦值語句
              variable:=expression;
      		立刻更新
              多次賦值,以最后一次賦值為準(zhǔn)    
      
      

      IF-THEN語句

      IF A='1' THEN
      	B<=1;
      ELSEIF A='2' THEN
      	B<=2;
      ……
      ELSE
         B<=255;
      END IF;
      
      --順序從上到下,有優(yōu)先級
      --可以嵌套    
      
      

      img

      CASE語句

      CASE A IS
          WHEN '1'=> B<=1;
      	WHEN '2'=> B<=2;
      	……
          WHEN OTHERS=> B<=255;
      END CASE;
      
      
      • 條件只杯評估一次
      • 沒有優(yōu)先級必須包括所有的條件(可以沒有WHEN OTHERS,但是必須包括所有條件)
      • WHEN OTHERS語句包括了沒有指定的所有條件

      img

      LOOP語句

      1.無限LOOP,LOOP將會無限執(zhí)行,除非EXIT語句存在

      NAME LOOP
      ---
      EXIT NAME;
      END LOOP;
      
      

      2.WHILE LOOP。條件滿足則循環(huán)

      WHILE CONDITION LOOP
      ----
      END LOOP;
      
      

      3.FOR LOOP.迭代LOOP

      FOR <IDENTIFIER> IN <RANGE> LOOP
      -----
      END LOOP;
      
      

      示例

      --四位左移
      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      
      ENTITY SHIFT4 IS
          PORT(
          	SHFT_LFT:IN STD_LOGIC;--允許位
              D_IN: IN STD_LOGIC_VECTOR(3 DOWNTO 0);--輸入4位
              Q_OUT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--輸出8位
          );
      END SHIFT4;
      
      ARCHITECTURE LOGIC OF SHIFT4 IS
      BEGIN
          PROCESS(D_IN,SHFT_LFT)
          VARIABLE SHFT_VAR:STD_LOGIC_VECTOR(7 DOWNTO 0);--進(jìn)程說明語句部分定義變量
          BEGIN
              SHFT_VAR(7 DOWNTO 4):="0000";--變量上4位為0
      		SHFT_VAR(3 DOWNTO 0):=D_IN; --變量下4位為輸入
      		IF SHFT_LFT='1'THEN--如果允許
                  FOR I IN 7 DOWNTO 4 LOOP--下4位被搬移到上4位
                      SHFT_VAR(I):=SHFT_VAR(I-4);
      			END LOOP;
      				SHFT_VAR(3 DOWNTO 0):="0000";--下4位歸0
              ELSE
                  SHFT_VAR:=SHFT_VAR;--如果不被允許,不搬移,輸入在下4位
      		END IF;
      	Q_OUT<=SHFT_VAR;--變量被搬移到輸出
      	END PROCESS;
      END LOGIC;
      
      

      RETURN語句

      RETURN語句是一段子程序結(jié)束后,返回主程序的語句

      RETURN;--只能用于過程,它后面不要有表達(dá)式
      RETURN 表達(dá)式;--只用于函數(shù),它后面必須有表達(dá)式,函數(shù)結(jié)束必須用RETURN語句
      
      

      示例

      --過程
      PROCEDURE RE(SIGNAL S,R:IN STD_LOGIC
                   SIGNAL Q:INOUT STD_LOGIC) IS
      BEGIN
      IF(S='1'andr='1')THEN
          REPORT"FORBIDDEN STATE:S AND R ARE QUUAL TO '1'";
          RETURN;
          ELSE
              Q <= S AND R AFTER 5NS;
          END IF;
      END PROCEDURE RS;
              
              
      --函數(shù)
      FUNCTION OPT(A,B,OPR:STD_LOGIC) RETURN STD_LOGIC IS
      BEGIN
          IF(OPR='1')THEN RETURN (A AND B);
          ELSE RETURN (A OR B);
          END IF;
      END FUNCTION OPT;        
      
      

      NULL語句

      空操作

      NULL;
      
      

      img

      代碼

      二輸入與非門

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      ENTITY demo4 IS
      PORT (a,b: IN STD_LOGIC;
      	  y: OUT STD_LOGIC);
      END demo4;
      ARCHITECTURE NAND2PP OF demo4 IS
      BEGIN
       y<= a NAND b;
      END NAND2PP; 	  
      
      

      二輸入或非門

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      ENTITY demo5 IS
      	PORT(a,b: IN STD_LOGIC;
      		 y: OUT STD_LOGIC);
      END demo5;
      ARCHITECTURE HUOFEIMEN OF demo5 IS
      BEGIN
      		y <= a NOR b;
      END HUOFEIMEN;		
      
      

      各個(gè)門

      --同時(shí)實(shí)現(xiàn)一個(gè)與門、或門、與非門、或非門、異或門及反相器的邏輯 
      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      ENTITY demo6 IS
      	PORT(
      		a,b: IN STD_LOGIC;
      		YAND,YOR,YNAND,YNOR,YXOR,YN: OUT STD_LOGIC
      	);
      END demo6;
      ARCHITECTURE LUAN OF demo6 IS
      BEGIN
      	YAND <= a AND b;
      	YNAND <= a NAND b;
      	YOR <= a OR b;
      	YNOR <= a NOR b;
      	YXOR <= a XOR b;
      	YN <= NOT a;
      END LUAN;	
      
      

      3-8譯碼器

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      ENTITY demo7 IS
      	PORT
      	(
      		A,B,C: IN STD_LOGIC;
      		Y : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
      	);
      END demo7;	
      ARCHITECTURE KEWU OF demo7 IS
      SIGNAL ABC: STD_LOGIC_VECTOR(2 DOWNTO 0);
      BEGIN
      	ABC <= A&B&C;
          PROCESS(ABC)
      	BEGIN
      		CASE ABC IS
      		WHEN "000"=>Y<="11111110";
      		WHEN "001"=>Y<="11111101";
      		WHEN "010"=>Y<="11111011";
      		WHEN "011"=>Y<="11110111";
      		WHEN "100"=>Y<="11101111";
      		WHEN "101"=>Y<="11011111";
      		WHEN "110"=>Y<="10111111";
      		WHEN "111"=>Y<="01111111";
      		WHEN OTHERS=>Y<="XXXXXXXX";
      		END CASE;
      	END PROCESS;
      END KEWU;
      
      

      3-8譯碼器(類型轉(zhuǎn)化解決式)

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164,ALL;
      USE IEEE.STD_LOGIC_UNSIGNED,ALL;
      
      ENTITY DECODER3TO8 IS
          PORT(
          	INPUT: IN STD_LOGIC_VECTOR(2 DOWNTO 0);
              OUTPUT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
          );
      END DECODER3TO8;
      
      ARCHITECTURE BEHAVE OF DECODER3TO8 IS
      BEGIN
          PROCESS(INPUT)
          BEGIN
              OUTPUT<=(OTHERS=>'0');
          	OUTPUT(CONV_INTEGER(INPUT))<='1';
          END PROCESS;
      END BEHAVE;    
          
          --在STD_LOGIC_UNSIGNED中,CONV_INTEGER()是把STD_LOGIC轉(zhuǎn)換成INTEGER
          --在STD_LOGIC_ARITH中,   CONV_INTEGER()是把UNSIGNED,SIGNED轉(zhuǎn)換成INTEGER
          
          --例如,假設(shè)INPUT是010,直接轉(zhuǎn)化成了INTEGER數(shù)字2
      
      

      異步復(fù)位(清零)

      PROCESS(CLK,RESET,A)
      BEGIN
          IF CLK'EVENT AND CLK='1' THEN
              Q <=A+1;
          ELSIF RESET='1' THEN
              Q <='0';
          END IF
      END PROCESS;        
      
      

      同步復(fù)位(清零)

      PROCESS(CJK,RESET,A)
      BEGIN
          IF CLK'EVENT AND CLK='1' THEN
              IF RESET='1' THEN
                  Q <= '0';
              ELSE
                  Q <=A+1;
              END IF;
          END IF;
      END PROCESS;        
      
      

      使用異步RESET的8BIT寄存器

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      
      ENTITY REG8 IS
          PORT(
          	D: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
              RESETN,CLOCK: IN STD_LOGIC;
              Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
          );
      END REG8;
          
      ARCHITECTURE BEHAVIORAL OF REG8 IS
      BEGIN 
          PROCESS(RESETN,CLOCK)
          BEGIN
              IF(RESETN='0') THEN
                  Q <="00000000";
              ELSIF (CLOCK'EVENT AND CLOCK='1') THEN
                  Q <= D;
              END IF;
      	END PROCESS;
      END BEHAVIORAL;            
      
      

      使用異步清零的NBIT寄存器

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      
      ENTITY REGN IS
          GENERIC (N:INTEGER:=16);
          PORT(
          	D: IN STD_LOGIC_VECTOR(N-1 DOWNTO 0);
              RESET,CLOCK: IN STD_LOGIC;
              Q: OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0);
          );
      ARCHITECTURE BEHAVIORAL OF REGN IS
      BEGIN
          PROCESS(RESET,CLOCK)
          BEGIN
              IF(RESET='0') THEN
      			Q <= (OTEHRS => '0');  --給Q的所有位賦0,方便用于多位信號的賦值操作
      		ELSIF (CLOCK'EVENT AND CLOCK='1') THEN
                  Q <= D;
              END IF;
      	END PROCESS;
      END BEHAVIORAL;            
      
      

      計(jì)數(shù)器

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      USE IEEE.STD_LOGIC_UNSGNED.ALL;
      
      ENTITY COUNT_A IS
          PORT(
          	CLK,RST.UPDN: IN STD_LOGIC;
              Q: OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
          );
      END COUNT_A;
       
      ARCHITECTURE LOGIC OF COUNT_A IS
      BEGIN
          PROCESS(RESET,CLOCK)
          VARIABLE TMP_Q:STD_LOGIC_VECTOR(15 DOWNTO 0);
          BEGIN
              IF(RST='0') THEN
                  Q<=(OTHERS=>'0');--異步復(fù)位
              ELSIF(CLOCK'EVENT AND CLOCK='1')
                  IF UPDN='1'THEN
                      TMP_Q:=TMP_Q+1;
              	ELSE
                      TMP_Q=TMP_Q-1;
                  END IF;
      		Q<=TMP_Q;
              END IF;
      	END PROCESS;
      END LOGIC;            
      
      

      4BIT帶進(jìn)位全加器(行為描述)

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      
      ENTITY ADDER4_FULL IS
          PORT(
          	A: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
          	B: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
              CI: IN STD_LOGIC;
          	S: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
              CO: OUT STD_LOGIC
          );
      END ADDER4_FULL;
      ARCHITECTURE RTL OF ADDER4_FULL IS
      BEGIN 
          PROCESS(A,B,CI)
          VARIABLE A_T,B_T,C_T,S_T: STD_LOGIC_VECTOR(4 DOWNTO 0);
          BEGIN
              -- &拼接符
              A_T :='0'&A;
      		B_T :='0'&B;
      		C_T :="0000"&CI;
      		S_T :=A_T+B_T+C_T;
      		
      		CO<=S_T(4);
      		S <=S_T(3 DOWNTO 0);
      	END PROCESS;
      END RTL;
      
      

      四選一電路

      -----------以下是錯(cuò)誤代碼-----------------
      -----------以下是錯(cuò)誤代碼-----------------
      -----------以下是錯(cuò)誤代碼-----------------
      -----------以下是錯(cuò)誤代碼-----------------
      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      
      ENTITY DEMO1 IS
          PORT(
          	INPUT: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
          	SW: IN STD_LOGIC_VECTOR(1 DOWNTO 0);
              OUTPUT: OUT STD_LOGIC
          );
      END DEMO1;
          
      ARCHITECTURE BEHAVE OF DEMO1 IS
      BEGIN
          PROCESS(INPUT,SW)------------------這句應(yīng)當(dāng)去掉
          BEGIN
              OUTPUT<=INPUT(3)WHEN SW="11" ELSE
                      INPUT(2)WHEN SW="10" ELSE
                      INPUT(1)WHEN SW="01" ELSE
                      INPUT(0)WHEN SW="00" ELSE
                      '0';
          END PROCESS;-----------------------這句應(yīng)當(dāng)去掉
      END BEHAVE;    
      -----------以上是錯(cuò)誤代碼-----------------
      -----------以上是錯(cuò)誤代碼-----------------
      -----------以上是錯(cuò)誤代碼-----------------
      -----------以上是錯(cuò)誤代碼-----------------
                          
      --因?yàn)?在VHDL中,IF...THEN...ELSE是順序語句,只能出現(xiàn)在行為描述中(進(jìn)程體或者子程序中);而WHEN...ELSE是并行語句,可以直接出現(xiàn)在結(jié)構(gòu)體中,但卻不能出現(xiàn)在行為描述中。WHEN...ELSE等效于一個(gè)進(jìn)程體為IF...THEN...ELSE語句的進(jìn)程。                    
      
      

      四選一電路(CASE)

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      
      ENTITY DEMO1 IS
          PORT(
          	INPUT: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
          	SW: IN STD_LOGIC_VECTOR(1 DOWNTO 0);
              OUTPUT: OUT STD_LOGIC
          );
      END DEMO1;
      
      ARCHITECTURE BEHAVE OF DEMO1 IS
      BEGIN
      	PROCESS(INPUT,SW)
          BEGIN
              CASE SW IS
                  WHEN "00" => OUTPUT<=INPUT(0);
                  WHEN "01" => OUTPUT<=INPUT(1);
                  WHEN "10" => OUTPUT<=INPUT(2);
                  WHEN "11" => OUTPUT<=INPUT(3);
          		WHEN OTHERS=>OUTPUT<='X';--x是強(qiáng)未知,這句話是必須的,因?yàn)镾TD_LOGIC的類型很多
              END CASE;
          END PROCESS;
      END BEHAVE;
      
      

      二選一電路(IF)

      IF (P1='1') THEN----p1p2:"10""11"
          Z<=A;
      ELSIF (P2='1') THEN----p1p2:"01"
          Z<=B;
      ELSE----p1p2:"00"
          Z<=C;
      
      
      

      奇偶校驗(yàn)電路(LOOP)

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      
      ENTITY DEMO1 IF
          PORT(
          	INPUT: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
          	OUTPUT: OUT STD_LOGIC
          );
      END DEMO1;
          
      ARCHITECTURE BEHAVE OF DEMO1 IS
      VARIABLE X:STD_LOGIC;
      BEGIN
          PROCESS(INPUT)
          BEGIN
              X:='0';
              FOR I IN 7 DOWNTO 0 LOOP
                  X:=X XOR INPUT(I);
      		END LOOP;
           OUTPUT<=X;
           END PROCESS;
      END BEHAVE;
      
      

      NEXT舉例

      LOOP1:FOR I IN 7 DOWNTO 0 LOOP
          A(I)<='0';
      	NEXT WHEN(A=B);
          A(I)<='1';
      END LOOP1;
      ---成立則跳過此次循環(huán)剩下的語句,進(jìn)行下次循環(huán)
      
      

      4元素位矢量比較(EXIT)

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      
      ENTITY DEMO1 IS
          PORT(
          	INPUT1: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
          	INPUT2: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
          	OUTPUT: OUT STD_LOGIC  --0相等,1不相等
          );
          
      ARCHITECTURE BEHAVE OF DEMO1 IS
          VARIABLE Y:STD_LOGIC;
      BEGIN
          PROCESS(INPUT1,INPUT2)
          Y:='0';
          BEGIN
              FOR I IN 3 DOWNTO 0 LOOP
              Y:='1';--假設(shè)不相等
      		EXIT WHEN(INPUT1(I)/=INPUT2(I));
      		Y:='0';--沒有跳出,說明目前還是相等的
              END LOOP;
      	OUTPUT<=Y;
      	END PROCESS;
      END BEHAVE;
      
      

      半加器造全加器

      library ieee;
      use ieee.std_logic_1164.all;
      
      entity demo10 is
          port (
              A, B, Cin : in std_logic;
              Sum, Cout : out std_logic
          );
      end entity demo10;
      
      architecture Behavioral of demo10 is
          component Half_Adder
              port (
                  X, Y : in std_logic;
                  S, C : out std_logic
              );
          end component;
      
          signal S1, S2, C1, C2 : std_logic;
      begin
          -- First Half Adder
          Half1: Half_Adder port map(A, B, S1, C1);
          
          -- Second Half Adder with Carry In from the first Half Adder
          Half2: Half_Adder port map(S1, Cin, Sum, C2);
          
          -- OR gate for Cout
          Cout <= C1 or C2;
      end architecture Behavioral;
      
      
      -- Half Adder
      library ieee;
      use ieee.std_logic_1164.all;
      
      entity Half_Adder is
          port (
              X, Y : in std_logic;
              S, C : out std_logic
          );
      end entity Half_Adder;
      
      architecture Behavioral of Half_Adder is
      begin
          S <= X xor Y; -- Sum
          C <= X and Y; -- Carry
      end architecture Behavioral;
          
          
          
      --下面自己寫的
      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      ENTITY BAN IS
      PORT(
      	A,B:IN STD_LOGIC;
      	S,Y:OUT STD_LOGIC
      );
      END BAN;
      ARCHITECTURE BEHAVE1 OF BAN IS
      BEGIN
      S<=A OR B;
      Y<=A AND B;
      END BEHAVE1;
      
      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      USE IEEE.STD_LOGIC_UNSIGNED.ALL;
      ENTITY demo12 IS
      PORT(
      	A,B,C:IN STD_LOGIC;
      	S,Y:OUT STD_LOGIC
      );
      END demo12;
      ARCHITECTURE BEHAVE OF demo12 IS
      COMPONENT BAN IS
      PORT(
      	A,B:IN STD_LOGIC;
      	S,Y:OUT STD_LOGIC
      );
      END COMPONENT;
      SIGNAL T1,T2,T3:STD_LOGIC;
      BEGIN
      U1:BAN PORT MAP(A,B,T1,T2);
      U2:BAN PORT MAP(T1,C,S,T3);
      Y<=T2 OR T3;
      END BEHAVE;
          
      
      

      四位二進(jìn)制加法計(jì)數(shù)器

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      USE IEEE.STD_LOGIC_UNSIGNED.ALL;
      ENTITY COUNTER IS
      PORT(CLK, EN, RST : IN STD_LOGIC;
      Q : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
      END; --設(shè)置輸入時(shí)鐘信號、時(shí)鐘使能信號和異步清零信號,以及 7 段 LED 數(shù)
      碼管輸出使能信號
      ARCHITECTURE ONE OF COUNTER IS
      SIGNAL R : STD_LOGIC_VECTOR(3 DOWNTO 0);
      BEGIN
      PROCESS(CLK, EN)
      BEGIN
      IF RST = '1' THEN R <= (OTHERS => '0');
      --異步清零功能,位于時(shí)鐘信號判斷之前實(shí)現(xiàn)異步
      ELSIF CLK'EVENT AND CLK = '1' THEN
      --判斷時(shí)鐘信號此時(shí)是否是上升沿
      IF EN = '1' THEN
      --判斷是否允許計(jì)數(shù)
      R <= R + 1;
      END IF;
      END IF;
      CASE R IS
      WHEN "0000" => Q <= "0111111";
      WHEN "0001" => Q <= "0000110";
      WHEN "0010" => Q <= "1011011";
      WHEN "0011" => Q <= "1001111";
      WHEN "0100" => Q <= "1100110";
      WHEN "0101" => Q <= "1101101";
      WHEN "0110" => Q <= "1111101";
      WHEN "0111" => Q <= "0000111";
      WHEN "1000" => Q <= "1111111";
      WHEN "1001" => Q <= "1101111";
      WHEN "1010" => Q <= "1110111";
      WHEN "1011" => Q <= "1111100";
      WHEN "1100" => Q <= "0111001";
      WHEN "1101" => Q <= "1011110";
      WHEN "1110" => Q <= "1111001";
      WHEN "1111" => Q <= "1110001";
      WHEN OTHERS => Q <= "0000000";
      END CASE;
      --通過打表的方式使得對應(yīng)的 4 位二進(jìn)制數(shù)能夠?qū)?yīng)相應(yīng)的 7 段 LED 數(shù)碼管
      的使能輸出信號
      END PROCESS;
      END;
      

      元件例化舉例

      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      USE IEEE.STD_LOGIC_UNSIGNED.ALL;
      ENTITY ND2 IS
      PORT(
      	A,B:IN STD_LOGIC;
      	C:OUT STD_LOGIC
      );
      END ND2;
      ARCHITECTURE BEHAVE1 OF ND2 IS
      BEGIN
      C<=A NAND B;
      END BEHAVE1;
      
      LIBRARY IEEE;
      USE IEEE.STD_LOGIC_1164.ALL;
      USE IEEE.STD_LOGIC_UNSIGNED.ALL;
      ENTITY demo12 IS
      PORT(
      	A,B,C,D:IN STD_LOGIC;
      	OUTPUT:OUT STD_LOGIC
      );
      END demo12;
      ARCHITECTURE BEHAVE OF demo12 IS
      COMPONENT ND2 IS
      PORT(
      	A,B:IN STD_LOGIC;
      	C:OUT STD_LOGIC
      );
      END COMPONENT;
      SIGNAL OUT1,OUT2:STD_LOGIC;
      BEGIN
      U1:ND2 PORT MAP(A,B,OUT1);
      U2:ND2 PORT MAP(C,D,OUT2);
      U3:ND2 PORT MAP(OUT1,OUT2,OUTPUT);
      END BEHAVE;
          --元件例化語句屬于并行語句,不能放在進(jìn)程里面
      

      img

      posted @ 2024-12-26 18:23  燊楽  閱讀(63)  評論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 中文字幕国产精品一区二| 久久天天躁夜夜躁狠狠85| 欧洲精品色在线观看| 激情综合网激情五月我去也| 人妻精品动漫h无码| 男女性高爱潮免费网站| 国产av一区二区三区久久| 欧美肥老太wbwbwbb| 无码一区二区三区久久精品| 久青草视频在线观看免费| 国产免费丝袜调教视频| 欧美私人情侣网站| 午夜国产精品福利一二| 阿克苏市| 国产成人精品无人区一区| 任我爽精品视频在线播放| 精品国产精品午夜福利| 国产无遮挡性视频免费看| 日本高清在线观看WWW色| 潼关县| 懂色AV| 国产成人亚洲综合图区| 无码乱人伦一区二区亚洲一| 吉川爱美一区二区三区视频| 在线观看成人年视频免费| 忘忧草在线社区www中国中文| 人妻va精品va欧美va| 亚洲国产日韩一区三区| 精品国产一区二区三区久| 中文一区二区视频| 亚洲开心婷婷中文字幕| 五月丁香啪啪| 最近中文字幕国产精品| 国产成人综合亚洲欧美日韩| 精品国产中文字幕av| 在线日韩日本国产亚洲| 99久久精品午夜一区二区| 亚洲国产另类久久久精品小说| 国产成人午夜精品永久免费| 国产成人亚洲综合图区| 日韩丝袜欧美人妻制服|