定時器VHDL設計_第1頁
定時器VHDL設計_第2頁
定時器VHDL設計_第3頁
定時器VHDL設計_第4頁
定時器VHDL設計_第5頁
已閱讀5頁,還剩21頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、 可編程ASIC設計 200711523 朱紅霞定時器 1.實驗任務設計要求:整體清零;可以定時最高到99min;以秒速度遞增至預定時間,以分速度遞減至零。 總體框圖如下圖所示: clr 用來整體復位清零;clk 提供了秒信號,頻率為1HZ(在仿真中取10MHZ);clky 是用來掃描輸出的,選用頻率大于50HZ的方波(為便于觀察結果,在仿真中取10MHZ);set是用來置位的,低電平時有效,將以秒的速度,從零遞增到所需定時的時間,為高電平時以分的速度遞減,實現定時,直到零,定時結束;alm 輸出高電平,可啟動各種電路或發出警報。時間的變化都將在數碼管上顯示出來。 2.模塊及模塊功能 模塊AA

2、A見下圖示。它是核心模塊,用來實現定時器的邏輯功能,計數結果用十進制數輸出。LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all;ENTITY aaa IS PORT(clk, clr, set: in std_logic; alm: out std_logic; q1,q0: out std_logic_vector(3 downto 0);END aaa;ARCHITECTURE aaa_arc OF aaa ISBEGIN PROCESS (clk,clr) variable cnt1,cnt

3、0:std_logic_vector(3 downto 0); variable cnt: integer range 0 to 59; BEGIN IF clr='0' THEN -整體復位 alm<='0' cnt:=0; cnt1:="0000" cnt0:="0000" ELSIF clk'EVENT AND clk='1' THEN -設計數初值 IF set='0' THEN cnt:=0; IF cnt0<"1001" THEN cnt0

4、:=cnt0+1; ELSE cnt0:="0000" IF cnt1<"1001" THEN cnt1:=cnt1+1; ELSE cnt1:="0000" END IF; END IF; ELSE IF cnt<59 THEN -60分頻 cnt:=cnt+1; ELSE cnt:=0; IF cnt0>"0000" THEN cnt0:=cnt0-1; IF cnt1="0000" AND cnt0="0000" THEN -判斷計時是否結束 alm&

5、lt;='1' END IF; ELSE cnt0:="1001" IF cnt1>"0000" THEN cnt1:=cnt1-1; ELSE cnt1:="1001" END IF; END IF; END IF; END IF; END IF; q0<=cnt0; q1<=cnt1; END PROCESS;END aaa_arc; 模塊CH如下圖示。由于只用了兩個數碼管,所以片選信號直接接一個較快的時鐘。此模塊的功能是對應片選信號,送出要顯示的數據。LIBRARY ieee;USE ieee.

6、std_logic_1164.all;ENTITY ch IS PORT(sel:in std_logic; a1,a0:in std_logic_vector(3 downto 0); q:out std_logic_vector(3 downto 0);END ch;ARCHITECTURE ch_arc OF ch ISBEGIN PROCESS(sel,a0,a1) BEGIN IF sel='0' THEN q<=a0; ELSE q<=a1; END IF; END PROCESS;END ch_arc; 模塊DISP如下圖示。該模塊為七段譯碼器。LIB

7、RARY ieee; USE ieee.std_logic_1164.all;ENTITY disp IS PORT(a:in std_logic_vector(3 downto 0); q:out std_logic_vector(6 downto 0);END disp;ARCHITECTURE disp_arc OF disp ISBEGIN PROCESS(a) BEGIN CASE a IS WHEN "0000"=>q<="0111111" WHEN "0001"=>q<="0000110

8、" WHEN "0010"=>q<="1011011" WHEN "0011"=>q<="1001111" WHEN "0100"=>q<="1100110" WHEN "0101"=>q<="1101101" WHEN "0110"=>q<="1111101" WHEN "0111"=>q<=&

9、quot;0000111" WHEN "1000"=>q<="1111111" WHEN "1001"=>q<="1101111" WHEN others=>q<="0000000" END CASE; END PROCESS;END disp_arc; 3.仿真結果分析總體仿真結果如下:由圖可見,clr =0可實現整體復位功能。set =0,輸出以秒的速度從零遞增。 本圖中當遞增到26后,set =1,輸出經60分頻后以分的速度遞減,實現定時,直到

10、零,定時結束。定時結束后,clm =1,此時可啟動各種電路或發出報警,定時結束。clr =0,整體復位,clm =0。該設計采用動態掃描電路,經過二選一模塊將結果顯示出來。從上圖可見,q交替輸出兩位結果。sel=1時輸出高位,sel=0時輸出低位。自動售貨機控制器一、設計一個自動售貨機的控制電路。該自動售貨機銷售價格為25美分的糖果,利用有限狀態機進行電路設計。控制器的輸入輸出如圖所示: 輸入信號是nickel_in(投入5美分),dime_in(投入10美分),quarter_in(投入25美分)。另外兩個必要的輸入是clk(時鐘)和rst(復位)。控制器相應的有3個輸出:candy_out

11、用于控制發放糖果, nickel_out用于控制找回5美分的零錢, dime_out用于控制找回10美分的零錢。025510152040453035ninininiqiqiqiqiqinododino+codo+cocodidididini自動售貨機控制器的頂層電路圖和狀態轉移圖信號說明:ni=nickel_in, di=dime_in, qi=quarter_in, no=nickel_out, do=dime_out, co=candy_out 上圖給出了有限狀態機的狀態轉移圖。圓圈里的數代表顧客投進來的總錢數(接受5美分、10美分或25美分的硬幣)。狀態0是空閑狀態。從它開始,如果投入5

12、美分硬幣,將跳轉到狀態5;如果投入10美分硬幣,將跳轉到狀態10;如果投入25美分硬幣,將跳轉到狀態25。隨著投幣數量的增加,狀態不斷跳轉,如果投入的幣值達到25美分,就可以進入狀態25,然后售貨機會發放糖果,并跳轉回狀態0。如果投入的幣值超過了25美分,那么售貨機要進入與找零錢相關的狀態。例如,當投入的幣值達到40美分時,需要先退出5美分硬幣(進入狀態35),然后再退出10美分,發放糖果并進入狀態0。二、該設計的VHDL源碼如下:在代碼中定義了枚舉類型state,它包含10個狀態,所以至少需要用4位對其進行編碼(將產生4個寄存器)。在默認狀態下,編譯器將按照它們的排列順序對其進行編碼,所以有

13、st0=”0000”(十進制的0),st5=”0001”(十進制的1),和st45=”1001”(十進制的9)。在仿真中,這些數字將替代狀態的名稱出現在仿真波形中。 LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY vending_machine IS PORT (clk, rst:IN STD_LOGIC; nickel_in, dime_in, quarter_in: IN BOOLEAN; candy_out, nickel_out, dime_out: OUT STD_LOGIC);END vending_machine;ARCHITECT

14、URE fsm OF vending_machine IS TYPE state IS(st0,st5,st10,st15,st20,st25,st30,st35,st40,st45); SIGNAL present_state,next_state: STATE;BEGIN PROCESS(rst,clk) BEGIN IF(rst='1') THEN present_state<=st0; ELSIF (clk'EVENT AND clk='1') THEN present_state<=next_state; END IF; END P

15、ROCESS; PROCESS(present_state, nickel_in, dime_in, quarter_in) BEGIN CASE present_state IS WHEN st0=> candy_out<='0' nickel_out<='0' dime_out<='0' IF(nickel_in) THEN next_state<=st5; ELSIF(dime_in) THEN next_state<=st10; ELSIF(quarter_in) THEN next_state<

16、=st25; ELSE next_state<=st0; END IF; WHEN st5=> candy_out<='0' nickel_out<='0' dime_out<='0' IF(nickel_in) THEN next_state<=st10; ELSIF(dime_in) THEN next_state<=st15; ELSIF(quarter_in) THEN next_state<= st30; ELSE next_state<=st5; END IF; WHEN st10

17、=> candy_out<='0' nickel_out<='0' dime_out<='0' IF(nickel_in) THEN next_state<=st15; ELSIF(dime_in) THEN next_state<=st20; ELSIF(quarter_in) THEN next_state<=st35; ELSE next_state<=st10; END IF; WHEN st15=> candy_out<='0' nickel_out<=&

18、#39;0' dime_out<='0' IF(nickel_in) THEN next_state<=st20; ELSIF(dime_in) THEN next_state<=st25; ELSIF(quarter_in) THEN next_state<=st40; ELSE next_state<=st15; END IF; WHEN st20=> candy_out<='0' nickel_out<='0' dime_out<='0' IF(nickel_in

19、) THEN next_state<=st25; ELSIF(dime_in) THEN next_state<=st30; ELSIF(quarter_in) THEN next_state<=st45; ELSE next_state<=st20; END IF; WHEN st25=> candy_out<='1' nickel_out<='0' dime_out<='0' next_state<=st0; WHEN st30=> candy_out<='1'

20、 nickel_out<='1' dime_out<='0' next_state<=st0; WHEN st35=> candy_out<='1' nickel_out<='0' dime_out<='1' next_state<=st0; WHEN st40=> candy_out<='0' nickel_out<='1' dime_out<='0' next_state<=st35;

21、WHEN st45=> candy_out<='0' nickel_out<='0' dime_out<='1' next_state<=st35; END CASE; END PROCESS;END fsm;三、仿真結果分析仿真結果如下圖示:由上圖可以看到:第一個周期內,一共投入了3個5美分硬幣和1個25美分硬幣。在第一個5美分硬幣投進去后的第一個時鐘上升沿出現時,有限狀態機的狀態從st0(十進制的0)轉到了st5(十進制的1)。在投入第二個5美分硬幣后狀態轉到st10(十進制的2),投入第二個5美分硬幣后狀態轉到

22、st15(十進制的3),在25美分硬幣投進去以后,狀態變為st40(十進制的8)。此后,售貨機退還顧客一個5美分硬幣(nickle_out=1),同時狀態機進入st35(十進制的7),接著退還10美分硬幣(dime_out=1)并發放糖果(candy_out=1),同時狀態回到空閑狀態(st0)。其他輸入組合的分析同上。二、2. 設計幀同步檢測電路,輸入位寬1位的二進制序列及時鐘,輸出高電平脈沖的檢測結果。對輸入的二進制序列檢測幀同步序列“01011”,即當輸入的二進制序列中出現幀同步序列時,輸出一個高電平脈沖。(1).設計原理用狀態機,狀態轉換圖如下圖示: State/YX 狀態轉換圖各狀態

23、定義如下:S0:空閑狀態或僅輸入“1”; S1:輸入一個“0”后的狀態;S2:輸入序列“01”后的狀態;S3:輸入序列“010”后的狀態;S4:輸入序列“0101”后的狀態;S5:輸入幀同步序列“01011”后的狀態,此時輸出一個高電平脈沖。管腳圖管腳說明:CLK時鐘信號;X輸入二進制序列;Y輸出變量。(2).VHDL源程序:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;ENTITY check IS PORT(clk,x:in std_

24、logic; y:out std_logic);END check;ARCHITECTURE check_arc OF check IStype state is(s0,s1,s2,s3,s4,s5);signal present_state:state;signal next_state:state;BEGIN s:PROCESS(clk) BEGIN IF clk'event and clk='1' THEN present_state<=next_state; END IF; END PROCESS s; c:PROCESS(x,present_state)

25、 BEGIN case present_state is when s0 => y<='0' if x='0' then next_state<=s1; else next_state<=s0; end if; when s1 => y<='0' if x='1' then next_state<=s2; else next_state<=s1; end if; when s2 => y<='0' if x='0' then next_st

26、ate<=s3; else next_state<=s0; end if; when s3 => y<='0' if x='1' then next_state<=s4; else next_state<=s1; end if; when s4 => y<='0' if x='1' then next_state<=s5; else next_state<=s3; end if; when s5 => y<='1' if x='1

27、9; then next_state<=s0; else next_state<=s1; end if; when others=>null; end case; END PROCESS c;END check_arc; (3).仿真結果及其分析 仿真結果如下圖示:仿真結果分析:由以上截圖可以看到,當輸入的二進制序列x=“01011”,即檢測到幀同步序列時,y輸出一個高電平脈沖。且由第三個圖可見,當clk取Hz時,輸出有12.6ns/12.8ns的延時。二、3. 設計可以對兩個運動員賽跑計時的秒表,要求如下:(1)秒表的輸入只有時鐘(clk)和一個按鍵(key),假設key已

28、經經過防抖動和脈沖寬度處理,每按一次key產生持續一個時鐘周期的高電平脈沖,可以滿足設計的需要,不需要對key再做任何處理。 (2)秒表輸出用059的整數表示,不需要對十位和個位分別計數,不需要7段譯碼。 (3)鍵key的功能如下:(A) 按第一下key,開始計數,并輸出計數值;(B) 第一個運動員到終點時按第二下key,秒表記住第一個運動員到終點的時間,但還在繼續計數并輸出計數值;(C) 第二個運動員到終點時按第三下key,停止計數,這時輸出的計數值就是第二個運動員用的時間;(D) 然后按第四下key,秒表輸出第一個運動員到終點的時間,即按第二下key時記住的計數值;(E) 按第五下key,

29、秒表清0,開始新的周期。(4)畫出秒表的狀態轉移圖,標明各個狀態的轉移條件和輸出。(5)用VHDL完成秒表的設計。(1). 設計原理:該設計的狀態轉移圖如下:S0/0S1/countS2/countS3/T2S4/T1S5/0Key=1Key=1Key=1Key=1Key=1Key=1=1Key=0Key=0Key=0Key=0Key=0Key=0其中,S0:空閑狀態,輸出為0;S1:第一個key按下后的狀態,輸出計數值;S2:第二個key按下后的狀態,輸出計數值,并記下第一個運動員到達終點的時間;S3:第三個key按下后的狀態,輸出第二個運動員所用時間;S4:第四個key按下后的狀態,輸出第

30、一個運動員所用時間;S5:第五個key按下后的狀態,輸出清零。(2). VHDL源程序如下:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;ENTITY second IS PORT(clk,key:in std_logic; count:out integer range 0 to 59);END second;ARCHITECTURE second_arc OF second IStype state is(s0,s1,s2,s3,s4

31、,s5);signal present_state:state;signal next_state:state;BEGIN h:PROCESS(key) BEGIN IF key='1' THEN present_state<=next_state; END IF; END PROCESS h; s:PROCESS(present_state) BEGIN CASE present_state IS WHEN s0 => next_state<=s1; WHEN s1 => next_state<=s2; WHEN s2 => next_st

32、ate<=s3; WHEN s3 => next_state<=s4; WHEN s4 => next_state<=s5; WHEN s5 => next_state<=s1; WHEN others => null; END CASE; END PROCESS s; c:PROCESS(clk,present_state) variable c1,c2:integer range 0 to 59; BEGIN IF clk'event and clk='1' THEN case present_state is whe

33、n s0 => c1:=0; c2:=0; count<=0; when s1 => c1:=c1+1; c2:=c2+1; count<=c1; when s2 => c2:=c2+1; count<=c2; when s3 => count<=c2; when s4 => count<=c1; when s5 => c1:=0; c2:=0; count<=0; when others=>null; end case; END IF; END PROCESS c;END second_arc; (3). 仿真結果

34、及其分析仿真結果如下圖示:仿真結果分析: 仿真中clk時鐘頻率為Hz,(實際應用中采用1Hz)。由以上3副截圖可以看出:在第一個計數周期內,按第一下key(2us)后,clk上升沿到來時,系統開始計數,并同時輸出計數值;第一個運動員到終點(23us)時按第二下key,秒表記住第一個運動員到終點的時間(23us-2us=21us),但還在繼續計數并輸出計數值;第二個運動員到終點(30us)時按第三下key,停止計數,這時輸出的計數值(28)就是第二個運動員用的時間(30us-2us=28us);然后按第四下key,秒表輸出第一個運動員到終點的時間(21),即按第二下key時記住的計數值;按第五下

35、key,秒表清0,開始新的周期。此外,由圖可見,present_state的變化發生在key=“1”且時鐘上升沿來臨時。其改變與狀態轉換圖給出的一致。二、自選題 三層電梯控制器1. 實驗任務(1) 每層電梯入口處設有上下請求開關,電梯內設有乘客到達層次的停站請求開關。(2) 設有電梯處所處位置指示裝置及電梯運行模式(上升或下降)指示裝置。(3) 電梯每秒升(降)一層樓(在仿真中取1s)。(4) 電梯到達有停站請求的樓層后,經過1s(在仿真中取1s)電梯門打開,開門指示燈亮,開門4s(在仿真中取2s)后,電梯門關閉(開門指示燈滅),電梯繼續運行,直至執行完最后一個請求信號后停在當前層。(5) 能

36、記憶電梯內外的所有請求信號,并按照電梯運行規則次序響應,每個請求信號保留至執行后清除。(6) 電梯運行規則:當電梯處于上升模式時,只響應比電梯所在位置高的上樓請求信號,由下而上逐個執行,直至最后一個上樓請求執行完畢,如更高層有下樓請求,則直接升到下樓請求的最高樓接客,然后便進入下降模式。當電梯處于下降模式時,則與上升模式相反。(7) 電梯初始狀態為一層開門。總體框圖如下圖所示: 2.模塊及模塊功能 模塊veryharrd見下圖。將電梯的狀態劃分為四個:一層狀態(c1),二層狀態(c2),三層狀態(c3),開門狀態(kai)。對每一個狀態分析其所有的可能。LIBRARY ieee; USE ie

37、ee.std_logic_1164.all;ENTITY veryhardd ISPORT(up1,up2,clk,down2,down3,k1,k2,k3:in std_logic; -up1,up2:是一層、二層的上升要求 -down1,down2:是二層、三層的下降要求 -k1,k2,k3:是在一層、二層、三層停電梯的要求 -up1,up2,clk,down2,down3,k1,k2,k3均與鍵開關相連 site:out std_logic_vector(3 downto 1); -site:顯示電梯現在在哪一層 a1,a2,a3:out std_logic; -a1,a2,a3:顯示在

38、哪一層有停電梯要求 mode,door:out std_logic); -door:顯示現在門的狀態("0"表示關,"1"表示開) -mode:顯示電梯現在的運行模式(上升或下降) -a1,a2,a3,door:均與發光二極管相連END veryhardd;ARCHITECTURE veryhardd_arc OF veryhardd IStype state_type is (c1,c2,c3,kai);BEGIN PROCESS (clk) variable upl,downl,tingl,cengl:std_logic_vector(3 downt

39、o 1); variable mo,x,y,z:std_logic; variable cnt1,cnt2:integer; variable state:state_type; BEGIN if clk'event and clk='1' then if up1='0' then upl(1):='1' end if; if up2='0' then upl(2):='1' end if; if down3='0' then downl(3):='1' end if; if

40、 down2='0' then downl(2):='1' end if; if k1='0' then tingl(1):='1' end if; if k2='0' then tingl(2):='1' end if; if k3='0' then tingl(3):='1' end if; if cnt1<10 then -每秒升降一層樓(在仿真中取1s)cnt1:=cnt1+1; else case state is when c1 => ceng

41、l:="001" mo:='0' -電梯在一層轉為上升模式 if upl/="000" or downl/="000" or tingl/="000" then z:='1' -任何請求都會破壞初態 end if; if z='0' then -電梯的初態為一層開門狀態 door<='1' else door<='0' if tingl(1)='1' or upl(1)='1' then st

42、ate:=kai; -轉入開門狀態 tingl(1):='0' upl(1):='0' elsif upl(2)='1' or tingl(2)='1' then state:=c2; elsif downl(3)='1' or tingl(3)='1' then state:=c2; x:='1' elsif downl(2)='1' then state:=c2; mo:='1' end if; end if; when c2 => cengl:="010" if mo='0' then if tingl(2)='1' or upl(2)='1' then state:=kai; tingl(2):='0' upl(2):='0' elsif downl(3)='1' or tingl(3)='1' or x='1' then state:=c3; x:='0'

溫馨提示

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

評論

0/150

提交評論