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