數(shù)字鐘verilog.doc
《數(shù)字鐘verilog.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《數(shù)字鐘verilog.doc(23頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
目 錄1 設(shè)計(jì)任務(wù)及要求12 總體設(shè)計(jì)分析13 各模塊設(shè)計(jì)23.1 數(shù)字鐘主體部分23.1.1小時(shí)計(jì)數(shù)器23.1.2 分、秒計(jì)數(shù)器33.2 分頻部分43.3 秒表模塊53.4 鬧鐘模塊53.5 時(shí)間設(shè)置模塊73.6 報(bào)時(shí)模塊73.7 控制顯示模塊83.8 頂層模塊114 總結(jié)114.1 本次作業(yè)遇到的問(wèn)題114.2 建議和總結(jié)12附件131 設(shè)計(jì)任務(wù)及要求本次大作業(yè)的要求為設(shè)計(jì)一個(gè)多功能數(shù)字鐘,其具體要求如下: 1.有基礎(chǔ)的實(shí)時(shí)數(shù)字鐘顯示功能,即時(shí)、分、秒的正常顯示模式,并且在此基礎(chǔ)上增加上,下午顯示。 2.手動(dòng)校準(zhǔn)。按動(dòng)方式鍵,將電路置于校時(shí)狀態(tài),則計(jì)時(shí)電路可用手動(dòng)方式校準(zhǔn),每按一下校時(shí)鍵,時(shí)計(jì)數(shù)器加1;按動(dòng)方式鍵,將電路置于校分狀態(tài),以同樣方式手動(dòng)校分。 3.整點(diǎn)報(bào)時(shí),仿中央人民廣播電臺(tái)整點(diǎn)報(bào)時(shí)信號(hào),從59分50秒起每隔秒發(fā)出一次低音“嘟”信號(hào)(信號(hào)鳴叫持續(xù)時(shí)間,間隙時(shí)間)連續(xù)次,到達(dá)整點(diǎn)(00分00秒時(shí)),發(fā)一次高音“噠”信號(hào)(信號(hào)持續(xù)時(shí)間S)。 4.鬧時(shí)功能,按動(dòng)方式鍵,使電路工作于預(yù)置狀態(tài),此時(shí)顯示器與時(shí)鐘脫開(kāi),而與預(yù)置計(jì)數(shù)器相連,利用前面手動(dòng)校時(shí),校分方式進(jìn)行預(yù)置,預(yù)置后回到正常模式。當(dāng)計(jì)時(shí)計(jì)至預(yù)置的時(shí)間時(shí),揚(yáng)聲器發(fā)出鬧鈴信號(hào),時(shí)間為半分鐘,鬧鈴信號(hào)可以用開(kāi)關(guān)“止鬧”,按下此開(kāi)關(guān)后,鬧鈴聲立刻中止,正常情況下應(yīng)將此開(kāi)關(guān)釋放,否則無(wú)鬧時(shí)作用。5.秒表功能。按start鍵開(kāi)始計(jì)秒,按stop鍵停止計(jì)秒并保持顯示數(shù)不變,直到復(fù)位信號(hào)加入。2 總體設(shè)計(jì)分析 設(shè)計(jì)的總體部分按照要求可以分為基本的數(shù)字時(shí)鐘顯示、手動(dòng)校準(zhǔn)、整點(diǎn)報(bào)時(shí)、鬧鐘功能和秒表功能5大部分。其總體設(shè)計(jì)框圖如下:秒 表鬧 鐘手 動(dòng) 校 準(zhǔn)整 點(diǎn) 報(bào) 時(shí) 數(shù)字鐘 圖1 總體設(shè)計(jì)框圖 其中整點(diǎn)報(bào)時(shí)跟鬧鐘部分要求不同頻率的聲響,所以需要加入分頻器模塊將輸入的1kHZ的分頻產(chǎn)生500HZ及1HZ的方波信號(hào),其中1HZ的信號(hào)對(duì)應(yīng)1S的周期,可以用作時(shí)鐘秒的顯示及秒表部分。3 各模塊設(shè)計(jì) 根據(jù)總體設(shè)計(jì)以及各分模塊的需要,將分立模塊分為7個(gè)部分運(yùn)用verilog HDL編程來(lái)實(shí)現(xiàn)。其分別為數(shù)字鐘主體部分、手動(dòng)設(shè)置、分頻、整點(diǎn)報(bào)時(shí)、鬧鐘功能、秒表、控制顯示和頂層8個(gè)模塊。下面將對(duì)各個(gè)模塊的設(shè)計(jì)思想做一詳細(xì)的介紹。3.1 數(shù)字鐘主體部分?jǐn)?shù)字鐘主體小時(shí)計(jì)數(shù)器分計(jì)數(shù)器秒計(jì)數(shù)器24進(jìn)制計(jì)數(shù)器60進(jìn)制計(jì)數(shù)器6進(jìn)制計(jì)數(shù)器10進(jìn)制計(jì)數(shù)器12(下午) 數(shù)字鐘主體部分主要由三個(gè)計(jì)數(shù)器組成,包括1個(gè)24進(jìn)制計(jì)數(shù)器,作為小時(shí)計(jì)數(shù)器,2個(gè)60進(jìn)制計(jì)數(shù)器分別作為分計(jì)數(shù)器和秒計(jì)數(shù)器。一個(gè)60進(jìn)制計(jì)數(shù)器由一個(gè)6進(jìn)制計(jì)數(shù)器和一個(gè)10進(jìn)制計(jì)數(shù)器組成,由于都是比較簡(jiǎn)單的計(jì)數(shù)器,所以在用verilog設(shè)計(jì)時(shí)作為一個(gè)整體部分進(jìn)行編程實(shí)現(xiàn)。同理小時(shí)計(jì)數(shù)器也作為整體部分來(lái)編程實(shí)現(xiàn)。設(shè)計(jì)的流程框圖如下圖2所示。 圖2 數(shù)字鐘整體部分設(shè)計(jì)框圖3.1.1小時(shí)計(jì)數(shù)器 在verilog程序設(shè)計(jì)中,小時(shí)計(jì)數(shù)器為hour_counter模塊,其中hour_data0為24進(jìn)制計(jì)數(shù)器的低位,即4進(jìn)制計(jì)數(shù)器,hour_data1則為高位,2進(jìn)制計(jì)數(shù)器。編程用always語(yǔ)句實(shí)現(xiàn),并且用clk上升沿觸發(fā)實(shí)現(xiàn)計(jì)數(shù)。EN為使能端,高電平有效。zox為顯示早上、下午的標(biāo)志位,其中小于12點(diǎn)之前為早上,zox為0,否則zox輸出為1表示下午。其Quartus仿真波形如下圖3所示,由于verilog HDL程序顯示不便,均附在附件上,下面各模塊相同。 圖3 小時(shí)計(jì)數(shù)器仿真 從仿真圖中可以看出,當(dāng)使能信號(hào)信號(hào)為高電平且始終上升沿到來(lái)時(shí)計(jì)數(shù)器開(kāi)始計(jì)時(shí),hour_data0計(jì)數(shù)為01230的計(jì)數(shù)規(guī)律,即4進(jìn)制計(jì)數(shù)器,同理hour_data1為2進(jìn)制計(jì)數(shù)器,zox信號(hào)由圖中看出當(dāng)小于12小時(shí)的時(shí)候輸出為0,大于12小時(shí)時(shí)輸出為1,與預(yù)計(jì)效果相同。3.1.2 分、秒計(jì)數(shù)器由于分、秒計(jì)數(shù)器均為60進(jìn)制計(jì)數(shù)器,所以以分計(jì)數(shù)器作為示例說(shuō)明其編程思想。其中分計(jì)數(shù)器模塊在程序中為minute_counter程序段,由上面分析得分計(jì)數(shù)器由一個(gè)十進(jìn)制計(jì)數(shù)器與一個(gè)六進(jìn)制計(jì)數(shù)器組成,程序中有minute_data0表示分計(jì)數(shù)器低位即10進(jìn)制計(jì)數(shù)器,minute_data1表示分計(jì)數(shù)器的高位為一個(gè)六進(jìn)制計(jì)數(shù)器(秒計(jì)數(shù)器的低位、高位分別由second_data0、second_data1表示,其余均與分計(jì)數(shù)器相同)。其它信號(hào)定義與小時(shí)計(jì)數(shù)器相同,clk為時(shí)鐘信號(hào),時(shí)鐘周期為1HZ,即1s,與小時(shí)計(jì)數(shù)器不同的是,EO為進(jìn)位信號(hào),即到60s后自動(dòng)進(jìn)位。Minute_data0、 minute_data1、second_data0、second_data1位寬均為4位reg型變量。仿真示意圖如下圖4所示。 圖4 分計(jì)數(shù)器仿真結(jié)果 由圖中可以看出,當(dāng)使能端信號(hào)端EN變?yōu)?的時(shí)候,計(jì)數(shù)器開(kāi)始計(jì)時(shí),minute_data0計(jì)數(shù)規(guī)律為012345678901當(dāng)計(jì)數(shù)到9的時(shí)候,minute_data1加1,minute_data1計(jì)數(shù)規(guī)則為01234501當(dāng)高位minute_data1計(jì)數(shù)到5的時(shí)候,進(jìn)位信號(hào)EO變?yōu)?。秒計(jì)數(shù)器second_counter模塊與分計(jì)數(shù)器完全一樣,這里不再贅述。3.2 分頻部分分頻器的功能主要有三個(gè):一是產(chǎn)生計(jì)時(shí)用的標(biāo)準(zhǔn)秒脈沖1HZ信號(hào);二是提供仿電臺(tái)用的1kHZ高音頻信號(hào)和500HZ低音頻信號(hào);三是鬧鐘設(shè)置時(shí)用的200HZ閃爍信號(hào)和鬧鐘響鈴用的500HZ音頻信號(hào)。所用輸入信號(hào)為1kHZ的高頻信號(hào)。根據(jù)分析可知,1kHZ方波信號(hào)經(jīng)過(guò)2分頻可以得到500HZ方波,經(jīng)過(guò)5分頻得到200HZ信號(hào),最后將分頻得到的200HZ信號(hào)作為分頻1HZ的時(shí)鐘,經(jīng)過(guò)200分頻得到1HZ的信號(hào)。設(shè)計(jì)框圖如下圖5所示。2分頻5分頻1kHZ信號(hào)(clk)500HZ(f500hz)200HZ(f200hz)1HZ(f1hz)200分頻 圖5 分頻信號(hào)框圖 在程序設(shè)計(jì)的過(guò)程中,在復(fù)位信號(hào)rst為高電平時(shí)分頻器工作,輸入信號(hào)為1kHZ的高頻信號(hào),分別經(jīng)過(guò)2分頻、5分頻、200分頻得到f500HZ的500HZ信號(hào)、f200HZ的200HZ信號(hào)和f1HZ的1HZ信號(hào)。仿真結(jié)果如下圖6所示。 圖6 分頻信號(hào)結(jié)果仿真圖從仿真圖中可以看到,在rst為高電平時(shí)分頻過(guò)程開(kāi)始,f500HZ、f200HZ和f1HZ也與預(yù)期的輸出結(jié)果一樣。3.3 秒表模塊秒表模塊實(shí)現(xiàn)秒表功能,在實(shí)現(xiàn)的過(guò)程中,通過(guò)改變自動(dòng)工作模式下的時(shí)鐘頻率來(lái)實(shí)現(xiàn)秒表的功能。即按動(dòng)start鍵鬧鐘開(kāi)始工作,再次按動(dòng)start鍵,鬧鐘便停止工作。由于秒表模塊比較簡(jiǎn)單,流程圖在此省略。根據(jù)分析,在verilog HDL實(shí)現(xiàn)過(guò)程中,clk作為時(shí)鐘正常工作時(shí)候的頻率,f500hz為秒表工作時(shí)候的頻率,仿真結(jié)果如下圖7所示。 圖7 秒表仿真模塊 由圖中可以看出,根據(jù)start高低電平的變化,時(shí)鐘在正常工作與秒表之間相互轉(zhuǎn)換。3.4 鬧鐘模塊鬧鐘模塊實(shí)現(xiàn)的是鬧鐘的設(shè)置及鬧鐘所設(shè)定的時(shí)間到之后的響鈴提示。鬧鐘模塊的設(shè)置主要思想是由控制鍵來(lái)設(shè)置數(shù)字鐘的鬧鐘響的時(shí)間,經(jīng)過(guò)與當(dāng)前數(shù)字鐘實(shí)時(shí)時(shí)間的比較,來(lái)決定鬧鐘提醒的時(shí)間。設(shè)計(jì)框圖如下圖8所示。hour0hour1minute0minute1hour_set0hour_set1minute_set0minute_set1設(shè)置時(shí)間與當(dāng)前時(shí)間的比較不相等相等con_alarm01鬧鐘不響alarm=0鬧鐘響alarm=1 圖8 鬧鐘模塊設(shè)計(jì)框圖在verilog HDL實(shí)現(xiàn)的過(guò)程中,由SW1、SW2兩個(gè)調(diào)整鍵來(lái)實(shí)現(xiàn),其中SW1為移位控制鍵,即按SW1一次,將移位一次,閃爍顯示當(dāng)前設(shè)置為數(shù)字,SW2為當(dāng)前位的鬧鐘數(shù)字設(shè)置,每按SW2一次,當(dāng)前數(shù)字設(shè)置位數(shù)字增加1,每一位上數(shù)字變化范圍由當(dāng)前位循環(huán)上限決定,不會(huì)超出范圍。EN為設(shè)置使能端,為1有效。Hour1、hour0、minute1和minute0分別為當(dāng)前時(shí)間每個(gè)位上顯示的數(shù)字,hour_set1、hour_set0、minute_set1和minute_set0為與當(dāng)前時(shí)間所對(duì)應(yīng)的每一位上設(shè)置的時(shí)間顯示,f200hz為鬧鐘設(shè)置過(guò)程中顯示閃爍的頻率。Con_alarm為鬧鐘響鈴的控制鍵,其值為1時(shí),表示鬧鐘已設(shè)置,并且在鬧鐘響的時(shí)候,如果設(shè)置其值為0,則鬧鐘關(guān)閉。Alarm為鬧鐘響鈴提示輸出,即設(shè)定時(shí)間到時(shí)alarm值為1,否則為0。Alarmclock_disp_select為鬧鐘設(shè)置中位選信號(hào),為4位reg型變量,其值采用獨(dú)熱編碼,為1000、0100、0010和0001分別表示設(shè)置過(guò)程中hour1、hour0、minute1和minute0四個(gè)位。其仿真結(jié)果如下圖9所示。 圖9 鬧鐘模塊仿真示意圖 由于設(shè)置波形輸入的時(shí)候如果調(diào)整過(guò)多,將不容易看出仿真結(jié)果的正確與否,所以圖中輸入比較簡(jiǎn)單,以便可以更好地分析仿真結(jié)果。由圖中可以看出,經(jīng)過(guò)SW1的兩次調(diào)整,位選信號(hào)alarmclock_disp_select的值為0010,表示此時(shí)的設(shè)置位為hour_set0位,SW2鍵將其值設(shè)置為0001,其他位均為0000,然后在與當(dāng)前時(shí)鐘時(shí)間相等的情況下,并且在con_alarm值為1的時(shí)候鬧鐘響,即alarm值輸出為1,在當(dāng)前時(shí)間與鬧鐘時(shí)間仍然相等的情況下,將鬧鐘控制鍵con_alarm值設(shè)置為0,鬧鐘停止,即alarm值為0。很好的完成了鬧鐘的功能。3.5 時(shí)間設(shè)置模塊 時(shí)間設(shè)置模塊實(shí)現(xiàn)的功能為通過(guò)按鍵調(diào)節(jié)可以對(duì)當(dāng)前時(shí)間進(jìn)行手動(dòng)控制。其主要是在時(shí)間設(shè)置使能端有效地情況下通過(guò)SW1和SW2兩個(gè)按鍵對(duì)數(shù)字鐘的小時(shí)和分鐘數(shù)進(jìn)行調(diào)節(jié)。Disp_drive為設(shè)置中的顯示控制,即通過(guò)SW1對(duì)位的調(diào)整,Disp_drive隨之變化。SW2為對(duì)每一位上的數(shù)字在其范圍內(nèi)進(jìn)行加1調(diào)節(jié),其調(diào)節(jié)過(guò)程與鬧鐘模塊相同。Disp_drive取值000、001、010和011分別對(duì)應(yīng)hour1、hour0、minute1和minute0的設(shè)置。Quartus下仿真結(jié)果如圖10所示。 圖10 時(shí)間設(shè)置模塊仿真效果 圖中,hour_set0、hour_set1、minute_set0和minute_set1為設(shè)置后的時(shí)間??梢钥吹?,當(dāng)前給的hour0為0010,hour1的值0001,在SW1經(jīng)過(guò)一次高電平之后,disp_drive的值變?yōu)?01,對(duì)hour0進(jìn)行設(shè)置,加1之后hour_set0變?yōu)?001,SW1再按一下,變?yōu)?010,在SW2兩次高電平之后,SW1的值變?yōu)?,此時(shí)對(duì)分的高位進(jìn)行加1設(shè)置,依此類推。3.6 報(bào)時(shí)模塊 整點(diǎn)報(bào)時(shí)模塊的主要功能為仿中央人民廣播電臺(tái)整點(diǎn)報(bào)時(shí)信號(hào),即從59分50秒起每隔秒發(fā)出一次低音“嘟”信號(hào),將其定義為500HZ的低頻信號(hào),到達(dá)整點(diǎn)(00分00秒時(shí)),發(fā)一次高音“噠”信號(hào),其響聲為高頻1kHZ信號(hào)。 由于整點(diǎn)報(bào)時(shí)程序比較簡(jiǎn)單,所以框圖省略。為了程序簡(jiǎn)化又與其他模塊有較好的兼容性,用minute、second分別表示minute1、minute0和second1,second0經(jīng)過(guò)位拼接之后的分和秒的當(dāng)前顯示時(shí)間。F1khz為到達(dá)整點(diǎn)之后的高音頻率,f500hz為59分50秒、52秒、54秒、56秒和58秒時(shí)的低音頻率,radio則為到達(dá)時(shí)間時(shí)的報(bào)時(shí)輸出。仿真圖如下圖11所示。 圖11 整點(diǎn)報(bào)時(shí)模塊仿真效果圖 從圖中可以看出,從59分50秒開(kāi)始,輸出的radio開(kāi)始以f500hz的頻率報(bào)時(shí),當(dāng)?shù)竭_(dá)00分00秒時(shí),輸出信號(hào)頻率為f1khz,到達(dá)00分01秒的時(shí)候之后便變?yōu)?,符合設(shè)計(jì)要求。3.7 控制顯示模塊控制顯示模塊在整個(gè)數(shù)字鐘的設(shè)計(jì)中起著非常重要的作用。它的作用是將時(shí)間等數(shù)據(jù)用數(shù)碼管顯示的控制和數(shù)據(jù)傳輸模塊,包括數(shù)據(jù)的傳輸以及BCD碼譯碼等。通過(guò)幾個(gè)控制使能端將其不同功能時(shí)的時(shí)間在數(shù)碼管上顯示出來(lái)。本模塊中端口定義比較多,下面是其所對(duì)應(yīng)的功能。Time_EN:時(shí)間自動(dòng)模式工作使能信號(hào);Timeset_EN:時(shí)間設(shè)置使能信號(hào);Stopwatch_EN:秒表使能信號(hào);Alarmclock_EN:鬧鐘設(shè)置使能信號(hào);Radio_EN:整點(diǎn)報(bào)時(shí)使能信號(hào);Time_disp_select:時(shí)間顯示位選信號(hào);Alarmclock_disp_select:鬧鐘設(shè)置的顯示位選信號(hào);Disp_select:顯示位選信號(hào)輸出;Disp_data:經(jīng)過(guò)譯碼之后顯示的數(shù)據(jù)。程序設(shè)計(jì)中,各使能端信號(hào)為1表示執(zhí)行該功能,以時(shí)間自動(dòng)工作模式使能信號(hào)有效為例說(shuō)明,當(dāng)Time_EN為1時(shí),首先將時(shí)間顯示位選信號(hào)isp_select的值賦給顯示位選信號(hào)disp_select輸出,定義time_disp_select的狀態(tài)一共有6個(gè),分別為100000、010000、001000、000100、000010和000001,其在各狀態(tài)下分別依次表示將hour0、hour1、minute0、minute1、second0和second1的值賦給data,用case語(yǔ)句來(lái)實(shí)現(xiàn),其實(shí)現(xiàn)語(yǔ)句如下:if(Time_EN = 1b1) begin disp_select = time_disp_select; case(time_disp_select) 6b100000: Data = hour1; 6b010000: Data = hour0; 6b001000: Data = minute1; 6b000100: Data = minute0; 6b000010: Data = second1; 6b000001: Data = second0; default: Data = 4b0; endcase在quartus下仿真圖12如下:圖12 控制顯示模塊當(dāng)前時(shí)間使能端有效時(shí)譯碼的顯示從圖中可以看出,在第一個(gè)時(shí)鐘周期內(nèi),時(shí)間顯示位選信號(hào)time_disp_select的值為000000,此時(shí)應(yīng)執(zhí)行case語(yǔ)句的default,Data的值為0;在第二個(gè)時(shí)鐘周期內(nèi),time_disp_select的值為000001,此時(shí)對(duì)應(yīng)其最后一種狀態(tài),將second0的值賦給Data,即Data的值為0110,從圖中看,仿真結(jié)果正確,disp_data表示的是將當(dāng)前數(shù)據(jù)譯碼顯示之后七段數(shù)碼管的顯示,所以在第一個(gè)周期內(nèi)值為1111110,表示值為0,與Data所表示的數(shù)對(duì)應(yīng)。依次類推,可將Data的值全部表示出來(lái)。顯示譯碼數(shù)據(jù)段主要程序如下: case(Data) 4b0000: disp_data=7b1111110; 4b0001: disp_data=7b0110000; 4b0010: disp_data=7b1101101; 4b0011: disp_data=7b1111001; 4b0100: disp_data=7b0110011; 4b0101: disp_data=7b1011011; 4b0110: disp_data=7b1011111; 4b0111: disp_data=7b1110000; 4b1000: disp_data=7b1111111; 4b1001: disp_data=7b1111011; default: disp_data=7b0; endcase 顯示譯碼程序說(shuō)明了0到9十個(gè)數(shù)在7段數(shù)碼管中所對(duì)應(yīng)的值,在case語(yǔ)句里面最重要的是一定不能忘了default,否則仿真會(huì)發(fā)生所不希望看到的結(jié)果。下圖13為鬧鐘設(shè)置使能有效時(shí)仿真結(jié)果。 圖13 控制顯示模塊當(dāng)鬧鐘設(shè)置使能信號(hào)有效時(shí)譯碼顯示從圖中可以看出,當(dāng)只有鬧鐘使能信號(hào)alarmclock_EN有效時(shí),其七段數(shù)碼管顯示結(jié)果,與數(shù)字鐘自動(dòng)工作使能端的區(qū)別為鬧鐘設(shè)置使能端有效時(shí)只需對(duì)hour0、hour1、minute0和minute1進(jìn)行設(shè)置,所以鬧鐘設(shè)置顯示位選信號(hào)alarmclock_disp_select的狀態(tài)只有4個(gè),由于其同樣需要將值賦給disp_select,為了統(tǒng)一期間,其值也設(shè)為6位,其4個(gè)狀態(tài)分別為100000、010000、001000和000100。其他與自動(dòng)工作模式相同。3.8 頂層模塊 將以上設(shè)計(jì)的各個(gè)模塊組合起來(lái),就可以得到多功能數(shù)字鐘的整體仿真結(jié)果。其主要作用是將各個(gè)模塊銜接起來(lái),圖14為時(shí)鐘正常工作模式下Quartus仿真結(jié)果。 圖14 整體仿真結(jié)果4 總結(jié) 4.1 本次作業(yè)遇到的問(wèn)題在做本次作業(yè)中,遇到的問(wèn)題主要有以下幾個(gè)方面:(1)軟件的安裝與學(xué)習(xí)。在軟件的安裝過(guò)程中,首先通過(guò)自己從網(wǎng)上下載軟件安裝,第一次安裝的時(shí)候未經(jīng)破解,導(dǎo)致安裝的軟件雖然裝上了,但是打不開(kāi),無(wú)法使用。軟件的學(xué)習(xí)過(guò)程中,首先經(jīng)過(guò)上課講解,自己從網(wǎng)上下視頻的學(xué)習(xí),運(yùn)行了幾個(gè)書(shū)上的小程序,對(duì)軟件進(jìn)行了熟悉。(2)由于Verilog HDL這門語(yǔ)言對(duì)自己來(lái)說(shuō)屬于一個(gè)從未接觸過(guò)的東西,所以學(xué)習(xí)起來(lái)比較困難。本次作業(yè)選擇的題目為多功能數(shù)字鐘,前面是資料的搜集與設(shè)計(jì)思路的理清,再有了一定的基礎(chǔ)之后,開(kāi)始對(duì)整個(gè)大的模塊進(jìn)行分模塊分析設(shè)計(jì)。(3)在作業(yè)的過(guò)程中,遇到了許多的問(wèn)題,首先發(fā)現(xiàn)自己對(duì)軟件的運(yùn)用上存在的一些問(wèn)題,如剛開(kāi)始的時(shí)候沒(méi)有生成功能網(wǎng)表,導(dǎo)致最后運(yùn)行出錯(cuò);還有沒(méi)有選功能仿真的時(shí)候,波形出現(xiàn)了一些毛刺和延時(shí)。(4)以為自己上課聽(tīng)懂了阻塞與非阻塞賦值的區(qū)別,結(jié)果的程序的書(shū)寫(xiě)上還是出現(xiàn)的問(wèn)題,比如在秒表模塊中,用的電平觸發(fā),剛開(kāi)始的時(shí)候時(shí)候用的阻塞賦值,發(fā)現(xiàn)仿真波形有延時(shí),以為是阻塞賦值的問(wèn)題,將阻塞賦值改為了非阻塞賦值,延時(shí)問(wèn)題還是沒(méi)有解決,才發(fā)現(xiàn)進(jìn)行的是時(shí)序仿真。這是由于自己當(dāng)時(shí)還是沒(méi)有深刻的理解兩者之間的區(qū)別,才造成的誤解,給解決問(wèn)題帶來(lái)了一定的困擾。(5)仿真過(guò)程中不夠細(xì)心,比如在整點(diǎn)報(bào)時(shí)模塊,波形輸入的時(shí)候,將minute與second的值設(shè)置反了,造成找了一下午的問(wèn)題,radio就是不報(bào)時(shí),后來(lái)發(fā)現(xiàn)問(wèn)題的時(shí)候,覺(jué)著特別不可思議,還把程序改了半天。(6)在控制顯示模塊,波形文件仿真的過(guò)程中,由于其輸入輸出接口比較多,為了看得更清楚期間,在數(shù)字鐘正常工作模式下顯示的過(guò)程中,將鬧鐘設(shè)置使能端去掉了,結(jié)果在仿真的過(guò)程中data跟disp_data就是沒(méi)有值,后來(lái)發(fā)現(xiàn)原因是在將鬧鐘使能端去掉之后,不確定鬧鐘使能端是否有效。造成沒(méi)有顯示結(jié)果,后來(lái)把鬧鐘使能段加上之后并將其置為0,仿真結(jié)果正確。 作業(yè)過(guò)程中,遇到的小問(wèn)題不計(jì)其數(shù),在多方努力之下,問(wèn)題基本解決,這里就不一一列舉??偨Y(jié)出的寶貴經(jīng)驗(yàn)就是要多看書(shū),學(xué)會(huì)自己解決問(wèn)題,一般的問(wèn)題在看書(shū)找資料之后基本都能解決;還有就是一定要細(xì)心,這樣可以避免很多不必要的麻煩。4.2 建議和總結(jié)首先非常感謝老師在每周末還那么辛苦的給我們上課,真的使我學(xué)到了很多的東西,在此對(duì)老師致以深深的謝意!對(duì)老師的建議就是可以在剛開(kāi)始上課的時(shí)候就可以給同學(xué)布置一些小的作業(yè),然后可以讓同學(xué)慢慢接觸一下軟件,學(xué)一點(diǎn)淺顯的編程,這樣在最后寫(xiě)大作業(yè)的時(shí)候就不會(huì)感覺(jué)無(wú)從下手,以便起到一個(gè)循序漸進(jìn)的作用。附件 1.小時(shí)計(jì)數(shù)器模塊 module hour_counter(EN,clk,hour_data1,hour_data0,zox);input clk,EN; /時(shí)鐘與使能端output 3:0 hour_data1,hour_data0;/小時(shí)的高位和低位output zox; /上下午指示模塊reg 3:0 hour_data1,hour_data0;reg zox;always (posedge clk)begin if(EN = 1b1) begin if(hour_data0 4b0011) hour_data0 = hour_data0 + 4b1; else begin zox = 1b0; hour_data0 = 4b0; if(hour_data1 4b0001) hour_data1 = hour_data1 + 4b1; else begin hour_data1 = 4b0; zox = 1b1; end end endendendmodule2.分秒計(jì)數(shù)器模塊module minute_counter(EN,clk,minute_data1,minute_data0,EO);input clk,EN;output 3:0 minute_data1,minute_data0; 分高位、低位output EO; /進(jìn)位輸出端reg 3:0 minute_data1,minute_data0;reg EO;always (posedge clk) /上升沿觸發(fā)begin if(EN = 1b1) /使能端為1有效 begin if(minute_data0 4b1001) minute_data0 = minute_data0 + 4b1; else begin EO = 1b0; minute_data0 = 4b0; if(minute_data1 4b0101) minute_data1 = minute_data1 + 4b1; else begin minute_data1 = 4b0; EO = 1b1; end end endendendmodule3. 分頻模塊module fdiv(clk,rst,f500hz,f200hz,f1hz);input clk,rst; /1KHz 輸入output f500hz,f200hz,f1hz; /分頻出500HZ、200HZ、1HZ輸出reg f500hz,f200hz,f1hz;integer CNT1=0,CNT2=0; /兩個(gè)常數(shù)變量,分頻技術(shù)用always (posedge clk) /2分頻begin if(!rst) f500hz=0; else f500hz=f500hz;endalways (posedge clk) /5分頻 if (!rst) begin f200hz=0; CNT2=0; end else begin if(CNT2=4) begin CNT2 = 0; f200hz =f200hz; end else CNT2 = CNT2+1; end always (posedge f200hz) /將200HZ信號(hào)200分頻為1HZ if (!rst) begin f1hz=0; CNT1=0; end else begin if(CNT1=199) begin CNT1 = 0; f1hz =f1hz; end else CNT1 = CNT1+1; end endmodule4.秒表模塊module stopwatch(clk,f500hz,start,F_out);input clk,f500hz,start; /start為控制秒表信號(hào)output F_out; /輸出,秒表工作方式reg F_out; always (start or clk or f500hz)begin case(start) 1b0:F_out=clk; 1b1:F_out=f500hz; default:F_out=1b0; endcaseendendmodule5鬧鐘模塊module alarmclock(clk_200hz,EN, SW1,SW2, hour1,hour0,hour_set1,hour_set0, minute1,minute0, minute_set1,minute_set0, alarm,control_alarm, alarmclock_disp_select);input EN,SW1,SW2,clk_200hz; /SW1、SW2為鬧鐘設(shè)置鍵input 3:0 hour1,hour0,minute1,minute0;/顯示當(dāng)前時(shí)間input control_alarm; /鬧鐘控制鍵output alarm; /鬧鐘響鈴輸出output 3:0 alarmclock_disp_select; /鬧鐘設(shè)置位選信號(hào)output 3:0 hour_set1,hour_set0,minute_set1,minute_set0; reg 3:0 alarmclock_disp_select;reg alarm;reg 3:0 hour_set1,hour_set0; /存放設(shè)置的小時(shí)reg 3:0 minute_set1,minute_set0; /存放設(shè)置的分reg 2:0 disp_drive; /設(shè)置鬧鐘時(shí)間時(shí),數(shù)碼管顯示的動(dòng)態(tài)位選擇/鬧鐘一直工作(設(shè)置的鬧鐘時(shí)間與當(dāng)前時(shí)間比較)alwaysbegin if(hour_set1 = hour1)&(hour_set0 = hour0) &(minute_set1=minute1)&(minute_set0=minute0)&(control_alarm=1)alarm = 1b1; /相等,鬧鐘響 else if(control_alarm=0)alarm = 1b0; /不相等,輸出1 end/鬧鐘設(shè)置中,按SW1一次,將移位一次,顯示當(dāng)前設(shè)置位always (posedge SW1)begin if(EN = 1b1)begin if(disp_drive != 3b101) disp_drive = disp_drive + 3b1; else disp_drive = 3b000;endend/當(dāng)前位的鬧鐘數(shù)字設(shè)置,按SW2一次,數(shù)字增加1always (posedge SW2)begin case(disp_drive)3b000: begin /000時(shí),設(shè)置小時(shí)的高位 if(hour_set1 4b0010) hour_set1 = hour_set1 + 4b1; else hour_set1 = 4b0; end3b001: begin /001時(shí),小時(shí)低位 if(hour_set1 4b0010)&(hour_set0 4b1001) hour_set0 = hour_set0 + 4b1; else if(hour_set1=4b0010)&(hour_set0 4b0100) hour_set0 = hour_set0 + 4b1; else hour_set0 = 4b0; end3b010: begin /010時(shí),分鐘高位 if(minute_set1 4b0101) minute_set1 = minute_set1 + 4b1; else minute_set1 = 4b0; end3b011: begin /011時(shí),分鐘低位 if(minute_set0 4b1001) minute_set0 = minute_set0 + 4b1; else minute_set0 = 4b0; endendcaseend/閃爍顯示always (posedge clk_200hz) /設(shè)置時(shí)閃爍頻率begin case(disp_drive) 3b000: alarmclock_disp_select = 6b1000;3b001: alarmclock_disp_select = 6b0100;3b010: alarmclock_disp_select = 6b0010;3b011: alarmclock_disp_select = 6b0001;default: alarmclock_disp_select = 6b0000; endcase endendmodule6.時(shí)間設(shè)置模塊module timeset( TimeSet_EN, SW1,SW2,disp_drive, hour1,hour0, minute1,minute0, hour_set1,hour_set0,minute_set1,minute_set0 );input TimeSet_EN;input SW1,SW2;input 3:0 hour1,hour0;input 3:0 minute1,minute0; output 3:0 hour_set1,hour_set0;output 3:0 minute_set1,minute_set0;output 2:0 disp_drive;reg 3:0 hour_set1,hour_set0;reg 3:0 minute_set1,minute_set0;reg 2:0 disp_drive;/初始化initialbegin hour_set1 = hour1; hour_set0 = hour0; minute_set1 = minute1; minute_set0 = minute0;endalways (posedge SW1) /手動(dòng)設(shè)置使能begin if(TimeSet_EN = 1b1) begin if(disp_drive 3b101) disp_drive = disp_drive + 3b1; else disp_drive = 3b0;endendalways (posedge SW2)begin case(disp_drive) 3b000: begin /小時(shí)的高位 if(hour_set1 4b0010) hour_set1 = hour_set1 + 4b1; else hour_set1 = 4b0; end 3b001: begin /小時(shí)的低位 if(hour_set0 4b1001) hour_set0 = hour_set0 + 4b1; else hour_set0 = 4b0; end 3b010: begin /分的高位 if(minute_set1 4b0101) minute_set1 = minute_set1 + 4b1; else minute_set1 = 4b0; end 3b011: begin /分的低位 if(minute_set0 4b1001) minute_set0 = minute_set0 + 4b1; else minute_set0 = 4b0; end default:begin end endcaseendendmodule7.報(bào)時(shí)模塊Module Radio(alarm_radio,minute1,minute0,second1,second0,minute,second, f1khz,f500hz); input f1khz,f500hz; input3:0minute1,minute0,second1,second0; input7:0minute,second; output alarm_radio; /拼接之后時(shí)間 reg alarm_radio; /報(bào)時(shí)輸出信號(hào) always(minute1 or minute0 or second1 or second0) begin reg 7:0 minute,second; minute7:0=minute13:0,minute03:0; /分拼接 second7:0=second13:0,second03:0; /秒拼接 end always(minute or second) if(minute=8h59) /59分鐘時(shí) case(second) /秒為50、52、54、56、58低音報(bào)時(shí) 8h50, 8h52, 8h54, 8h56, 8h58:alarm_radio=f500hz; default:alarm_radio=1b0; endcase else if(minute=8h00&second=8h00) /00分00秒高音報(bào)時(shí) alarm_radio=f1khz; else alarm_radio=1b0;endmodule8.控制顯示模塊module disp_data_mux(Time_EN,TimeSet_EN,Stopwatch_EN, time_disp_select,Alarmclock_EN, alarmclock_disp_select, hour1,hour0,minute1,minute0,second1,second0, disp_select,disp_data,Data);input Time_EN,TimeSet_EN,Stopwatch_EN;input 5:0 time_disp_select;input Alarmclock_EN;input 5:0 alarmclock_disp_select;input 3:0 hour1,hour0,minute1,minute0,second1,second0;output 5:0 disp_select;output 6:0 disp_data;output3:0 Data;reg 5:0 disp_select;reg 6:0 disp_data;reg 3:0 Data;always (Time_EN, TimeSet_EN,Stopwatch_EN,time_disp_select, Alarmclock_EN,alarmclock_disp_select,disp_select, hour1,hour0,minute1,minute0,second1,second0)begin /時(shí)鐘,秒表顯示 if(Time_EN | TimeSet_EN | Stopwatch_EN) = 1b1) begin disp_select = time_disp_select; case(time_disp_select) 6b100000: Data = hour1; 6b010000: Data = hour0; 6b001000: Data = minute1; 6b000100: Data = minute0; 6b000010: Data = second1; 6b000001: Data = second0; default: Data = 4b0; endcase end else if(Alarmclock_EN = 1b1) /鬧鐘設(shè)置顯示 begin disp_select = alarmclock_disp_select; case(alarmclock_disp_select) 6b100000: Data = hour1; 6b010000: Data = hour0; 6b001000: Data = minute1; 6b000100: Data = minute0; default: Data = 4b0; endcase end case(Data) /顯示數(shù)據(jù)譯碼 4b0000: disp_data = 7b1111110; 4b0001: disp_data = 7b0110000; 4b0010: disp_data = 7b1101101; 4b0011: disp_data = 7b1111001; 4b0100: disp_data = 7b0110011; 4b0101: disp_data = 7b1011011; 4b0110: disp_data = 7b1011111; 4b0111: disp_data = 7b1110000; 4b1000: disp_data = 7b1111111; 4b1001: disp_data = 7b1111011; default: disp_data = 7b0; endcaseendendmodule- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 數(shù)字 verilog
鏈接地址:http://italysoccerbets.com/p-6615843.html