




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
VHDL入門需掌握的根本知識一、信號〔signal〕的含義和信號的2種最常 用類型:std_logic和td_logic_vector二、四種常用語句的根本用法 賦值語句、if語句、case語句和process語句三、實體〔entity〕、結構體〔architecture)和一個實 體和一個結構體組成的設計實體。四、層次結構的設計掌握元件〔component〕語句和端口映射〔portmap〕語句。五、庫〔library〕和程序包〔pachage〕的根本使用。有了上述的入門知識,一般的設計沒有什么問題。
信號和變量信號〔signal)是硬件中連線的抽象描述,信號在元件的端口連接元件。變量(varable)在硬件中沒有類似的對應關系,它們主要用于硬件特性的高層次建模所需的計算中。信號在邏輯電路
設計中最常用的數據類型在VHDL語言中有10種數據類型,但是在邏輯電路設計中最常用的是std_logic和std_logic-vector提供的數據類型。Std_logic類型分為布爾〔boolean〕型、位〔bit〕型、位矢量(bit_vector)型。信號在邏輯電路
設計中最常用的數據類型Std_logic有9種狀態,常用的是三種狀態:‘0’高電平‘1’低電平‘z’ 高阻
高阻狀態是為了雙向總線的描述信號的說明
一個信號只有說明語句說明后才能使用。用VHDL語言進行設計就是寫一系列語句。一個語句用分號結束。設計說明形式如下:Signalclock,T1,T2:std_logic;Signalr0,r1,r2,r3:std_logic_vector(15downto0);Signalr0,r1,r2,r3:std_logic_vector(0upto15);信號的說明整數不能看作矢量,不能按位運算。整數不能進行邏輯運算,只能進行算術運算。從信號說明看不出一個信號是組合邏輯還是時序邏輯〔例如存放器〕,這與ABEL語言是不同的。邏輯運算符有6種邏輯運算符:NOT、OR、AND、NAND、NOR、XOR。常用的為前三種。
signala,b:std_logic;signalc,d:std_logic_vector(7downto0);aandb aorb nota正確
canddcxord notc
正確
aandc錯誤
2個進行邏輯運算的信號,類型必須相同。這些邏輯運算符優先級相同。
算術運算符常用的算術運算符有:+
-
Signala,b:std_logic_vector(15downto0);a+ba+‘1’A+“01”并置運算符
&并置運算符用于位的連接,形成矢量。也可連接矢量形成更大的矢量。Signala,b:std_logic_vector(3downto0);Signalc,d:a,b:std_logic_vector(2downto0);aand(‘1’&c)c&a
關系運算符關系運算符有以下幾種:=等于 /=不等于<小于 >大于<=小于等于 >=大于等于等于、不等于運算符適用于所有的數據類型,其他的運算符適用于整數、位及矢量等。在進行關系運算時,兩邊的數據類型必須相同,但位長度可以不同。關系運算的結果為“真”或者“假”。
常用的4種語句VHDL有許多類型的語句,我們這里講4種。一、賦值語句
signala,b,c:std_logic;signald,e,q:std_logic_vector;c<=not(aandb);q<=dorq;常用的4種語句二、if語句1、if語句的三種形式?if條件then假設干語句endif;?if條件then假設干語句else假設干語句endif;常用的4種語句二、if語句1、if語句的三種形式?if條件1then假設干語句elsif條件2then假設干語句┆
else條件nthen假設干語句endif;
常用的4種語句二、if語句2、例子1—16位存放器--Signalreset,clk,wen:std_logic;--Signald,q:std_logic_vector(15downto0);Ifreset=‘0’thenq<=x”0000”;Elsifclock’eventandclock=‘1’thenifwen=‘1’thenq<=d;else q<=q;endif;Endif;說明:--是注釋開始的標志,signal語句的存在只是為了說明這些信號的類型,供閱讀方便使用。
常用的4種語句二、if語句3、例子2—16位存放器的另一種形式--Signalreset,clk,wen:std_logic;--Signald,q:std_logic_vector(15downto--0);Ifreset=‘0’thenq<=x”0000”;Elsifclock’eventandclock=‘1’thenifwen=‘1’thenq<=d; endif;Endif;常用的4種語句二、if語句4、例子3—16位存放器的第三種形式--Signalreset,clk,wen:std_logic;--Signald,q:std_logic_vector(15downto--0);Ifreset=‘0’thenq<=”0000000000000000”;Elsifclock’eventandclock=‘1’thenifwen=‘1’thenq<=d;endif;Endif;常用的4種語句二、if語句5、信號沿的幾種表示方法clock’eventandclock=‘1’上升沿clock’eventandclock=‘0’下降沿rising_edge〔clock〕上升沿falling_edge(clock)下降沿
常用的4種語句二、if語句6、例子4—時鐘下降沿觸發的16位存放器--Signalreset,clk,wen:std_logic;--Signald,q:std_logic_vector(15downto--0);Ifreset=‘0’thenq<=X”0000”;Elsiffalling_edge(clock)thenifwen=‘1’thenq<=d;endif;Endif;常用的4種語句二、if語句7、例子5—二選一多路開關
--Signalsel:std_logic;--Signala,b,c:std_logic_vector(15--downto0);Ifsel=‘0’thenc<=a;Elsec<=b;Endif;常用的4種語句三、進程〔process〕語句PROCESS語句是VHDL語言中描述硬件系統行為的最根本的語句。本質上描述了一個功能獨立的電路塊。1、process語句的根本形式PROCESS[〔敏感信號1,敏感信號2,…〕]BEGIN┇ENDPROCESS;常用的4種語句三、process語句2、說明敏感信號表中的任何一個發生變化,都啟動process語句工作。敏感信號表中的信號是一局部輸入信號,或者在process語句中形成的反響信號;純粹輸出的信號或者在本語句中不發生變化的信號不能放入敏感信號表。常用的4種語句三、process語句我們在if語句中介紹的電路如果不和PROCESSS語句結合起來,不能構成一個功能獨立的電路,編譯時就會出錯。下面是改造后的16位存放器和2選1多路開關。3、改造后的16位存放器--Signalreset,clk,wen:std_logic;
--Signald,q:std_logic_vector(15downto0);
register_pro:process(reset,clock)
begin
Ifreset=‘0’then
q<=x”0000”;
Elsifclock’eventandclock=‘1’then
ifwen=‘1’then
q<=d;
endif;
Endif;
endprocess;
注意:敏感信號表中沒有信號D,因為只需要reset和clock啟動這個process語句;信號q是個輸出信號,因此不能放入process語句的敏感信號表中。
Register_pro:表示一個標號,標號可有可無。
常用的4種語句三、process語句4、改造后的2選一多路開關--Signalsel:std_logic;
--Signala,b,c:std_logic_vector(15
--downto0);
process(sel,a,b)
begin
Ifsel=‘0’then
c<=a;
Else
c<=b;
Endif;
endprocess;
常用的4種語句三、process語句5、程序計數器PC的一種設計--signalpc,zjmp_pc,cjmp_pc:
--std_logic_vector(15downhto0);
--signalt,zj_flag,cj_flag,dw_flag,reset:std_logic;
pc_proc:process(pc,zjmp_pc,cjmp_pc,t,zj_flag,cj_flag,
dw_flag,reset)
begin
ifreset=‘0’then
pc<=x”0000”;
elsift’eventandt=‘1’then
ifzj_flag=‘1’then
pc<=zjmp_pc;
elsifcj_flag=‘1’then
pc<=cjmp_pc;
elsifdw_flag=‘1’then
pc<=pc+“10”;
else
pc<=pc+‘1’;
endif;
endif;
endprocess;常用的4種語句三、process語句6、1000000計數器設計--signalcounter:std_logic_vector(19downto0);
--signalcounterclk,reset:std_logic;
--16進制f423f等于10進制999999
process(reset,clk)
begin
ifreset=‘0’then
counter<=x”00000”;
elsifclk’eventandclk=‘1’then
ifcounter/=x”f423f”then
counter<=counter+‘1’;
else
counter<=x”00000”;
endif;
endif;
endprocess;
常用的4種語句三、process語句7、鎖存器設計--signalreset,set,clk:std_logic;
--siganld,q:std_logic_vector(15downto0);
process(reset,set,clk)
ifreset=‘0’then
q<=x”0000”;
elsifset=‘0’then
q<=x”ffff”;
elsifclk=‘1’then
q<=d;
endif;
endprocess;常用的4種語句四、CASE語句1、CASE語句的書寫格式CASE條件表達式ISWHEN條件表達式值1=〉假設干語句 ┆WHEN條件表達式n=〉 假設干語句WHENOTHERS=〉 假設干語句ENDCASE;常用的4種語句四、CASE語句2、例子1—運算器設計
一個有加、減、與、或功能的16位運算器。其中,cin是原來的進位值,cout是運算后的進位值,q是運算的結果,a和b是2個操作數,sel是個2位的運算選擇碼。
--signala,b,q:std_logic_vector(15downto0);
--signalsel:std_logic_vector(1downto0);
--signalcin,cout:std_logic;
--signalresult:std_logic_vector(16downto0);
process(a,b,sel,cin)
begin
caseselis
when“00”=>
result<=‘0’&a+‘0’&b;
q<=result(15downto0);
cout<=result(16);
when“01”=>
result<=‘0’&a+‘0’&b;
q<=result(15downto0);
cout<=result(16);
when“10”=>
q<=aandb;
cout<=cin
whenothers=>
q<=aorb;
cout<=cin;
endcase;
endprocess;常用的4種語句四、CASE語句3、例子2—一個2與非門--signal
a:std_logic_vector(1downto0);
--signalc:std_logic;
process(a)
begin
caseselis
when“00”|“01”|“10”=>
c<=‘1’;
when“11”=>
c<=‘0’;
whenothers=>
null;
endcase;
endprocess;
在本例子中,第一個when中的“|“代表或者,即三個條件中的任何一個滿足,都執行c<=‘1’。實際上與非門很少這樣設計。
Null是個什么也不做的空語句。常用的4種語句四、CASE語句4、例子3—一個狀態機設計該狀態機可用于指令cache的在不命中時的控制。指令cache容量是8x8字。每個字16位。存儲器數據總線是16位。Miss是不命中標志。
--signalstate,next_state:std_logic_vector(3downto0);
--signalreset,clk,miss:std_logic;
proceee(reset,clk)
begin
ifreset=‘0’then
state<=“0000”;
elsifclk’eventandclk=‘1’then
state<=next_state;
endif;
endprocess;
process(miss,state)
begin
casestateis
when“0000”=>
ifmiss=‘1’then
next_state<=“0001”;
else
next_state<=“0000”;
endif;
when“0001”=>--1
next_state<=“0011”;
when“0011”=>--2
next_state<=“0010”;
when“0010”=>--3
next_state<=“0110”;
when“0110”=>--4
next_state<=“0111”;
when“0111”=>--5
next_state<=“0100”;
when“0100”=>--6
next_state<=“1100”;
when“1100”=>--7
next_state<=“1000”;
when“1000”=>--8
next_state<=“0000”;
whenothers=>
next_state<=“0000”;
endcase;
endprocess;設計實體VHDL適合做大型工程的設計。除了極少數十分簡單的工程外,根本上都采用層次結構的設計。在層次結構的設計中,設計實體是一個根本單元。使用VHDL語言設計一個工程的過程中,經常要使用廠家提供各種庫,庫中存放的是供用戶使用的已經設計好的設計實體。因此可以認為,一個工程就是用戶設計的各個設計實體和庫中提供的設計實體通過適當的信號連接完成的。設計實體在一個工程中除了最高層的設計實體外,其他設計實體都是子系統,或者稱為元件。這里的元件是廣義的,不是市場上賣的現成的元件。最高層的設計實體就是系統總體。
設計實體一個設計實體由三局部構成:實體〔entity〕定義系統對外聯系的信號,信號的方向和數據類型。相當于電子器件的引腳。結構體(architecture)完成設計實體規定的功能,就是子系統的內部電路結構。庫(library)和程序包(package)設計實體前面要寫明該設計實體用到的庫和程序包。實體〔entity〕Entity定義流出、流入設計實體的信號。Entity的書寫形式如下:
Entity
實體名is
端口說明;
end實體名;實體〔entity〕下面舉一個實體的例子:ENTITYmuxISPORT(d0,d1,sel:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux;
其中,MUX是實體名。PORT〔端口〕說明的是端口信號的數據類型的和流動方向。在本例中,d0、d1和sel是STD_LOGIC數據類型,是流入實體的信號;q是STD_LOGIC數據類型,是流出實體的信號。實體〔entity〕Port(端口的書寫形式)
PORT(端口名,…,端口名:模式數據類型; 端口名,…,端口名:模式數據類型;
. . .
端口名,…,端口名:模式數據類型);
實體說明中的每一個輸出/輸入被稱為一個端口。一個端口實際上表示一個或者一組具有相同模式和數據類型的負責與外部通訊的信號,相當于元件的引腳。實體〔entity〕下面是一個PORT語句的例子:PORT (reset,cs: in std_logic; rd,wr in std_logic; a1,a0: in std_logic; pa,pb inout std_logic_vector(7downto0); pc out std_logic_vector(17downto0));
端口的模式用來說明信號通過端口的方向和通過方式,有以下幾種方式:實體〔entity〕IN〔流入實體〕OUT〔從實體流出〕INOUT〔雙向端口,即可流入實體,又可從實體流出〕BUFFER〔雙向端口,可從實體流出,也能用于內部反響〕
OUT模式的端口不能用于被設計實體的內部反響。BUFFER模式的端口能夠用于被設計實體的內部反響。INOUT模式可以代替IN、INOUT、BUFFER模式,INOUT模式允許內部反響。雖然INOUT模式能代替其他模式,但在設計時,除非真正需要雙向端口時,建議不要使用INOUT模式。慣例是把輸入端口指定為IN模式,把輸出端口指定為OUT模式,把雙向端口指定INOUT模式。這一良好的設計習慣,從端口的名稱和端口模式就可以一目了然地判定信號的用途、性質、來源和去向,十分方便。對于一個大型設計任務,大家協同工作,這樣的描述不會引起歧義。另一方面,指定滿足端口性能的最根本模式,可以減少占用的器件內部的資源。結構體(architecture)完成設計實體規定的功能,就是子系統的內部電路結構。結構體的書寫形式如下:ARCHITECTURE結構體名OF實體名IS內部信號,常量,數據類型,函數等的定義;BEGIN 假設干并行執行語句;END結構體名;注意:實體名一定要與對應的實體名完全一致。ARCHITECTURE后面的結構體名與END后的結構體名完全一致。結構體的名字可以隨便起,因為別的地方都用不著這個名字。結構體內要求并行執行語句,類似IF之類的順序執行語句,只要將它們放在并行語句〔如process)之內即可。結構體(architecture)一個實體可以對應幾個結構體,我們這里只介紹一個實體只對應一個結構體的情況。結構體有許多構成的方法,就是把各類的并行語句加以不同的組合方式形成各種構成方法。我們使用賦值語句、PROCESS語句和COMPONENT〔元件語句〕構成結構體的方法,這是初學者最常使用的方法,也是很管用的方法。庫在層次結構設計中,程序包〔PACKAGE〕和庫(LIBRARY)都是很重要的工具,即使是由一個設計實體構成的設計,也要用到庫。VHDL的庫是用來存儲可編譯的設計單元的地方,也就是用來存放可編譯的程序包的地方,這樣它就可以在其他設計中被調用。庫中的設計單元〔實體說明、結構體、配置說明、程序包說明和程序包體等〕可以用作其他VHDL設計的資源。VHDL語言的庫分為兩種,一種是設計庫,一種是資源庫。被IEEE認可的資源庫稱為IEEE庫。VHDL工具廠商和EDA工具專業公司都有自己的資源庫,有的自行參加到各自的開發工具IEEE庫中,也有自行建庫,另行獨立調用的資源庫。庫IEEE庫是最常用的資源庫,其中包含的程序包是:Std_logic_1164 一些常用函數和數據類型程 序包Numeric_bit bit類型程序包 Numeric_Std 用于綜合的數值類型和算術 函數程序包Math_Real 實數的算術函數程序包Math_Complex 復數的算術函數程序包Vital_Timing Vital時序程序包Vital_Primitives Vital元件程序包
上述程序包中,不是每一個EDA軟件都全部提供。使用時應該詳細了解EDA軟件的功能,看有無相應的程序包,或者找出替代的程序包。
庫除了IEEE標準資源庫外,各可編程器件的廠家提供的EDA軟件提供自己獨特的資源程序包。由于這些程序包是為它們制造的器件效勞的,往往更有針對性。QartusⅡ中提供了一個LPM庫,庫中有許多稱之為MegaFunctions的功能強大的函數。在QartusⅡ中使用菜單命令Tools→MegaWizardPlug-InManager能夠很容易地掌握QartusⅡ提供的許多元件和函數的使用。使用Cyclone芯片中的存儲器時,Altera公司強烈推薦通過Tools→MegaWizardPlug-InManager進行設計。一個設計實體例子
libraryieee;useieee.std_logic_1164.all;
ENTITYand_gateIS PORT(op1,op2:instd_logic; and_result:outstd_logic);ENDand_gate;
ARCHITECTUREbehavOFand_gateISBEGIN and_result<=op1ANDop2;ENDbehav;
庫使用庫中的元件和函數之前,需要使用LIBRARY子句和USE子句予以說明。沒有說明的庫中的元件通常不能使用。如果一個設計實體中使用了某個庫中的元件和函數,就要使用相應的LIBRARY子句和USE子句,LIBRARY子句和USE子句放在總是放在設計文件的最前面〔可以放在注釋之后〕,LIBRARY子句的作用是使該庫在當前文件中“可見”。LIBRARY子句說明使用哪個庫,它的格式是 LIBRARY庫名1,庫名2,…,庫名n;USE子句說明使用哪個庫中的哪個程序包中的元件或者函數。它的格式是: USE庫名.程序包名.ALL;下面是使用,LIBRARY子句和USE子句的例子:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;對于一般使用而言,這些庫的說明語句夠用了。
component〔元件〕語句
和portmap〔端口映射〕語句在層次化結構設計中,要經常用到component〔元件〕語句和portmap〔端口映射〕語句。component語句的作用是說明設計實體中使用的哪個低層設計實體和該低層設計實體的端口。該低層設計實體在本設計實體中作為現成的元件使用。component〔元件〕語句一般放在結構體中architecture語句和首次出現的begin之間,給人以一目了然的感覺。portmap語句完成低層設計實體的端口信號和本設計實體其他局部的信號連接問題。它必須放在結構體內首次出現的begin之后。component〔元件〕語句
和portmap〔端口映射〕語句高層的設計實體可以把低層設計實體當作元件來引用稱作例化。在一個高層設計實體中可以對一個元件例化屢次。component〔元件〕語句
和portmap〔端口映射〕語句COMPONENT語句的書寫形式是:COMPONENT元件名--指定調用元件PORT 說明--被調用元件端口ENDCOMPONENT;端口的說明和被調用元件〔設計實體〕中ENTITY中的說明要完全一致〔次序可以改變〕。component〔元件〕語句
和portmap〔端口映射〕語句PORT語句的書寫格式如下: [標號]:POETMAP(MS1=>S1,MS2=>S2,…,MSn=>Sn); 其中,MS1,MS2,…,MSn和S1,S2,…,Sn都是信號名。標號是可選的,即可有可無。S1,S2,…,Sn是高層設計實體中使用的信號名;MS1,MS2,…,MSn是低層建立元件時使用的端口信號名〔引腳名〕。這種映射方式稱為顯式映射方式,它把元件端口的信號和高層中使用的信號顯式對應起來,書寫的順序不受任何限制。請注意:高層中使用的信號名和元件端口對應的信號名可以相同,也可以不同;但是完全相同有時根本做不到。component〔元件〕語句
和portmap〔端口映射〕語句每次引用該元件都要使用portmap〔端口映射〕語句例化一次。標號是可選的。然而我主張,為了區別同一個元件在一個設計實體內的屢次例化,最好使用標號將屢次例化加以區分。在一個設計實體的獨立電路〔如process〕原那么上都應該有標號,以便閱讀。一個層次結構設計的例子設計一個由2個與門、1個或門構成的與或門低層的設計實體“與門”
libraryieee;
useieee.std_logic_1164.all;
ENTITYand_gateIS
PORT(op1,op2:instd_logic;
and_result:outstd_logic);
ENDand_gate;
ARCHITECTUREbehavOFand_gateIS
BEGIN
and_result<=op1ANDop2;
ENDbehav;低層的設計實體“或門”
libraryieee;
useieee.std_logic_1164.all;
ENTITYor_gateIS
PORT(op1,op2:instd_logic;
or_result:outstd_logic);
ENDor_gate;
ARCHITECTUREbehavOFor_gateIS
BEGIN
or_result<=op1ORop2;
ENDbehav;高層設計中使用元件and_gate和or_gate設計與或門
libraryieee;
useieee.std_logic_1164.all;
ENTITYand_or_gateIS
PORT(a1,a2,a3,a4:instd_logoc;
and_or_result:outstd_logic);
ENDand_or_gate;
ARCHITECTUREstructOFand_or_gateIS
SIGNALb1,b2:std_logic;--高層設計中使用的內 --部信號
COMPONENTand_gate--說明元件“與門”and_gate
PORT(op1,op2:instd_logic;
and_result:outstd_logic);
ENDCOMPONENT;
COMPONENTor_gate--說明元件“或門”or_gate
PORT(op1,op2:instd_logic;
or_result:outstd_logic);
ENDCOMPONENT;
BEGIN
--對“與門”and_gate的一次例化
G1:and_gate
PORTMAP(op1=>a1,op2=>a2,
and_result=>b1);
--對“與門”and_gate的一次例化
G2:and_gatePORTMAP(op1=>a3,op2=>a4,
and_result=>b2);
--對“或門”or_gate的一次例化
G3:or_gatePORTMAP(op1=>b1,or_result=>
and_or_result,op2=>b2);
ENDstruct;
Pachage(程序包)
和工作庫work在上面與或門的構建中,我們會覺察一個問題:如果每個高層設計實體在使用同一個低層設計實體時都要對引用的低層設計實體進行說明豈不是太麻煩?解決這個問題的的方法是使用package(程序包)和工作庫work。程序包〔PACKAGE〕是一種使包體中的類型、常量、元件和函數對其他模塊〔文件〕是可見,可以調用的設計單元。程序包是公用的存儲區,在程序包內說明的數據,可以被其他模塊〔文件〕使用。程序包由包頭和包體2局部組成。WORK庫是設計庫,在任何設計文件中隱含都是“可見”的,不需要特別說明。也就是說,每一個設計文件中總是隱含以下不可見的行: LIBRARY WORK;下面仍將與或門的設計為例,說明pachage和庫work的使用。與門和活門的設計不變,增加一個PACKAGE的設計,對與或門設計進行修改。LIBRARYieee;
USEieee.std_logic_1164.all;
PACKAGEand_or_componentsIS
COMPONENTor_gate--說明元件“或門”or_gate
PORT(op1,op2:instd_logic;
or_result:outstd_logic);
ENDCOMPONENT;
COMPONENTand_gate --說明元件“與門”and_gate
PORT(op1,op2:instd_logic;
and_result:outstd_logic);
ENDCOMPONENT;
ENDand_or_components;LIBRARYieee;
USEieee.std_logic_1164.all;
USEwork.and_or_components.all;--指明調用的程序包,使其成為可用
ENTITYand_or_gateIS
PORT(a1,a2,a3,a4:instd_logoc;
and_or_result:outstd_logic);
ENDand_or_gate;
ARCHITECTUREstructOFand_or_gateIS
SIGNALb1,b2:std_logic;--高層設計中使用的內部信號
BEGIN
--對“與門”and_gate的一次例化
G1:and_gate PORTMAP(op1=>a1,op2=>a2,and_result=>b1);
--對“與門”and_gate的一次例化
G2:and_gatePORTMAP(op1=>a3,op2=>a4,and_result=>b2);
--對“或門”or_gate的一次例化
G3:or_gatePORTMAP(op1=>b1,or_result=>and_or_result,op2=>b2);
ENDstruct;一個存放器堆的設計要求:1、設計4個16位的存放器堆2、當reset信號為低時,使所有存放器復位。3、用rd〔2位〕選擇寫入的存放器。當寫允許信號write為高時,在時鐘信號clk的上升沿將數據d_input寫入rd選中的存放器。4、用rs〔2位〕信號選擇讀出的存放器,讀出的內容送q_out。一個存放器堆的設計設計方案:1、低層設計實體有3個:16位的存放器register_162—4譯碼器decoder2_to_44選1多路開關mux4_to_12、使用上述元件的高層設計實體regfile16位存放器register_16LIBRARYieee;USEieee.std_logic_1164.all;ENTITYregiister_16IS PORT ( reset :IN STD_LOGIC; d_input :IN STD_LOGIC_vector(15downto0); clk :IN STD_LOGIC; write :IN STD_LOGIC; sel :IN STD_LOGIC; q_output :OUT STD_LOGIC_vector(15downto0) );
ENDregister_16;ARCHITECTUREaOFregister_16IS
BEGIN
PROCESS(reset,clk)
BEGIN
IFreset='0'then
q_output<=x"0000";
elsif(clk'EVENTANDclk='1')THEN
IFsel='1'andwrite='1'THEN
q_output<=d_input;
ENDIF;
ENDIF;
ENDPROCESS;
ENDa;
2-4譯碼器decoder2_to_4LibraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitydecoder2_to_4is port( rd:instd_logic_vector(1downto0); sel00:outstd_logic; sel01:outstd_logic; sel02:outstd_logic; sel03:outstd_logic);enddecoder2_to_4;architectureBehavioralofdecoder2_to_4isbegin sel00 <=(notrd(1))and(notrd(0)); sel01 <=(notrd(1))andrd(0); sel02 <=rd(1)and(notrd(0)); sel03 <=rd(1)andrd(0);endBehavioral;4選1多路開關mux4_to_1libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitymux4_to_1isport( Input0,Input1,Input2,Input3 :instd_logic_vector(15downto0); Sel :instd_logic_vector(1downto0); Out_put:outstd_logic_vector(15downto0));endmux4_to_1;architectureBehavioralofmux4_to_1isbeginmux:process(Sel,Input0,Input1,Input2,Input3)begincaseSelis when"00"=>Out_put<=Input0; when"01"=>Out_put<=Input1; when"10"=>Out_put<=Input2; when"11"=>Out_put<=Input3; endcase;endprocess;endBehavioral;存放器堆regfile高層設計實體libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entityregfileis
Port( rs:instd_logic_vector(2downto0);
rd:instd_logic_vector(2downto0);
reset :instd_logic;
write :instd_logic;
clk :instd_logic;
d_input:instd_logic_vector(5downto0);
q_out:outstd_logic_vector(5downto0)
);
endregfile;architecturestructureofregfileis
componentregister_16PORT(--16bit存放器
reset,clk,write,sel:INSTD_LOGIC;
d_input :IN STD_LOGIC_vector(15downto0);
q_output:OUTSTD_LOGIC_vector(15downto0));
endcomponent;
comp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 耐火土石礦山安全生產事故案例分析考核試卷
- 漁業機械化漁業資源增殖與養護考試考核試卷
- 稀土分離與純化考核試卷
- 2025技術授權與共同生產合同范本
- 2025年小學教師勞動合同
- 2025商用物業租賃合同范本
- 大學生職業規劃大賽《偵查學專業》生涯發展展示
- 遂平懿豐假日廣場施工組織設計
- 保證人借款合同書范例
- 虛假合同書貸款
- 湖南省邵陽市2023年英語小升初試卷(含答案)
- 監理公司員工手冊
- 電子商務的區塊鏈技術應用
- YY 1042-2023 牙科學 聚合物基修復材料
- 中國地圖素材課件
- 腫瘤患者隨訪管理制度
- 【新能源汽車電池回收技術方案設計3500字(論文)】
- 刑偵行業:刑偵技術與案件偵查培訓研討會
- 各種生活用紙售后服務方案
- (完整版)中醫養生課程標準
- 第4課 視覺中的紅屋頂 課件 2022-2023學年湘美版初中美術八年級下冊
評論
0/150
提交評論