版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第6章常用電路的VHDL描述組合電路設(shè)計時序電路設(shè)計存儲器設(shè)計本章內(nèi)容:6.1組合邏輯電路VHDL描述組合邏輯電路的功能可以用真值表、表達(dá)式、電路圖等方式描述?;谶@3種方式可以分別采用行為式、數(shù)據(jù)流式和結(jié)構(gòu)式的VHDL描述風(fēng)格及層次。常見的組合邏輯電路:基本門電路加法器編碼器譯碼器選擇器分配器等組合電路的VHDL描述方法:
1、真值表:行為描述(IF:有優(yōu)先級;CASE),例如優(yōu)先編碼器例7-7、譯碼器例7-8
2、表達(dá)式:數(shù)據(jù)流(賦值),例如比較器例7-9、加法器例5-26
3、邏輯電路:結(jié)構(gòu)式(元件例化),例如等值比較器例4-5、例7-3。
4、三態(tài)門及雙向電路設(shè)計:例7-15、例7-176.1組合邏輯電路VHDL描述6.1組合邏輯電路VHDL描述行為式1:【例6-7】優(yōu)先編碼器74LS148程序設(shè)計。真值表符號libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityencoder_74ls148isport(d:instd_logic_vector(7downto0); st:instd_logic; y:outstd_logic_vector(2downto0); yex:outstd_logic; ys:outstd_logic);endencoder_74ls148;6.1組合邏輯電路VHDL描述程序設(shè)計—實體architectureBehavioralofencoder_74ls148isbeginprocess(st,d)beginifst='1'then
y<="111"; yex<='1';s<='1';
elsifd="11111111"then y<="111"; yex<='1';ys<='0';elsifd(7)='0'then
y<="000"; yex<='0';ys<='1';
…
…elsifd(0)='0'then y<="111"; yex<='0';ys<='1';endif;endprocess;endBehavioral;6.1組合邏輯電路VHDL描述程序設(shè)計—結(jié)構(gòu)體行為式2:【例6-8】譯碼器74LS138程序設(shè)計。6.1組合邏輯電路VHDL描述真值表符號libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitydecoderisport(sta:instd_logic; stb:instd_logic; stc:instd_logic; a:instd_logic_vector(2downto0); y:outstd_logic_vector(7downto0) );enddecoder;6.1組合邏輯電路VHDL描述程序設(shè)計—實體architectureBehavioralofdecoderisbeginprocess(sta,stb,stc,a)begin if(sta='1'andstb='0'andstc='0')then caseaiswhen"000"=>y<="11111110";
…
…
when"111"=>y<="01111111";
whenothers=>y<="11111111"; endcase; else y<="11111111"; endif;endprocess;endBehavioral;6.1組合邏輯電路VHDL描述程序設(shè)計—結(jié)構(gòu)體libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;
entitycompisport(a:instd_logic_vector(3downto0); b:instd_logic_vector(3downto0);a_greater_b:outstd_logic;a_less_b:outstd_logic;a_equal_b:outstd_logic);endcomp;6.1組合邏輯電路VHDL描述行為式3:【例6-9】兩個4位二進(jìn)制數(shù)比較器程序設(shè)計。architectureBehavioral1ofcompisbeginprocess(a,b) begin ifa>bthena_greater_b<='1';a_less_b<='0';a_equal_b<='0'; elsifa<bthen a_greater_b<='0';a_less_b<='1';a_equal_b<='0'; else a_greater_b<='0';a_less_b<='0'; a_equal_b<='1'; endif;endprocess;endBehavioral1;6.1組合邏輯電路VHDL描述architectureBehavioral2ofcompisbegina_greater_b<='1'whena>belse‘0’; a_less_b<='1'whena<belse‘0’; a_equal_b<='1'whena=belse‘0’;endBehavioral2;6.1組合邏輯電路VHDL描述6.1組合邏輯電路VHDL描述數(shù)據(jù)流式:例5-26全加器真值表表達(dá)式libraryieee;useieee.std_logic_1164.all;entityadder1isport(a,b,ci:instd_logic;co,s:outstd_logic);endadder1;6.1組合邏輯電路VHDL描述程序設(shè)計—實體6.1組合邏輯電路VHDL描述architecturebehavioralofadder1ISbeginco<=(aandb)or(aandci)or(bandci);s<=axorbxorci;endbehavioral;程序設(shè)計—結(jié)構(gòu)體結(jié)構(gòu)化:例4-5(4位等值比較器)、
【例6-3】4輸入與邏輯設(shè)計6.1組合邏輯電路VHDL描述表達(dá)式:結(jié)構(gòu)圖:6.1組合邏輯電路VHDL描述兩輸入與邏輯設(shè)計【例6-1】:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityand_gate_2isport(a:instd_logic; b:instd_logic;f:outstd_logic);endand_gate_2;architectureBehavioralofand_gate_2isbeginf<=aandb;endBehavioral;6.1組合邏輯電路VHDL描述4輸入與邏輯程序設(shè)計:architectureBehavioralofand_gate_4is
signaltemp1,temp2:std_logic;componentand_gate_2isport(a:instd_logic; b:instd_logic; f:outstd_logic);endcomponent;begin
U1:and_gate_2portmap(a=>a,b=>b,f=>temp1);
U2:and_gate_2portmap(a=>c,b=>d,f=>temp2);
U3:and_gate_2portmap(temp1,temp2,f);
endBehavioral;
6.1組合邏輯電路VHDL描述libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitytri_gateisport(a:instd_logic; b:instd_logic; en:instd_logic; f:outstd_logic);endtri_gate;6.1.7三態(tài)門電路描述例6-13三態(tài)與非門6.1.7三態(tài)門電路描述architectureBehavioraloftri_gateisbegin process(a,b,en) begin ifen='1'then f<=anandb; else
f<='Z'; endif; endprocess;endBehavioral;6.1.7三態(tài)門電路描述單向總線驅(qū)動器在微型計算機的總線驅(qū)動中經(jīng)常要用單向總線緩沖器,它通常由多個三態(tài)門組成,用來驅(qū)動地址總線和控制總線。一個8位的單向總線緩沖器如下圖所示。單向總線驅(qū)動器程序設(shè)計—實體LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYTRI_BUF8ISPORT(DIN:INSTD_LOGIC_VECTOR(7DOWNTO0);
EN:INSTD_LOGIC;
DOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDENTITYTRI_BUF8;單向總線驅(qū)動器ARCHITECTUREARTOFTRI_BUF8ISBEGINPROCESS(EN,DIN)ISBEGINIF(EN=‘1’)THENDOUT<=DIN;
ELSE
DOUT<="ZZZZZZZZ";
ENDIF;
ENDPROCESS;ENDARCHITECTUREART;程序設(shè)計—結(jié)構(gòu)體多通道三態(tài)總線電路設(shè)計【例】8位4通道三態(tài)總線結(jié)構(gòu)圖:多通道三態(tài)總線電路設(shè)計libraryieee;useieee.std_logic_1164.all;entitytriisport(ctl:instd_logic_vector(1downto0);datain1,datain2,datain3,datain4:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0));endtri;architecturebody_trioftriisbegin
q<=datain1whenctl="00"else(others=>'Z');q<=datain2whenctl="01"else(others=>'Z');q<=datain3whenctl="10"else(others=>'Z');q<=datain4whenctl="11"else(others=>'Z');endbody_tri;程序設(shè)計:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBIDIRISPORT(A,B:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);DIR:INSTD_LOGIC);ENDENTITYBIDIR;6.1.8雙向端口ABDIR結(jié)構(gòu)圖:雙進(jìn)程描述:【例】6-14程序設(shè)計—實體ARCHITECTUREARTOFBIDIRISSIGNALAOUT,BOUT:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(A,DIR)IS --A為輸入BEGINIF(DIR=‘1’)THENBOUT<=A;ELSEBOUT<="ZZZZZZZZ";
ENDIF;B<=BOUT; --B為輸出ENDPROCESS;6.1.8雙向端口程序設(shè)計—結(jié)構(gòu)體ABDIRPROCESS(B,DIR)IS --B為輸入BEGINIF(DIR=‘0’)THENAOUT<=B;ELSEAOUT<="ZZZZZZZZ";ENDIF;A<=AOUT; --A為輸出ENDPROCESS;ENDARCHITECTUREART;6.1.8雙向端口進(jìn)程B設(shè)計:ABDIRARCHITECTUREARTOFBIDIRISBEGINProcess(A,B,DIR)beginif(DIR='0')thenA<=B;
B<="ZZZZZZZZ";ElseB<=A;
A<="ZZZZZZZZ";endif;endprocess;ENDARCHITECTUREART;6.1.8雙向端口單進(jìn)程描述:【例】6-15ABDIR時序電路的VHDL描述方法
(1)PROCESS+IF:
1、PROCESS
敏感表中放異步控制信號、時鐘信號;
多進(jìn)程對應(yīng)異步結(jié)構(gòu)。
2、IF:
不完整if形成觸發(fā)器結(jié)構(gòu);
條件判斷順序?qū)?yīng)控制信號的優(yōu)先級。
(2)有限狀態(tài)機描述控制部件6.2時序邏輯電路設(shè)計常用時序部件
6.2時序邏輯電路設(shè)計觸發(fā)器;計數(shù)器;序列信號發(fā)生器;序列信號檢測器;狀態(tài)控制器
6.2.1觸發(fā)器時鐘
鎖存器、寄存器同步、異步控制復(fù)位、置位信號邊沿提取應(yīng)用
...PROCESS(CLK,D)BEGINIFCLK='1'THEN--電平觸發(fā)型寄存器
Q<=D;ENDIF;ENDPROCESS;鎖存器、寄存器
鎖存器鎖存器、寄存器
D觸發(fā)器:例6-16architectureBehavioralofd_cfqisbeginprocess(clk,d)beginifclk'eventandclk='1'then--時鐘上升沿
q<=d;endif;endprocess;endBehavioral;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYASYNDCFQISPORT(CLK,D,PRESET,CLR:INSTD_LOGIC;
Q:OUTSTD_LOGIC);ENDENTITYASYNDCFQ;同步、異步控制
異步復(fù)位、置位控制D觸發(fā)器ARCHITECTUREARTOFASYNDCFQISBEGINPROCESS(CLK,PRESET,CLR)ISBEGINIF(PRESET=‘0')THEN--置位
Q<='1';
ELSIF(CLR=‘0')THEN--復(fù)位
Q<='0';
ELSIF(CLK'EVENTANDCLK=‘1’)THENQ<=D;
ENDIF;ENDPROCESS;ENDARCHITECTUREART;異步控制
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSYNDCFQISPORT(D,CLK,RESET:INSTD_LOGIC;
Q:OUTSTD_LOGIC);ENDENTITYSYNDCFQ;同步、異步控制
同步復(fù)位控制D觸發(fā)器ARCHITECTUREARTOFSYNDCFQISBEGINPROCESS(CLK)ISBEGINIF(CLK'EVENTANDCLK=‘1’)THENIF(RESET=‘0’)THEN Q<=‘0’;--時鐘邊沿到來且有復(fù)位信號,觸發(fā)器被復(fù)位
ELSEQ<=D;
ENDIF;ENDIF;ENDPROCESS;ENDARCHITECTUREART;同步控制
【例6-19】設(shè)計信號上升沿和下降沿提取電路。libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitycnt4isport(rst:instd_logic;clk:instd_logic;d:instd_logic;d_up:outstd_logic;d_down:outstd_logic );endcnt4;信號邊沿提取
architectureBehavioralofcnt4issignald1,d2:std_logic;beginprocess(clk,rst,d)beginifrst='0'then d1<='0';d2<='0';elsifclk'eventandclk='1'then
d1<=d;d2<=d1;endif;endprocess;
信號邊沿提取
d_up<=d1and(notd2);d_down<=(notd1)andd2;endBehavioral;信號邊沿提取
信號邊沿提取
計數(shù)器是在數(shù)字系統(tǒng)中使用最多的時序電路,它不僅能用于對時鐘脈沖計數(shù),還可以用于分頻、定時、產(chǎn)生節(jié)拍脈沖和脈沖序列以及進(jìn)行數(shù)字運算等。6.2.2計數(shù)器二進(jìn)制、非二進(jìn)制計數(shù)器同步、異步計數(shù)器序列信號發(fā)生器應(yīng)用libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;Entitycounter4isport(clk:instd_logic;cnt:outstd_logic_vector(3downto0) );endcounter4;二進(jìn)制計數(shù)器【例6-20】4位二進(jìn)制加法計數(shù)器的設(shè)計。architectureBehavioralofcounter4issignalcnt1:std_logic_vector(3downto0):="0000";beginprocess(clk)beginifclk'eventandclk='1'then
cnt1<=cnt1+1;endif;endprocess;cnt<=cnt1;endBehavioral;二進(jìn)制計數(shù)器libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycounter12isport(rst:instd_logic;--復(fù)位輸入信號
en:instd_logic;--計數(shù)使能信號
clk:instd_logic;--輸入時鐘信號
q:outstd_logic--十二分頻輸出信號
);endcounter12;非二進(jìn)制計數(shù)器【例6-21】12分頻器architectureBehavioralofcounter12is
signalcnt1:std_logic_vector(3downto0):="0000";beginprocess(rst,clk)beginifrst='0'thencnt1<=(others=>'0');elsifclk'eventandclk='1'thenifen=’1’then
ifcnt1=11thencnt1<=(others=>'0'); else cnt1<=cnt1+1; endif;endif;endif;endprocess;
q<='1'whencnt1=11else'0';endBehavioral;非二進(jìn)制計數(shù)器libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycnt10is port(rst:instd_logic; clk:instd_logic; cnt:bufferstd_logic_vector(3downto0) );endcnt10;BCD十進(jìn)制計數(shù)器例4-26:模值為10的計數(shù)器architectureBehavioralofcnt10isbeginprocess(clk,rst)beginifrst='0'then cnt<="0000"; elsifclk'eventandclk='1'then ifcnt=9then
cnt<="0000"; else
cnt<=cnt+1;
endif; endif;endprocess;endBehavioral;BCD十進(jìn)制計數(shù)器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNTM60ISPORT(CI:INSTD_LOGIC;--計數(shù)控制
NRESET:INSTD_LOGIC;--異步復(fù)位控制
LOAD:INSTD_LOGIC;--置數(shù)控制
D:INSTD_LOGIC_VECTOR(7DOWNTO0);
CLK:INSTD_LOGIC;
CO:OUTSTD_LOGIC; --進(jìn)位輸出
QH,QL:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));
--輸出高4位、輸出低4位
ENDENTITYCNTM60;BCD六十進(jìn)制計數(shù)器模為60,具有異步復(fù)位、同步置數(shù)功能的8421BCD碼計數(shù)器。ARCHITECTUREARTOFCNTM60ISBEGINCO<=‘1’WHEN(QH="0101"ANDQL="1001"ANDCI=‘1’)ELSE'0';
--進(jìn)位輸出的產(chǎn)生PROCESS(CLK,NRESET)ISBEGINIF(NRESET=‘0’)THEN--異步復(fù)位
QH<=“0000”;QL<=“0000”;ELSIF(CLK'EVENTANDCLK=‘1’)THEN--同步置數(shù)
IF(LOAD=‘1’)THENQH<=D(7DOWNTO4);
QL<=D(3DOWNTO0);
ELSIF(CI=‘1’)THEN --模60的實現(xiàn)BCD六十進(jìn)制計數(shù)器IF(QL=9)THEN--低位計數(shù)實現(xiàn)
QL<="0000";
IF(QH=5)THEN--高位計數(shù)實現(xiàn)
QH<=“0000”;
ELSE QH<=QH+1;
ENDIF;
ELSEQL<=QL+1;
ENDIF;--ENDIFCIENDIF;--ENDIFLOAD ENDIF;ENDPROCESS;ENDARCHITECTUREART;BCD六十進(jìn)制計數(shù)器多進(jìn)程同步BCD六十進(jìn)制計數(shù)器CNT1:PROCESS(CLK,NRESET)IS--個位BEGINIF(NRESET=‘0’)THEN--異步復(fù)位 QL<=“0000”;ELSIF(CLK'EVENTANDCLK=‘1’)THEN--同步置數(shù)IF(LOAD=‘1’)THENQL<=D(3DOWNTO0);ELSIF(CI=‘1’)THENIF(QL=9)THEN--模10計數(shù)
QL<=“0000”;
ELSEQL<=QL+1;
ENDIF;ENDIF;ENDPROCESSCNT1;CNT2:PROCESS(CLK,NRESET)IS--十位BEGINIF(NRESET=‘0’)THEN --異步復(fù)位 QH<="0000";ELSIF(CLK'EVENTANDCLK=‘1’)THEN--同步置數(shù)IF(LOAD=‘1’)THENQH<=D(7DOWNTO4);ELSIF(CI=‘1’)AND(QL=9)THEN IF(QH=5)THEN--模6計數(shù)
QH<=“0000”;
ELSEQH<=QH+1;ENDIF;ENDIF;ENDPROCESSCNT2;多進(jìn)程同步BCD六十進(jìn)制計數(shù)器…SIGNALCLK10:STD_LOGIC;BEGINCNT1:PROCESS(CLK)IS--個位BEGINIF(CLK'EVENTANDCLK=‘1’)THENIF(QL=9)THEN--模10計數(shù)
QL<=“0000”;
CKL10<=‘1’;ELSEQL<=QL+1;
CKL10<=‘0’;ENDIF;ENDIF;ENDPROCESSCNT1; 多進(jìn)程異步BCD六十進(jìn)制計數(shù)器CNT2:PROCESS(CLK10)IS--十位BEGINIF(CLK10'EVENTANDCLK10=‘1’)THEN IF(QH=5)THEN--模6計數(shù)
QH<=“0000”;
ELSEQH<=QH+1;ENDIF;ENDIF;ENDPROCESSCNT2;多進(jìn)程異步BCD六十進(jìn)制計數(shù)器libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityseq_genisport(clk:instd_logic;rst:instd_logic;q:outstd_logic );endseq_gen;序列信號發(fā)生器【例6-22】利用計數(shù)器方式設(shè)計產(chǎn)生序列信號“11011001”architectureBehavioralofseq_genissignald:std_logic_vector(2downto0);beginCNT:process(rst,clk)beginifrst='0'then d<="000"; elsifclk'eventandclk='1'then d<=d+1; endif;endprocessCNT;序列信號發(fā)生器【例6-23】COM:process(clk,d)begin
ifclk'eventandclk='1'thencasedis when"000"=>q<='1';when"001"=>q<='1'; when"010"=>q<='0'; when"011"=>q<=‘1'; when"100"=>q<=‘1';when"101"=>q<=‘0'; when"110"=>q<='0'; when"111"=>q<='1'; whenothers=>q<='Z'; endcase;
endif;endprocessCOM;endBehavioral;序列信號發(fā)生器序列信號發(fā)生器單向移位寄存器雙向移位寄存器6.2.3移位寄存器【例6-24】4位單向移位寄存器設(shè)計單向移位寄存器libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityreg4isport(clk:instd_logic;
din:instd_logic;q:outstd_logic_vector(3downto0) );endreg4;單向移位寄存器程序設(shè)計—實體architectureBehavioralofreg4issignalqin:std_logic_vector(3downto0);beginprocess(clk,din)beginifclk'eventandclk='1'thenqin<=qin(2downto0)&din;endif;endprocess;q<=qin;endBehavioral;單向移位寄存器程序設(shè)計—結(jié)構(gòu)體雙向移位寄存器【例6-25】8位雙向移位寄存器設(shè)計具有同步置數(shù)、同步清零、左移、右移功能:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityreg4isport(clk,rst:instd_logic;din_left:instd_logic;din_right:instd_logic;sel:instd_logic_vector(1downto0);din:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0));endreg4;雙向移位寄存器程序設(shè)計—實體architectureBehavioralofreg4issignalqin:std_logic_vector(7downto0);beginprocess(clk,sel)beginifclk'eventandclk='1'then ifrst='0'thenqin<=(others=>'0'); elsifsel="11"then qin<=din; elsifsel="01"then
qin<=qin(6downto0)&din_left;
elsifsel="10"then
qin<=din_right&qin(7downto1);endif; endif;endprocess;
q<=qin;endBehavioral;雙向移位寄存器程序設(shè)計—結(jié)構(gòu)體6.2.4狀態(tài)機設(shè)計狀態(tài)機結(jié)構(gòu)狀態(tài)機信號:
輸入、輸出;現(xiàn)態(tài)、次態(tài);時鐘、復(fù)位。7.2.4狀態(tài)機狀態(tài)機操作(1)狀態(tài)機內(nèi)部狀態(tài)轉(zhuǎn)換(次態(tài)指定和時鐘驅(qū)動轉(zhuǎn)移)。狀態(tài)機的下一狀態(tài)由狀態(tài)譯碼器根據(jù)當(dāng)前狀態(tài)和輸入條件決定。(2)產(chǎn)生輸出信號序列。輸出信號由輸出譯碼器根據(jù)當(dāng)前狀態(tài)和輸入條件決定。在產(chǎn)生輸出的過程中,由是否使用輸入信號可以確定狀態(tài)機的類型。兩種典型的狀態(tài)機是摩爾(MOORE)狀態(tài)機和米立(MEALY)狀態(tài)機。狀態(tài)機設(shè)計方法:雙進(jìn)程描述7.2.4狀態(tài)機狀態(tài)信號定義方法1:使用枚舉型數(shù)據(jù)類型來指定現(xiàn)態(tài)、次態(tài)的類型;
Typestatesis(s0,s1,s2,s3,s4,s5,s6,s7);
signalcurrent_sta,next_sta:states;
方法2:直接對狀態(tài)進(jìn)行編碼,定義狀態(tài)常量;signalcurrent_sta,next_sta:std_logic_vector(2downto0);
constants0:std_logic_vector(2downto0):=“000”;
…constants7:std_logic_vector(2downto0):=“111”;7.2.4狀態(tài)機應(yīng)用一:序列信號發(fā)生器【例6-26】使用狀態(tài)機方式設(shè)計序列信號發(fā)生器,輸出“11000101···”序列。7.2.4狀態(tài)機S0S1S2S3/1/1/0S7S6S5S4/0/1/0/輸出/0/1libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;Entitystate_seqisport(clk:instd_logic;rst:instd_logic;q:outstd_logic );endstate_seq;序列信號發(fā)生器程序設(shè)計—實體architectureBehavioralofstate_seqistypestateis(s0,s1,s2,s3,s4,s5,s6,s7);--定義狀態(tài)信號
signalpresent_state,next_state:state;beginREG:process(rst,clk)--時序進(jìn)程beginifrst='0'then present_state<=s0;elsifclk'eventandclk='1'then present_state<=next_state;endif;endprocessREG;序列信號發(fā)生器程序設(shè)計—結(jié)構(gòu)體COM:process(present_state)--組合進(jìn)程begincasepresent_stateis whens0=>q<='1';next_state<=s1; whens1=>q<='1';next_state<=s2; whens2=>q<='0';next_state<=s3; whens3=>q<='0';next_state<=s4; whens4=>q<='0';next_state<=s5; whens5=>q<='1';next_state<=s6; whens6=>q<='0';next_state<=s7; whens7=>q<='1';next_state<=s0; whenothers=>q<='0';next_state<=s0;endcase;endprocessCOM;endBehavioral;序列信號發(fā)生器architectureBehavioralofstate_seqistypestateis(s0,s1,s2,s3,s4,s5,s6,s7);--定義狀態(tài)信號
signalpresent_state:state;beginREG:process(rst,clk)--時序進(jìn)程beginifrst='0'then present_state<=s0;elsifclk'eventandclk='1'then
序列信號發(fā)生器(單進(jìn)程)程序設(shè)計—結(jié)構(gòu)體casepresent_stateis whens0=>q<='1';present_state<=s1; whens1=>q<='1';present_state<=s2; whens2=>q<='0';present_state<=s3; whens3=>q<='0';present_state<=s4; whens4=>q<='0';present_state<=s5; whens5=>q<='1';present_state<=s6; whens6=>q<='0';present_state<=s7; whens7=>q<='1';present_state<=s0; whenothers=>q<='0';present_state<=s0;endcase;endif;endprocessREG;endBehavioral;序列信號發(fā)生器(單進(jìn)程)應(yīng)用二:序列檢測器【例6-27】使用狀態(tài)機方式設(shè)計“11000101···”序列檢測器。7.2.4狀態(tài)機S0S1S2S31/0S7S6S5S4輸入/輸出0/01/11/00/00/00/01/0libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityseq_detectisport(clk:instd_logic;rst:instd_logic;din:instd_logic;q:outstd_logic );endseq_detect;序列檢測器程序設(shè)計—實體architectureBehavioralofseq_detectistypestateis(s0,s1,s2,s3,s4,s5,s6,s7);signalcurrent_state,next_state:state;beginREG:process(clk,rst)beginifrst='0'then current_state<=s0;elsifclk'eventandclk='1'then current_state<=next_state;endif;endprocessREG;序列檢測器程序設(shè)計—結(jié)構(gòu)體process(current_state,din)begincasecurrent_stateis whens0=>ifdin='1'thennext_state<=s1; else next_state<=s0; endif; q<='0';……whens7=>ifdin='1'thenq<=‘1'; else q<='0'; endif;
next_state<=s0;endcase;endprocess;endBehavioral;序列檢測器6.3存儲器設(shè)計ROMRAM6.3.1ROMROM一般用來存儲固定值參數(shù),輸入信號有時鐘、地址、使能,輸出信號為存儲數(shù)據(jù)。以一個深度為16、數(shù)據(jù)寬度為8位的ROM存儲器為例介紹ROM存儲器的設(shè)計。7.3.1ROM【例6-28】ROM存儲器設(shè)計libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityrom_16_8isport(clk:instd_logic;en:instd_logic; addr:instd_logic_vector(3downto0); data:outstd_logic_vector(7downto0));endrom_16_8;7.3.1ROMarchitectureBehavioralofrom_16_8isbeginprocess(clk,en,addr)beginifclk'eventandclk='1'then ifen='1'then caseaddris when"0000"=>data<="00000001"; …… when"1111"=>data<="10000011"; whenothers=>data<="ZZZZZZZZ";endcase; endif;endif;endprocess;endBehavioral;when"0001"=>data<="00000001"; when"0010"=>data<="00000001"; when"0011"=>data<="00000001"; when"0100"=>data<="00000001"; when"0101"=>data<="00000001"; when"0110"=>data<="00000001"; when"0111"=>data<="00000001"; when"1000"=>data<="00000001"; when"1001"=>data<="00000001"; when"1010"=>data<="00000001"; when"1011"=>data<="00000001"; when"1100"=>data<="00000001"; when"1101"=>data<="00000001"; when"1110"=>data<="00000001";7.3.1ROM7.3.1ROMarchitectureBehavioralofrom_16_8isSignaldata:std_logic_vector(7downto0);beginprocess(clk,en,addr)beginifen='1'thenifclk'eventandclk='1'then caseaddris when"0000"=>data<="00000001"; …… when"1111"=>data<="10000011"; whenothers=>data<="ZZZZZZZZ";endcase;endif;Data1<=data;elsedata1<="ZZZZZZZZ";endif;endprocess;endBehavioral;6.3.2RAMRAM存儲器可對存儲器中的地址單元進(jìn)行數(shù)據(jù)寫入或從地址單元中讀取數(shù)據(jù)。以一個4位地址深度、8位數(shù)據(jù)寬度的RAM存儲器為例介紹RAM存儲器的設(shè)計。
7.3.2RAM【例6-29】RAM存儲器設(shè)計libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityram_16_8isport(clk:instd_logic;we:instd_logic;--寫使能信號rd:instd_logic;--讀使能信號
waddr:instd_logic_vector(3downto0); raddr:instd_logic_vector(3downto0); datain:instd_logic_vector(7downto0); dataout:outstd_logic_vector(7downto0) );
endram_16_8;6.3.2RAMarchitectureBehavioralofram_16_8istypememoryisarray(0to15)ofstd_logic_vector(7downto0);signalram:memory;beginwrite_process:process(clk,we,waddr)beginifclk'eventandclk='1'then ifwe='1'then ram(conv_integer(waddr))<=datain; endif;endif;endprocess;6.3.2RAMrd_process:process(clk,rd,raddr)beginifclk'eventandclk='1'then ifrd='1'then dataout<=ram(conv_integer(raddr)); endif;endif;endprocess;endBehavioral;6.3.2RAMLPM_RAMLPM_ROMLPM_DLLSignalTap應(yīng)用本章內(nèi)容:第7章宏功能模塊與IP核應(yīng)用LPM:參數(shù)可設(shè)置模塊庫,基于Altera特定器件的優(yōu)化設(shè)計Altera提供的宏模塊與LPM函數(shù)有:第7章宏功能模塊與IP核應(yīng)用第7章宏功能模塊與IP核應(yīng)用LPM模塊定制向?qū)В篗egaWizardPlug-InManager使用步驟:
LPM定制;原理圖或HDL文件中例化7.1LPM_RAM
LPM_RAM
定制
頂層文件中例化
1.打開MegaWizardPlug-InManager
2.RAM參數(shù)配置
3.初始化數(shù)據(jù)
4.完成RAM定制
5.編譯
7.1.1LPM_RAM定制
7.1.1LPM_RAM定制
1.打開MegaWizardPlug-InManager
7.1.1LPM_RAM定制
2.RAM參數(shù)配置3.指定初始化數(shù)據(jù)文件(.mif)
7.1.1LPM_RAM定制
4.完成RAM定制
7.1.1LPM_RAM定制
5.編譯
建立項目、編譯、仿真測試
7.1.1LPM_RAM定制
【例7-1】
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityram_testis
port(rst:instd_logic; --復(fù)位信號,低電平有效
clk:instd_logic; --時鐘信號
wen:instd_logic; --寫使能信號,高電平有效
ren:instd_logic; --讀使能信號,高電平有效
waddr:instd_logic_vector(4downto0); --寫端口地址信息
raddr:instd_logic_vector(4downto0); --讀端口地址信息
datain:instd_logic_vector(7downto0); --數(shù)據(jù)寫入端口
dataout:outstd_logic_vector(7downto0)); --數(shù)據(jù)輸出端口
endentity;7.1.2LPM_RAM例化
architecturebehavofram_testis
componentram_lpmis--調(diào)用單端口RAM存儲器
port(clock:instd_logic;
wren:instd_logic;
data:instd_logic_vector(7downto0);
address:instd_logic_vector(4downto0);
q:outstd_logic_vector(7downto0)
);
endcomponent;
signalwren:std_logic;
signaladdr:std_logic_vector(4downto0);7.1.2LPM_RAM例化
begin
process(rst,clk,wen,ren)
begin
ifrst='0'then
wren<='0';
addr<="00000";
elsifclk'eventandclk='1'then
ifwen='1'then
wren<='1';
addr<=waddr;
elsifren='1'then
wren<='0';
addr<=raddr;
endif;
endif;
endprocess;
u0:ram_lpmportmap(clock=>clk,wren=>wren,data=>datain,address=>addr,
q=>dataout);
endbehav;7.1.2LPM_RAM例化
1.建立初始化數(shù)據(jù)文件
2.LPM_ROM定制
3.LPM_ROM例化
7.2LPM_ROM1.新建“MemoryInitializationFile”文件
2.設(shè)定數(shù)據(jù)文件容量
3.輸入數(shù)據(jù)
4.保存mif文件
7.2.1建立初始化數(shù)據(jù)文件7.2.2LPM_ROM定制1.打開MegaWizardPlug-InManager
2.ROM參數(shù)配置
3.初始化數(shù)據(jù)文件指定
4.完成ROM定制
5.編譯
【例7-2】
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityrom_testis
port(rst:instd_logic; --復(fù)位信號,低電平有效
clk:instd_logic; --時鐘信號
en:instd_logic; --使能信號,高電平有效
dataout:outstd_logic_vector(7downto0)--數(shù)據(jù)輸出信號
);
endentity;7.2.3LPM_ROM例化
architecturebehavofrom_testis
componentrom_lpmis
port(clock:instd_logic;
address:instd_logic_vector(4downto0);
q:outstd_logic_vector(7downto0)
);
endcomponent;
signalcnt:std_logic_vector(4downto0);7.2.3LPM_ROM例化
begin
process(rst,clk,en)
begin
ifrst='0'then
cnt<="00000";
elsifclk'eventandclk='1'then
ifen='1'then
cnt<=cnt+1;
endif;
endif;
endprocess;
u0:rom_lpmportmap(clock=>clk,address=>cnt,q=>dataout);
endbehav;7.2.3LPM_ROM例化
例基于LPM_ROM的4位乘法器設(shè)計
設(shè)計原理:硬件乘法器有多種設(shè)計方法,但相比之下,由LPM_ROM構(gòu)成的乘法表方式的乘法器的運算速度最快。這里定制LPM_ROM的地址位寬為8;地址輸入由時鐘inclock的上升沿鎖入;數(shù)據(jù)位寬也為8。最后為ROM配置乘法表數(shù)據(jù)文件。
LPM_ROM中作為乘法表的數(shù)據(jù)文件rom_data.mif如表所示。其中的地址/數(shù)據(jù)表達(dá)方式是,冒號左邊寫ROM地址值,冒號右邊寫對應(yīng)此地址放置的16進(jìn)制數(shù)據(jù)。如47﹕28,表示47為地址,28為該地址中的數(shù)據(jù),這樣,地址高4位和低4位可以分別看成是乘數(shù)和被乘數(shù),輸出的數(shù)據(jù)可以看成是它們的乘積。基于LPM_ROM的4位乘法器設(shè)計用LPM_ROM設(shè)計的4位乘法器原理圖編輯mif文件
時鐘鎖相環(huán)PLL
(phase-lockedloop)
可以實現(xiàn)對輸入時鐘的分頻、倍頻、相移等功能,能夠減少時間延遲,增加時鐘信號的穩(wěn)定性。7.3L
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 地下科研設(shè)施引孔施工協(xié)議
- 雇傭合同模板
- 公積金繳納比例調(diào)整影響
- 健身中心泳池翻新協(xié)議
- 城市供水管道改造工程施工合同
- 2025版機械運輸租賃及安裝指導(dǎo)服務(wù)合同范本3篇
- 2024年物流運輸車輛維修保養(yǎng)合同模板3篇
- 2025版客車節(jié)能環(huán)保技術(shù)應(yīng)用與推廣承包協(xié)議3篇
- 2025版航空航天設(shè)備設(shè)計與制造合同范本3篇
- 2025版跨境電商進(jìn)口食品檢驗檢疫合同3篇
- 傷口造口護(hù)理質(zhì)量標(biāo)準(zhǔn)
- 熱性驚厥診斷治療與管理專家共識
- 《橋梁輕量化監(jiān)測系統(tǒng)建設(shè)規(guī)范(征求意見稿)》
- 現(xiàn)代農(nóng)業(yè)產(chǎn)業(yè)園建設(shè)規(guī)劃方案(2篇)
- 物流配送中心租賃合同
- 幼兒園幼小銜接方案及反思
- 生命科學(xué)前沿技術(shù)智慧樹知到期末考試答案章節(jié)答案2024年蘇州大學(xué)
- 低空經(jīng)濟產(chǎn)業(yè)園項目可行性研究報告
- 中國神話故事繪本倉頡造字
- 消化道出血護(hù)理新進(jìn)展
- MOOC 心理健康與創(chuàng)新能力-電子科技大學(xué) 中國大學(xué)慕課答案
評論
0/150
提交評論