基于CPLD的VHDL語言數(shù)字鐘課程設(shè)計(jì)(精編版)_第1頁
基于CPLD的VHDL語言數(shù)字鐘課程設(shè)計(jì)(精編版)_第2頁
基于CPLD的VHDL語言數(shù)字鐘課程設(shè)計(jì)(精編版)_第3頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、基于 cpld 的 vhdl 語言數(shù)字鐘設(shè)計(jì)基于cpld 的 vhdl語言數(shù)字鐘(含秒表)設(shè)計(jì)張偉軍( 002004101751)利用一塊芯片完成除時(shí)鐘源、按鍵、揚(yáng)聲器和顯示器(數(shù)碼管)之外的所有數(shù)字電路功能。所有數(shù)字邏輯功能都在cpld 器件上用vhdl語言實(shí)現(xiàn)。這樣設(shè)計(jì)具有體積小、設(shè)計(jì)周期短(設(shè)計(jì)過程中即可實(shí)現(xiàn)時(shí)序仿真)、調(diào)試方便、故障率低、修改升級容易等特點(diǎn)。本設(shè)計(jì)采用自頂向下、混合輸入方式(原理圖輸入 頂層文件連接和vhdl語言輸入各模塊程序設(shè)計(jì))實(shí)現(xiàn)數(shù)字鐘的設(shè)計(jì)、下載和調(diào)試。一、功能說明已完成功能1. 完成秒分時(shí)的依次顯示并正確計(jì)數(shù);2. 秒分時(shí)各段個(gè)位滿10 正確進(jìn)位,秒分能做到滿

2、60 向前進(jìn)位;3. 定時(shí)鬧鐘:實(shí)現(xiàn)整點(diǎn)報(bào)時(shí),又揚(yáng)聲器發(fā)出報(bào)時(shí)聲音;4. 時(shí)間設(shè)置,也就是手動調(diào)時(shí)功能:當(dāng)認(rèn)為時(shí)鐘不準(zhǔn)確時(shí),可以分別對分時(shí)鐘進(jìn)行調(diào)整;5. 利用多余兩位數(shù)碼管完成秒表顯示:a 、精度達(dá)10ms; b、可以清零;c、完成暫??梢噪S時(shí)記時(shí)、暫停后記錄數(shù)據(jù)。待改進(jìn)功能:1. 鬧鐘只是整點(diǎn)報(bào)時(shí),不能手動設(shè)置報(bào)時(shí)時(shí)間,遺憾之一;2. 秒表不能向秒進(jìn)位,也就是最多只能記時(shí)100ms;3. 秒表暫停記錄數(shù)據(jù)后不能在原有基礎(chǔ)上繼續(xù)計(jì)時(shí),而是復(fù)位重新開始?!咀⒁狻棵氡頌楹髞硖砑庸δ?,所以有很多功能不成熟!二、設(shè)計(jì)方案1. 數(shù)字鐘頂層設(shè)計(jì)外部輸入要求: 輸入信號有1khz 1hz 時(shí)鐘信號、 低電

3、平有效的秒微秒清零信號clr 、低電平有效的調(diào)分信號setmin、低電平有效的調(diào)時(shí)信號sethour ;外部輸出要求:整點(diǎn)報(bào)時(shí)信號speaker ( 59 分 52-59 分 59 秒時(shí)未 1024hz 低頻聲,00 分 00 秒時(shí)為 4096khz 高頻聲)、時(shí)十位顯示信號h103 、時(shí)個(gè)位顯示信號h003 、分十位顯示信號m1 及分個(gè)位m0、秒十位s1 及秒個(gè)位 s0。2. 內(nèi)部功能模塊主要有:fenp 分頻模塊:主要是整點(diǎn)報(bào)時(shí)用的1kh 與 500hz 的脈沖信號,這里的輸入信號是 1khz 信號,所以只要一個(gè)二分頻即可;時(shí)間基準(zhǔn)采用1hz 輸入信號直接提供(當(dāng)然也可以分頻取得,這里先用

4、的是分頻取得的信號,后考慮到精度問題而采用硬件頻率信號。實(shí)現(xiàn)帶有100 進(jìn)制進(jìn)位和清零功能,暫定等功能的微秒模塊minsecondb輸入為1hz 脈沖和低電平的清零信號clr 與暫定信號stop,輸出微秒個(gè)位、 十位及進(jìn)位信號 co (雖然沒有實(shí)現(xiàn)進(jìn)位功能,但還是編寫了這個(gè)端口,只是在連線時(shí)懸空)。實(shí)現(xiàn) 60 進(jìn)制帶有進(jìn)位和清零功能的秒計(jì)數(shù)模塊second ,輸入為1hz 脈沖和低電平有效的清零信號clr ,輸出秒個(gè)位、時(shí)位及進(jìn)位信號co。實(shí)現(xiàn) 60 進(jìn)制帶有進(jìn)位和置數(shù)功能的分計(jì)數(shù)模塊minute ,輸入為1hz 脈沖和高15電平有效的使能信號en ,輸出分個(gè)位、時(shí)位及進(jìn)位信號co 。實(shí)現(xiàn) 2

5、4 進(jìn)制的時(shí)計(jì)數(shù)模塊hour ,輸入為 1hz 脈沖和高電平有效的使能信號en, 輸出分個(gè)位、時(shí)位。實(shí)現(xiàn)分時(shí)復(fù)用功能模塊seltime ,輸入為秒(含個(gè)十位)、分、時(shí)、掃描時(shí)鐘clk1k ,輸出為d 和顯示控制信號sel。實(shí)現(xiàn)整點(diǎn)報(bào)時(shí)功能模塊alert ,輸入為分秒信號,輸出為高頻聲控q1k和q500 。實(shí)現(xiàn)譯碼顯示功能模塊display ,輸入為d,輸出為q三、設(shè)計(jì)框圖高低電平頻率信分頻號輸入微秒模塊進(jìn)位秒模塊進(jìn)位分模塊進(jìn)位時(shí)模塊置數(shù)位選顯示模塊四、模塊說明(含程序代碼)1. 分頻模塊采用原理圖輸入方式實(shí)現(xiàn)2 分頻與 1000 分頻,但這里并沒有用到后來考慮到精度問題,將千分頻用直接輸入了。

6、程序如圖:利用三個(gè)1000 分頻,因?yàn)?490 進(jìn)行硬件分頻!2. 微秒模塊采用 vhdl語言輸入方式, 以時(shí)鐘 clk ,清零信號clr 以及暫停信號stop 為進(jìn)程敏感變量,程序如下:library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;entity minsecondb isport(clk,clrm,stop:instd_logic;時(shí)鐘/清零信號secm1,secm0:out std_logic_vector(3downto0);秒高位 /低位co:outstd_logic);-輸 出 /進(jìn)

7、位信號end minsecondb;architecture sec of minsecondb issignal clk1,dout2:std_logic;begin process(clk,clrm)variable cnt1,cnt0:std_logic_vector(3 downto 0);計(jì)數(shù)variablecount2 :integer range 0 to 10 ;beginifclk'eventand clk='1'thenifcount2>=0and count2<10 thencount2:=count2+1; else count2:=

8、0;dout2<=notdout2;end if;end if;if clrm='1' then- 當(dāng) clr 為 1 時(shí),高低位均為0cnt1:="0000"cnt0:="0000"elsif clk'event and clk='1' then if stop='1' thencnt0:=cnt0;cnt1:=cnt1; end if;基于 cpld 的 vhdl 語言數(shù)字鐘設(shè)計(jì)ifcnt1="1001"andcnt0="1000" then- 當(dāng)記

9、數(shù)為98(實(shí)際是經(jīng)過59 個(gè)記時(shí)脈沖)co<='1'進(jìn)位cnt0:="1001"- 低位為 9elsif cnt0<"1001" then- 小 于 9 時(shí)cnt0:=cnt0+1;計(jì)數(shù)-elsif cnt0="1001" then-clk1<=not clk1; else cnt0:="0000"3. 秒模塊程序清單library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity s

10、econd isport(clk,clr:instd_logic;時(shí)鐘 /清零信號sec1,sec0:outstd_logic_vector(3 downto 0);- 秒高位 /低位co:outstd_logic);- 輸出 / 進(jìn)位信號end second;architecture sec of second is beginprocess(clk,clr)variable cnt1,cnt0:std_logic_vector(3 downto 0);計(jì)數(shù)beginif clr='1'then- 當(dāng) ckr 為 1 時(shí),高低位均為 0cnt1:="0000&quo

11、t;cnt0:="0000"elsif clk'event and clk='1' thenif cnt1="0101" and cnt0="1000" then-if cnt1<"1001" then- 高位小于 9 時(shí)cnt1:=cnt1+1;else cnt1:="0000"co<='0'end if; end if; end if;secm1<=cnt1; secm0<=cnt0;end process; end sec;當(dāng)

12、記數(shù)為58(實(shí)際是經(jīng)過59 個(gè)記時(shí)脈沖)co<='1'進(jìn)位cnt0:="1001"- 低位為 9elsif cnt0<"1001" then- 小 于 9 時(shí)cnt0:=cnt0+1;計(jì)數(shù)elsecnt0:="0000"if cnt1<"0101" then- 高位小于5 時(shí)cnt1:=cnt1+1;else cnt1:="0000"co<='0'end if; end if; end if;sec1<=cnt1; sec0<=

13、cnt0;end process; end sec;4. 分模塊程序清單library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity minute isport(clk,en:in std_logic;min1,min0:outstd_logic_vector(3 downto 0);process(clk)variablecnt1,cnt0:std_logic_vector(3 downto 0);beginif clk'event and clk='1' then i

14、f en='1' thenif cnt1="0101" and cnt0="1000" then co<='1'cnt0:="1001"elsif cnt0<"1001" then cnt0:=cnt0+1;else cnt0:="0000"5. 時(shí)模塊程序清單library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity hour isport(clk

15、,en:instd_logic;- 輸入時(shí)鐘 /高電平有效的使能信號h1,h0:outstd_logic_vector(3 downto 0);- 時(shí)高位 /低位end hour;architecture hour_arc of hour is beginprocess(clk)variable cnt1,cnt0:std_logic_vector(3 downto 0);記數(shù)beginifclk'event and clk='1' then上升沿觸發(fā)6. 動態(tài)掃描模塊library ieee;use ieee.std_logic_1164.all; use ieee.

16、std_logic_unsigned.all; use ieee.std_logic_arith.all;co:out std_logic); end minute;architecture min of minute is beginif cnt1<"0101" then cnt1:=cnt1+1;elsecnt1:="0000"co<='0'end if; end if; end if; end if;min1<=cnt1;min0<=cnt0;end process; end min;if en='1

17、' then- 同時(shí)“使能”為1 if cnt1="0010" and cnt0="0011" thencnt1:="0000"- 高位 /低位同時(shí)為0 時(shí)cnt0:="0000"elsif cnt0<"1001" then- 低位小于 9 時(shí), 低位記數(shù)累加cnt0:=cnt0+1; else cnt0:="0000"cnt1:=cnt1+1;高位記數(shù)累加end if; end if; end if; h1<=cnt1; h0<=cnt0;end

18、process; end hour_arc;entity seltime is port(clk:in std_logic;掃描時(shí)鐘secm1,secm0,sec1,sec0,min1,min0,h1,h0:instd_logic_vector(3downto0);分別為秒個(gè)位 /時(shí)位;分個(gè)位/daout:out std_logic_vector(3 downto 0);-輸出sel:out std_logic_vector(2 downto 0);位選信號end seltime;architecture fun of seltime issignal count:std_logic_vect

19、or(2 downto 0);計(jì)數(shù)信號beginsel<=count; process(clk)beginif(clk'event and clk='1') then if(count>="111") thencount<="000" elsecount<=count+1; end if;end if;case count iswhen"111"=>daout<= secm0;秒個(gè)位when"110"=>daout<= secm1;秒十位whe

20、n"101"=>daout<= sec0;分個(gè)位when"100"=>daout<= sec1;分十位when"011"=>daout<=min0;時(shí)個(gè)位when"010"=>daout<=min1;時(shí)十位when"001"=>daout<=h0; when others =>daout<=h1; end case;end process; end fun;7. 報(bào)時(shí)模塊library ieee;use ieee.std_l

21、ogic_1164.all; entity alert isport(m1,m0,s1,s0:in std_logic_vector(3 downto 0);-輸入秒、分高/低位信號clk:in std_logic;高頻聲控制q500,qlk:out std_logic);低頻聲控制end alert;architecture sss_arc of alert isbegin process(clk) beginif clk'event and clk='1' thenif m1="0101" and m0="1001" and

22、s1="0101" then-當(dāng)秒高位為5,低位為 9 時(shí)且分高位為 5if s0="0001" or s0="0011" or s0="0101" or s0="0111" then-當(dāng)分的低位為1 或 3 或5 或 7 時(shí)q500<='1'- 低頻輸出為1 elseq500<='0'- 否則輸出為0 end if;end if;if m1="0101" and m0="1001" and s1="0

23、101" and s0="1001" then-當(dāng)秒高位為5,低位為 9時(shí)且分高位為5, - 分低位為9 時(shí),也就是“59 分 59 秒”的時(shí)候“報(bào)時(shí)”qlk<='1'- 高頻輸出為1 elseqlk<='0' end if;end if;end process; end sss_arc;8. 顯示模塊library ieee;use ieee.std_logic_1164.all; entity display isport(d:in std_logic_vector(3 downto 0);-連接 seltime 掃

24、描部分d 信號q:out std_logic_vector(6 downto 0);輸出段選信號(電平)end display;architecture disp_are of display is beginprocess(d)when"0000" =>q<="0111111"-顯示0when"0001" =>q<="0000110"-顯示1when"0010" =>q<="1011011"-顯示2when"0011"

25、 =>q<="1001111"-顯示3when"0100" =>q<="1100110"-顯示4when"0101" =>q<="1101101"-顯示5begin case d is基于 cpld 的 vhdl 語言數(shù)字鐘設(shè)計(jì)when"0110" =>q<="1111101"- 顯示 6 when"0111" =>q<="0100111"- 顯示 7 wh

26、en"1000" =>q<="1111111"- 顯示 8when others =>q<="1101111"- 顯示 9 end case;end process; end disp_are;9.頂層文件(原理圖輸入)*數(shù)字鐘設(shè)計(jì)模塊與程序(不含秒表)* 1.分頻模塊(原理圖輸入)2. 秒模塊程序library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity second isport(clk,clr:in s

27、td_logic;sec1,sec0:out std_logic_vector(3 downto 0); co:out std_logic);end second;architecture sec of second is beginprocess(clk,clr)variable cnt1,cnt0:std_logic_vector(3 downto 0); beginif clr='1' then cnt1:="0000"cnt0:="0000"elsif clk'event and clk='1' theni

28、f cnt1="0101" and cnt0="1000" then co<='1'cnt0:="1001"elsif cnt0<"1001" then cnt0:=cnt0+1;else cnt0:="0000"if cnt1<"0101" then cnt1:=cnt1+1;else cnt1:="0000"co<='0'end if;基于 cpld 的 vhdl 語言數(shù)字鐘設(shè)計(jì)end if; e

29、nd if;sec1<=cnt1; sec0<=cnt0;end process; end sec;3. 分模塊程序library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity minute isport(clk,en:in std_logic;min1,min0:out std_logic_vector(3 downto 0); co:out std_logic);end minute;architecture min of minute is beginprocess(clk)

30、variable cnt1,cnt0:std_logic_vector(3 downto 0); beginif clk'event and clk='1' then if en='1' thenif cnt1="0101" and cnt0="1000" then co<='1'cnt0:="1001"elsif cnt0<"1001" then cnt0:=cnt0+1;else cnt0:="0000"if cnt1<

31、;"0101" then cnt1:=cnt1+1;else cnt1:="0000"co<='0'end if; end if; end if; end if;min1<=cnt1; min0<=cnt0;end process; end min;4. 時(shí)模塊程序library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity hour isport(clk,en:in std_logic;h1,h0:out std_lo

32、gic_vector(3 downto 0); end hour;architecture hour_arc of hour is beginprocess(clk)variable cnt1,cnt0:std_logic_vector(3 downto 0); beginif clk'event and clk='1' then if en='1' thenif cnt1="0010" and cnt0="0011" then cnt1:="0000"cnt0:="0000"

33、;elsif cnt0<"1001" then cnt0:=cnt0+1;end if; end if; end if; h1<=cnt1; h0<=cnt0;end process; end hour_arc;5. 掃描模塊程序library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity seltime isport(clk:in std_logic;sec1,sec0,min1,min0,h1

34、,h0:in std_logic_vector(3 downto 0); daout:out std_logic_vector(3 downto 0);sel:out std_logic_vector(2 downto 0); end seltime;architecture fun of seltime issignal count:std_logic_vector(2 downto 0); beginsel<=count;process(clk)beginif(clk'event and clk='1') then if(count>="101

35、") thencount<="000" elsecount<=count+1;end if; end if;case count iswhen"000"=>daout<= sec0; when"001"=>daout<= sec1; when"010"=>daout<= min0; when"011"=>daout<= min1; when"100"=>daout<=h0; when other

36、s =>daout<=h1; end case;end process; end fun;6. 顯示模塊程序library ieee;use ieee.std_logic_1164.all; entity display isport(d:in std_logic_vector(3 downto 0); q:out std_logic_vector(6 downto 0);end display;architecture disp_are of display is beginprocess(d) begincase d iswhen"0000" =>q&

37、lt;="0111111" when"0001" =>q<="0000110"when"0010" =>q<="1011011" when"0011" =>q<="1001111" when"0100" =>q<="1100110" when"0101" =>q<="1101101" when"0110" =>q<="1111101" when"0111" =>q<="0100111" when"1000" =>q

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論