第一篇:FPGA可調數字時鐘實驗報告
浙江大學城市學院
實驗報告紙
一、實驗要求
1、用vhdl編程,實現10進制計數器
2、用vhdl編程,實現60進制計數器
3、用vhdl編程,實現數字時鐘,時、分、秒、毫秒分別顯示在數碼管上。
4、實現可調數字時鐘的程序設計,用按鍵實現時、分、秒、毫秒的調整。
二、實驗原理
用VHDL,行為級描述語言實現實驗要求。思路如下:
1、分頻部分:由50MHZ分頻實現1ms的技術,需要對50MHZ采取500000分頻。
2、計數部分:采用低級影響高級的想法,類似進位加1的思路。對8個寄存器進行計數,同步數碼管輸出。
3、數碼管輸出部分:用一個撥碼開關控制顯示,當sw0=0時,四位數碼管顯示秒、毫秒的計數。當sw0=1時,四位數碼管顯示時、分得計數。
4、調整部分:分別用四個按鍵控制時、分、秒、毫秒的數值。先由一個開關控制計數暫停,然后,當按鍵按下一次,對應的數碼管相對之前的數值加1,,通過按鍵實現時間控制,最后開關控制恢復計數,完成時間調整。
5、整個實現過程由一個文件實現。
三、實驗過程
各個引腳說明: Clk:50MHZ SW:數碼管切換,SW=’0’時,數碼管顯示為秒,毫秒。SW=’1’時,數碼管顯示為時,分。
SW1:暫停與啟動。SW1=’0’時,時鐘啟動,SW=’1’時,時鐘暫停。
SW2:時鐘調整接通按鈕,當SW2=’0’時,不進行調整,當SW=’1’時,通過按鍵調整時間。
KEY0: 毫秒調整,按一次實現+1功能 KEY1:秒調整,按一次實現+1功能
浙江大學城市學院 實 驗 報 告 紙
KEY2:分調整,按一次實現+1功能 KEY3:時調整,按一次實現+1功能 Q0;第一個數碼管 Q1;第二個數碼管 Q2: 第三個數碼管 Q3: 第四個數碼管
1、源代碼如下:
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity paobiao is port(clk,sw,key0,key1,key2,key3,sw1,sw2:in std_logic;
q0:out std_logic_vector(6 downto 0);
q1:out std_logic_vector(6 downto 0);
q2:out std_logic_vector(6 downto 0);
q3:out std_logic_vector(6 downto 0));end paobiao;architecture behave of paobiao is signal cntt1 :integer range 0 to 10;signal cntt2 :integer range 0 to 10;signal cntt3 :integer range 0 to 10;signal cntt4 :integer range 0 to 6;signal cntt5 :integer range 0 to 10;signal cntt6 :integer range 0 to 10;signal cntt7 :integer range 0 to 10;signal cntt8 :integer range 0 to 6;浙江大學城市學院 實 驗 報 告 紙
signal cntttt1 :integer range 0 to 10;signal cntttt2 :integer range 0 to 10;signal cntttt3 :integer range 0 to 10;signal cntttt4 :integer range 0 to 6;signal cntttt5 :integer range 0 to 10;signal cntttt6 :integer range 0 to 10;signal cntttt7 :integer range 0 to 10;signal cntttt8 :integer range 0 to 6;
begin
process(clk)--,key0,key1,key2,key3)
variable cnt :integer range 0 to 500000;
--variable cnt9 :integer range 0 to 3000000000;
variable cnt1 :integer range 0 to 10;
variable cnt2 :integer range 0 to 10;
variable cnt3 :integer range 0 to 10;
variable cnt4 :integer range 0 to 6;
variable cnt5 :integer range 0 to 10;
variable cnt6 :integer range 0 to 10;
variable cnt7 :integer range 0 to 10;
variable cnt8:integer range 0 to 6;
begin if(clk'event and clk='1')then
if(sw1='0')then if(cnt>=2)then
cnt:=0;
cnt1:=cnt1+1;浙江大學城市學院 實 驗 報 告 紙
if(cnt1=10)then
cnt1:=0;
cnt2:=cnt2+1;
if(cnt2=10)then
cnt1:=0;
cnt2:=0;
cnt3:=cnt3+1;
if(cnt3=10)then
cnt1:=0;
cnt2:=0;
cnt3:=0;
cnt4:=cnt4+1;
if(cnt4=6)then
cnt1:=0;
cnt2:=0;
cnt3:=0;
cnt4:=0;
cnt5:=cnt5+1;
if(cnt5=10)then
cnt5:=0;
cnt6:=cnt6+1;
if(cnt6=6)then
cnt5:=0;
cnt6:=0;
cnt7:=cnt7+1;
if(cnt7=4)then
cnt5:=0;
cnt6:=0;
cnt7:=0;浙江大學城市學院 實 驗 報 告 紙
cnt8:=cnt8+1;
if(cnt8=3)then
cnt5:=0;
cnt6:=0;
cnt7:=0;
cnt8:=0;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
else cnt:=cnt+1;
end if;
if(sw2='0')then
cntt1<=cnt1;
cntt2<=cnt2;
cntt3<=cnt3;
cntt4<=cnt4;
cntt5<=cnt5;
cntt6<=cnt6;
cntt7<=cnt7;
cntt8<=cnt8;
else
cnt1:=cntttt1;
cnt2:=cntttt2;
cnt3:=cntttt3;浙江大學城市學院 實 驗 報 告 紙
cnt4:=cntttt4;
cnt5:=cntttt5;
cnt6:=cntttt6;
cnt7:=cntttt7;
cnt8:=cntttt8;
cntt1<=cnt1;
cntt2<=cnt2;
cntt3<=cnt3;
cntt4<=cnt4;
cntt5<=cnt5;
cntt6<=cnt6;
cntt7<=cnt7;
cntt8<=cnt8;
end if;
end if;end if;end process;
process(key0)variable cnttt1 :integer range 0 to 10;variable cnttt2 :integer range 0 to 10;begin if(key0'event and key0='0')then
cnttt1:=cnttt1+1;
if(cnttt1=10)then
cnttt1:=0;
cnttt2:=cnttt2+1;
if(cnttt2=10)then 浙江大學城市學院 實 驗 報 告 紙
cnttt2:=0;
end if;
end if;
cntttt1<=cnttt1;
cntttt2<=cnttt2;end if;
end process;process(key1)variable cnttt3 :integer range 0 to 10;variable cnttt4 :integer range 0 to 10;begin if(key1'event and key1='0')then
cnttt3:=cnttt3+1;
if(cnttt3=10)then
cnttt3:=0;
cnttt4:=cnttt4+1;
if(cnttt4=6)then
cnttt4:=0;
end if;
end if;cntttt3<=cnttt3;
cntttt4<=cnttt4;end if;end process;process(key2)variable cnttt5 :integer range 0 to 10;variable cnttt6 :integer range 0 to 10;begin
if(key2'event and key2='0')then 浙江大學城市學院 實 驗 報 告 紙
cnttt5:=cnttt5+1;
if(cnttt5=10)then
cnttt5:=0;
cnttt6:=cnttt6+1;
if(cnttt6=6)then
cnttt6:=0;
end if;
end if;cntttt5<=cnttt5;
cntttt6<=cnttt6;
end if;end process;process(key3)variable cnttt7 :integer range 0 to 10;variable cnttt8 :integer range 0 to 10;begin
if(key3'event and key3='0')then
cnttt7:=cnttt7+1;
if(cnttt7=4)then
cnttt7:=0;
cnttt8:=cnttt8+1;
if(cnttt8=3)then
cnttt8:=0;
end if;
end if;
cntttt7<=cnttt7;
cntttt8<=cnttt8;
end if;浙江大學城市學院 實 驗 報 告 紙
end process;
--end if;--end process;
process(cntt1,cntt5)
begin
if(sw='0')then
case cntt1 is
when 0=>q0<=“1000000”;
when 1=>q0<=“1111001”;
when 2=>q0<=“0100100”;
when 3=>q0<=“0110000”;
when 4=>q0<=“0011001”;
when 5=>q0<=“0010010”;
when 6=>q0<=“0000010”;
when 7=>q0<=“1011000”;
when 8=>q0<=“0000000”;
when 9=>q0<=“0010000”;
when others=>q0<=NULL;end case;else
case cntt5 is
when 0=>q0<=“1000000”;
when 1=>q0<=“1111001”;
when 2=>q0<=“0100100”;
when 3=>q0<=“0110000”;
when 4=>q0<=“0011001”;
when 5=>q0<=“0010010”;
when 6=>q0<=“0000010”;
浙江大學城市學院 實 驗 報 告 紙
when 7=>q0<=“1011000”;
when 8=>q0<=“0000000”;
when 9=>q0<=“0010000”;
when others=>q0<=NULL;end case;
end if;
end process;
process(cntt2,cntt6)
begin if(sw='0')then
case cntt2 is
when 0=>q1<=“1000000”;
when 1=>q1<=“1111001”;
when 2=>q1<=“0100100”;
when 3=>q1<=“0110000”;
when 4=>q1<=“0011001”;
when 5=>q1<=“0010010”;
when 6=>q1<=“0000010”;
when 7=>q1<=“1011000”;
when 8=>q1<=“0000000”;
when 9=>q1<=“0010000”;
when others=>q1<=NULL;end case;else
case cntt6 is
when 0=>q1<=“1000000”;
when 1=>q1<=“1111001”;
when 2=>q1<=“0100100”;浙江大學城市學院 實 驗 報 告 紙
when 3=>q1<=“0110000”;
when 4=>q1<=“0011001”;
when 5=>q1<=“0010010”;
when 6=>q1<=“0000010”;
when 7=>q1<=“1011000”;
when 8=>q1<=“0000000”;
when 9=>q1<=“0010000”;
when others=>q1<=NULL;end case;end if;
end process;process(cntt3,cntt7)
begin
if(sw='0')then
case cntt3 is
when 0=>q2<=“1000000”;
when 1=>q2<=“1111001”;
when 2=>q2<=“0100100”;
when 3=>q2<=“0110000”;
when 4=>q2<=“0011001”;
when 5=>q2<=“0010010”;
when 6=>q2<=“0000010”;
when 7=>q2<=“1011000”;
when 8=>q2<=“0000000”;
when 9=>q2<=“0010000”;
when others=>q2<=NULL;end case;else
case cntt7 is 浙江大學城市學院 實 驗 報 告 紙
when 0=>q2<=“1000000”;
when 1=>q2<=“1111001”;
when 2=>q2<=“0100100”;
when 3=>q2<=“0110000”;
when 4=>q2<=“0011001”;
when 5=>q2<=“0010010”;
when 6=>q2<=“0000010”;
when 7=>q2<=“1011000”;
when 8=>q2<=“0000000”;
when 9=>q2<=“0010000”;
when others=>q2<=NULL;end case;end if;
end process;
process(cntt4,cntt8)
begin if(sw='0')then
case cntt4 is
when 0=>q3<=“1000000”;
when 1=>q3<=“1111001”;
when 2=>q3<=“0100100”;
when 3=>q3<=“0110000”;
when 4=>q3<=“0011001”;
when 5=>q3<=“0010010”;
when others=>q3<=NULL;end case;else
case cntt8 is
when 0=>q3<=“1000000”;浙江大學城市學院 實 驗 報 告 紙
when 1=>q3<=“1111001”;
when 2=>q3<=“0100100”;
when 3=>q3<=“0110000”;
when 4=>q3<=“0011001”;
when 5=>q3<=“0010010”;
when 6=>q3<=“0000010”;
--when 7=>q3<=“1011000”;--when 8=>q3<=“0000000”;--when 9=>q3<=“0010000”;
when others=>q3<=NULL;end case;end if;
end process;end behave;
2、原理圖如下:
浙江大學城市學院 實 驗 報 告 紙
3、功能仿真如下
1、秒、毫秒計數仿真
2、分、時計數仿真
注釋:由于仿真時間限制,小時不能顯示。注意SW由0變成1;
浙江大學城市學院 實 驗 報 告 紙
3、暫停的仿真,數碼管顯示用秒,毫秒。
4、按鍵調整的仿真,主要仿真毫秒的仿真
四、實驗結果
實驗結果均完成所有要求,但有一個bug,在實現調整功能的時候,不能實時調整數碼管暫停下來的數字,只能從之前調整過的數值起開始調整,不過能實現調整之后,開啟時鐘,時鐘即在設定的時間開始跑。當然找到解決的方法,當由于思路和已經 寫好的程序沖突性較大,所以此處不再修改。
五、心得體會
本次實驗在分頻的基礎上進行拓展,同時應用數碼管顯示,開關和按鍵的控制,比較系統的做了一個實驗,對自身的提高還是很有幫助的。
說到心得,此次實驗告訴我一下經驗:
1、在開始寫程序之前最好先評估好自己的思路,簡易畫出想象中的原理圖,再進行編程,對之后的修改有很大的幫助。
2、程序寫長了,發現錯得時候,修改比較麻煩,所有注意編程習慣很重要,適當的加一些注釋,提高程序的可讀性。
3、程序最好分模塊寫,比較清晰。
浙江大學城市學院 實 驗 報 告 紙
第二篇:數字電子時鐘實驗報告
華大計科學院
數字邏輯課程設計說明書
題目:
多功能數字鐘
專業:
計算機科學與技術
班級:
網絡工程1班
姓名:
劉群 學號:
1125111023
完成日期:
2013-9
一、設計題目與要求
設計題目:多功能數字鐘 設計要求:
1.準確計時,以數字形式顯示時、分、秒的時間。2.小時的計時可以為“12翻1”或“23翻0”的形式。
3.可以進行時、分、秒時間的校正。
二、設計原理及其框圖 1.數字鐘的構成
數字鐘實際上是一個對標準頻率1HZ)進行計數的計數電路。由于計數的起始時間不可能與標準時間(如北京時間)一致,故需要在電路上加一個校時電路。圖 1 所示為數字鐘的一般構成框圖。
圖1 數字電子時鐘方案框圖 ⑴多諧振蕩器電路
多諧振蕩器電路給數字鐘提供一個頻率1Hz 的信號,可保證數字鐘的走時準確及穩定。⑵時間計數器電路
時間計數電路由秒個位和秒十位計數器、分個位和分十位計數器及時個位和時十位計數器電路構成。其中秒個位和秒十位計數器、分個位和分十位計數器為60 進制計數器。而根據設計要求,時個位和時十位計數器為24 進制計數器。⑶譯碼驅動電路
譯碼驅動電路將計數器輸出的8421BCD 碼轉換為數碼管需要的邏輯狀態,并且為保證數碼管正常工作提供足夠的工作電流。⑷數碼管
數碼管通常有發光二極管(LED)數碼管和液晶(LCD)數碼管。本設計提供的為LED數碼管。2.數字鐘的工作原理 ⑴多諧振蕩器電路
555 定時器與電阻R1、R2,電容C1、C2 構成一個多諧振蕩器,利用電容的充放電來調節輸出V0,產生矩形脈沖波作為時鐘信號,因為是數字鐘,所以應選擇的電阻電容值使頻率為1HZ。⑵時間計數單元
六片74LS90 芯片構成計數電路,按時間進制從右到左構成從低位向高位的進位電路,并通過譯碼顯示。在六位LED 七段顯示起上顯示對應的數值。⑶校時電源電路
當重新接通電源或走時出現誤差時都需要對時間進行校正。通常,校正時間的方法是:首先截斷正常的計數通路,然后再進行人工出觸發計數或將頻率較高的方波信號加到需要校正的計數單元的輸入端,校正好后,再轉入正常計時狀態即可。
根據要求,數字鐘應具有分校正和時校正功能。因此,應截斷分個位和時個位的直接計數通路,并采用正常計時信號與校正信號可以隨時切換的電路接入其中。圖8所示即為帶有基本RS 觸發器的校時電路。
三、元器件
1.實驗中所需的器材 單刀雙擲開關4 個.5V 電源.共陰七段數碼管 6 個.74LS90D 集成塊 6 塊.74HC00D 6個 LM555CM 1個 電阻 6個 10uF 電容 2個
2.芯片內部結構及引腳圖
圖2 LM555CM集成塊
圖3 74LS90D集成塊
五、各功能塊電路圖
1秒脈沖發生器主要由555 定時器和一些電阻電容構成,原理是利用555 定時器的特性,通過電容的充放電使VC 在高、低電平之間轉換。其中555 定時器的高、低電平的門閥電壓分別是2/3VCC 和1/3VCC電容器充電使VC 的電壓大于2/3VCC 則VC 就為高電平,然
而由于反饋作用又會使電容放電。當VC 小于1/3VCC 時,VC 就為低電平。同樣由于反饋作用又會使電容充電。通過555 定時器的這一性質我們就可以通過計算使他充放電的周期剛好為1S這樣我們就會得到1HZ 的信號。其中555 定時器的一些功能對照后面目錄。其中 555 定時器組成的脈沖發生器電路見附圖4.圖4 555 定時器組成的脈沖發生器
由于我們要得到1HZ 的信號,所以我們就可以通過555 定時器充放電一次所需的時間的公式。將那時間設為1S然后設定兩個電阻計算出另外那個電容值.在設定電阻值時我們要記住將電阻值設為比較常用的那種電阻值,得到的電容值也盡可能讓它是比較普遍使用 的。這樣就避免了在實際組裝過程中很難買到當初設定的那電阻和計算出 的電容值。
在這次設定中我們設定的電阻值RA=10KΩ,RB=62kΩ,C=10uF 經公式
f = 1.43 ÷【(RA + 2RB)×C 】 可得近似為1HZ。
2、利用一個LED 數碼管一塊74LS90D 連接成一個十進制計數器,電路在晶振的作用下數碼管從0—9 顯示見圖5。
圖5、利用2 片74LS90D 芯片連接成一個六十進制電路,電路可從0—59 顯示。第一片74LS90D芯片構成10 進制計數器,第二片74LS90D 芯片構成6 進制計數器。74LS90D 具有異步清零功能。
在第一片74ls90 構成的十進制計數器中,當第十個脈沖來到時。此時他的四級觸發器的狀態為“1001”。這時他就會自動清零。同時給第二片74ls90 構成的6 進制計數器進一,第六個脈沖進位到來時,此時第二片74ls90 芯片的觸發器的狀態為“0110”,這時QB,QC 均為高電平。將QB 與RO1 相連,將Ro2 與Qc 相連,就會進行異步清零。如此循環就會構成60 進制計數器.見附圖6.圖6 十六進制電路
4、利用2 片74LS90D 芯片構成24 進制計數器。一片構成二進制計數器,一片構成四進制計數器。由于74LS90D 芯片清零是由兩個清零端控制的,所以當第24 個脈沖到來時,第一片74lLS90D芯片的Qc 為高電平。第二片74LS90D 芯片的Qb 為高電平,讓第一片74LS90D 芯片的Qc 與兩片芯片的Ro1 相連.讓第二片74ls90 芯片的QB 與兩片芯片的Ro2 相連。當第24 個脈沖到來時就會進行異步清零。如此循環就會構成24 進制計數器。見附圖7.圖7 24進制電路
5、數字鐘電路由于秒信號的精確性和穩定性不可能坐到完全準確無誤,又因為電路中其他的原因數字鐘總會產生走時誤差的現象。所以,電路中就應該有校準時間功能的電路。在這次設計中教時電路用的是一個RS 基本觸發器的單刀雙置開關,每搬動開關一次產生一個計數脈沖.實現校時功能。見附圖8。
7、利用兩個六十進制和一個二十四進制連接成一個時、分、秒都會進位的電路總圖。見附圖8
圖8 總電路圖
六、心得體會
在這次設計中我們深深地體會到了理論跟實踐的不同,理論學的再好不會動手那也只能是紙上談兵。我們了解了集成電路芯片的型號命名規律,懂得了沒有某種芯片時的替代方法,以及在網上查找電子電路資料的方法,掌握了各芯片的邏輯功能及使用方法,進一步熟悉了集成電路的引腳安排,掌握了數字鐘的設計方法,明白了數字鐘的組成原理以及工作原理。掌握了計數器的工作原理,以及計數器進制的組成方法和級聯方法,實現了一次理論指導實踐、理論向實踐過渡的跨越,雖然期間遇到一些困難,但這些困難卻增強了我們分析問題、解決問題的能力,使我們以后不僅只學習書本中的理論知識,而且知道學以致用,動過動手實踐是我們對書本中的理論知識掌握地跟牢固、理解地跟深刻,這對我們今后的工作及學習有積極的影響。這次課程設計不僅再次復習了數字電子和模擬電子,而且讓我對于芯片的使用更加了解。增加了我的動手操作能力,加深了對該軟件的了解。這就是這次課程設計的成果,相信這些實際的操作經驗會是我們以后的寶貴財富。
第三篇:數字時鐘的設計實驗報告
實驗報告
數字時鐘的設計
一、實驗目的
1、掌握數字鐘的設計方法。
2、掌握計數器相互級聯的方法。學號:14040120049 姓名:陶澤
二、實驗設備和器件
1、數字邏輯電路實驗板2、74HC(LS)20(二四輸入與非門)
3、74HC(LS)160(4位十進制計數器)
1塊 2片 4片、三、實驗原理
1、設計總框圖:
2、各部分單元的設計提示與分析: 1)時鐘源
它是數字式時鐘的核心,它保證了時鐘的走時準確及穩定。1Hz的脈沖信號由CPLD輸出的信號得到。
2)時間計數單元
時間計數單元有分計數和秒計數等幾個部分。分計數和秒計數單元為60進制計數器,其輸出為8421BCD碼。
3)譯碼驅動及顯示單元 計數器實現了對時間的累計并以8421BCD碼形式輸出,顯示譯碼電路將計數器的輸出數碼轉換為數碼顯示器件所需要的輸出邏輯和一定的電流。4)校時電路
當重新接通電源或走時出現誤差時都需要對時間進行校正。通常,校正時間的方法是:首先截斷正常的計數通路,然后再進行人工出觸發計數或將頻率較高的方波信號加到需要校正的計數單元的輸入端,校正好后,再轉入正常計時狀態即可。5)鬧鐘電路
一般時鐘都應具備鬧鐘功能,即在到達某預定時間時,時鐘會發出連續的或有節奏的音頻聲波,較復雜的也可以是實時語音提示,以示提醒。實驗用器件管腳介紹:
四、實驗內容與步驟
1、用兩片74HC(LS)160連接構成秒計數器,并連接數碼管顯示(基本命題)
例如采用整體置零法。實現計數范圍為0000 0000--0101 1001。電路連接完成后,檢驗其功能。
2、在實驗內容與步驟1的基礎上再用兩片74 HC(LS)160實現分的計數(基本命題)
分計數器的個位和十位之間的連接類同于秒計數器。需實現從秒到分的進位。電路連接完成后檢驗其功能。
3、實現校時功能(擴展命題)
檢驗功能
4、實現鬧鐘功能(擴展命題)
連接電路,檢驗其功能。
五、實驗注意事項 集成電路要輕插輕拔!
六.實驗電路圖
1.用兩片74HC(LS)160連接構成秒計數器,并連接數碼管顯示
2.在實驗內容與步驟1的基礎上再用兩片74 HC(LS)160實現分的計數
七.其他(實驗過程中出現的問題或心得體會)這次實驗增加了我對計數器的了解,增強了我的動手能力。這次實驗我們插錯了一根線,結果成了模100的計數器,經過仔細的檢查才發現。
第四篇:數字時鐘設計實驗報告
電 子 課 程 設 計
題
目:數字時鐘
數字時鐘設計實驗報告
一、設計要求:
設計一個 24 小時制的數字時鐘。
要求:計時、顯示精度到秒;有校時功能。采用中小規模集成電路設計。
發揮:增加鬧鐘功能。
二、設計方案:
由秒時鐘信號發生器、計時電路和校時電路構成電路。
秒時鐘信號發生器可由振蕩器和分頻器構成。
計時電路中采用兩個 60 進制計數器分別完成秒計時和分計時;24 進制計數器完成時計時;采用譯碼器將計數器的輸出譯碼后送七段數碼管顯示。
校時電路采用開關控制時、分、秒計數器的時鐘信號為校時脈沖以完成校時。
三、電路框圖:
圖一 數字時鐘電路框圖
四、電路原理圖:
(一)秒脈沖信號發生器 秒脈沖信號發生器是數字電子鐘的核心部分,它的精度和穩定度決定了數字鐘的質量。由振蕩器與分頻器組合產生秒脈沖信號。
? 振蕩器: 通常用 555 定時器與 RC 構成的多諧振蕩器,經過調整輸出 1000Hz 脈沖。
? 分頻器: 分頻器功能主要有兩個,一是產生標準秒脈沖信號,一是提供功能 擴展電路所需要的信號,選用三片 74LS290 進行級聯,因為每片為 1/10 分頻器,三片級聯好獲得 1Hz 標準秒脈沖。其電路圖如下:
譯碼器 譯碼器 譯碼器 時計數器(24 進制)分計數器(60 進制)秒計數器(60 進制)校 時 電 路 秒信號發生器
圖二 秒脈沖信號發生器
(二)秒、分、時計時器電路設計 秒、分計數器為 60 進制計數器,小時計數器為 24 進制計數器。
? 60 進制——秒計數器 秒的個位部分為逢十進一,十位部分為逢六進一,從而共同完成 60 進制計數器。當計數到 59 時清零并重新開始計數。秒的個位部分的設計:利用十進制計數器 CD40110 設計 10 進制計數器顯示秒的個位。個位計數器由 0 增加到 9 時產生進位,連在十位部計數器脈沖輸入端 CP,從而實現 10 進制計數和進位功能。利用 74LS161 和 74LS11 設計 6 進制計數器顯示秒的十位,當十位計數器由 0 增加到 5 時利用 74LS11 與門產生一個高電平接到個位、十位的 CD40110 的清零端,同時產生一個脈沖給分的個位。其電路圖如下:
圖三 60 進制--秒計數電路
? 60 進制——分計數電路 分的個位部分為逢十進一,十位部分為逢六進一,從而共同完成 60 進制計數器。當計數到 59 時清零并重新開始計數。秒的個位部分的設計:來自秒計數電路的進位脈沖使分的個位加 1,利用十進制計數器 CD40110 設計 10 進制計數器顯示秒的個位。個位計數器由 0 增加到 9 時產生進位,連在十位部計數器脈沖輸入端 CP,從而實現 10 進制計數和進位功能。利用 74LS161 和 74LS11 設計 6 進制計數器顯示秒的十位,當十位計數器由 0增加到 5 時利用 74LS11 與門產生一個高電平接到個位、十位的 CD40110 的清零端,同時產生一個脈沖給時的個位。其電路圖如下:
圖四 60 進制--分計數電路
? 24 進制——時計數電路 來自分計數電路的進位脈沖使時的個位加,個位計數器由 0 增加到 9 是產生進位,連在十位計數器脈沖輸入端 CP,當十位計到 2 且個位計到 3 是經過 74LS11 與門產生一個清零信號,將所有 CD40110 清零。其電路圖如下:
圖五 24 進制--時計數電路
? 譯碼顯示電路 譯碼電路的功能是將秒、分、時計數器的輸出代碼進行翻譯,變成相應的數字。用以驅動 LED 七段數碼管的譯碼器常用的有 74LS148。74LS148 是 BCD-7 段譯碼器/驅動器,輸出高電平有效,專用于驅動 LED 七段共陰極顯示數碼管。若將秒、分、時計數器的每位輸出分別送到相應七段數碼管的輸入端,便可以進行不同數字的顯示。在譯碼管輸出與數碼管之間串聯電阻 R 作為限流電阻。其電路圖如下:
圖六 譯碼顯示電路
?
校時電路
校時電路是數字鐘不可缺少的部分,每當數字鐘與實際時間不符時,需要根據標準時間進行校時。一般電子表都具有時、分、秒等校時功能。為了使電路簡單,在此設計中只進行分和小時的校時。“快校時”是通過開關控制,使計數器對 1Hz 校時脈沖計數。圖中
S1 為校正用的控制開關,校時脈沖采用分頻器輸出的 1Hz 脈沖,當 S1 為“0”時可以進行“快校時”。
其電路圖如下:
圖七 校隊電路
五、實驗方法:
1、秒脈沖產生部分
采用555多諧振蕩器產生1HZ頻率信號,作為秒脈沖及整體電路的信號輸入部分。其仿真電路圖如下圖所示:
圖八 秒脈沖發生器仿真電路
2、計數電路 電子鐘計時分為小時、分鐘和秒,其中小時為二十四進制,分鐘和秒均為六十進制,輸出可以用數碼管顯示,所以要求二十四進制為 00000000~00100100 計數,六十進制為 00000000~01100000 計數,并且均為 8421 碼編碼形式。
(1)
小時計數——二十四進制電路仿真
用兩片 74LS160N(分 A 片、B 片)設計一個一百進制的計數器,在 24(00100100)處直接取出所有為 1 的端口,經過輸入與非門 74LS00D,再給兩個清零端 CLR。使用 74LS160N 異步清零功能完成二十四進制循環,計數范圍為 0~23。然后用七段顯示譯碼器 74LS47D 將 A、B 兩片8
U1074LS01
U1174LS0112
U1074LS00
R3.3 C0.01uS1
GN10
1U8E
74LS01HZ
S2/M2 +5
74LS160N 的輸出譯碼給 LED 數碼管。仿真電路如圖九所示。
:
圖九 24 進制——時計數器仿真電路(2)分鐘、秒計數——六十進制電路仿真
此電路類似于二十四進制計數器,采用 74LS160N 設計出一百進制的計數器,在 60(01100000)處直接取出所有為 1 的端口,經過輸入與非門 74LS00D,再給兩個清零端 CLR。使用 74LS160N異步清零功能完成六十進制循環,計數范圍為 0~59。然后用七段顯示譯碼器 74LS47D 將 A、B兩片 74LS160N 的輸出譯碼給 LED 數碼管。仿真電路如圖所示:
圖十 60 進制——秒計數器仿真電路
圖十一 60 進制——分計數器仿真電路
(四)校時校分(秒)電路。
數字鐘應具有分校正和時校正功能,因此,應截斷分個位和時個位的直接計數通路,并采用正常計時信號與校正信號可以隨時切換的電路接入其中。這里利用兩個與非門加一個單刀雙擲開關來實現校時功能。第一個 74LS00D 與非門的輸入端一端接清零信號,另一端接第二個與非門的輸入端,第二個 74LS00D 的輸入端一端接計數脈沖,另一端接一個單刀雙擲開關。開關接通的一段接地,另一端接高電平。當開關打到另一端時,時或分的個位就單獨開始計數,這樣就能實現校時功能。其電路圖如圖所示:
圖十二 校分仿真電路
六、實驗結果和結論:
數字時鐘仿真電路圖如下圖所示,在 Multisim11.0 中進行仿真,可以實現數字時鐘的顯示功能、校時功能。顯示功能中,小時實現的是 24 進制,分和秒實現的是 60 進制,通過校時電路能夠分別校對時和分。
圖十三 數字時鐘仿真電路
七、設計體會:
在本次 Multisim 仿真過程,從安裝軟件、選定課題、設計電路、進行仿真、運行結果都自己實際操作完成。在數字時鐘設計中,根據老師上課所講的內容,可以用兩片集成十進制同步計數器 74LS160D 級聯為 100 進制,再利用其異步清零功能,可以分別實現小時的 24 進制和分秒的 60 進制。當然,在仿真過程中也遇到了很多困難和問題。比如說,無法直接從秒進位到分和分進位到時,并且在仿真中總是出錯。于是自己請教了一些也做數字時鐘的同學,同時在網上查找了相關資料,最后終于用兩個與非門和單刀雙擲開關實現了從秒到分的進位、分到時的進位功能及校準功能。
通過本次實驗對數電知識有了更深入的了解,將其運用到了實際中來,明白了學習電子技術基礎的意義,也達到了其培養的目的。也明白了一個道理:成功就是在不斷摸索中前進實現的,遇到問題我們不能灰心、煩躁,甚至放棄,而要靜下心來仔細思考,分部檢查,找出最終的原因進行改正,這樣才會有進步,才會一步步向自己的目標靠近,才會取得自己所要追求的成功。
當然,自己的仿真技術和應用能力還是很欠缺的,雖然完成了基本的設計要求,但是很多自己想要的擴展功能還未能實現。而且很多時候會走過很多彎路,浪費了很多不必要的時間。不過,這次設計經歷必將使我受益終身,讓我明白如何更好的獲取知識,如何更好的理論聯系實際。今后的學習更需要不斷努力,在獲得知識的同時獲得快樂,真正的主動探索,主動學習,形成自己的思維方式,不斷應用,不斷進取。
第五篇:基于FPGA的數字電子時鐘設計與實現(范文模版)
《數字電子技術》課程設計
設計題目:基于FPGA的數字電子時鐘設計與實現
系 部: 電子與信息工程系 專業班級: 電子信息工程08秋(1)班 小組成員: 胡修遠 學 號: 08031145 指導教師 : 陶亞雄 周麗婕
完成日期: 2012年 1 月
目錄
一、所用設備與器材................................................1 1.1儀器設備...................................................1 二.系統方案......................................................1 2.1 設計思想..................................................1 2.1.1課題背景........................................1 2.1.2 Quartus II軟件.................................3 2.2工作原理及系統框圖.........................................8 三.軟件方案......................................................9 3.1 程序流程圖................................................9 3.1.1 24進制........................................9 3.1.2 10進制流程圖.................................10 3.1.3 6進制........................................11 3.1.4 60進制.......................................11 3.1.5 from0to9......................................12 3.1.6 分頻模塊.......................................12 3.1.7 總流程圖.......................................13 3.2 程序清單.................................................14 3.2.1頭文件complete_clock程序......................14 3.2.2 counter24程序.................................15 3.2.3 counter60程序.................................15 3.2.4 from0to9程序..................................16 3.2.5 counter6程序..................................17 3.2.6 counter10程序.................................17 3.2.7 分頻程序.......................................17 3.2.8 校時模塊程序...................................18 四.調試及結果...................................................18
4.1 模塊仿真.................................................18 4.1.1 counter10模塊仿真.............................18 4.1.2 counter24模塊仿真.............................19 4.1.3 counter60模塊仿真.............................19 4.1.4 分頻模塊仿真...................................19 4.1.5 top_clock計時模塊仿真.........................19 4.2 程序下載.................................................20 4.3分析運行結果..............................................21 4.3.1 設計總結.......................................21 4.3.2 心得體會.......................................21 4.3.3 致謝...........................................22
2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
一、所用設備與器材
1.1儀器設備
使用儀器設備有FPGA DE2-70開發板、PC機、信號發生器。
圖1 FPGA DE2-70開發板圖
二.系統方案
2.1 設計思想
利用數字電子技術、EDA設計方法、FPGA等技術,設計、仿真并實現一個基于FPGA的數字電子時鐘基本功能,其基本組成框圖如圖1所示,振蕩器采用ALTERA的DE2-70實驗板的50MHz輸出,分頻器將50MHz的方波進行分頻進而得到1Hz的標準秒脈沖,時、分、秒計時模塊分別由二十四進制時計數器、六十進制分計數器和六十進制秒計數器完成,校時模塊完成時和分的校正。擴展功能設計為倒計時功能,從59分55秒至59分59秒,每秒亮一盞燈報時。
2.1.1課題背景
20世紀末,電子技術獲得了飛速的發展,在其推動下,現代電子產品幾乎滲透了社會的各個領域,有力的推動了社會生產力的發展和社會信息化程度的提高,同時也使現代電子產品性能更進一步,產品更新換代的節奏也越來越快。
20世紀80年代末,出現了FPGA(Field Progrommable Gate Array),CAE和CAD技術的應用更為廣泛,它們在PCB設計的原理圖輸入,自動布局布線及PCB分析,以及邏輯設計,邏輯仿真布爾綜合和化簡等方面擔任了重要的角色,2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
為電子設計自動化必須解決的電路建模,標準文檔及仿真測試奠定了基礎。硬件描述語言是EDA技術的重要組成部分,VHDL是作為電子設計主流硬件的描述語言。本論文就是應用VHDL語言來實現秒表的電路設計。VHDL語言是標準硬件描述語言,它的特點就是能形式化抽樣表示電路結構及行為,支持邏輯設計中層次領域的描述,借用了高級語言的精巧結構簡化電路描述,具有電路模擬與驗證及保證設計的正確性,支持電路由高層向底層的綜合變換,便于文檔管理,易于理解和設計重用。
EDA技術是在電子CAD技術基礎上發展起來的計算機軟件系統,是指以計算機為工作平臺,融合了應用電子技術、計算機技術、信息處理及智能化技術的最新成果,進行電子產品的自動設計。
利用EDA工具,電子設計師可以從概念、算法、協議等開始設計電子系統,大量工作可以通過計算機完成,并可以將電子產品從電路設計、性能分析到設計出IC版圖或PCB版圖的整個過程在計算機上自動處理完成。
現在對EDA的概念或范疇用得很寬。包括在機械、電子、通信、航空航天、化工、礦產、生物、醫學、軍事等各個領域,都有EDA的應用。目前EDA 技術已在各大公司、企事業單位和科研教學部門廣泛使用。例如在飛機制造過程中,從設計、性能測試及特性分析直到飛行模擬,都可能涉及到EDA技術。本文所指的EDA技術,主要針對電子電路設計、PCB設計和IC設計。EDA 設計可分為系統級、電路級和物理實現級。
用VHDL語言開發的流程:(1)文本編輯:用任何文本編輯器都可以進行,也可以用專用的HDL編輯環境。通常VHDL文件保存為.vhd文件。
(2)功能仿真:將文件調入HDL仿真軟件進行功能仿真,檢查邏輯功能是否正確(也叫前仿真,對簡單的設計可以跳過這一步,只在布線完成以后,進行時序仿真)。
(3)邏輯綜合:將源文件調入邏輯綜合軟件進行綜合,即把語言綜合成最簡的布爾表達式和信號的連接關系。邏輯綜合軟件會生成.edf(edif)的EDA工業標準文件。
(4)布局布線:將.edf文件調入PLD廠家提供的軟件中進行布線,即把設計好的邏輯安放到PLD/FPGA內。2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
3(5)編程下載:確認仿真無誤后,將文件下載到芯片中。
本設計為一個多功能的數字鐘,具有時、分、秒計數顯示功能,以24小時的循環計數:具有校對功能。本設計采用EDA技術,以硬件描述語言VHDL為系統邏輯描述手段設計文件,在Quartus ?工具軟件下,采用自頂向下的設計方式,由各個基本模塊共同構建了一個基本FPGA的數字鐘。
系統主芯片采用EP2C70F896C6,有時鐘模塊、控制模塊、計時模塊、數據譯碼模塊、顯示以及報時模塊組成。經編譯和仿真所設計的程序,在可編程邏輯器件上下載驗證,本系統能夠完成時、分、秒的分別顯示,由按鍵輸入進行數字鐘的校時、清零、啟停功能。
隨著電子技術的發展,數字電路朝著速度快、容量大、體積小、重量輕的方向發展。人們對時間計量的精度要求越來越高,鐘表的數字化給人們生產生活帶來了極大的方便。數字鐘是一種用數字電路技術實現時、分、秒計時的裝置,與機械式時鐘相比具有更高的準確性和直觀性,且無機械裝置,具有更更長的使用壽命,因此得到了廣泛的使用。
本次設計以數字電子為主,實現對時、分、秒數字顯示的計時裝置,周期為24小時,顯示滿刻度為23時59分59秒,并具有校時功能和報時功能的數字電子鐘。課程設計所采用的開發平臺:Quartus II是可編程片上系統的綜合性設計環境,它支持CPLD和FPGA器件的開發。FPGA(Field Programmable Gate Array)現場可編程門陣列,內部主要由許多可編程邏輯模塊組成,靠縱橫交錯的分布式可編程互連線連接起來,可構成極其復雜的邏輯電路。本次課程設計所采用的FPGA芯片 Cyclone II系列的EP2C70F896C6。
2.1.2 Quartus II軟件
Quartus II 是Altera公司的綜合性PLD開發軟件,支持原理圖、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多種設計輸入形式,內嵌自有的綜合器以及仿真器,可以完成從設計輸入到硬件配置的完整PLD設計程。Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl腳本完成設計流程外,提供了完善的用戶圖形界面設計方式。具有運行速度快,界面統一,功能集中,易學易用等特點。
Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模塊庫,使用戶可以充分利用成熟的模塊,簡化了設計的復雜性、加快了 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
設計速度。對第三方EDA工具的良好支持也使用戶可以在設計流程的各個階段使用熟悉的第三方EDA工具。
Quartus II使用基本流程如下: 1.打開Quartus II軟件,創建工程
a.點擊工具欄File,利用創建工程向導(New Project Wizard)創建新工程。
圖2 新建工程圖
b.工程目錄為c:altera71sp1quartus(路徑中不能包含中文,不能建立在桌面上),工程名稱以及頂層設計實體為counter10(以英文字母開頭)。
圖3 創建路徑圖
c.選擇與開發板上芯片型號對應的器件。硬件選cycloneⅡ EP2C70F896C6。
圖4 芯片選擇圖
d.進入第三方EDA工具選擇窗口,在此可以選擇使用第三方的EDA工具,如一些布局布線、綜合、仿真軟件。
e.確認無誤后,單擊Finsh完成工程創建。2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
f.工程創建成功后,在【Project Navigator】(資源管理窗口)顯示當前工程的層次、文件和設計單元。
g.執行File—New—Design Files—verilog HDL File,建立原理圖文件。
圖5 原理圖文件建立圖
h.完成后點擊File----save as,保存到c:altera71sp1quartus目錄下。i.使用文本編輯器輸入源碼,完成原理圖編譯。
j.編譯工程,執行Processing—start—start Analysis&Elaboration進行編譯,分析檢查輸入文件是否有錯誤。2.創建仿真波形文件
a.點擊New—Vector Waveform File—save as
圖6 新建仿真波形文件圖
b.在Name框圖中右擊鼠標,Insert—Insert Node or Bus—Node Finder—在Filter中選擇Pinns:all,點擊list,點擊“》”將左側列表中的內容移動到右側列表中。2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
圖7 插入管腳圖
c.在CP上右擊選擇value,選擇時鐘脈沖信號clock(周期可自行設置)。EN和nCR都選擇高電平(Forcing High)。
圖8 輸入信號賦值
d.選擇Assignments—Settings設置—simulater settings—模式mode選擇功能型Functional e.選擇Processing—generate functional simulation netlist生成功能網表
圖9 生成功能網表圖
f.點擊波形仿真的快捷鍵,進行波形的仿真。
g.分別給EN和nCR不同的電平信號,觀察分析波形的變化。2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
圖10 EN=1 nCR=1
圖11 EN=0 nCR=1
圖12 EN=1 nCR=0 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
圖13 EN=0 nCR=0
圖14 EN脈沖 nCR=1
2.2工作原理及系統框圖
利用數字電子技術、EDA設計方法、FPGA等技術,設計、仿真并實現一個基于FPGA的數字電子時鐘基本功能,其基本組成框圖如圖1所示,振蕩器采用ALTERA的DE2-70實驗板的50MHz輸出,分頻器將50MHz的方波進行分頻進而得到1Hz的標準秒脈沖,時、分、秒計時模塊分別由二十四進制時計數器、六十進制分計數器和六十進制秒計數器完成,校時模塊完成時和分的校正。電子時鐘擴展功能為倒計時流水燈。數字電子鐘的電路組成框圖片如下圖: 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
多功能數字鐘頂層模塊振蕩器校時電路倒計時模塊分頻器CP 1Hz時計數器(24進制)分計數器(60進制)秒計數器(60進制)時譯碼顯示6計數器10計數器分譯碼顯示6計數器10計數器分譯碼顯示 圖15 系統框圖
1.數字鐘電路系統由主體電路和擴展電路兩大部分所組成。
2.數字電子時鐘電路具有時、分、秒計時,秒計數器計滿60后向分計數器進位,分計數器計滿60后向小時計數器進位,小時計數器按照“24進制”規律計數。
3.準確計時,以數字形式顯示時、分、秒的時間,計數器的輸出經譯碼器送顯示器。
4.具有分、時校正功能,校正輸入脈沖頻率為1Hz 5.復位功能,時、分、秒計時清零。
6.擴展功能為:具有仿廣播電臺整點報時的功能,即每逢59分51秒、52秒、53秒、54秒、55秒及57秒,LED綠燈依此點亮,59分59秒時,LED紅燈亮,形成倒計時流水燈報時。
三.軟件方案
3.1 程序流程圖
3.1.1 24進制
小時采用24進制計時,當CP↑,EN和nCR為高電平時計數,計數范圍為[0,23],使能信號EN等于0時,計時器保持。當高位大于2或高位等于2且低位大于3時,計時器清零,否則繼續計時。流程圖見下圖。2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
開始CP↑or nCR↓YnCR=0 ?YNNEN=0 ?YNNQH>2 or Q>23Y清零保持清零Q=Q+1 圖16 24進制程序流程圖
3.1.2 10進制流程圖
當CP↑,EN和nCR為高電平時計數,計數范圍為[0,9],使能信號EN等于0時,計時器保持。當計時到9的時候,計時器清零,否則繼續計時。流程圖見下圖。
開始CP↑or nCR↓YnCR=0 ?YNNNEN=0 ?YQ=9 ?Y清零保持清零NQ=Q+1
圖17 10進制流程圖 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
3.1.3 6進制
當CP↑,EN和nCR為高電平時計數,計數范圍為[0,5],使能信號EN等于0時,計時器保持。當計時到5的時候,計時器清零,否則繼續計時。流程圖見下圖。
開始CP↑or nCR↓YnCR=0 ?YNNNNEN=0 ?YQ=5 ?Y清零保持清零Q=Q+1 圖18 6進制流程圖
3.1.4 60進制
分、秒采用60進制計時,當CP↑,EN和nCR為高電平時計數,計數范圍為[0,59],使能信號EN等于0時,計時器保持。當個位等于9時向十位進位;當個位等于9十位等于5,計時器清零,否則繼續計時。流程圖見下圖。
開始CP↑or nCR↓NnCR=0?NEN=0?Y個位Q1=9?NYQ2=Q2+1Q2=5?YQ1=9?NNN清零保持Q1=Q1+1Y清零Q1=Q1+1 圖19 60進制流程圖 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
3.1.5 from0to9
數碼管有7段組成,分共陽極和共陰極,本次設計采用共陽極數碼管。當輸入為低電平時,數碼管顯示;當輸入為高電平時,數碼管不顯示。用這樣的方法輸入不同的高低信號控制數碼管的顯示。
HEX=7'b0000001HEX=1001111HEX=b0010010HEX=7'b0000110HEX=7'b1001100開始Case DNHEX=7'b0100000HEX=7'b1111111HEX=7'b0001111HEX=7'b0000000HEX=7'b0000100顯示7顯示8顯示9顯示6YHEX=7'b0100100顯示5顯示0顯示1顯示2顯示3顯示4 圖20 from0to9流程圖
3.1.6 分頻模塊
開始50MHz方波10^2分頻500KHz方波10^2分頻5KHz方波10^2分頻50Hz方波10^2分頻0.5Hz方波
圖21 分頻模塊流程圖 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
3.1.7 總流程圖
開始開始NCPCP↑↑or nCRor nCR↓↓Y分頻模塊YYNYAdjHrkey=1?AdjHrkey=1?NNN時低位時低位=9?=9?NYYAdjMinKey=1?AdjMinKey=1?YY低位清零高位進位低位清零高位進位N高位高位>2or>2or時時>23>23YNN分低位分低位=9=9??NN清零清零YY秒低位秒低位=9=9??NNNY低位清零高位進位低位清零高位進位YY低位計數低位計數低位計數低位計數YNY秒高位秒高位=5=5??低位清零高位進位低位清零高位進位低位計數低位計數NYY高位高位=5=5??NN秒高位清零,分低位進位秒高位清零,分低位進位高位計數高位計數清零清零Y高位計數高位計數N低位計數低位計數Y低位清零高位進位低位清零高位進位N分低位分低位=9=9??NN分高位分高位=5=5??YY高位計數高位計數Y分清零,時低位位進位分清零,時低位位進位低位清零高位進位低位清零高位進位Y時低位時低位=9=9??NNNNYY高位高位>2or>2or時時>23>23清零清零低位計數低位計數
圖22 總流程圖 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
3.2 程序清單
3.2.1頭文件complete_clock程序
module complete_clock(HEX0,HEX1,HEX2,HEX3,HEX4,HEX5,_50MHzIn,_1Hz,_50Hz, _5KHz,_500KHz,AdjMinkey,AdjHrkey,nCR,Alarm,LED0,LED10,LED3,LED4,LED5,LED6,LED7,LED8,LED9);
output [7:0] HEX0,HEX1,HEX2,HEX3,HEX4,HEX5;output Alarm,_1Hz,_50Hz,_5KHz,_500KHz;output LED0;output LED10;output LED3;output LED4;output LED5;output LED6;output LED7;output LED8;output LED9;wire [7:0] HEX0,HEX1,HEX2,HEX3,HEX4,HEX5;input nCR,_50MHzIn;wire _1Hz,_50Hz,_5KHz,_500KHz;wire LED0;wire LED10;wire LED3;wire LED4;wire LED5;wire LED6;wire LED7;wire LED8;wire LED9;input AdjMinkey,AdjHrkey;wire [7:0] Second,Minute,Hour;Divided_Frequency C1(_5KHz,_500KHz,nCR,_50MHzIn);//調用分頻模塊,輸入50MHz的頻率,經兩次分頻后變為5KHz Divided_Frequency U0(_1Hz,_50Hz,nCR,_5KHz);//調用分頻模塊,輸入5KHz的頻率,經
兩次分頻后變為1Hz top_clock U1(Hour,Minute,Second,_1Hz,nCR,AdjMinkey,AdjHrkey);//調用校時模塊,對時、分模塊進行校時 baoshi U2(Alarm_Ring,Minute,Second,_50Hz,_5KHz);assign Alarm=Alarm_Ring;assign LED0=({Minute,Second}==16'h5951);//定義LED0為59分51秒時燈亮 assign LED10=({Minute,Second}==16'h5952);//定義LED10為59分52秒時燈亮 assign LED3=({Minute,Second}==16'h5953);//定義LED3為59分53秒時燈亮 assign LED4=({Minute,Second}==16'h5954);//定義LED4為59分54秒時燈亮 assign LED5=({Minute,Second}==16'h5955);//定義LED5為59分55秒時燈亮 assign LED6=({Minute,Second}==16'h5956);//定義LED6為59分56秒時燈亮 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
assign LED7=({Minute,Second}==16'h5957);//定義LED7為59分57秒時燈亮 assign LED8=({Minute,Second}==16'h5958);//定義LED8為59分58秒時燈亮 assign LED9=({Minute,Second}==16'h5959);//定義LED9為59分59秒時燈亮 from0to9 U10(HEX0,Second[3:0]);//個位秒調用譯碼 from0to9 U9(HEX1,Second[7:4]);//十位秒調用譯碼 from0to9 U3(HEX2,Minute[3:0]);//個位分調用譯碼 from0to9 U4(HEX3,Minute[7:4]);//個位分調用譯碼 from0to9 U5(HEX4,Hour[3:0]);//個位時調用譯碼 from0to9 U6(HEX5,Hour[7:4]);//十位時調用譯碼 endmodule 3.2.2 counter24程序
module counter24(CntH,CntL,nCR,EN,CP);input CP,nCR,EN;output [3:0] CntH,CntL;reg [3:0] CntH,CntL;always @(posedge CP or negedge nCR)begin if(~nCR){CntH,CntL}<=8'h00;//當nCR=0時,計時器清零
else if(~EN){CntH,CntL}<={CntH,CntL};//當EN=0時,停止計時,保持 else if((CntH>2)||(CntH>9)||((CntH==2)&&(CntL>=3))){CntH,CntL}<=8'h00;else if((CntH==2)&&(CntL<3))begin CntH<=CntH;CntL<=CntL+1'b1;end else if(CntL==9)begin CntH<=CntH+1'b1;CntL<=4'b0000;end else begin CntH<=CntH;CntL<=CntL+1'b1;end end Endmodule 3.2.3 counter60程序
module counter60(Q1,Q2,Q3,Q4,Q5,Q6,Cnt,Cnt1,Cnt24,nCR,EN,CP,LED,LED1,LED2);input CP,nCR,EN;output [7:0] Cnt;output [7:0] Cnt1;output [7:0] Cnt24;output [6:0] Q1;output [6:0] Q2;output [6:0] Q3;output [6:0] Q4;output [6:0] Q5;output [6:0] Q6;output LED;output LED1;output LED2;wire [7:0] Cnt;2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
wire [7:0] Cnt1;wire [7:0] Cnt24;wire [6:0] Q1;wire [6:0] Q2;wire [6:0] Q3;wire [6:0] Q4;wire [6:0] Q5;wire [6:0] Q6;wire LED;wire LED1;wire LED2;wire ENP;wire ENP1;wire ENP2;wire ENP3;counter10 UC0(Cnt[3:0],nCR,EN,CP);counter6 UC1(Cnt[7:4],nCR,ENP,CP);counter10 UC2(Cnt1[3:0],nCR,ENP1,CP);counter6 UC3(Cnt1[7:4],nCR,ENP2,CP);counter24 UC4(Cnt24[7:4],Cnt24[3:0],nCR,ENP3,CP);assign ENP=(Cnt[3:0]==4'h9);assign ENP1=(Cnt==8'h59);assign ENP2=((Cnt1[3:0]==4'h9)&&(Cnt==8'h59));assign ENP3=((Cnt1==8'h59)&&(Cnt==8'h59));assign LED=~CP;assign LED1=~CP;assign LED2=~CP;from0to9 UC5(Q1,Cnt[3:0]);from0to9 UC6(Q2,Cnt[7:4]);from0to9 UC7(Q3,Cnt1[3:0]);from0to9 UC8(Q4,Cnt1[7:4]);from0to9 UC9(Q5,Cnt24[3:0]);from0to9 UC10(Q6,Cnt24[7:4]);Endmodule 3.2.4 from0to9程序
module from0to9(HEX,D);output [6:0] HEX;input [3:0] D;reg [6:0] HEX;always @(D)begin case(D)4'd0:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0000001;4'd1:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b1001111;4'd2:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0010010;2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
4'd3:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0000110;4'd4:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b1001100;4'd5:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0100100;4'd6:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0100000;4'd7:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0001111;4'd8:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0000000;4'd9:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0000100;default:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b1111111;endcase end endmodule 3.2.5 counter6程序
module counter6(Q,nCR,EN,CP);input CP,nCR,EN;output [3:0] Q;reg [3:0] Q;always @(posedge CP or negedge nCR)begin if(~nCR)Q<=4'b0000;//當nCR=0時,計時器清零 else if(~EN)Q<=Q;//當EN=0時,停止計時,保持 else if(Q==4'b0101)Q<=4'b0000;else Q<=Q+1'b1;//計時器正常計時 end Endmodule 3.2.6 counter10程序
module counter10(Q,nCR,EN,CP);input CP,nCR,EN;output [3:0] Q;reg [3:0] Q;always @(posedge CP or negedge nCR)begin if(~nCR)Q<=4'b0000;//當nCR=0時,計時器清零 else if(~EN)Q<=Q;//當EN=0時,停止計時,保持 else if(Q==4'b1001)Q<=4'b0000;else Q<=Q+1'b1;//計時器正常計時 end Endmodule 3.2.7 分頻程序
module Divided_Frequency(_1HzOut,nCR,_5kHzIN);input _5kHzIN,nCR;output _1HzOut;supply1 Vdd;//定義 Vdd 是高電平
wire [15:0] Q;//計時器的輸出信號(中間變量)wire EN1,EN2,EN3;// 計時器的使能信號(中間變量)counter10 DU0(Q[3:0],nCR,Vdd,_5kHzIN);//調用十進制 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
counter10 DU1(Q[7:4],nCR,EN1,_5kHzIN);counter10 DU2(Q[11:8],nCR,EN2,_5kHzIN);counter10 DU3(Q[15:12],nCR,EN3,_5kHzIN);assign EN1=(Q[3:0]==4'h9);assign EN2=(Q[7:4]==4'h9)&(Q[3:0]==4'h9);assign EN3=(Q[11:8]==4'h9)&(Q[7:4]==4'h9)&(Q[3:0]==4'h9);assign _1HzOut=Q[15];//assign _500HzOut=Q[0];endmodule 3.2.8 校時模塊程序
module top_clock(Second,Minute,Hour,_1Hz,nCR,AdjMinKey,AdjHrkey);input _1Hz,nCR,AdjMinKey,AdjHrkey;output [7:0] Second,Minute,Hour;wire [7:0] Hour,Minute,Second;supply1 Vdd;wire MinCP,HrCP;counter60 UT1(Second,nCR,Vdd,_1Hz);//調用counter60,對秒計時 counter60 UT2(Minute,nCR,Vdd,~MinCP);// 調用counter60,對分校時
counter24 UT3(Hour[7:4],Hour[3:0],nCR,Vdd,~HrCP);//調用counter24,對時校時 assign MinCP=AdjMinKey ? _1Hz:(Second==8'h59);//當MinCP=AdjMinKey時,執行校時,當MinCP≠AdjMinKey時,秒計時至59 時向分進位 assign HrCP=AdjHrkey?_1Hz:({Minute,Second}==16'h5959);//當HrCP=AdjHrkey時,執
行校時,當HrCP≠AdjHrkey時,分
秒計時至59分59秒時向時進位 Endmodule 四.調試及結果
4.1 模塊仿真
4.1.1 counter10模塊仿真
CP為時鐘脈沖;當CP↑,EN和nCR為高電平時Q計數;Q的計數范圍為[0,9]
圖counter10仿真波形圖 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
4.1.2 counter24模塊仿真
CP為時鐘脈沖;當CP↑,EN和nCR為高電平時Q計數;Q的計數范圍為[0,23]
圖24 counter24仿真波形圖
4.1.3 counter60模塊仿真
CP為時鐘脈沖;當CP↑,EN和nCR為高電平時Q計數;Q的計數范圍為[0,59]
圖25 counter60仿真波形圖
4.1.4 分頻模塊仿真
分頻器是將輸入的基本時鐘信號分頻為其他模塊需要的5kHZ 和1HZ 的信號.其中CLK 輸入為5kHZ , CLK2 輸出1HZ 信號,分頻實際也是用了計數器的原理。
圖26 分頻模塊仿真波形圖
4.1.5 top_clock計時模塊仿真 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
當秒計時到59時,向分進一位,當秒計時到59且分計時到59時向時進一位。當時分秒計時到23’59’59時,計時器清零。
圖27 top_clock計時模塊仿真波形圖
4.2 程序下載
圖28 時測試校時,時至23 圖29 時測試校時,時進位至00
圖30 分測試校時分至59
圖31 分測試校時,分進位至00 圖32 59分52秒,LEDG1亮 圖33 59分55秒,LEDG4亮 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
圖34 59分57秒,LEDG6亮
圖35 59分59秒,LEDR0亮
4.3分析運行結果
4.3.1 設計總結
本次大型作業我們所研究的課題是基于FPGA的數字電子時鐘的設計與實現。時鐘設計的方法是通過計時模塊、分頻模塊、校時模塊、譯碼顯示模塊和倒計時報時模塊來構成該電子時鐘。計時模塊為時分秒計時,采用24進制計時。因此該模塊中調用了24進制和60進制兩個程序,其中60進制采用的是調用6進制和10進制的方法來實現。
分頻模塊輸入一頻率為50MHz的信號,經過四次10^2分頻,將信號逐次分為500KHz、5KHz、50Hz直至0.5Hz。計時模塊就由分頻器分頻出來的標準秒脈沖進行計時,時、分、秒計時模塊分別由二十四進制時計數器、六十進制分計數器和六十進制秒計數器完成,校時模塊完成時和分的校正。我們還進行了擴展功能設計——倒計時流水燈功能,從59分55秒至59分59秒,每秒亮一盞燈報時,55秒至58秒,依此亮綠燈,59秒亮紅燈。
通過這兩周的課程設計,我們熟悉了基于FPGA的數字電子時鐘的設計與實現的整個流程,文本編輯,功能仿真,邏輯綜合,布局布線,編程下載,每一步剛開始或多或少有些問題,但在我們不斷努力學習補充修改后,最終圓滿完成數字電子時鐘的時、分、秒的計時和校時功能,復位功能,還設計實現了倒計時流水燈擴展功能。
4.3.2 心得體會
為期兩周的大型作業,我們組順利完成了基于FPGA的數字電子時鐘設計與實現的課程設計。從剛開始對Verilog語言非常陌生,到最后接近熟練地掌握Verilog語言的程度,期間花費不少時間和精力,同時也收獲了很多,學會了 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
使用Verilog語言編程仿真電路實驗,掌握了可編程邏輯器件的應用開發技術,熟悉了一種EDA軟件使用,掌握了Verilog設計方法,即分模塊分層次的設計方法。
在設計的過程中,因為剛剛接觸這種編程語言,我們也遇到了很多問題。但是我們沒有放棄過,不斷檢查糾正錯誤。Verilog源程序的編寫很容易出現錯誤,這就需要耐心的調試。因為很多情況下,一長串的錯誤往往是由一個不經意的小錯誤引起的。有時程序一直出錯找不到原因的時候,我們也會去虛心向別的組的同學請教,或者和他們一起討論問題,從中得到一些啟發。
由于設備和時間的限制,我們還有一部分擴展內容沒能夠完成,即數字鐘的整點蜂鳴報時功能。但本次設計實驗已使我們對Verilog語言產生了濃厚的興趣,在以后的學習生活中會主動去了解更多有關這方面的知識及其在實踐中的應用。
這次大型作業,不僅讓我們又掌握了一些新的知識,也提高了我們的動手能力和科學嚴謹的精神。其次也培養了我們自學的能力,遇到不明白的地方可以通過思考、查資料、與同學交流多種方式解決問題。這些對于我們以后的學習和工作都有極大的幫助。
4.3.3 致謝
最后,我們要感謝系里提供這一次的機會讓我們學到更多知識,并且提供了這么好的學習條件,設備、學習環境、師資等方面都非常好。同時也要感謝周麗婕老師和陶亞雄老師兩周以來耐心的指導,在我們遇到問題的時候,是她們悉心的指導幫助和不厭其煩的講解下我們才得以順利的完成這次的設計,我們再次表示由衷的感謝!