計算機軟件及應(yīng)用第4章VHDL設(shè)計實例_第1頁
計算機軟件及應(yīng)用第4章VHDL設(shè)計實例_第2頁
計算機軟件及應(yīng)用第4章VHDL設(shè)計實例_第3頁
計算機軟件及應(yīng)用第4章VHDL設(shè)計實例_第4頁
計算機軟件及應(yīng)用第4章VHDL設(shè)計實例_第5頁
已閱讀5頁,還剩88頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第四章基本邏輯電路設(shè)計實例組合邏輯電路設(shè)計時序邏輯電路設(shè)計存儲器設(shè)計狀態(tài)機設(shè)計一、4選1多路選擇器四選一yabcds0s1組合邏輯電路的設(shè)計LIBRARYIEEE;USEIEEE.std_logic_1164.all;ENTITYmux4ISPORT(a,b,c,d,s0,s1:INstd_logic; y:OUTstd_logic);ENDmux4;ARCHITECTUREfuncOFmux4ISVARIABLE

sel:std_logic_vector(1DOWNTO0);BEGIN

sel<=s1&s0;y<=aWHENsel=‘00'ELSE

bWHENsel=‘01’ELSE

cWHENsel=‘10’ELSE dWHENsel=‘11’ELSE ‘X’;ENDfunc;PROCESS(s0,s1)sel:=s1&s0

CASEselIS

WHEN‘00’=>y<=‘a(chǎn)’;

WHEN‘01’=>y<=‘b’;

WHEN‘10’=>y<=‘c’;

WHEN‘11’

=>y<=

‘d’;

WHENOTHERS=>y<=‘X’;

ENDCASE;ENDPROCESS;BEGINPROCESS(s0,s1)BEGIN

IF(s0=‘0’ands1=‘0’)THENy<=‘a(chǎn)’;

ELSIF(s0=‘0’ands1=‘1’)THENy<=‘b’;

ELSIF(s0=‘1’ands1=‘0’)THENy<=‘c’;

ELSIF(s0=‘1’ands1=‘1’)THENy<=‘d’;

ELSEy<=‘X’;

ENDIF;ENDPROCESS;二:編碼器與譯碼器1、優(yōu)先級8-3編碼器編碼器y0d0d1d2d3d4d5d6d7y1y2輸入輸出d7d6d5d4d3d2d1d0y2y1y01-------11101------110001-----1010001----10000001---011000001--0100000001-00100000000000優(yōu)先編碼器就是當有兩個或兩個以上的輸入有效時,僅對優(yōu)先級高的輸入進行編碼LIBRARYIEEE;USEIEEE.std_logic_1164.all;ENTITYencoder8_3ISPORT(d:INstd_logic_vector(7downto0); y0,y1,y2:OUTstd_logic);ENDencoder8_3;ARCHITECTUREfuncOFencoder8_3ISBEGINPROCESS(d)VARIABLEtemp:std_logic_vector(2downto0);BEGIN IF(d(7)=‘1’)THENtemp:=“111”; ELSIF(d(6)=‘1’)THENtemp:=“110”; ELSIF(d(5)=‘1’)THENtemp:=“101”; ELSIF(d(4)=‘1’)THENtemp:=“100”; ELSIF(d(3)=‘1’)THENtemp:=“011”; ELSIF(d(2)=‘1’)THENtemp:=“010”; ELSIF(d(1)=‘1’)THENtemp:=“001”; ELSIF(d(0)=‘1’)THENtemp:=“000”;ENDIFy(0)<=temp(0);y(1)<=temp(1);y(2)<=temp(2);ENDPROCESSENDfunc;普通8-3編碼器CASEdIS WHEN‘10000000’=>temp<=‘111’;

WHEN‘01000000’=>temp<=‘110’;

WHEN‘00100000’=>temp<=‘101’;

WHEN‘00010000’=>temp<=‘100’;

WHEN‘00001000’

=>temp<=‘011’;WHEN‘00000100’=>temp<=‘010’;WHEN‘00000010’=>temp<=‘001’;WHEN‘00000001’=>temp<=‘000’;

WHEN

OTHERS

=>temp<=‘XXX’;ENDCASE;2、138譯碼器選通輸入地址輸入譯碼器輸出g1g2ag2ba2a1a0y7y6y5y4y3y2y1y0-1----11111111--1---111111110-----111111111000001111111010000111111101100010111110111000111111011110010011101111100101110111111001101011111110011101111111LIBRARYIEEE;USEIEEE.std_logic_1164.all;ENTITYdecoder3_8ISPORT(a2,a1,a0,g1,g2a,g2b:INstd_logic; y:OUTstd_logic_vector);ENDdecoder3_8;ARCHITECTUREfuncOFdecoder3_8ISBEGINPROCESS(a2,a1,a0,g1,g2a,g2b)VARIABLEtemp:std_logic_vector(2downto0);BEGIN temp:=a2&a1&a0; IF(g1=‘1’andg2a=‘0’andg2b=‘0’)THEN CASEtempIS WHEN“000”=>y<=“11111110”

WHEN“111”=>y<=“01111111”; WHEN“OTHERS”=>y<=“XXXXXXXX”; ENDCASE;ELSE y<=“11111111” ENDIF;ENDPROCESS;ENDfunc;三:加法器1、一位全加器半加器h_adder的描述一位全加器可以由兩個半加器和一個與門連接而成。LIBRARYIEEE;--半加器描述USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDh_adder;ARCHITECTUREfh1OFh_adderisBEGINso<=NOT(aXOR(NOTb));co<=aANDb;ENDfh1;全加器f_adder電路圖及其實體模塊LIBRARYIEEE;--1位二進制全加器頂層設(shè)計描述

USEIEEE.STD_LOGIC_1164.ALL;ENTITYf_adderISPORT(ain,bin,cin:INSTD_LOGIC;cout,sum:OUTSTD_LOGIC);ENDf_adder;ARCHITECTUREfd1OFf_adderIS

COMPONENTh_adder--調(diào)用半加器聲明語句

PORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);

ENDCOMPONENT

COMPONENTor2aPORT(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC);

ENDCOMPONENT;SIGNALd,e,f:STD_LOGIC;--定義3個信號作為內(nèi)部的連接線。

BEGINu1:h_adderPORTMAP(a=>ain,b=>bin,co=>d,so=>e);--例化語句

u2:h_adderPORTMAP(a=>e,

b=>cin,

co=>f,so=>sum);u3:or2aPORTMAP(a=>d,

b=>f,

c=>cout);ENDfd1;2、串行進位加法器

兩個多位二進制數(shù)相加時,除了最低位之外,每一位相加都必須包括低位進位,因此必須使用全加器。按照加法規(guī)則,只需將低位全加器的進位輸出端Ci接到高位全加器的進位輸入端Ci+1就可以構(gòu)成多位二進制加法器。例:兩個二位數(shù)相加串行進位鏈:c0<=(a0andb0)or((a0orb0)andcin);c1<=(a1andb1)or((a1orb1)andc0);a0b0a1b1cinc0c1

時序邏輯電路的設(shè)計

時序電路中,任一時刻的輸出信號不僅取決于當時的輸入信號,而且還取決于電路原來的狀態(tài),即還和以前的輸入信號及輸出有關(guān)。也就是說,時序邏輯電路具有記憶功能。一:時鐘信號和復位信號

任何時序電路都是以時鐘信號為驅(qū)動程序的,時序電路也只有在時鐘信號的邊沿到來時,其狀態(tài)才發(fā)生改變。因此,時鐘信號通常是描述時序電路的程序的執(zhí)行條件,時序電路也總是以時鐘進程形式來進行描述。1、時鐘信號1)、進程的敏感信號是時鐘信號PROCESS(clock_Signal)BEGIN IF(clock_edge_condition)THEN Signal_out<=Signal_in; …… ENDIF;ENDPROCESS;

2)、用進程中的WAIT語句等待時鐘信號PROCESSBEGINWAITON(clock_Signal) UNTIL(clock_edge_condition) Signal_out<=Signal_in; ……ENDPROCESS;

時鐘沿描述:上升沿:If(clk’eventandclk=‘1’)ThenIf(rising_edge(clk))ThenWaitUntilclk=‘1’If(clk’last_value=‘0’andclk’eventand clk=‘1’)Then下降沿:If(clk’eventandclk=‘0’)ThenIf(falling_edge(clk))ThenWaitUntilclk=‘0’If(clk’last_value=‘1’andclk’eventand clk=‘0’)Then2、復位信號

觸發(fā)器的初始狀態(tài)是由復位信號來設(shè)置。根據(jù)復位信號對觸發(fā)器復位的操作不同,分為同步復位和非同步復位(異步復位)兩種。1)、同步復位2)、非同步復位

當復位信號有效,且在給定的時鐘邊沿到來時,觸發(fā)器才被觸發(fā)。一旦復位信號有效,觸發(fā)器就被觸發(fā)。

在用VHDL語言描述時,同步復位一定在以時鐘為敏感信號的進程中定義,且用If語句來描述必要的復位條件。PROCESS(clock_Signal)BEGIN IF(clock_edge_condition)THEN IF(reset_condition)Then Signal_out<=reset_value; ElseSignal_out<=Signal_in; …… ENDIF;

ENDIF;ENDPROCESS;

PROCESSBEGINWaiton(clock_Signal) Until(clock_edge_condition) IF(reser_condition)Then Signal_out<=reset_value; Else Signal_out<=Signal_in; …… ENDIF;ENDPROCESS;

在用VHDL語言描述異步復位時,首先在進程的敏感信號中除時鐘信號外,還應(yīng)加上復位信號;然后用If語句來描述必要的復位條件;最后在Eleif段描述時鐘信號邊沿條件,并加上event屬性。PROCESS(reset_Signal,clock_Signal)BEGINIF(reset_condition)THEN Signal_out<=reset_value;Elsif(clock_eventandclock_edge_condition)Then ElseSignal_out<=Signal_in; ……ENDIF;ENDPROCESS;

二:D觸發(fā)器LIBRARYIEEE;

USEIEEE.std_logic_1164.all;

ENTITYdffIS

PORT(data,clk:INSTD_LOGIC;

Q:OUTSTD_LOGIC);

ENDdff;

ARCHITECTUREBehaviorOFdffIS

BEGIN

PROCESS(clk)

BEGIN

IFclk'EVENTANDclk=‘1'THEN

Q<=data;

ENDIF;

ENDPROCESS;

ENDBehavior;D>CPQQclkdata1、D觸發(fā)器不推薦LIBRARYIEEE;

USEIEEE.std_logic_1164.all;

ENTITYdffIS

PORT(data,clk:INSTD_LOGIC;

Q:OUTSTD_LOGIC);

ENDdff;

ARCHITECTUREBehaviorOFdffIS

BEGIN

PROCESS

BEGIN

WaitUntilclk'EVENTANDclk=‘1' Q<=data;ENDPROCESS;

ENDBehavior;2、帶異步復位上升沿的D觸發(fā)器D>CPQQclkdataresetLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff_resetISPORT(data:INSTD_LOGIC; clk:INSTD_LOGIC; reset:INSTD_LOGIC; Q:OUTSTD_LOGIC);ENDdff_reset;ARCHITECTUREdffOFdff_resetISBEGINPROCESS(clk,reset)BEGIN IFreset=‘0’THEN Q<=‘0’;Elsifclk’eventandclk=‘1’THEN Q<=data; ENDIF; ENDIF;ENDPROCESS;ENDdff;3、帶異步置位復位上升沿的D觸發(fā)器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff_asynISPORT(data:INSTD_LOGIC; clk:INSTD_LOGIC; reset:INSTD_LOGIC; set:INSTD_LOGIC;Q:OUTSTD_LOGIC);ENDdff_asyn;D>CPQQclkdataresetsetARCHITECTUREdffOFdff_asynISBEGIN

PROCESS(clk,set,reset)BEGIN IFset=‘0’THEN Q<=‘1’;

Elsifreset=‘1’THEN Q<=‘0’;

Elsif

clk’eventandclk=‘1’THEN Q<=data; ENDIF;ENDPROCESS;ENDdff;4、帶異步復位和輸入使能上升沿的D觸發(fā)器D>CPQQclkdataresetenLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdff_ck_enISPORT(data:INSTD_LOGIC; clk:INSTD_LOGIC; reset:INSTD_LOGIC; en:INSTD_LOGIC;Q:OUTSTD_LOGIC);ENDdff_ck_en;ARCHITECTUREdffOFdff_ck_enISBEGINPROCESS(clk,reset)BEGIN IFreset=‘0’THEN Q<=‘0’;Elsifclk’eventandclk=‘1’THEN IFen=‘1’THEN Q<=data; ENDIF; ENDIF;ENDPROCESS;ENDdff_ck_en;三:寄存器

在數(shù)字系統(tǒng)中能夠用來存儲一組二進制碼的同步時序邏輯電路,一般由多位觸發(fā)器連接而成。通??梢园垂δ芊譃椋烘i存器和移位寄存器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYreg4bISPORT(load:INSTD_LOGIC din:INSTD_LOGIC_VECTOR(3DOWNTO0);dout:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDreg4b;ARCHITECTUREbehavOFreg4bisBEGINPROCESS(load,din)BEGINIFload’eventandload=‘1’THEN dout<=din;ENDIF;ENDPROCESS;ENDbehav;1、4位鎖存器2、串行輸入、并行輸出移位寄存器

移位寄存器除了具有存儲二進制碼的功能以外,還具有移位功能。即寄存器里面存儲的代碼能夠在時鐘的作用下依次進行左移或者右移。移位寄存器不僅可以用來存儲數(shù)據(jù),還可以用來實現(xiàn)數(shù)值運算和數(shù)據(jù)處理等。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYshiftISPORT(clk,rst,data:INSTD_LOGIC;q:OUTSTD_LOGIC_VICTOR(7downto0));ENDshift;ARCHITECTUREsh1OFshiftisSignalq_temp:STD_LOGIC_VECTOR(7downto0)BEGIN PROCESS(clk,rst) BEGIN IFrst=‘1’THEN q_temp<=(others=>‘0’)); Elsifclk’eventandclk=‘1’THEN q_temp<=q_temp(6downto0)&data; ENDIF; ENDPROCESS; q<=q_temp;ENDsh1;8位帶置位移位鎖存器3、串行輸入、串行輸出移位寄存器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYshiftISPORT(clk,a:INSTD_LOGIC;b:OUTSTD_LOGIC_VICTOR(4downto0));ENDshift;ARCHITECTUREsh2OFshiftisCOMPONENTdffPORT(d,clk:INSTD_LOGIC; q:OUTSTD_LOGIC);Signalz:STD_LOGIC_VECTOR(4downto0)BEGINz(4)<=a;G1:FORiIN3downto0GENERATE Dffx:dffPORTMAP(z(i),clk,z(i+1));ENDGENERATE;b<=z(0);ENDsh2;3、通用寄存器

通用寄存器可以直接設(shè)置初始值,完成雙向移位寄存器功能,加法計數(shù)器功能、減法計數(shù)器功能。初始值并行輸入置數(shù)。由3位二進制數(shù)輸入控制工作模式。當寄存器計數(shù)為0時,引腳term輸出高電平。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYunicISGENERIC(n:Positive:=8);PORT(clk,shl,shr:INSTD_LOGIC;mode:OUTSTD_LOGIC_VICTOR(2downto0) datain:INSTD_LOGIC_VICTOR((n-1)downto0) dataout:OUTSTD_LOGIC_VICTOR((n-1)downto0) term:OUTSTD_LOGIC);ENDunic;ARCHITECTUREv1OFunicisSignaltemp:STD_LOGIC_VECTOR((n-1)downto0)BEGINPROCESSBEGIN WAITuntilrising_edge(clk) CASEmodeIS WHEN“000”=>temp<=(others=>‘0’); WHEN“001”=>temp<=datain; WHEN“010”=>temp<=temp+1; WHEN“011”=>temp<=temp-1; WHEN“100”=>temp<=temp((n-2)downto0)&shl; WHEN“101”=>temp<=shr&temp((n-1downto0)); WHENothers=>NULL; ENDCASE;ENDPROCESS;PROCESS(temp) BEGIN term<=‘1’; FORiINtemp’rangeLOOP IFtemp(i)=‘1’THEN; temp<=‘0’ EXIT; ENDIF; ENDLOOP; ENDPROCESS; dataout<=temp;ENDv1;

4、移位寄存器

移位寄存器除了具有存儲代碼的功能以外,還具有移位功能。所謂移位功能,是指寄存器里存儲的代碼能在移位脈沖的作用下依次左移或右移。因此,移位寄存器不但可以用來寄存代碼,還可用來實現(xiàn)數(shù)據(jù)的串/并轉(zhuǎn)換、數(shù)值的運算以及數(shù)據(jù)處理等。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSHIFTERISPORT(DATA:INSTD_LOGIC_VECTOR(7DOWNTO0);

SHIFT_LEFT,SHIFT_RIGHT:INSTD_LOGIC;

RESET:INSTD_LOGIC;

MODE:INSTD_LOGIC_VECTOR(1DOWNTO0);

QOUT:BUFFERSTD_LOGIC_VECTOR(7DOWNTO0));ENDSHIFTER;ARCHITECTUREARTOFSHIFTERISBEGIN PROCESS BEGINWAITUNTIL(RISING_EDGE(CLK));

IF(RESET=‘1’)THENQOUT<=“00000000”;

ELSE CASEMODEISWHEN"01"=>QOUT<=SHIFT_RIGHT&QOUT(7DOWNTO1);WHEN"10"=>QOUT<=QOUT(6DOWNTO0)&SHIFT_LEFT;WHEN“11”=>QOUT<=DATA;WHENOTHERS=>NULL;

ENDCASE;

ENDIF;ENDPROCESS;ENDARCHITECTUREART;四:計數(shù)器

計數(shù)器是在數(shù)字系統(tǒng)中使用最多的時序電路,它不僅能用于對時鐘脈沖計數(shù),還可以用于分頻、定時、產(chǎn)生節(jié)拍脈沖和脈沖序列以及進行數(shù)字運算等。

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNTM60ISPORT(CI:INSTD_LOGIC;

NRESET:INSTD_LOGIC;

LOAD:INSTD_LOGIC;

D:INSTD_LOGIC_VECTOR(7DOWNTO0);

CLK:INSTD_LOGIC;

CO:OUTSTD_LOGIC;

QH:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0);

QL:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));ENDCNTM60;1、同步計數(shù)器模為60,帶異步復位、同步置數(shù)功能的8421BCD碼計數(shù)器。ARCHITECTUREARTOFCNTM60ISBEGINCO<=‘1’WHEN(QH="0101"ANDQL="1001"ANDCI=‘1’)ELSE'0';

PROCESS(CLK,NRESET)ISBEGIN

IF(NRESET=‘0’)THEN QH<="0000";

QL<=“0000”;

ELSIF(CLK'EVENTANDCLK=‘1’)THEN

IF(LOAD=‘1’)THEN QH<=D(7DOWNTO4);

QL<=D(3DOWNTO0); ELSIF(CI=‘1’)THEN

IF(QL=9)THEN QL<="0000";

IF(QH=5)THEN QH<="0000";

ELSE QH<=QH+1;

ENDIF;

ELSE QL<=QL+1;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;ENDART;2、異步計數(shù)器

用VHDL語言描述異步計數(shù)器,與同步計數(shù)器不同之處主要表現(xiàn)在對各級時鐘的描述上。下面是一個由4個觸發(fā)器構(gòu)成的異步計數(shù)器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDIFFRISPORT(CLK,CLR,D:INSTD_LOGIC;

Q,QB;OUTSTD_LOGIC);ENDDIFFR;ARCHITECTUREART1OFDIFFRISSIGNAQ_IN:STD_LOGIC;BEGINQ<=Q_IN;

QB<=NOTQ_IN;PROCESS(CLK,CLR)ISBEGINIF(CLR=‘1’)THEN Q_IN<=‘0’;

ELSIF(CLK'EVENTANDCLK=‘1')THEN Q_IN<=D;

ENDIF;

ENDPROCESS;ENDART1;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYRPLCOUNTISPORT(CLK,CLR:INSTD_LOGIC;

COUNT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDRPLCOUNT;ARCHITECTUREART2OFRPLCOUNTISSIGNACOUNT_IN:STD_LOGIC_VECTOR(4DOWNTO0);COMPONENTDIFFRISPORT(CLK,CLR,D:INSTD_LOGIC;

Q,QB:OUTSTD_LOGIC);ENDCOMPONENTDIFFR;BEGIN COUNT_IN(0)<=CLK;

GEN1:FORIIN0TO3GENERATE U:DIFFRPORTMAP(CLK=>COUNT_IN(I),

CLR=>CLR,

D=>COUNT_IN(I+1),

Q=>COUNT_IN(I),

QB=>COUNT_IN(I+1));

ENDGENERATEGEN1;ENDART2;存儲器設(shè)計

半導體存儲器從功能上可以分為只讀存儲器和隨機存儲器兩大類。兩類存儲器描述中的相同問題——存儲器中的數(shù)據(jù)類型:

通常用數(shù)組來描述存儲器結(jié)構(gòu),數(shù)組的元素就是存儲器中的數(shù)據(jù)。1.ROM

只讀存儲器在正常工作時從中讀取數(shù)據(jù),不能快速地修改或重新寫入數(shù),適用于存儲固定數(shù)據(jù)的場合。下面是一個容量為256×4的ROM存儲的例子,該ROM有8位地址線ADR(0)~ADR(7),4位數(shù)據(jù)輸出線DOUT(0)~DOUT(3)及使能信號EN。注意:需要初始化LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USESTD.TEXTIO.ALL;ENTITYROMISPORT(EN:INSTD_LOGIC;

ADR:INSTD_LOGIC_VECTOR(7DOWNTO0);

DOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDROM;ARCHITECTUREARTOFROMISSUBTYPEWORDISSTD_LOGIC_VECTOR(3DOWNTO0);

TYPEMEMORYISARRAY(0TO255)OFWORD;

SIGNAADR_IN:INTEGERRANGE0TO255;

VARIABLEROM:MEMORY;

VARIABLESTART_UP:BOOLEAN:=TRUE;

VARIABLEL:LINE;

VARIABLEJ:INTEGER;

FILEROMIN:TEXTISIN“ROMIN”;BEGINPROCESS(EN,ADR)ISBEGINIFSTART_UPTHEN FORJINROM'RANGELOOPREADLINE(ROMIN,1);

READ(1,ROM(J));

ENDLOOP;

START_UP:=FALSE ENDIF;

ADR_IN<=CONV_INTEGER(ADR);

IF(EN=‘1’)THEN DOUT<=ROM(ADR_IN);

ELSE DOUT<="ZZZZ";

ENDIF;

ENDPROCESS;ENDART;初始化2.SRAMRAM和ROM的主要區(qū)別在于RAM描述上有讀和寫兩種操作,而且在讀/寫上對時間有較嚴格的要求。下面是一個8×8位的雙口SRAM。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYDPRAMISGENERIC(WIDTH:INTEGER:=8;

DEPTH:INTEGER:=8;

ADDER:INTEGER:=3);PORT(DATAIN:INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

DATAOUT:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

CLOCK,WE,RE:INSTD_LOGIC;

WADD,RADD:INSTD_LOGIC_VECTOR(ADDER-1DOWNTO0);ENDDPRAM;ARCHITECTUREARTOFDPRAMISTYPEMEMISARRAY(0TODEPTH-1)OFSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);SIGNARAMTMP:MEM;BEGINPROCESS(CLOCK)IS BEGIN IF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(WE=‘1’)THEN RAMTMP(CONV_INTEGER(WADD))<=DATAIN;

ENDIF;

ENDIF;

ENDPROCESS; PROCESS(CLOCK)IS BEGIN IF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(RE=‘1’)THEN DATAOUT<=RAMTMP(CONV_INTEGER(RADD));

ENDIF;

ENDIF;

ENDPROCESS;ENDART;3.隊列先進先出隊列FIFO,作為數(shù)據(jù)緩沖器,通常其數(shù)據(jù)存放結(jié)構(gòu)完全與RAM一致,只是存取方式有所不同。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYREG_FIFOISGENERIC(WIDTH:INTEGER:=8;

DEPTH:INTEGER:=8;

ADDR:INTEGER:=3);

PORT(DATA:INSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

Q:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);

ACLR,CLOCK,WE,RE:INSTD_LOGIC;

EF,F(xiàn)F:OUTSTD_LOGIC;ENDREG_FIFO;TYPEMEMISARRAY(0TODEPTH-1)OFSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0);SIGNARAMTMP:MEM;SIGNAWADD:STD_LOGIC_VECTOR(ADDR-1DOWNTO0);SIGNARADD:STD_LOGIC_VECTOR(ADDR-1DOWNTO0);SIGNAWORDS:STD_LOGIC_VECTOR(ADDR-1DOWNTO0);ARCHITECTUREARTOFREG_FIFOISBEGINPROCESS(ACLR,CLOCK)ISBEGIN IF(ACLR=‘0’)THEN WADD<=(OTHERS=>‘0’);

ELSIF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(WE=‘1’)THEN IF(WADD=WORDS)THEN WADD<=(OTHERS=>‘0’);

ELSE WADD<=WADD+‘1’;

ENDIF;

ENDIF;

ENDIF;ENDPROCESS;PROCESS(CLOCK)ISBEGIN IF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(WE=‘1’)THEN RAMTMP(CONV_INTEGER(WADD))<=DATA;

ENDIF;

ENDIF;ENDPROCESS;PROCESS(ACLR,CLOCK)ISBEGIN IF(ACLR=‘0’)THEN RADD<=(OTHERS=>‘0’);

ELSIF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(RE=‘1’)THEN IF(RADD=WORDS)THEN RADD<=(OTHERS=>‘0’);

ELSE RADD<=RADD+‘1’;

ENDIF;

ENDIF;

ENDIF;ENDPROCESS;PROCESS(CLOCK)ISBEGIN IF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(RE=‘1’)THEN Q<=RAMTMP(CONV_INTERGER(RADD));

ENDIF;

ENDIF;ENDPROCESS;PROCESS(ACLR,CLOCK)ISBEGIN IF(ACLR=‘0’)THEN FF<=‘0’;

ELSIF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(WE=‘1’ANDRE=‘0’)THEN IF((WADD=RADD-1)OR ((WADD=DEPTH-1)AND(RADD=0)))THEN FF<=‘1’;

ENDIF;

ELSE FF<=‘0’;

ENDIF;

ENDIF;ENDPROCESS;PROCESS(ACLR,CLOCK)ISBEGIN IF(ACLR=‘0’)THEN EF<='0'; ELSIF(CLOCK'EVENTANDCLOCK=‘1’)THEN IF(RE=‘1’ANDWE=‘0’)THEN IF((WADD=RADD+1)OR ((RADD=DEPTH-1)AND(WADD=0)))THEN EF<=‘0’;

ENDIF;

ELSE EF<=‘1’;

ENDIF;

ENDIF;ENDPROCESS;ENDART;狀態(tài)機的VHDL設(shè)計1、

狀態(tài)機的基本結(jié)構(gòu)和功能狀態(tài)機是一類很重要的時序電路,是許多數(shù)字電路的核心部件。狀態(tài)機的一般形式如圖所示。

狀態(tài)機的基本操作有兩種:

(1)狀態(tài)機內(nèi)部狀態(tài)轉(zhuǎn)換。狀態(tài)機的下一狀態(tài)由狀態(tài)譯碼器根據(jù)當前狀態(tài)和輸入條件決定。

(2)產(chǎn)生輸出信號序列。輸出信號由輸出譯碼器根據(jù)當前狀態(tài)和輸入條件決定。在產(chǎn)生輸出的過程中,由是否使用輸入信號可以確定狀態(tài)機的類型。兩種典型的狀態(tài)機是摩爾(MOORE)狀態(tài)機和米立(MEALY)狀態(tài)機。

使用枚舉類數(shù)據(jù)類型來定義狀態(tài)機的狀態(tài),并使用多進程方式來描述狀態(tài)機的內(nèi)部邏輯。

多進程中,一個用來描述時序邏輯,包括狀態(tài)寄存器的工作和狀態(tài)的輸出;一個描述組合邏輯,包括進程間狀態(tài)值的傳遞邏輯以及狀態(tài)轉(zhuǎn)換值的輸出。進程間一般是并行運行的,但由于敏感信號的設(shè)置不同以及電路的延遲,在時序上,進程間的動作是有先后的。用于進程間信息傳遞的信號,在狀態(tài)機設(shè)計中稱為反饋信號。2、

一般狀態(tài)機的VHDL設(shè)計圖:一般狀態(tài)機結(jié)構(gòu)框圖LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYs_machineISPORT(clk,reset:INSTD_LOGIC;state_inputs:INSTD_LOGIC_VECTOR(0TO1);comb_outputs:OUTINTEGERRANGE0TO15);ENDs_machine;ARCHITECTUREbehvOFs_machineIS

TYPEFSM_STIS(s0,s1,s2,s3);

SIGNALcurrent_state,next_state:FSM_ST;BEGIN

REG:PROCESS(reset,clk)

--主控時序進程

BEGINIFreset='1'THENcurrent_state<=s0;ELSIFclk='1'ANDclk'EVENTTHENcurrent_state<=next_state;ENDIF;ENDPROCESSREG;WHENs3=>comb_outputs<=14;IFstate_inputs="11"THENnext_state<=s3;ELSEnext_state<=s0;ENDIF; ENDCASE;ENDPROCESSCOM;ENDBEHV;3、Mealy狀態(tài)機和Moore狀態(tài)機的VHDL設(shè)計圖:Mealy類型的狀態(tài)機的邏輯電路框圖圖:Moore類型的狀態(tài)機的邏輯電路框圖有限狀態(tài)機FSM由以下三部分組成:

▲當前狀態(tài)寄存器電路:為時序電路,由時鐘信號和次態(tài)邏輯電路控制狀態(tài)的變化。

▲次態(tài)邏輯電路:為組合電路,次態(tài)由輸入信號和當前狀態(tài)決定。

▲輸出邏輯電路:對于Mealy類型的狀態(tài)機,輸出由當前狀態(tài)和輸入信號決定;對于Moore類型的狀態(tài)機,輸出僅由當前狀態(tài)決定。1、用VHDL描述一個狀態(tài)轉(zhuǎn)換圖如圖所示的Mealy類型的狀態(tài)機。輸入信號為data_in<1:0>,時鐘輸入信號為clock,復位控制信號為reset(低電平有效),輸出信號為data_out。狀態(tài)機有5個狀態(tài),復位控制信號reset有效時,狀態(tài)機的狀態(tài)為st0狀態(tài)。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmealyISPORT(clock,reset:INSTD_LOGIC;data_out:OUTSTD_LOGIC;data_in:INSTD_LOGIC_VECTOR(1DOWNTO0));ENDmealy;ARCHITECTUREbehaveOFmealyISTYPEstate_valuesIS(st0,st1,st2,st3,st4);SIGNALpres_state,next_state:state_values;BEGINstatereg:PROCESS(clock,reset)BEGIN IF(reset='0')THEN pres_state<=st0; ELSIF(clock’EVENTANDclock='1')THEN pres_state<=next_state; ENDIF;ENDPROCESSstatereg;fsm:PROCESS(pres_state,data_in)BEGIN

CASEpres_stateIS WHENst0=> CASEdata_inIS WHEN"00"=>next_state<=st0; WHEN"01"=>next_state<=st4;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論