第一篇:fpga數字鐘課程設計報告
課程設計報告
設計題目:基于FPGA的數字鐘設計
班級:電子信息工程1301 學號:20133638 姓名:王一丁
指導教師:李世平
設計時間:2016年1月
摘要
EDA(Electronic Design Automation)電子設計自動化,是以大規模可編程器件為設計載體,以硬件描述語言為系統邏輯描述的主要表達方式,通過相關的軟件,自動完成軟件方式設計得電子系統到硬件系統,最終形成集成電子系統或專用集成芯片。本次課程設計利用Quartus II 為設計軟件,VHDL為硬件描述語言,結合所學知識設計一個多功能時鐘,具有顯示年、月、日、時、分、秒顯示,計時,整點報時,設定時間等功能。利用硬件描述語言VHDL 對設計系統的各個子模塊進行邏輯描述,采用模塊化的思想完成頂層模塊的設計,通過軟件編譯、邏輯化簡、邏輯綜合優化、邏輯仿真、最終完成本次課程設計的任務。
關鍵詞:EDA VHDL語言 數字鐘
目 錄
摘要 課程設計目的 課程設計內容及要求 2.1 設計任務
2.2 設計要求 VHDL程序設計
3.1方案論證 3.2 系統結構框圖 3.3設計思路與方法 3.3.1 狀態控制模塊 3.3.2 時分秒模塊 3.3.3 年月日模塊 3.3.4 顯示模塊 3.3.5脈沖產生模塊 3.3.6 揚聲器與鬧鐘模塊
3.4 RTL整體電路 4 系統仿真與分析
課程設計總結,包括.收獲、體會和建議 6 參考文獻 1 課程設計目的
(1)通過設計數字鐘熟練掌握EDA軟件(QUARTUS II)的使用方法,熟練進行設計、編譯,為以后實際工程問題打下設計基礎。
(2)熟悉VHDL 硬件描述語言,提升分析、尋找和排除電子設計中常見故障的能力。
(3)通過課程設計,鍛煉書寫有理論根據的、實事求是的、文理通順的課程設計報告。課程設計內容及要求
2.1 設計任務
(1)6個數字顯示器顯示時分秒,setpin按鍵產生一個脈沖,顯示切換為年月日。
(2)第二個脈沖可預置年份,第三個脈沖可以預置月份,依次第四、五、六、七個脈沖到來時分別可以預置時期、時、分、秒,第八個脈沖到來后預置結束正常從左顯示時分秒。
(3)up為高時,upclk有脈沖到達時,預置位加一,否則減一。2.2 設計要求
(1)在基本功能的基礎上,鬧鐘在整點進行報時,產生一定時長的高電平。
(2)實現鬧鐘功能,可對鬧鐘時間進行預置,當達到預置時間時進行報時。
VHDL程序設計 3.1方案論證
該數字鐘可以實現:計時功能、整點報時、鬧鐘和預置時間功能,因此時鐘系統可分為5個模塊:功能選擇模塊、時分秒計數模塊、年月日計數模塊、顯示模塊、揚聲器模塊、脈沖產生模塊。
(1)功能選擇模塊是有狀態機構成的,功能為依次進行、設置時間、設置鬧鐘時間。
調整工作狀態:數字鐘的初始狀態顯示時分秒,在setpin按鍵產生一個脈沖,顯示切換為年月日。
設置時間:第二個脈沖可預置年份,第三個脈沖可以預置月份,依次第四、五、六、七個脈沖到來時分別可以預置時期、時、分、秒。第八個脈沖到來后,預置結束恢復初始狀態,正常顯示時分秒。
設置鬧鐘時間:鬧鐘在setpin1按鍵產生第一個脈沖時設定鬧鐘的時,第二個脈沖設定分,第三個脈沖設定秒,第四個脈沖恢復顯示時分秒。
(2)時分秒計數模塊包括正常計時、鬧鐘、整點報時三個功能。
正常計時功能通過軟件編寫,60進制的秒計數器,60進制的分計數器,24進制的時計數器。時分秒的計數器具有清0、置數、進位和計數功能。其中reset為清0信號,當reset為0時,時分秒的計數器清0。當set產生第四個脈沖后,連續產生的set信號使分秒計數器依次進行置數。以upclk為時鐘,通過up對預置位進行控制,當up為高時且upclk有脈沖到來時,預置位加一,否則減一。當set產生第八個脈沖時,數字鐘恢復時分秒的顯示。
鬧鐘功能是在正常計數功能上拓展,分為鬧鐘時間預置和鬧鐘響應兩個部分。鬧鐘時間預置功能:當set1連續產生脈沖時,依次對鬧鐘的時分秒位進行預置。以upclk為時鐘,通過up對預置位進行控制,當up為高時且upclk有脈沖到來時,預置位加一,否則減一。當set1產生第四個脈沖時,數字鐘恢復時分秒的顯示。與此同時在程序中增添變量時計時功能可以持續運行。鬧鐘響應功能:通過預置后,儲存的變量與計時器模塊的時、分、秒進行比對,當時、分、秒相同時,模塊產生一個一段時間的高電平,傳輸給鬧鐘響應模塊。
整點報時功能:當計數器中的分位等于59,秒位等于59時,模塊產生一段高電平,輸出給揚聲器模塊進行報時。
(3)年月日計數模塊分為年月日計數功能,年月日預置數功能。
年月日計數功能:以時位的進位脈沖為計時脈沖,閏年二月份為29天,普通年二月份為28天。一月、三月、五月、七月、八月、十月、十二月為31天,四月、六月、九月、十一月為30天。
年月日預置數功能:當set產生第一個脈沖后,依次進行年月日數器置數。以upclk為時鐘,通過up對預置位進行控制,當up為高時且upclk有脈沖到來時,預置位加一,否則減一。
(4)顯示模塊:以時分秒,年月日模塊的輸出、狀態標志為輸入信號,通過狀態控制模塊產生的狀態標志對顯示模塊進行控制,顯示計時、預置時的不同狀態。
(5)揚聲器模塊:輸入信號為分位、秒位和狀態信號,當計時時鐘到達整點是輸出高電平,其他時刻輸出低電平。
(6)脈沖產生模塊:對輸入的信號進行1000分頻,產生周期為一秒的時鐘信號,用于數字鐘的時鐘輸入。
3.2系統結構框圖
3.3設計思路與方法 3.3.1 狀態控制模塊
狀態控制模塊實現對各個功能模塊的整體設計,包括對時間與日期的顯示與調整,鬧鐘的顯示與調整等控制操作。狀態機的輸入為setpin,setpin1,upclk。狀態機的狀態有11種狀態。g0:鬧鐘設置時位; g1:鬧鐘設置分位; g2:鬧鐘設置秒位;
s0:時鐘顯示時分秒;s1:時鐘顯示年月日; s2:鐘設置年; s3:時鐘設置月; s4:時鐘設置日; s5:時鐘設置時; s6:時鐘設置分; s7:設置秒
在產生如上狀態的同時產生Tlock,flag狀態標志,此標志用來進行時鐘設置、鬧鐘設置與顯示控制。RTL 電路圖
實現代碼如下: process(upclk)begin if(upclk='1' and upclk'LAST_VALUE='0')then state<=next_state;--實現狀態變換
end if;end process;process(state,setpin,setpin1)begin next_state<=state;case(state)is when s0 => Tlock<=“0000”;flag<='1';if(setpin1='1'
and
setpin1'LAST_VALUE='0')then next_state<=g0;end if;if(setpin='1'
and
setpin'LAST_VALUE='0')
then next_state<=s1;end if;when s1=> Tlock<=“0001”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and next_state<=s2;end if;when s2=> Tlock<=“0010”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and next_state<=s3;end if;
when s3=> Tlock<=“0011”;flag<='1';if(setpin1='1' and next_state<=g0;end if;
setpin1'LAST_VALUE='0')then
then
setpin1'LAST_VALUE='0')then
setpin'LAST_VALUE='0')
then
setpin1'LAST_VALUE='0')then
setpin'LAST_VALUE='0')if(setpin='1' and next_state<=s4;end if;
when s4=> Tlock<=“0100”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and next_state<=s5;end if;when s5=> Tlock<=“0101”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and next_state<=s6;end if;when s6=> Tlock<=“0110”;flag<='1';if(setpin1='1' and next_state<=g0;end if;if(setpin='1'
and
setpin'LAST_VALUE='0')then
setpin1'LAST_VALUE='0')then
then
setpin1'LAST_VALUE='0')then
then
setpin1'LAST_VALUE='0')then
then
setpin'LAST_VALUE='0')
setpin'LAST_VALUE='0')
setpin'LAST_VALUE='0')next_state<=s7;end if;
when s7=>
Tlock<=“0111”;
flag<='1';if(setpin1='1' and
setpin1'LAST_VALUE='0')then next_state<=g0;end if;if(setpin='1'
and next_state<=s0;end if;when g0=> Tlock<=“1000”;flag<='0';if(setpin1='1' and next_state<=g1;end if;if(setpin='1'
and next_state<=s0;end if;
when g1=> Tlock<=“1001”;flag<='0';if(setpin1='1' and next_state<=g2;end if;if(setpin='1'
and next_state<=s0;end if;then
setpin1'LAST_VALUE='0')then
setpin'LAST_VALUE='0')
then
setpin1'LAST_VALUE='0')then
setpin'LAST_VALUE='0')
then
setpin'LAST_VALUE='0')
when g2=> Tlock<=“1010”;flag<='0';if(setpin1='1' next_state<=s0;end if;if(setpin='1'
and
setpin'LAST_VALUE='0')
then
and
setpin1'LAST_VALUE='0')then next_state<=s0;end if;
when others=> next_state<=s0;end case;end process;3.3.2 時分秒模塊
時分秒模塊的輸入為ce(使能端),clk0(系統輸入時鐘),clk1(upclk時鐘),flag(標志位),lock(狀態位),up(預置位增減控制),ov(進位位),op(鬧鐘與揚聲器響應)。
時分秒模塊的RTL電路圖 時鐘選擇方式:在初始狀態和顯示年月日的狀態下,時分秒模塊的時鐘輸入為系統時鐘輸入(clk0),在其他狀態下,時分秒模塊的時鐘輸入為(upclk時鐘)用來進行置位。
實現代碼入下:
process(lock,clk0,clk1)begin if(lock=“0000” or lock=“0001”)then clk<=clk0;--正常計數時選擇clk0 else clk<=clk1;--預置的時候clk1 end if;end process;時鐘計時功能,在顯示年月日,時分秒的狀態時,時鐘正常計數。當數字鐘處于置數狀態時,年、月、日、時、分、秒時鐘停止計時,各個位顯示預置數。在鬧鐘的預置功能實現的同時,通過增添變量,在設置鬧鐘的同時保證時鐘的正常計數,在鬧鐘預置結束后,恢復到初始的時鐘顯示。3.2.3 年月日模塊
年月日模塊分為日期增加和日期減小兩個部分,日期增加:在顯示時分秒,顯示年月日和設置完秒位的狀態下,如果是二月,通過函數判斷是否為閏年,其他月份對大小月進行判斷,大月為31天,小月為30天,代碼如下:
if(clk'event and clk='1')then if(ce='1')then if(lock=“0000”)or(lock=“0001”)or(lock=“0100”and up='1')then
if(mon0=“0010”and mon1=“0000”)then
Feb_add_day(Td0,Td1,tempy0,tempy1,date0,date1);
elsif((mon0=“0001”and mon0=“0000”)or(mon0=“0011”)or(mon0=“0101”)
or(mon0=“0111”)or(mon0=“1000”)or(mon0=“0000”and mon1=“0001”)or(mon0=“0010”and mon1=“0001”))then
oddmonth_add_day(Td0,Td1,date0,date1);
else evenmonth_add_day(Td0,Td1,date0,date1);
end if;
end if;日期減少同理,代碼如下: if(lock=“0100”and up='0')then if(mon0=“0010”and mon1=“0000”)then Feb_add_day(Td0,Td1,tempy0,tempy1,date0,date1);elsif((mon0=“0001”and mon1=“0000”)or(mon0=“0011”)or(mon0=“0101”)or(mon0=“0111”)or(mon0=“1000”)or(mon0=“0000”and mon1=“0001”)
or(mon0=“0010”and mon1=“0001”))then
oddmonth_sub_day(Td0,Td1,date0,date1);
else evenmonth_sub_day(Td0,Td1,date0,date1);
END IF;
end if;
end if;
end if;當以日位的進位為輸入,當存在輸入脈沖時,通過函數對月份進行加減,代碼如下: begin
if(clk'event and clk='1')then
if(ce='1')then
if(lock=“0000”)or(lock=“0001”)or(lock=“0011”and up='1')then
add_month(Tm0,Tm1,mon0,mon1);
end if;
if(lock=“0011”and up='0')then
sub_month(Tm0,Tm1,mon0,mon1);
end if;
if(lock=“0000”)or(lock=“0001”)then
if(mon0=“0010”and mon1=“0001”)then
sub_year(Ty0,Ty1,year0,year1);
end if;
end if;
if(lock=“0010”and up='1')then
add_year(Ty0,Ty1,year0,year1);
end if;
if(lock=“0010”and up='0')then
sub_year(Ty0,Ty1,year0,year1);
end if;
end if;
end if;3.2.4 顯示模塊
顯示模塊的輸入為年、月、日、時、分、秒、lock(狀態標志),通過if語句,狀態機一共提供11鐘狀態。在不同狀態下,給顯示模塊的年月日時分秒不同的輸入,從而得到要求的顯示。
顯示電路的RTL電路 代碼如下:
process(lock,sec0,sec1,min1,min0,hour1,hour0,date0,date1,mon0,mon1,year0,year1)begin if(lock=“0000”)then a0<=sec0;a1<=sec1;b0<=min0;b1<=min1;c0<=hour0;c1<=hour1;end if;if(lock=“0001”)then a0<=date0;a1<=date1;b0<=mon0;b1<=mon1;c0<=year0;c1<=year1;end if;if(lock=“0101”)or(lock=“1000”)then a0<=“1111”;a1<=“1111”;b0<=“1111”;b1<=“1111”;c0<=hour0;c1<=hour1;end if;if(lock=“0110”)or(lock=“1001”)then a0<=“1111”;a1<=“1111”;b0<=min0;b1<=min1;c0<=“1111”;c1<=“1111”;end if;if(lock=“0111”)or(lock=“1010”)then a0<=sec0;a1<=sec1;b0<=“1111”;b1<=“1111”;c0<=“1111”;c1<=“1111”;end if;if(lock=“0010”)then a0<=“1111”;a1<=“1111”;b0<=“1111”;b1<=“1111”;c0<=year0;c1<=year1;end if;if(lock=“0011”)then a0<=“1111”;a1<=“1111”;b0<=mon0;b1<=mon1;c0<=“1111”;c1<=“1111”;end if;if(lock=“0100”)then a0<=date0;a1<=date1;b0<=“1111”;b1<=“1111”;c0<=“1111”;c1<=“1111”;end if;end process;end led_disp_arc;3.2.5脈沖發生模塊(分頻電路)
脈沖發生電路將提供的1000hz頻率分頻成1hz(供系統時鐘)。f1000為1000hz輸入,second_wave為分頻輸出。
分頻器的RTL電路 代碼如下: process(f1000,cnt)begin if(f1000'event and f1000='1')then if(cnt=“00000011”)then cnt<=“000000000”;second_wave<=not second_wave;else cnt<=cnt+'1';end if;end if;end process;end second_wave_arc;3.2.6 揚聲器模塊
模塊的輸入為clk(系統時鐘),op(響應信號),vcc(鬧鐘使能端),ala(高電平輸出)。當vcc為高時,且當op有響應信號輸入(高),鬧鐘產生一定時長的高電平。
鬧鐘的RTL電路 代碼如下:
signal temp1:std_logic_vector(3 downto 0);begin process(op,vcc,clk)begin if clk'event and clk='1' then if(vcc='1')then if(temp1=“1111”)then ala<=not ala;
else
temp1<=temp1+'1';
ala<='1';
end if;
end if;
end if;end process;end alarm_arc;
3.3整體RTL電路
系統仿真與分析 4.1對基本要求的仿真
初態設置:setpin1=0;up=0;setpin置連續8個脈沖,f1000為頻率為1000hz的方波。
分析:在setpin第一次脈沖到來時,顯示年月日,因為數字鐘是初始狀態所以年月日均為0。Setpin。第二次脈沖到來時對時進行預置數,因為up=0,所以設置時位,時位在不斷地減小,在后面各位預置的過程中,每一位的預置過程都是減小。第三次脈沖來到是對分位進行預置,第四次脈沖到來時對秒位進行預置。第四次脈沖到來時對年進行預置,第五次脈沖到來時對月進行預置,第六次脈沖到來時對日進行預置。第七次脈沖到來時,數字鐘顯示時分秒,從仿真結果可以看出來,此時時鐘是從預置的時間開始計時的,第八次脈沖到來時,此時時鐘顯示的是年月日,此時顯示的年月日為預置的年月日。
從上述分析可以看出,經過仿真的程序基本達到數字鐘的基本要求,系統可靠。
4.2對鬧鐘狀態轉換的仿真
初始設置:初態設置:setpin1設計一個脈沖;up=0;setpin置連續2個脈沖,f1000為頻率為1000hz的方波。
當第一個setpin脈沖到來時,顯示年月日,第二個setpin脈沖來臨時時鐘對年進行預置,此后setpin1的第一個脈沖到來,時鐘的狀態轉為對鬧鐘時間的設置,達到實驗要求。
4.3對鬧鐘功能的仿真
初始設置:初態設置:setpin1設計三個脈沖;up=0;f1000為頻率為1000hz的方波。
數字鐘的原狀態顯示時分秒,由于未進行初始化,所以時分秒從0開始計時,當setpin1第一個脈沖到來時,數字鐘對鬧鐘的時刻的時位進行預置,當setpin1第二個脈沖到來時,數字鐘對鬧鐘的時刻的分位進行預置,當setpin1第三個脈沖到來時,數字鐘對鬧鐘的時刻的秒位進行預置,當第四個脈沖到來是恢復顯示時分秒,此時的時分秒已經計數到51秒,符合預期,在設置鬧鐘的同時,時鐘依舊計數,達到要求。
同時從初始時刻,鬧鐘的揚聲器產生一定時長高電平可以看出整點報時功能良好,達到設計要求。課程設計總結(收獲、體會和建議)本次VHDL設計的數字鐘定義了三種類型的端口,分別是in、out、buffer。In和out端口使用簡單,buffer端口具有回讀功能,因為buffer類型的端口不能連接到其他類型的端口上,因此不利于子模塊原件例化,不利于大型設計。
進程(Process)是VHDL中最為重要的部分,在本次設計中。我出現了對于時鐘引入,輸出多驅動,一個進程中不允許出現兩個時鐘沿觸發的錯誤,這些錯誤在未來的設計中都是應該避免的。順序語句如IF語句、CASE語句、LOOP語句、變量賦值語句等必須出現在進程、函數或子程序內部,而不能單獨出現在進程之外。
本次實驗讓我對VHDL 語言有了更深的認識,對語言的運用更加熟悉,為未來的實際應用打下了良好的基礎。因為實驗室的條件限制,并沒有將程序下載到實際器件中觀察現象,只是通過軟件對系統進行仿真,希望以后可以機會接觸并使用實際器件。6 參考文獻
1.吳廷鑫.基于FPGA的多功能數字鐘設計[J].科技經濟市場, 2015,(5): 1-5 2.徐大詔.基于FPGA實現的數字鐘設計[J].信息技術, 2009,(12): 101-104 3.張子剛, 盧戈, 田鵬.基于VHDL的數字時鐘的設計[J].氣象水文海洋儀器, 2008,(2): 10-14 4.樊永寧, 張曉麗.基于VHDL的多功能數字鐘的設計[J].工礦自動化, 2006,(3): 92-94 5.江翠云 基于CPLD和VHDL的數字鐘的設計[期刊論文]-硅谷2010(2)
第二篇:基于FPGA的數字鐘課程設計
計算機與信息工程系
《脈沖與數字電路》 課程設計報告
專業
通信工程
班級
B090507
學號
B09050722
姓名
張亞威
報告完成日期
2011/06/24
指導教師
秦玉潔
評語:
成績:
批閱教師簽名:
批閱時間:
1.任務和設計要求
設計具有時、分、秒計數顯示,以24小時循環計時的時鐘電路,帶有清零和校準功能;
2.設計原理
采用硬件描述語言Verilog 進行編程,實現20MHZ晶振到1HZ的分頻;采用verilog語言實現數字表功能實現的各個模塊;通過各個模塊的代碼生成相應的模塊原理圖;再將各個模塊生成的原理圖進行疊加組成一個數字表系統;
3.系統設計
設計的數字表有6個輸入,16個輸出;
6個輸入中,有一個是時鐘信號,開發板上的28號引腳輸入的50MHZ的時鐘信號;一個清零端,當數字表正常顯示時,按下清零端可以實現
數字鐘整體電路圖:
4.各個模塊設計
基于EP1C6Q240C8的數字鐘設計,有6個模塊組成: Fdiv 分頻模塊
Control 模式選擇模塊 Tune 校正模塊 Zoushi 時間正常運行模塊 Saomiao 數碼管動態掃描模塊; Decoder BCD譯碼模塊;
Fdiv 模塊:
功能:實現20MHZ的時鐘信號分成10KHZ的信號和1HZ的信號;
輸入:clk 為20MHZ的時鐘信號; 輸出:f10000HZ 為10KH的時鐘信號;
F1HZ 為1HZ的時鐘信號; Fdiv 模塊代碼:
module fdiv(clk,f10000Hz,f1Hz);output f10000Hz,f1Hz;input clk;reg f10000Hz,f1Hz;integer CNT1=0,CNT2=0;always@(posedge clk)
begin
if(CNT1<1999)
begin
CNT1=CNT1+1;
f10000Hz<=1'b0;
end
else
begin
CNT1=0;
f10000Hz<=1'b1;
end
end
always@(posedge f10000Hz)
begin
if(CNT2<9999)
begin
CNT2=CNT2+1;
f1Hz<=1'b0;
end
else
begin
CNT2=0;
f1Hz<=1'b1;
end
end endmodule fdiv 模塊波形仿真:
由于實際的分頻波形仿真中,由于要將20MHZ的分成1HZ的,需要將信號縮小20 000 000倍,因此,此處采用將20HZ的先分成10HZ,然后再將10HZ的分成1HZ的時鐘信號;在仿真中這樣整,在實際演示中再改下代碼,實現真正的20MHZ到1HZ的分頻;它們只是一個倍數關系而已;
Control 模塊:
功能:實現電子表的正常顯示及時間校正模式的轉換;
輸入:key 模式修改鍵,每來一個高電平,mode加一次。如果mode 的值為2,則mode被賦值為 1;
Reset 復位鍵,如果reset 為 1,則mode 被賦值為0; 輸出:mode 用于輸出到下一級模塊,進行模式判斷; Control 模塊源代碼:
module control(mode,key,reset);input key,reset;output[1:0] mode;reg[1:0] mode;always@(posedge key)begin
if(reset)
begin
mode<=2'b00;
end
else
begin
mode<=mode+2'b01;
if(mode==2)
begin
mode<=2'b00;
end
end end endmodule Control 模塊波形仿真
Tune 模塊
功能:實現秒分時的校正;
輸入:Mode 為模式選擇,mode為0時是正常顯示時間模式;mode 為1時,是秒、分、時加一模式。Mode為2時,是時分秒減一模式;
Ht 為時調節輸入;
mt 為分調節輸入;
St 為秒調節輸入;
輸出:Aa 為秒的個位;
Ba 為秒的十位;
Da 為分鐘的個位;
Ea 為分鐘的十位;
Ga 為小時的個位;
Ha 為小時的十位; Tune 調時模塊源代碼:
module tune(mode,ht,mt,st,aa,ba,da,ea,ga,ha);input[1:0] mode;input ht;input mt;input st;output[3:0] aa;output[2:0] ba;output[3:0] da;output[2:0] ea;output[3:0] ga;output[1:0] ha;reg[3:0] aa,da,ga;reg[2:0] ba,ea;reg[1:0] ha;
always@(posedge st)begin
if(mode==1)
begin
aa<=aa+1;
if(aa==9)
begin
ba<=ba+1;
aa<=0;
end
if(ba==5&&aa==9)
ba<=0;
end
else if(mode==2)
begin
aa<=aa-1;
if(aa==0)
begin
ba<=ba-1;
aa<=9;
end
if(ba==0&&aa==0)
ba<=5;
end end always@(posedge mt)begin
if(mode==1)
begin
da<=da+1;
if(da==9)
begin
ea<=ea+1;
da<=0;
end
if(ea==5&&da==9)
ea<=0;
end
else if(mode==2)
begin
da<=da-1;
if(da==0)
begin
ea<=ea-1;
da<=9;
end
if(ea==0&&da==0)
ea<=5;
end end always@(posedge ht)begin
if(mode==1)
begin
ga<=ga+1;
if(ga==9)
begin
ha<=ha+1;
ga<=0;
end
if(ha==2&&ga==3)
begin
ha<=0;
ga<=0;
end
end
else if(mode==2)
begin
ga<=ga-1;
if(ga==0)
begin
ha<=ha-1;
ga<=9;
end
if(ga==0&&ha==0)
begin
ga<=3;
ha<=2;
end
end end
endmodule Tune
調時模塊仿真波形:
Mode 為0 時,ht,mt,st均不起作用;
Mode 為1時,小時加到23,ht再來一個上升沿,小時變為0;
Mode 為1時,秒、分加到59,st、mt再來一個上升沿,秒、分變成0;
Mode 為2時,小時減到0,ht再來一個上升沿,小時變為23;
Mode 為2時,秒、分減到0,st、mt再來一個上升沿,秒、分變成59;
Zou shi模塊:
功能:實現時間的正常顯示及校正顯示;
正常顯示,當秒加到59時,1HZ的脈沖信號CLK1再來一個上升沿,秒變為0,同時分加一;
當正常顯示時,復位端來一個上升沿的脈沖,顯示變成輸入端輸入的數據;
Mode 變成模式1時,顯示變成輸入端輸入的數據;
Mode 變成模式2時,顯示變成輸入端輸入的數據;
Sao miao模塊:
功能:實現數碼管的動態掃描;
輸入:clk10K 輸入10KHZ的時鐘信號作為數碼管的動態掃描時鐘信號;
a[3..0] 上一級輸出的秒的個位;
b[2..0] 上一級輸出的秒的十位;
c[3..0] 上一級輸出的分秒之間的標志位;
d[3..0] 上一級輸出的分的個位;
e[2..0] 上一級輸出的分的十位;
f[2..0] 上一級輸出的秒的時分之間的標志位; g[3..0] 上一級輸出的時的個位;
h[2..0] 上一級輸出的時的個位;
輸出:zx[3..0]數碼管將要顯示的4位BCD碼;
Zw[7..0]八位數碼管動態掃描輸出; Sao miao 數碼管掃描模塊源代碼:
module saomiao(a,b,c,d,e,f,g,h,f10000HZ,zx,zw);input f10000HZ;input[3:0] a,d,g,c,f;input[2:0] b,e;input[1:0] h;output[3:0] zx;output[7:0] zw;reg[3:0] zx;
reg[7:0] zw;reg[2:0] slip;always@(posedge f10000HZ)begin
if(slip==100)
slip<=4'b000;
else
slip<=slip+1'b1;end always@(slip)begin
case(slip)
4'd0:begin zw=8'b11111110;zx=a;end
4'd1:begin zw=8'b11111101;zx=b;end
4'd2:begin zw=8'b11111011;zx=c;end
4'd3:begin zw=8'b11110111;zx=d;end
4'd4:begin zw=8'b11101111;zx=e;end
4'd5:begin zw=8'b11011111;zx=f;end
4'd6:begin zw=8'b10111111;zx=g;end
4'd7:begin zw=8'b01111111;zx=h;end
default:zw=8'bx;
endcase end endmodule Sao miao 數碼管掃描模塊仿真波形:
Zx顯示的是上一級輸出的4位BCD碼,此處是以十進制的形式顯示的;
Decoder 模塊:
功能:將上一級輸出的4為BCD碼轉換成數碼管能正常顯示的數據;
輸入:zx[3..0]上一級輸出的4位BCD碼; 輸出:seg[6..0]數碼管能正常顯示的數據;
Decoder 譯碼模塊源代碼: module decoder(zx,seg);input[3:0] zx;output[6:0] seg;reg[6:0] seg;always@(zx)begin case(zx)4'b0000: seg<=7'b0111111;4'b0001: seg<=7'b0000110;4'b0010: seg<=7'b1011011;4'b0011: seg<=7'b1001111;4'b0100: seg<=7'b1100110;4'b0101: seg<=7'b1101101;4'b0110: seg<=7'b1111101;4'b0111: seg<=7'b0000111;4'b1000: seg<=7'b1111111;4'b1001: seg<=7'b1101111;4'b1010: seg<=7'b1000000;
default:seg<=7'bx;
endcase end endmodule Decoder 譯碼模塊仿真波形:
輸入的4位BCD碼從0~10,則數碼管顯示0~9和一橫標志位;
5.系統調試與性能分析
在第一次做好之后,下載到開發板里面,出現了問題,不能下載成功;最初認為是下載器的驅動沒有安裝好,后來經過認真的分析是因為在選擇芯片的時候,選錯了芯片;在進行了芯片的正確選擇,以及引腳的正確配置后,成功的加生成的.sof文件下載到了開發板中;
6.設計過程中遇到的問題及解決方法。
程序完全調時成功后,下載到開發板中,顯示全部為0,可能是時鐘分頻的問題;解決方法是修改源代碼,進行正確的時鐘信號分頻;
第三篇:FPGA課程設計多功能數字鐘講解
多功能數字鐘
開課學期:2014—2015 學年第二學期 課程名稱: FPGA課程設計
學 院: 信息科學與工程學院
專 業: 集成電路設計與集成系統
班 級: 學 號: 姓 名:
任課教師:
2015 年 7 月 21 日
說 明
一、論文書寫要求與說明
1.嚴格按照模板進行書寫。自己可以自行修改標題的題目 2.關于字體:
a)題目:三號黑體加粗。
b)正文:小四號宋體,行距為1.25倍。
3.嚴禁抄襲和雷同,一經發現,成績即判定為不及格??!
二、設計提交說明
1.設計需要提交“電子稿”和“打印稿”;
2.“打印稿”包括封面、說明(即本頁內容)、設計內容三部分;訂書機左邊裝訂。
3.“電子稿”上交:文件名為 “FPGA課程設計報告-班級-學號-姓名.doc”,所有報告發送給班長,由班長統一打包后統一發送到付小倩老師。
4.“打印稿”由班長收齊后交到:12教305辦公室; 5.上交截止日期:2015年7月31日17:00之前。
第一章
緒論....................................................................................................................3 關鍵詞:FPGA,數字鐘....................................................................................................3 第二章 FPGA的相關介紹...............................................................................................4 2.1 FPGA概述........................................................................................................4 2.2 FPGA特點...........................................................................................................4 2.3 FPGA設計注意...................................................................................................5 第三章 Quartus II與Verilog HDL相關介紹..................................................................7 3.1 Quartus II..............................................................................................................7 3.2 Verilog HDL......................................................................................................7 第四章 設計方案..............................................................................................................8 4.1數字鐘的工作原理..............................................................................................8 4.2 按鍵消抖.............................................................................................................8 4.3時鐘復位..............................................................................................................8 4.4時鐘校時..............................................................................................................8 4.5數碼管顯示模塊。..............................................................................................8 第五章 方案實現與驗證..................................................................................................9 5.1產生秒脈沖..........................................................................................................9 5.2秒個位進位..........................................................................................................9 5.3按鍵消抖..............................................................................................................9 5.4復位按鍵設置....................................................................................................10 5.5 數碼管顯示。...................................................................................................10 5.6 RTL結構總圖....................................................................................................11 第六章 實驗總結............................................................................................................14 第七章 Verilog HDL源代碼附錄..................................................................................15
第一章
緒論
現代社會的標志之一就是信息產品的廣泛使用,而且是產品的性能越來越強,復雜程度越來越高,更新步伐越來越快。支撐信息電子產品高速發展的基礎就是微電子制造工藝水平的提高和電子產品設計開發技術的發展。前者以微細加工技術為代表,而后者的代表就是電子設計自動化(electronic design automatic, EDA)技術。
本設計采用的VHDL是一種全方位的硬件描述語言,具有極強的描述能力,能支持系統行為級、寄存器傳輸級和邏輯門級這三個不同層次的設計;支持結構、數據流、行為三種描述形式的混合描述,覆蓋面廣,抽象能力強,因此在實際應用中越來越廣泛。ASIC是專用的系統集成電路,是一種帶有邏輯處理的加速處理器;而FPGA是特殊的ASIC芯片,與其它的ASIC芯片相比,它具有設計開發周期短、設計制造成本低、開發工具先進、標準產品無需測試、質量穩定以及可實時在線檢測等優點。
在控制系統中,鍵盤是常用的人機交換接口,當所設置的功能鍵或數字鍵按下的時候,系統應該完成該鍵所對應的功能。因此,按鍵信息輸入是與軟件結構密切相關的過程。根據鍵盤結構的不同,采用不同的編碼方法,但無論有無編碼以及采用什么樣的編碼,最后都要轉換成為相應的鍵值,以實現按鍵功能程序的轉移。[1] 鐘表的數字化給人們生產生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、定時啟閉電路、定時開關烘箱、通斷動力設備,甚至各種定時電氣的自動啟用等,所有這些都是以鐘表數字化為基礎的。因此研究數字鐘以及擴大其應用有著非?,F實的意義。
關鍵詞:FPGA,數字鐘
第二章 FPGA的相關介紹
FPGA(Field-Programmable Gate Array),即現場可編程門陣列,它是在PAL、GAL、CPLD等可編程器件的基礎上進一步發展的產物。它是作為專用集成電路(ASIC)領域中的一種半定制電路而出現的,既解決了定制電路的不足,又克服了原有可編程器件門電路數有限的缺點。
2.1 FPGA概述
系統設計師可以根據需要通過可編輯的連接把FPGA內部的邏輯塊連接起來,就好像一個電路試驗板被放在了一個芯片里。一個出廠后的成品FPGA的邏輯塊和連接可以按照設計者而改變,所以FPGA可以完成所需要的邏輯功能。
FPGA一般由3種可編程電路和一個用于存放編程數據的靜態存儲器SRAM組成。這3種可編程電路是:可編程邏輯模塊(CLB--Configurable Logic Block)、輸入/輸出模塊(IOB--I/O Block)和互連資源(IR—Interconnect Resource)??删幊踢壿嬆KCLB是實現邏輯功能的基本單元,它們通常規則的排列成一個陣列,散布于整個芯片;可編程輸入/輸出模塊(IOB)主要完成芯片上的邏輯與外部封裝腳的接口,它通常排列在芯片的四周;可編程互連資源包括各種長度的連接線段和一些可編程連接開關,它們將各個CLB之間或CLB、IOB之間以及IOB之間連接起來,構成特定功能的電路。
FPGA一般來說比ASIC(專用集成芯片)的速度要慢,無法完成復雜的設計,而且消耗更多的電能。但是他們也有很多的優點比如可以快速成品,可以被修改來改正程序中的錯誤和更便宜的造價。廠商也可能會提供便宜的但是編輯能力差的FPGA。因為這些芯片有比較差的可編輯能力,所以這些設計的開發是在普通的FPGA上完成的,然后將設計轉移到一個類似于ASIC的芯片上。另外一種方法是用CPLD(復雜可編程邏輯器件備)。
2.2 FPGA特點
FPGA的基本特點主要有:
1)采用FPGA設計ASIC電路,用戶不需要投片生產,就能得到合用的芯片。
2)FPGA可做其它全定制或半定制ASIC電路的中試樣片。3)FPGA內部有豐富的觸發器和I/O引腳。
4)FPGA是ASIC電路中設計周期最短、開發費用最低、風險最小的器件之一。5)FPGA采用高速CHMOS工藝,功耗低,可以與CMOS、TTL電平兼容??梢哉f,FPGA芯片是小批量系統提高系統集成度、可靠性的最佳選擇之一。編程互連資源IR可以將FPGA內部的CLB和CLB之間、CLB和IOB之間連接起來,構成各種具有復雜功能的系統。
FPGA是由存放在片內RAM中的程序來設置其工作狀態的,因此,工作時需要對片內的RAM進行編程。用戶可以根據不同的配置模式,采用不同的編程方式。
加電時,FPGA芯片將EPROM中數據讀入片內編程RAM中,配置完成后,FPGA進入工作狀態。掉電后,FPGA恢復成白片,內部邏輯關系消失,因此,FPGA能夠反復使用。FPGA的編程無須專用的FPGA編程器,只須用通用的EPROM、PROM編程器即可。當需要修改FPGA功能時,只需換一片EPROM即可。這樣,同一片FPGA,不同的編程數據,可以產生不同的電路功能。因此,FPGA的使用非常靈活。
FPGA有多種配置模式:并行主模式為一片FPGA加一片EPROM的方式;主從模式可以支持一片PROM編程多片FPGA;串行模式可以采用串行PROM編程FPGA;外設模式可以將FPGA作為微處理器的外設,由微處理器對其編程。
2.3 FPGA設計注意
不管你是一名邏輯設計師、硬件工程師或系統工程師,甚或擁有所有這些頭銜,只要你在任何一種高速和多協議的復雜系統中使用了FPGA,你就很可能需要努力解決好器件配置、電源管理、IP集成、信號完整性和其他的一些關鍵設計問題。不過,你不必獨自面對這些挑戰,因為在當前業內領先的FPGA公司里工作的應用工程師每天都會面對這些問題,而且他們已經提出了一些將令你的設計工作變得更輕松的設計指導原則和解決方案。
本次實驗所采用的FPGA器件是Altera Cyclone V 5CSEMA5F31C6N
FPGA實物圖
FPGA數碼管介紹,每節數碼管低電平點亮高電平熄滅。LED序號如下圖所示:
根據上圖所示的順序,可以得出顯示的數組代碼。
4'd0: HEX0=7'b1000000;4'd1: HEX0=7'b1111001;4'd2: HEX0=7'b0100100;4'd3: HEX0=7'b0110000;4'd4: HEX0=7'b0011001;4'd5: HEX0=7'b0010010;4'd6: HEX0=7'b0000010;4'd7: HEX0=7'b1111000;4'd8: HEX0=7'b0000000;4'd9: HEX0=7'b0010000;
//0 低電平點亮高電平熄滅 //1 //2 //3 //4 //5 //6 //7 //8 //9 default: HEX0=7'b1111111;//不符合條件的顯示零
第三章 Quartus II與Verilog HDL相關介紹
3.1 Quartus II Quartus II 是Altera公司的綜合性PLD/FPGA開發軟件,原理圖、VHDL、VerilogHDL以及AHDL(Altera Hardware 支持Description Language)等多種設計輸入形式,內嵌自有的綜合器以及仿真器,可以完成從設計輸入到硬件配置的完整PLD設計流程。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模塊庫,使用戶可以充分利用成熟的模塊,簡化了設計的復雜性、加快了設計速度。對第三方EDA工具的良好支持也使用戶可以在設計流程的各個階段使用熟悉的第三方EDA工具。
Quartus II 軟件擁有友好的界面,使用便捷,功能強大,當中可編程邏輯設計環境采用完成集成化,是先進的EDA工具軟件。該軟件具備諸多特點(例如:開放性,與結構無聯系,多平臺設計,完全集成化,設計庫豐富、工具模塊化等),支持原理圖、VHDL、VerilogHDL以及AHDL等多種設計輸入形式。Quartus II能夠在多系統上使用,為用戶的設計方式提供了完善的圖形界面。具有運行速度快,界面統一,功能集中,學用簡單等特點。
圖形或HDL編輯Analysis & Synthesis(分析與綜合)Filter(適配器)Assembler(編程文件匯編)編輯器Timing Analyzer(時序分析器)設計輸入綜合或編譯適配器件下載仿真
3.2 Verilog HDL
Verilog HDL是一種硬件描述語言(HDL:Hardware Description Language),以文本形式來描述數字系統硬件的結構和行為的語言,用它可以表示邏輯電路圖、邏輯表達式,還可以表示數字邏輯系統所完成的邏輯功能。Verilog HDL和VHDL是世界上最流行的兩種硬件描述語言,都是在20世紀80年代中期開發出來的。前者由Gateway Design Automation公司(該公司于1989年被Cadence公司收購)開發。兩種HDL均為IEEE標準。
第四章 設計方案
4.1數字鐘的工作原理
振蕩器產生穩定的高頻脈沖信號,作為數字鐘的時間基準,然后經過分頻器輸出標準秒脈沖。秒計數器滿60后向分計數器進位,分計數器滿60后向小時計數器進位,小時計數器按照“24翻0”規律計數。計數滿后各計數器清零,重新計數。計數器的輸出分別經譯碼器送數碼管顯示。計時出現誤差時,可以用校時電路校時、校分。控制信號由三個獨立按鍵輸入。輸入信號選擇FPGA器件上的50MHZ時鐘信號。
4.2 按鍵消抖
因為按鍵的物理結構并非理想式開關,在按鍵按下后會在一個很短的時間內出現電平抖動的情況,因此需要對按鍵進行消抖處理。這里的按鍵消抖與單片機中的按鍵消抖問題有所不同,不能采用延時的方法進行按鍵消抖,這里我選用對時鐘脈沖計數的方式來判斷按鍵是否按下。采用50MHZ時鐘信號,實測160ms的消抖時長較為合適,即8000000個時鐘上升沿。
4.3時鐘復位
按下復位按鍵后,所有位清零。
4.4時鐘校時
時鐘計時過程中,可對時鐘進行校時。本次設計不考慮對秒位進行校時,分鐘的個位和小時的個位加到10時會自動進位,因此只對分鐘的個位和小時的個位設置可以加1的校時按鈕,即可實現校時功能。整體比較容易實現。
4.5數碼管顯示模塊。
選擇需要顯示的時鐘位數作為敏感詞,用上述給出的顯示代碼對時鐘的每一位分別進行顯示處理。
第五章 方案實現與驗證
5.1產生秒脈沖
always@(posedge clk)。。。
如代碼展現,當計數器count記到50000000個時鐘上升沿的時候,向秒個位進1.count=count+1;
begin
end count=0;count_s0=count_s0+1;
//秒個位計數
if(count==32'd50000000)
//產生一個一秒的脈沖,//敏感詞為50MHZ時鐘上升沿
5.2秒個位進位
當秒的個位計數到10的時候,向秒的十位進位。
if(count_s0==4'd10)
begin
end count_s0=0;count_s1=count_s1+1;
//產生秒十位進位
5.3按鍵消抖
if(!inrst_m0)
count0=count0+1;if(count0==32'd8000000 &&!inrst_m0)
begin count0=0;count_m0=count_m0+1;end
對時鐘秒沖進行計數,計數達到8000000時,判斷此時的電平是否為0,若還是為0,則判斷按鍵按下,執行分鐘個位加1操作。
5.4復位按鍵設置
begin
if(!reset)
begin
count=0;
count_s0=0;count_s1=0;
count_m0=0;count_m1=0;
count_h0=0;count_h1=0;
end else
復位按鍵按下后所有位置零。
5.5 數碼管顯示。
always@(count_s0)
begin
case(count_s0)
4'd0: HEX0=7'b1000000;
4'd1: HEX0=7'b1111001;
4'd2: HEX0=7'b0100100;
4'd3: HEX0=7'b0110000;
4'd4: HEX0=7'b0011001;
4'd5: HEX0=7'b0010010;
4'd6: HEX0=7'b0000010;
4'd7: HEX0=7'b1111000;
4'd8: HEX0=7'b0000000;
4'd9: HEX0=7'b0010000;
default: HEX0=7'b1111111;
endcase end
//按鍵按下為邏輯0
//復位置零
//秒個位顯示
//0 低電平點亮高電平熄滅 //1 //2 //3 //4 //5 //6 //7 //8 //9
//不符合條件的顯示零
5.6 RTL結構總圖
顯示部分如下圖:
判斷主體如下圖:
部分引腳圖展現
最終實驗現象:
第六章 實驗總結
其實本次的多功能數字鐘設計其實應該還有很多其他的方法,比如用到外部中斷功能進行時鐘的校時,采用按鍵輸入加數碼管閃爍的方式進行校時位的選擇,但限于時間較短,這部分知識空白,所以本次設計實有所缺陷。
經歷了本次FPGA的設計,有很多感受,首先就是看了一點數字鐘設計方面的資料,遇到很多不理解的地方,于是就需要再和同學進行研究討論,在討論的過程中,能聽到其他人的思路,感覺特別有意思,同樣的功能,實現的方法有許許多多,努力把自己的想法實現,或是選擇一種你喜歡的設計借鑒一下,兩者都是很好的選擇。
通過這次設計實驗,著實培養了我們獨立思考、解決問題的能力,從最一開始的一籌莫展,沒有一點思路,感覺像平底拔樓一樣,從兩手空空到產生一個控制電路,從無到有,這是創造的力量。同時,和其他同學討論的過程也很重要,要說的還有就是最后實驗成功的喜悅是無可替代的,就好像你親手種的果樹長出了果實,養的雞下了雞蛋,是一種創造的喜悅,整個心就像是一個大箱子里面放著一塊糖,隱隱約約總能感覺到一絲甜蜜。
數碼管顯示的數字鐘是常見的技術,這次基于FPGA的多功能數字鐘設計具有很高的工程價值和現實意義。讓我們將知識服務于生活,將知識用于實踐,鍛煉了我們發現問題解決問題的能力。
這次FPGA的多功能數字鐘設計,加深了我們對FPGA設計的理解,培養了我們的邏輯思維和動手操作能力,使我們將知識與技能鏈接起來,使我們每個人的都在不斷進步,提高了專業技能,提高了動手實踐的綜合能力。
第七章 Verilog HDL源代碼附錄
module clock(reset,inrst_m0,inrst_h0,clk,HEX0,HEX1,HEX2,HEX3,HEX4,HEX5);input clk,reset,inrst_m0,inrst_h0;output reg [6:0] HEX0,HEX1,HEX2,HEX3,HEX4,HEX5;reg [31:0] count=0,count0=0,count1=0;reg [3:0] count_s0=0,count_s1=0,count_m0=0,count_m1=0, count_h0=0,count_h1=0;
//實際寬度為25 always@(posedge clk)begin
if(!inrst_m0)
count0=count0+1;if(count0==32'd8000000 &&!inrst_m0)//按鍵消抖
begin count0=0;count_m0=count_m0+1;end if(!inrst_h0)count1=count1+1;if(count1==32'd8000000 &&!inrst_h0)
begin count1=0;count_h0=count_h0+1;end
//按鍵按下為邏輯0
//復位置零 if(!reset)begin count=0;count_s0=0;count_s1=0;count_m0=0;count_m1=0;count_h0=0;count_h1=0;end count=count+1;begin else
if(count==32'd50000000)
//產生一個一秒的脈沖,end count=0;count_s0=count_s0+1;
//秒個位計數
else if(count_s0==4'd10)
begin
end count_s0=0;count_s1=count_s1+1;
//產生秒十位進位
else if(count_s1==4'd6)
begin
end
//分個位計數 count_s1=0;count_m0=count_m0+1;else if(count_m0==4'd10)
begin
end
//分十位計數 count_m0=0;count_m1=count_m1+1;else if(count_m1==4'd6)
begin
end
//時個位計數 count_m1=0;count_h0=count_h0+1;else if(count_h0==4'd10)
begin
end
//滿24判斷 count_h0=0;count_h1=count_h1+1;else if(count_h0==4 && count_h1==2)
begin
count_h0=0;
count_h1=0;end
end
always@(count_s0)
begin
case(count_s0)
4'd0: HEX0=7'b1000000;
4'd1: HEX0=7'b1111001;
4'd2: HEX0=7'b0100100;
4'd3: HEX0=7'b0110000;
4'd4: HEX0=7'b0011001;
4'd5: HEX0=7'b0010010;
4'd6: HEX0=7'b0000010;
4'd7: HEX0=7'b1111000;
4'd8: HEX0=7'b0000000;
4'd9: HEX0=7'b0010000;
default: HEX0=7'b1111111;
endcase end
always@(count_s1)
begin
case(count_s1)
4'd0: HEX1=7'b1000000;
4'd1: HEX1=7'b1111001;
4'd2: HEX1=7'b0100100;
4'd3: HEX1=7'b0110000;
4'd4: HEX1=7'b0011001;
4'd5: HEX1=7'b0010010;
default: HEX1=7'b1111111;endcase
//秒個位顯示
//0 低電平點亮高電平熄滅//1 //2 //3 //4 //5 //6 //7 //8 //9
//不符合條件的顯示零
//秒十位顯示
//0 低電平點亮高電平熄滅//1 //2 //3 //4 //5
//不符合條件的顯示零
end
always@(count_m0)
begin
case(count_m0)
4'd0: HEX2=7'b1000000;
4'd1: HEX2=7'b1111001;
4'd2: HEX2=7'b0100100;
4'd3: HEX2=7'b0110000;
4'd4: HEX2=7'b0011001;
4'd5: HEX2=7'b0010010;
4'd6: HEX2=7'b0000010;
4'd7: HEX2=7'b1111000;
4'd8: HEX2=7'b0000000;
4'd9: HEX2=7'b0010000;
default: HEX2=7'b1111111;
endcase end always@(count_m1)
begin
case(count_m1)
4'd0: HEX3=7'b1000000;
4'd1: HEX3=7'b1111001;
4'd2: HEX3=7'b0100100;
4'd3: HEX3=7'b0110000;
4'd4: HEX3=7'b0011001;
4'd5: HEX3=7'b0010010;
default: HEX3=7'b1111111;
endcase end always@(count_h0)
begin
case(count_h0)
4'd0: HEX4=7'b1000000;4'd1: HEX4=7'b1111001;
//分個位顯示
//0 低電平點亮高電平熄滅 //1 //2 //3 //4 //5 //6 //7 //8 //9
//不符合條件的顯示零
//分十位顯示
//0 低電平點亮高電平熄滅 //1 //2 //3 //4 //5
//不符合條件的顯示零
//時個位顯示
//0 低電平點亮高電平熄滅 //1
4'd2: HEX4=7'b0100100;
4'd3: HEX4=7'b0110000;
4'd4: HEX4=7'b0011001;
4'd5: HEX4=7'b0010010;
4'd6: HEX4=7'b0000010;
4'd7: HEX4=7'b1111000;
4'd8: HEX4=7'b0000000;
4'd9: HEX4=7'b0010000;
default: HEX4=7'b1111111;endcase End
always@(count_h1)
begin
case(count_h1)
4'd0: HEX5=7'b1000000;
4'd1: HEX5=7'b1111001;
4'd2: HEX5=7'b0100100;
default: HEX5=7'b1111111;
endcase end
endmodule
//2 //3 //4 //5 //6 //7 //8 //9
//不符合條件的顯示零
//時十位顯示
//0 低電平點亮高電平熄滅//1 //2
//不符合條件的顯示零
第四篇:數字鐘課程設計報告
摘要
數字電子鐘是一種用數字顯示秒﹑分﹑時的記時裝置,與傳統的機械時鐘相比,它一般具有走時準確﹑顯示直觀﹑無機械傳動裝置等優點,因而得到了廣泛的應用。數字電子鐘的設計方法有許多種,例如,可用中小規模集成電路組成電子鐘;也可以利用專用的電子鐘芯片配以顯示電路及其所需要的外圍電路組成電子鐘;還可以利用單片機來實現電子鐘等等。本課程設計采用的是中小規模集成電路法,時鐘信號發生器采用32768Hz的CMOS石英諧振器制作,產生1Hz時鐘脈沖;用74LS290設計兩個六十進制的計數器對“分”、“秒”信號計數,二十四進制計數器對“時”信號計數、再通過“時”、“分”校正電路進行時間的校正,實現數字電子鐘的功能。
關鍵詞
數字電子鐘;中小規模集成芯片;計數器;數字電子技術
設計的目的
(1)加強對電子制作的認識,充分掌握和理解設計個部分的工作原理、設計過程、選擇芯片器件、電路的焊接與調試等多項知識。(2)把理論知識與實踐相結合,充分發揮個人與團隊協作能力,并在實踐中鍛煉。(3)提高利用已學知識分析和解決問題的能力。(4)提高實踐動手能力
設計用到的儀器和零件
計數器(3片CD4518、CD4081)、顯示譯碼器(6片CD4511)、6片共陰極數碼管、二極管、電阻、電容、晶振(32.768kHz)、集成計數器(CD4060、CD4013)、開關、接線座、PCB板等元件。
數字鐘的結構及基本工作原理
結構
數字電子時鐘實際上是一個對標準頻率(1Hz)進行計數的計數電路。由于計數的起始時間不可能與某一個標準時間(如東八時區時間)一致,故需要在電路上加上一個對“時”、“分”進行校正的校時電路,同時為了提高計時的準確性,信號發生器產生的標準的1Hz時間信號必須做到準確穩定,通常使用石英晶體振蕩器電路構成數字電子時鐘中的信號發生器電路的主元件。
(1)晶體振蕩器電路給數字鐘提供一個頻率穩定準確的32768Hz的方波信號,可保證數字鐘的走時準確及穩定。不管是指針式的電子鐘還是數字顯示的電子鐘都使用了晶體振蕩器電路。
(2)分頻器電路將32768Hz的高頻方波信號經3276次分頻后得到1Hz的方波信號供秒計數器進行計數。分頻器實際上也就是計數器。
(3)時間計數電路由秒個位和秒十位計數器、分個位和分十位計數器及時個位和時十位計數器電路構成,其中秒個位和秒十位計數器、分個位和分十位計數器為60進制計數器,而根據設計要求,時個位和時十位計數器為12進制計數器。
(4)譯碼驅動電路將計數器輸出的8421BCD碼轉換為數碼管需要的邏輯狀態,并且為保證數碼管正常工作提供足夠的工作電流。
(5)數碼管通常有發光二極管(LED)數碼管和液晶(LCD)數碼管,本設計提供的為LED數碼管。
工作原理
(1)秒脈沖產生電路— CD4060
14位二進制串行計數器 CD4060。CD4060 是由一振蕩器和 14 級二進制串行計數位組成。振蕩器的結構可以是 RC 或晶振電路。CR 為高電平時,計數器清零且振蕩器停止工作。所有的計數器均為主-從觸發器,在 CP1(和 CP0)的下降沿,計數器以二進制進行計數。在時鐘脈沖線上使用斯密特觸發器對時鐘的上升和下降時間無限制。利用CD4060組成32.768 kHz振蕩器,再經過內部分頻器14分頻從其第3腳輸出2Hz(32.768 kHz /214 = 2 Hz)的脈沖信號。焊接完畢后,通電測試 LED指示燈閃爍,1秒鐘閃爍 2次。說明該電路正常工作
(2)分脈沖產生電路— CD4518 CD4518,是一種同步加計數器,在一個封裝中含有兩個可互換二 / 十進制計數器,其功能引腳分別為1~7和9~15。該計數器是單路系列脈沖輸入(1 腳或 2 腳;9 腳或 10腳),4路BCD碼信號輸出(3腳~6腳;{11}腳~{14}腳)。此外還必須掌握其控制功能,否則無法工作CD4518有兩個時鐘輸入端CP和EN,若用時鐘上升沿觸發,信號由CP輸入,此時EN端應接高電平“1”, 若用時鐘下降沿觸發,信號由EN端輸入,此時CP端應接低電平“0”,不僅如此,清零(又稱復位)端CR也應保持低電平“0”,只有滿足了這些條件時,電路才會處于計數狀態,若不滿足則不工作。值得注意,因輸出是二/十進制的BCD碼,所以輸入端的計數脈沖到第十個時,電路自動復位0000狀態。另外,CD4518無進位功能的引腳,但電路在第十個脈沖作用下,會自動復位,同時第6腳或第14 腳將輸出下降沿的脈沖,利用該脈沖和EN端功能,就可作為計數的電路進位脈沖和進位功能端供多位數顯用。(3)小時脈沖產生電路— CD4518 與分脈沖產生電路的結構工作原理相同,只是為24進制。
(4)與門電路— CD4081 CD4081為14腳封裝,四2輸入與門。在數字鐘電路中的作用:將CD4518置為60進制、24進制計數器。
(5)2分頻電路— CD4013 CD4013 是雙 D 觸發器芯片,為14腳封裝,在數字電路中常用來進行鎖存數據,組成分頻電路等。CD4013 在數字鐘電路中的作用:將 CD4060 產生的2Hz 脈沖2分頻(2進制計數器),輸出 1Hz 的秒脈沖。(6)譯碼顯示電路— CD4511 CD4511 是一片 CMOS BCD —鎖存 / 7 段譯碼 / 驅動器,用于驅動共陰極LED數碼管顯示器的BCD碼—七段數碼管譯碼器。具有BCD轉換、消隱和鎖存控制、七段譯碼及驅動功能的CMOS電路,能提供較大的拉電流。共陰 LED 數碼管是指 7 段 LED 的陰極是連在一起的,在應用中應接地。限流電阻要根據電源電壓來選取,電源電壓5V時,可使用300Ω左右的限流電阻。(7)秒、分、時校準電路—開關S3、S2、S1 分、時校準電路:利用開關手動輸入脈沖,S2、S1每按下一次,相應的時、分的數字加一。秒校準電路:正常計時工作時,S3閉合;進行秒校準時,S3斷開,暫停秒計時,等標準時間一到,立即閉合S3,恢復正常走時。
課程設計電路的組裝與調試
組裝
(1)核對元器件清單:是否有缺件;
(2)檢查印制電路板:是否有斷線、短路等;(3)焊接電阻:擺放整齊一致,黃色環在下邊;(4)焊接二極管:1N4148,注意極性;(5)焊接跨線:剪下二極管引腳,焊J1~J6;(6)焊接集成電路座:注意缺口位置與圖一致;(7)焊接無極性電容、晶振:注意C的字在正面;(8)焊接數碼管:注意小數點在右下方;(9)焊接發光二極管:LED,注意極性;(10)焊接開關、電解電容、接線座。(1)判斷二極管1N4148,LED的極性;
(2)判斷電阻阻值:讀色環、用萬用表測量;(3)安裝集成芯片12片:芯片型號不要裝錯,缺口位置與圖/座一致,缺口左下方為1腳;(4)安裝數碼管:注意小數點在右下方;
(5)安裝電容:正負極性,無極性C的字放在正面(6)最后檢查焊接質量:焊點有無虛焊、瑕疵。
調試
(1)安裝完成后通電,觀察各個模塊的工作情況;(2)若數碼管不亮,檢查地線通否,3腳接地否;(3)若整個電路不工作,分模塊檢查,各個部分 的接線、安裝、功能是否正常;(一般方法)(4)芯片工作是否正常:首先檢查電源,??;(5)秒、分、時校準部分:測試是否功能正常。
總結與心得
通過這次課程設計,加強了我動手、思考和解決問題的能力。在設計中用的芯片可能與平時常見的不一樣,但原理一樣,同時我還理解到,同樣功能可以由不同的芯片實現,需遵行簡單,經濟的原則,從而最大程度符合目標設計。課程設計是一次難得的鍛煉機會,讓我們能夠充分利用所學過的理論知識還有自己的想象的能力,另外還讓我們學習查找資料的方法,以及自己處理分析電路,設計電路的能力。這些對我來說都是一個很好的提高。我趁著做課程設計同時也是對課本知識的鞏固和加強,由于課本上的知識太多,平時課間的學習并不能很好的理解和運用各個元件的功能,而且考試內容有限,所以在這次課程設計過程中,我們了解了很多元件的功能,并且對于其在電路中的使用有了更多的認識。另外還學習到了一些仿真軟件,比如Proteus等學習軟件,給設計提供了很大的便利。
同時,這次課設還讓我明白,困難是成功的臺階,只有一級級走上去才能有所收獲。工科院校的學生應當這樣多參與實踐,多去運用自己所學的知識,為將來工作打下基礎。
第五篇:數字鐘課程設計報告
一、綜述
數字電子鐘是一種用數字電路實現時、分、秒計時的裝置,與機械式時鐘相比具有更高的準確性和直觀性,且無機械裝置,具有更長的使用壽命,因此得到了廣泛的應用。數字鐘從原理上來講是一種典型的數字電路,其中即包含了組合邏輯電路,也有時序電路。
因此,我們此次設計與制作數字電子鐘就是為了了解其工作原理,從而學會制作數字鐘。通過設計和制作數字電子鐘,可以加深我們對中小規模集成電路相關知識的理解,并且通過實際運用,提高我們的動手能力、培養我們的探索精神。
二、設計題目與設計要求 1.設計題目
本次的題目為設計一個具有計時、顯示“時、分、秒”和校時功能的數字電子鐘,具體功能如下:
① 顯示時、分、秒;
② 具有校時功能,可以分別對時及分進行單獨校時,使其校正到標準時間; ③ 計時過程具有報時功能,當時間到達整點前10秒進行蜂鳴報時; ④ 為了保證計時的穩定及準確須由晶體振蕩器提供表針時間基準信號。2.設計要求
本次設計的具體要求如下:
① 畫出電路原理圖(或仿真電路圖); ② 元器件及參數選擇; ③ 電路仿真與調試;
三、方案選擇
數字電子鐘作為實際生活中運用廣泛的一個物品。在電路實現方面,完全可以用單片機實現功能。這也是我們小組一開始的思路。但是,由于我們小組的這道題本身就比較簡單,如果還從用單片機來做,基本上就只是編個程序的事情了。如此,這個學期在數電課上學到的一些東西并不能得到很好的運用,老師也是基于此考慮,建議我們還是不要使用單片機。
因此,我們采用了老師提供的思路和方案,具體的闡述請見以下幾個部分。
四、大體設計思路
1.總體概要設計
數字鐘實際上是一個對標準頻率(1HZ)進行計數的計數電路。由于計數的起始時間不可能與標準時間(如北京時間)一致,故需要在電路上加一個校時電路,同時標準的1HZ時間信號必須做到準確穩定。晶體振蕩器電路給數字電子鐘提供一個頻率穩定準確的32768Hz的方波信號,可保證數字鐘的走時準確及穩定。然后分頻器將32768Hz的高頻方波信號經32768次分頻后得到1Hz的方波信號供秒計數器進行計數。分頻器實際上也就是計數器。通常使用石英晶體振蕩器電路構成數字鐘。圖1所示為數字鐘的一般構成框圖。
“時”計時信號 “分”計時信號
校時信號
“秒”計時信號
圖 1
數字電子鐘原理框圖
2.晶體振蕩器電路
晶體振蕩器電路給數字鐘提供一個頻率穩定準確的32768Hz的脈沖,可保證數字鐘的走時準確及穩定。不管是指針式的電子鐘還是數字顯示的電子鐘都使用了晶體振蕩器電路。
3.分頻器電路
分頻器電路將32768Hz的高頻方波信號經74HC4060和T’觸發器(將D端接至輸出的非端,使其變成一個T’觸發器實現二分頻)的分頻后得到1Hz的方波信號,可以供秒計數器進行計數。分頻器實際上也就是計數器。
4.時間計數器電路
時間計數電路由秒個位和秒十位計數器、分個位和分十位計數器及時個位和時十位計數器電路構成,其中秒個位和秒十位計數器、分個位和分十位計數器為60進制計數器,時個位和時十位計數器設計為24進制計數器。
5.譯碼驅動電路
譯碼驅動電路將計數器輸出的8421BCD碼轉換為數碼管需要的邏輯狀態,并且為保證數碼管正常工作提供足夠的工作電流。
6.示數電路
用譯碼驅動電路提供的電流帶動數碼管實現數字電子鐘最后的示數部分。數碼管通常有發光二極管(LED)數碼管和液晶(LCD)數碼管,本設計采用的為LED數碼管。
五、元件清單
30pF電容2個 32768Hz晶振1個 15k歐姆電阻4個 74HC4060一片
74LS74雙D觸發器一個 單刀雙擲開關2個 1M電阻1個
74Ls00四二輸入7個 74Ls192六片 74Ls48六片 共陰數碼管6個 蜂鳴器一個
六、仿真電路圖
根據上述思路,我們小組的各個成員分別負責了部分電路,在確認部分功能可以實現 的前提下,將它們有機地組合起來得到了總電路。并在proteus軟件中進行了仿真,確定可以實現功能后,再申請了實做。
仿真電路總圖見下:
七、各單元模塊的具體設計和分析
1.晶體振蕩器電路
晶體振蕩器是構成數字式時鐘的核心,它保證了時鐘的走時準確及穩定。
圖2所示電路通過CMOS非門構成的輸出為方波的數字式晶體振蕩電路,這個電路中,CMOS非門U1與晶體、電容和電阻構成晶體振蕩器電路,U2實現整形功能,將振蕩器輸出的近似于正弦波的波形轉換為較理想的方波。輸出反饋電阻R1為非門提供偏置,使電路工作于放大區域,即非門的功能近似于一個高增益的反相放大器。電容C1、C2與晶體構成一個諧振型網絡,完成對振蕩頻率的控制功能,同時提供了一個180度相移,從而和非門構成一個正反饋網絡,實現了振蕩器的功能。由于晶體具有較高的頻率穩定性及準確性,從而保證了輸出頻率的穩定和準確。
晶體XTAL的頻率選為32768HZ。該元件專為數字鐘電路而設計,其頻率較低,有利于減少分頻器級數。
從有關手冊中,可查得C1、C2 為30pF時,頻率準確度和穩定度較高。
由于CMOS電路的輸入阻抗極高,因此反饋電阻R1可選為20MΩ或10MΩ。較高的反饋電阻有利于提高振蕩頻率的穩定性。但是,由于實驗室只提供了1MΩ的電阻,所以在實際制作的過程中,我們采用的是實驗室提供的電阻,最終造成了脈沖輸出端的頻率并不是嚴格符合1Hz。
圖2 晶體振蕩器電路圖
2.分頻器電路
通常,數字鐘的晶體振蕩器輸出頻率較高,為了得到1Hz的秒信號輸入,需要對振蕩
器的輸出信號進行分頻。
通常實現分頻器的電路是計數器電路,一般采用多級2進制計數器來實現。例如,將32767Hz的振蕩信號分頻為1Hz的分頻倍數為32767(2),即實現該分頻功能的計數器相當于15級2進制計數器。
本實驗中采用HC4060來構成分頻電路。HC4060在數字集成電路中可實現的分頻次數最高,而且HC4060還包含振蕩電路所需的非門,使用更為方便。
HC4060計數為最高為14級2進制計數器,可以將32767Hz的信號分頻為2Hz,而經過轉換為T’的D觸發器則可以通過翻轉功能將它分為1HZ的信號。如圖3所示,可以直接實現振蕩和分頻的功能。
5圖3 分頻電路圖
3.時間計數單元
時間計數單元有時計數、分計數和秒計數等幾個部分。
時計數單元一般為24進制計數器計數器,其輸出為兩位8421BCD碼形式;分計數和秒計數單元為60進制計數器,其輸出也為8421BCD碼。
針對每個計數單元,本實驗分別采取了用兩塊74LS192芯片進行級聯來產生相應的進制。
74LS192是同步十進制可逆計數器,它具有雙時鐘輸入,并具有清除和置數等功能,其引腳排列及邏輯符號如下所示:
(a)引腳排列(b)邏輯符號
其中:為置數端,為加計數端,為減計數端,為非同步進位輸出端,為清除端,Q0、Q1、Q2、為非同步借位輸出端,P0、P1、P2、P3為計數器輸入端,Q3為數據輸出端。
其功能表如下:
表1 74LS192的功能表
對于秒計數單元,由于192內部本身就是10進制,所以只需要將作為十位輸出的那一片192的輸出端中的Q2和Q1(相與代表作為得到數字6)作為反饋端,相與再連接到兩片
192的清零端上即可。如此就可以實現60進制的計數。滿足秒計數的要求。實現此功能的部分電路如圖四所示:
圖4 60進制計數器電路
對于分計數單元,與秒計數單元完全一致,在此不再累述。
對于時計數單元,同理,將作為十位輸出的那一片的192的輸出端中的Q1(代表數字2)和作為個位輸出的那一片192的輸出端中的Q2(代表數字4)作為反饋端,相與再連接到兩片192的清零端上即可。如此就可以實現24進制的計數。滿足時計數的要求。實現此功能的部分電路如圖五所示:
圖5 24進制計數器電路
4.譯碼驅動及顯示單元
計數器實現了對時間的累計以8421BCD碼形式輸出,選用顯示譯碼電路將計數器的輸出數碼轉換為數碼顯示器件所需要的輸出邏輯和一定的電流,選用74LS48作為顯示譯碼電路,選用共陰LED數碼管作為顯示單元電路,實現此部分的功能的電路如圖6所示。
圖6 譯碼驅動和顯示電路
5.校時電路
當重新接通電源或走時出現誤差時都需要對時間進行校正。通常,校正時間的方法是:首先截斷正常的計數通路,然后再進行人工出觸發計數或將頻率較高的方波信號加到需要校正的計數單元的輸入端,校正好后,再轉入正常計時狀態即可。
根據要求,數字鐘應具有分校正和時校正功能,因此,應截斷分個位和時個位的直接計數通路,并采用正常計時信號與校正信號可以隨時切換的電路接入其中。
圖7 校正電路
6.整點報時電路
一般時鐘都應具備整點報時電路功能,即在時間出現整點前數秒內,數字鐘會自動報時,以示提醒。其作用方式是發出連續的或有節奏的音頻聲波,較復雜的也可以是實時語音提示。本次采用的是用蜂鳴器實現簡單的鳴響。
根據要求,電路應在整點前10秒鐘內開始整點報時,即當時間在59分51秒到59分59秒期間時,報時電路報時控制信號。故將秒計數電路部分的作為十位的那一片的192的輸出端中的Q2、Q0相與(即表示數字5),作為蜂鳴器的控制端1。再將分計數電路部分的作為十位的那一片192的輸出端中的Q2、Q0相與(即表示數字5),再和作為個位的那一片192的輸出端中的Q3、Q0相與(即表示數字9)相與,如此作為蜂鳴器的控制端2。最后,再將兩個控制端相與,連接至蜂鳴器的一端,再將另一段接地即可。
八、心得體會