EDA技術與FPGA應用設計 第三版 課件 第6、7、11章常用電路的VHDL描述、宏功能模塊與IP核應用、綜合設計_第1頁
EDA技術與FPGA應用設計 第三版 課件 第6、7、11章常用電路的VHDL描述、宏功能模塊與IP核應用、綜合設計_第2頁
EDA技術與FPGA應用設計 第三版 課件 第6、7、11章常用電路的VHDL描述、宏功能模塊與IP核應用、綜合設計_第3頁
EDA技術與FPGA應用設計 第三版 課件 第6、7、11章常用電路的VHDL描述、宏功能模塊與IP核應用、綜合設計_第4頁
EDA技術與FPGA應用設計 第三版 課件 第6、7、11章常用電路的VHDL描述、宏功能模塊與IP核應用、綜合設計_第5頁
已閱讀5頁,還剩152頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第6章常用電路的VHDL描述組合電路設計時序電路設計存儲器設計本章內容:6.1組合邏輯電路VHDL描述組合邏輯電路的功能可以用真值表、表達式、電路圖等方式描述。基于這3種方式可以分別采用行為式、數據流式和結構式的VHDL描述風格及層次。常見的組合邏輯電路:基本門電路加法器編碼器譯碼器選擇器分配器等組合電路的VHDL描述方法:

1、真值表:行為描述(IF:有優先級;CASE),例如優先編碼器例7-7、譯碼器例7-8

2、表達式:數據流(賦值),例如比較器例7-9、加法器例5-26

3、邏輯電路:結構式(元件例化),例如等值比較器例4-5、例7-3。

4、三態門及雙向電路設計:例7-15、例7-176.1組合邏輯電路VHDL描述6.1組合邏輯電路VHDL描述行為式1:【例6-7】優先編碼器74LS148程序設計。真值表符號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描述程序設計—實體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描述程序設計—結構體行為式2:【例6-8】譯碼器74LS138程序設計。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描述程序設計—實體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描述程序設計—結構體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位二進制數比較器程序設計。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描述數據流式:例5-26全加器真值表表達式libraryieee;useieee.std_logic_1164.all;entityadder1isport(a,b,ci:instd_logic;co,s:outstd_logic);endadder1;6.1組合邏輯電路VHDL描述程序設計—實體6.1組合邏輯電路VHDL描述architecturebehavioralofadder1ISbeginco<=(aandb)or(aandci)or(bandci);s<=axorbxorci;endbehavioral;程序設計—結構體結構化:例4-5(4位等值比較器)、

【例6-3】4輸入與邏輯設計6.1組合邏輯電路VHDL描述表達式:結構圖:6.1組合邏輯電路VHDL描述兩輸入與邏輯設計【例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輸入與邏輯程序設計: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三態門電路描述例6-13三態與非門6.1.7三態門電路描述architectureBehavioraloftri_gateisbegin process(a,b,en) begin ifen='1'then f<=anandb; else

f<='Z'; endif; endprocess;endBehavioral;6.1.7三態門電路描述單向總線驅動器在微型計算機的總線驅動中經常要用單向總線緩沖器,它通常由多個三態門組成,用來驅動地址總線和控制總線。一個8位的單向總線緩沖器如下圖所示。單向總線驅動器程序設計—實體LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYTRI_BUF8ISPORT(DIN:INSTD_LOGIC_VECTOR(7DOWNTO0);

EN:INSTD_LOGIC;

DOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDENTITYTRI_BUF8;單向總線驅動器ARCHITECTUREARTOFTRI_BUF8ISBEGINPROCESS(EN,DIN)ISBEGINIF(EN=‘1’)THENDOUT<=DIN;

ELSE

DOUT<="ZZZZZZZZ";

ENDIF;

ENDPROCESS;ENDARCHITECTUREART;程序設計—結構體多通道三態總線電路設計【例】8位4通道三態總線結構圖:多通道三態總線電路設計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;程序設計:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBIDIRISPORT(A,B:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);DIR:INSTD_LOGIC);ENDENTITYBIDIR;6.1.8雙向端口ABDIR結構圖:雙進程描述:【例】6-14程序設計—實體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雙向端口程序設計—結構體ABDIRPROCESS(B,DIR)IS --B為輸入BEGINIF(DIR=‘0’)THENAOUT<=B;ELSEAOUT<="ZZZZZZZZ";ENDIF;A<=AOUT; --A為輸出ENDPROCESS;ENDARCHITECTUREART;6.1.8雙向端口進程B設計:ABDIRARCHITECTUREARTOFBIDIRISBEGINProcess(A,B,DIR)beginif(DIR='0')thenA<=B;

B<="ZZZZZZZZ";ElseB<=A;

A<="ZZZZZZZZ";endif;endprocess;ENDARCHITECTUREART;6.1.8雙向端口單進程描述:【例】6-15ABDIR時序電路的VHDL描述方法

(1)PROCESS+IF:

1、PROCESS

敏感表中放異步控制信號、時鐘信號;

多進程對應異步結構。

2、IF:

不完整if形成觸發器結構;

條件判斷順序對應控制信號的優先級。

(2)有限狀態機描述控制部件6.2時序邏輯電路設計常用時序部件

6.2時序邏輯電路設計觸發器;計數器;序列信號發生器;序列信號檢測器;狀態控制器

6.2.1觸發器時鐘

鎖存器、寄存器同步、異步控制復位、置位信號邊沿提取應用

...PROCESS(CLK,D)BEGINIFCLK='1'THEN--電平觸發型寄存器

Q<=D;ENDIF;ENDPROCESS;鎖存器、寄存器

鎖存器鎖存器、寄存器

D觸發器:例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;同步、異步控制

異步復位、置位控制D觸發器ARCHITECTUREARTOFASYNDCFQISBEGINPROCESS(CLK,PRESET,CLR)ISBEGINIF(PRESET=‘0')THEN--置位

Q<='1';

ELSIF(CLR=‘0')THEN--復位

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;同步、異步控制

同步復位控制D觸發器ARCHITECTUREARTOFSYNDCFQISBEGINPROCESS(CLK)ISBEGINIF(CLK'EVENTANDCLK=‘1’)THENIF(RESET=‘0’)THEN Q<=‘0’;--時鐘邊沿到來且有復位信號,觸發器被復位

ELSEQ<=D;

ENDIF;ENDIF;ENDPROCESS;ENDARCHITECTUREART;同步控制

【例6-19】設計信號上升沿和下降沿提取電路。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;信號邊沿提取

信號邊沿提取

計數器是在數字系統中使用最多的時序電路,它不僅能用于對時鐘脈沖計數,還可以用于分頻、定時、產生節拍脈沖和脈沖序列以及進行數字運算等。6.2.2計數器二進制、非二進制計數器同步、異步計數器序列信號發生器應用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;二進制計數器【例6-20】4位二進制加法計數器的設計。architectureBehavioralofcounter4issignalcnt1:std_logic_vector(3downto0):="0000";beginprocess(clk)beginifclk'eventandclk='1'then

cnt1<=cnt1+1;endif;endprocess;cnt<=cnt1;endBehavioral;二進制計數器libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycounter12isport(rst:instd_logic;--復位輸入信號

en:instd_logic;--計數使能信號

clk:instd_logic;--輸入時鐘信號

q:outstd_logic--十二分頻輸出信號

);endcounter12;非二進制計數器【例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;非二進制計數器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十進制計數器例4-26:模值為10的計數器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十進制計數器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,QL:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));

--輸出高4位、輸出低4位

ENDENTITYCNTM60;BCD六十進制計數器模為60,具有異步復位、同步置數功能的8421BCD碼計數器。ARCHITECTUREARTOFCNTM60ISBEGINCO<=‘1’WHEN(QH="0101"ANDQL="1001"ANDCI=‘1’)ELSE'0';

--進位輸出的產生PROCESS(CLK,NRESET)ISBEGINIF(NRESET=‘0’)THEN--異步復位

QH<=“0000”;QL<=“0000”;ELSIF(CLK'EVENTANDCLK=‘1’)THEN--同步置數

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

QL<=D(3DOWNTO0);

ELSIF(CI=‘1’)THEN --模60的實現BCD六十進制計數器IF(QL=9)THEN--低位計數實現

QL<="0000";

IF(QH=5)THEN--高位計數實現

QH<=“0000”;

ELSE QH<=QH+1;

ENDIF;

ELSEQL<=QL+1;

ENDIF;--ENDIFCIENDIF;--ENDIFLOAD ENDIF;ENDPROCESS;ENDARCHITECTUREART;BCD六十進制計數器多進程同步BCD六十進制計數器CNT1:PROCESS(CLK,NRESET)IS--個位BEGINIF(NRESET=‘0’)THEN--異步復位 QL<=“0000”;ELSIF(CLK'EVENTANDCLK=‘1’)THEN--同步置數IF(LOAD=‘1’)THENQL<=D(3DOWNTO0);ELSIF(CI=‘1’)THENIF(QL=9)THEN--模10計數

QL<=“0000”;

ELSEQL<=QL+1;

ENDIF;ENDIF;ENDPROCESSCNT1;CNT2:PROCESS(CLK,NRESET)IS--十位BEGINIF(NRESET=‘0’)THEN --異步復位 QH<="0000";ELSIF(CLK'EVENTANDCLK=‘1’)THEN--同步置數IF(LOAD=‘1’)THENQH<=D(7DOWNTO4);ELSIF(CI=‘1’)AND(QL=9)THEN IF(QH=5)THEN--模6計數

QH<=“0000”;

ELSEQH<=QH+1;ENDIF;ENDIF;ENDPROCESSCNT2;多進程同步BCD六十進制計數器…SIGNALCLK10:STD_LOGIC;BEGINCNT1:PROCESS(CLK)IS--個位BEGINIF(CLK'EVENTANDCLK=‘1’)THENIF(QL=9)THEN--模10計數

QL<=“0000”;

CKL10<=‘1’;ELSEQL<=QL+1;

CKL10<=‘0’;ENDIF;ENDIF;ENDPROCESSCNT1; 多進程異步BCD六十進制計數器CNT2:PROCESS(CLK10)IS--十位BEGINIF(CLK10'EVENTANDCLK10=‘1’)THEN IF(QH=5)THEN--模6計數

QH<=“0000”;

ELSEQH<=QH+1;ENDIF;ENDIF;ENDPROCESSCNT2;多進程異步BCD六十進制計數器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;序列信號發生器【例6-22】利用計數器方式設計產生序列信號“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;序列信號發生器【例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;序列信號發生器序列信號發生器單向移位寄存器雙向移位寄存器6.2.3移位寄存器【例6-24】4位單向移位寄存器設計單向移位寄存器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;單向移位寄存器程序設計—實體architectureBehavioralofreg4issignalqin:std_logic_vector(3downto0);beginprocess(clk,din)beginifclk'eventandclk='1'thenqin<=qin(2downto0)&din;endif;endprocess;q<=qin;endBehavioral;單向移位寄存器程序設計—結構體雙向移位寄存器【例6-25】8位雙向移位寄存器設計具有同步置數、同步清零、左移、右移功能: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;雙向移位寄存器程序設計—實體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;雙向移位寄存器程序設計—結構體6.2.4狀態機設計狀態機結構狀態機信號:

輸入、輸出;現態、次態;時鐘、復位。7.2.4狀態機狀態機操作(1)狀態機內部狀態轉換(次態指定和時鐘驅動轉移)。狀態機的下一狀態由狀態譯碼器根據當前狀態和輸入條件決定。(2)產生輸出信號序列。輸出信號由輸出譯碼器根據當前狀態和輸入條件決定。在產生輸出的過程中,由是否使用輸入信號可以確定狀態機的類型。兩種典型的狀態機是摩爾(MOORE)狀態機和米立(MEALY)狀態機。狀態機設計方法:雙進程描述7.2.4狀態機狀態信號定義方法1:使用枚舉型數據類型來指定現態、次態的類型;

Typestatesis(s0,s1,s2,s3,s4,s5,s6,s7);

signalcurrent_sta,next_sta:states;

方法2:直接對狀態進行編碼,定義狀態常量;signalcurrent_sta,next_sta:std_logic_vector(2downto0);

constants0:std_logic_vector(2downto0):=“000”;

…constants7:std_logic_vector(2downto0):=“111”;7.2.4狀態機應用一:序列信號發生器【例6-26】使用狀態機方式設計序列信號發生器,輸出“11000101···”序列。7.2.4狀態機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;序列信號發生器程序設計—實體architectureBehavioralofstate_seqistypestateis(s0,s1,s2,s3,s4,s5,s6,s7);--定義狀態信號

signalpresent_state,next_state:state;beginREG:process(rst,clk)--時序進程beginifrst='0'then present_state<=s0;elsifclk'eventandclk='1'then present_state<=next_state;endif;endprocessREG;序列信號發生器程序設計—結構體COM:process(present_state)--組合進程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;序列信號發生器architectureBehavioralofstate_seqistypestateis(s0,s1,s2,s3,s4,s5,s6,s7);--定義狀態信號

signalpresent_state:state;beginREG:process(rst,clk)--時序進程beginifrst='0'then present_state<=s0;elsifclk'eventandclk='1'then

序列信號發生器(單進程)程序設計—結構體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;序列信號發生器(單進程)應用二:序列檢測器【例6-27】使用狀態機方式設計“11000101···”序列檢測器。7.2.4狀態機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;序列檢測器程序設計—實體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;序列檢測器程序設計—結構體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存儲器設計ROMRAM6.3.1ROMROM一般用來存儲固定值參數,輸入信號有時鐘、地址、使能,輸出信號為存儲數據。以一個深度為16、數據寬度為8位的ROM存儲器為例介紹ROM存儲器的設計。7.3.1ROM【例6-28】ROM存儲器設計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存儲器可對存儲器中的地址單元進行數據寫入或從地址單元中讀取數據。以一個4位地址深度、8位數據寬度的RAM存儲器為例介紹RAM存儲器的設計。

7.3.2RAM【例6-29】RAM存儲器設計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應用本章內容:第7章宏功能模塊與IP核應用LPM:參數可設置模塊庫,基于Altera特定器件的優化設計Altera提供的宏模塊與LPM函數有:第7章宏功能模塊與IP核應用第7章宏功能模塊與IP核應用LPM模塊定制向導:MegaWizardPlug-InManager使用步驟:

LPM定制;原理圖或HDL文件中例化7.1LPM_RAM

LPM_RAM

定制

頂層文件中例化

1.打開MegaWizardPlug-InManager

2.RAM參數配置

3.初始化數據

4.完成RAM定制

5.編譯

7.1.1LPM_RAM定制

7.1.1LPM_RAM定制

1.打開MegaWizardPlug-InManager

7.1.1LPM_RAM定制

2.RAM參數配置3.指定初始化數據文件(.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; --復位信號,低電平有效

clk:instd_logic; --時鐘信號

wen:instd_logic; --寫使能信號,高電平有效

ren:instd_logic; --讀使能信號,高電平有效

waddr:instd_logic_vector(4downto0); --寫端口地址信息

raddr:instd_logic_vector(4downto0); --讀端口地址信息

datain:instd_logic_vector(7downto0); --數據寫入端口

dataout:outstd_logic_vector(7downto0)); --數據輸出端口

endentity;7.1.2LPM_RAM例化

architecturebehavofram_testis

componentram_lpmis--調用單端口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.建立初始化數據文件

2.LPM_ROM定制

3.LPM_ROM例化

7.2LPM_ROM1.新建“MemoryInitializationFile”文件

2.設定數據文件容量

3.輸入數據

4.保存mif文件

7.2.1建立初始化數據文件7.2.2LPM_ROM定制1.打開MegaWizardPlug-InManager

2.ROM參數配置

3.初始化數據文件指定

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; --復位信號,低電平有效

clk:instd_logic; --時鐘信號

en:instd_logic; --使能信號,高電平有效

dataout:outstd_logic_vector(7downto0)--數據輸出信號

);

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位乘法器設計

設計原理:硬件乘法器有多種設計方法,但相比之下,由LPM_ROM構成的乘法表方式的乘法器的運算速度最快。這里定制LPM_ROM的地址位寬為8;地址輸入由時鐘inclock的上升沿鎖入;數據位寬也為8。最后為ROM配置乘法表數據文件。

LPM_ROM中作為乘法表的數據文件rom_data.mif如表所示。其中的地址/數據表達方式是,冒號左邊寫ROM地址值,冒號右邊寫對應此地址放置的16進制數據。如47﹕28,表示47為地址,28為該地址中的數據,這樣,地址高4位和低4位可以分別看成是乘數和被乘數,輸出的數據可以看成是它們的乘積。基于LPM_ROM的4位乘法器設計用LPM_ROM設計的4位乘法器原理圖編輯mif文件

時鐘鎖相環PLL

(phase-lockedloop)

可以實現對輸入時鐘的分頻、倍頻、相移等功能,能夠減少時間延遲,增加時鐘信號的穩定性。7.3L

溫馨提示

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

評論

0/150

提交評論