




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
njust多功能數(shù)字鐘設(shè)計(jì)基于VerilogHDL語言學(xué)院:電子工程與光電技術(shù)學(xué)院學(xué)號:姓名:匡鑫指導(dǎo)教師:譚雪琴2023年11月21日星期五
摘要:基于FPGA平臺,運(yùn)用Verilog語言編寫設(shè)計(jì)一多功能數(shù)字鐘,包括根本的時(shí)鐘,校時(shí)校分,整點(diǎn)報(bào)時(shí)功能。擴(kuò)展鬧鐘,秒表,萬年歷,鍵盤輸入功能。Abstract:FPGA-basedplatform,usingVeriloglanguagetodesignamulti-functionaldigitalclock,includingbasicfunctionofclock,schoolhours,schoolminutes,thewholepointtimekeeping.Andextendedfunctionofalarmclock,stopwatch,calendar,keyboardinput.關(guān)鍵詞:多功能數(shù)字鐘,可編程邏輯器件,EDA設(shè)計(jì),VerilogKeywords:multi-functionaldigitalclock,FPGA,EDAdisign,Verilog目錄1設(shè)計(jì)要求 22設(shè)計(jì)方案選擇及思路分析 23各子模塊設(shè)計(jì)原理和分析 33.1分頻模塊 33.2時(shí)分秒模塊 53.3時(shí)分調(diào)整模塊 63.4報(bào)時(shí)模塊 73.5掃描顯示模塊 73.6秒表模塊 93.7鬧鐘模塊 103.8萬年歷模塊 123.9鍵盤掃描模塊 134調(diào)試仿真 155編程下載 166結(jié)論 167參考文獻(xiàn) 178實(shí)驗(yàn)感想 179源代碼 171設(shè)計(jì)要求基于FPGA可編程邏輯器件,用quatusII軟件設(shè)計(jì)一個(gè)多功能數(shù)字鐘,其根本要求如下:1.有根底的計(jì)時(shí)顯示功能,即時(shí)、分、秒顯示在6個(gè)七段管上2.K0,K1,K2,K3分別為系統(tǒng)使能〔暫停〕,時(shí)鐘清零,校時(shí),校分開關(guān)。由于按鍵是長期處于“1〞狀態(tài),故在這里采用低電平“0〞為有效電平〔本人認(rèn)為原要求中“1〞為有效電平不合理〕。3.使時(shí)鐘具有整點(diǎn)報(bào)時(shí)功能〔當(dāng)時(shí)鐘計(jì)到59’53〞時(shí)開始報(bào)時(shí),在59’53〞,59’55〞,59’57〞時(shí)報(bào)時(shí)頻率為500Hz,59’59〞時(shí)報(bào)時(shí)頻率為1KHz,〕。提高局部要求:添加按鍵:K4,K5分別為設(shè)置位選擇,設(shè)置位加一。K6,K7為組合功能選擇,當(dāng)K6K7值:〔11〕為時(shí)鐘功能,〔10〕為秒表功能,〔01〕為鬧鐘設(shè)置,〔00〕為萬年歷功能。1.鬧時(shí)功能,按動方式鍵,使電路工作于預(yù)置狀態(tài),此時(shí)顯示器與時(shí)鐘脫開,而與預(yù)置計(jì)數(shù)器相連,利用前面手動校時(shí),校分方式進(jìn)行預(yù)置,預(yù)置后回到正常模式。當(dāng)計(jì)時(shí)計(jì)至預(yù)置的時(shí)間時(shí),揚(yáng)聲器發(fā)出鬧鈴信號,時(shí)間為半分鐘,鬧鈴信號可以用開關(guān)“止鬧〞,按下此開關(guān)后,鬧鈴聲立刻中止,正常情況下應(yīng)將此開關(guān)釋放,否那么無鬧時(shí)作用。2.秒表功能。按start鍵開始計(jì)秒,按stop鍵停止計(jì)秒并保持顯示數(shù)不變,直到復(fù)位信號參加。3.萬年歷功能,4.使用4*4矩陣鍵盤輸入設(shè)置信號2設(shè)計(jì)方案選擇及思路分析由于之前參加過華為杯電子設(shè)計(jì)大賽,當(dāng)時(shí)采用的是VerilogHDL語言,而且EDA實(shí)驗(yàn)一曾經(jīng)做過用器件搭數(shù)字鐘的實(shí)驗(yàn),如果再用原理圖方法的話沒有挑戰(zhàn)性,而且VerilogHDL語言更為靈活方便,因此決定采用其完本錢次電子設(shè)計(jì)。設(shè)計(jì)的總體局部按照要求可以分為根本模塊:分頻模塊、時(shí)鐘計(jì)時(shí)及調(diào)整模塊、掃描顯示。附加模塊:萬年歷、整點(diǎn)報(bào)時(shí)、鬧鐘功能和秒表功能。其總體設(shè)計(jì)框圖如下:嗡鳴器嗡鳴器鬧鐘報(bào)時(shí)秒表日月年計(jì)數(shù)分頻秒分時(shí)計(jì)數(shù)掃描顯示鬧鐘報(bào)時(shí)秒表日月年計(jì)數(shù)分頻秒分時(shí)計(jì)數(shù)掃描顯示3各子模塊設(shè)計(jì)原理和分析3.1分頻模塊初步分析后面所需要的信號頻率,分頻器的功能主要有4個(gè):分別是產(chǎn)生計(jì)時(shí)用的標(biāo)準(zhǔn)秒脈沖1HZ信號;鬧鐘及萬年歷設(shè)置時(shí)用的2HZ閃爍信號整點(diǎn)報(bào)時(shí)及顯示掃描用的1kHZ高音頻信號和500HZ低音頻信號。分析系統(tǒng)時(shí)鐘為48M,經(jīng)過48K的分頻后得到1K信號,再經(jīng)過2分頻可以得到500HZ方波,1K經(jīng)過5分頻得到200HZ信號,最后100分頻得到的2HZ信號,再2分頻得到1HZ的時(shí)鐘。原理框圖如下列圖5所示。1HZ2HZ200HZ1K48M1HZ2HZ200HZ1K48M500HZ500HZ圖5分頻信號框圖Verilog設(shè)計(jì)分頻器很簡單,在偶數(shù)分頻時(shí),在輸入脈沖下直接計(jì)數(shù)到所分頻數(shù)的一半,然后翻轉(zhuǎn)即可。如:always@(posedgeclk) begin f1k<=(count48k<48000/2)?1'b1:1'b0; if(count48k==48000-1) count48k<=0; else count48k<=count48k+1; end但是奇數(shù)分頻那么要復(fù)雜得多,假設(shè)奇數(shù)分頻不要求占空比為50%,原理同偶數(shù)分頻,可計(jì)數(shù)到〔N-1〕/2翻轉(zhuǎn),此時(shí)占空比接近50%。但如果要求占空比為準(zhǔn)確的50%,通過查閱資料得知也可以實(shí)現(xiàn)的。原理如下列圖always@(posedgef1k)//上升沿計(jì)數(shù) if(count5p==4) count5p<=0; else count5p<=count5p+1;//posedgewave//上升沿波形always@(posedgef1k) begin if(count5p<2) f200p<=1; else f200p<=0; end//negedgecounteralways@(negedgef1k)//下降沿計(jì)數(shù) if(count5n==4) count5n<=0; else count5n<=count5n+1;//negedgewavealways@(negedgef1k) //下降沿波形 begin if(count5n<2) f200n<=1; else f200n<=0; endassignf200hz=f200n|f200p;//波形相或仿真波形如下,clk設(shè)置頻率為4800M,那么f1k的周期為10us,仿真結(jié)果正確。3.2時(shí)分秒模塊均用BCD碼來保存便于后期顯示,時(shí)分秒的情況根本相同,現(xiàn)詳細(xì)分析秒的進(jìn)位情況。用4位存放器來保存秒個(gè)位,4位存放器來保存秒十位。時(shí)分秒一共需要24位存放器。在1HZ的脈沖下,秒個(gè)位計(jì)數(shù),當(dāng)滿10時(shí)即4’ha時(shí)向秒十位進(jìn)位,秒個(gè)位清零;秒十位滿6即4’h6時(shí)向分個(gè)位進(jìn)位,秒十位清零……以此類推,特別在時(shí)十位處理時(shí)有些不同,當(dāng)小時(shí)整體滿24即8’h24時(shí),清零,〔向天進(jìn)位,為以后萬年歷做鋪墊〕。代碼如下,〔此處把年月日的計(jì)數(shù)一起處理〕beginsecond[3:0]=second[3:0]+1'b1;if(second[3:0]==4'ha)beginsecond[3:0]=4'h0;second[7:4]=second[7:4]+1'b1;if(second[7:4]==4'h6)beginsecond[7:4]=4'h0;minute[3:0]=minute[3:0]+1'b1;if(minute[3:0]==4'ha)beginminute[3:0]=4'h0;minute[7:4]=minute[7:4]+1'b1;if(minute[7:4]==4'h6)beginminute[7:4]=4'h0;hour[3:0]=hour[3:0]+1'b1;if(hour[3:0]==4'ha)beginhour[3:0]=4'h0;hour[7:4]=hour[7:4]+1'b1;if(hour==8'h24)beginhour[7:4]=4'h0;day[3:0]=day[3:0]+1'b1;if(day[3:0]==4'ha)beginday[3:0]=4'h0;day[7:4]=day[7:4]+1'b1;if(day[7:4]==4'h3)beginday[7:4]=4'h0;month[3:0]=month[3:0]+1'b1;if(month[3:0]==4'ha)beginmonth[3:0]=4'h0;month[7:4]=month[7:4]+1'b1;if(month[7:0]==8'h12)beginmonth=8'h0;year=year+1;endendendendendendendendendendend仿真波形:仿真結(jié)果正確3.3時(shí)分調(diào)整模塊調(diào)整模塊的功能包括暫停計(jì)時(shí),清零,校時(shí),校分。在Verilog中很容易實(shí)現(xiàn),暫停:在時(shí)分秒計(jì)數(shù)模塊前加一個(gè)條件,當(dāng)key[0]不等于0時(shí)計(jì)時(shí),那么低電平0有效時(shí)就不計(jì)時(shí),即暫停。清零:always@(posedgeclk_1hzornegedgekey[1])//key[1]控制清零beginif(key[1]==0)//clearbeginhour=8'b0;minute=8'b0;second=8'b0;end校時(shí)和校分一致,當(dāng)key[2]=0時(shí),時(shí)個(gè)位加一,個(gè)位滿十時(shí),向十位進(jìn)一位。校時(shí):elseif(key[7:6]==2'b11&&key[2]==0)beginhour[3:0]=hour[3:0]+1'b1;if(hour[3:0]==4'ha)beginhour[3:0]=4'h0;hour[7:4]=hour[7:4]+1;if(hour[7:4]==4'h6)hour[7:4]=4'h0;endend校分:elseif(key[7:6]==2'b11&&key[3]==0)beginminute[3:0]=minute[3:0]+1'b1;if(minute[3:0]==4'ha)beginminute[3:0]=4'h0;minute[7:4]=minute[7:4]+1;if(minute[7:4]==4'h6)minute[7:4]=4'h0;endend3.4報(bào)時(shí)模塊以分和秒為敏感表,檢測當(dāng)分為59時(shí),秒為53,55,57時(shí),beep_r存放器放入500hz;秒為59時(shí),beep_r存放器放入1khz。always@(minuteorsecond)if(minute==8'h59)//59分鐘時(shí)case(second)//秒為53、55、57低音報(bào)時(shí)8'h53,8'h55,8'h57:beep_r<=clk_500hz;8'h59:beep_r<=clk_1k;default:beep_r<=1'b0;endcaseelsebeep_r<=1'b0;3.5掃描顯示模塊掃描顯示模塊是一個(gè)重點(diǎn)模塊,理解其工作原理很重要。先定義一個(gè)32位的存放器裝載要顯示的內(nèi)容,方便在功能擴(kuò)展時(shí)直接把想要顯示的內(nèi)容送到該存放器就行了。采用掃描顯示,只要掃描的周期小于10ms,人眼就感覺不到閃爍。通過1k的頻率控制掃描,一共掃描8位,那么顯示的頻率為125hz,掃描周期為8ms。這樣還可以節(jié)省管腳,方便操作。原理簡述,通過快速循環(huán)掃描產(chǎn)生8位的位碼和段碼,循環(huán)因子當(dāng)然也是8.在循環(huán)中把8位中對應(yīng)的當(dāng)前位的位碼置為0,同時(shí)把該為對應(yīng)的數(shù)保存到存放器。同時(shí)把剛剛存放器中的值翻譯為對應(yīng)的七段管碼值送到段碼中。always@(posedgeclk_1k)begin//display_functionchosecase(key[7:6])2'b11:display={hour,4'ha,minute,4'ha,second};//正常計(jì)時(shí)2'b10:display={hour1,4'ha,minute1,4'ha,second1};//設(shè)置鬧鐘2'b01:display={min,4'ha,sec,4'ha,ms};//秒表2'b00:display={year,month,day};//萬年歷endcasecase(count1)3'd0:dis_data=display[3:0];3'd1:dis_data=display[7:4];3'd2:dis_data=display[11:8];3'd3:dis_data=display[15:12];3'd4:dis_data=display[19:16];3'd5:dis_data=display[23:20];3'd6:dis_data=display[27:24];3'd7:dis_data=display[31:28];endcasecase(count1)3'd0:dig_r=8'b11111110;3'd1:dig_r=8'b11111101;3'd2:dig_r=8'b11111011;3'd3:dig_r=8'b11110111;3'd4:dig_r=8'b11101111;3'd5:dig_r=8'b11011111;3'd6:dig_r=8'b10111111;3'd7:dig_r=8'b01111111;endcasecount1<=count1+1;case(dis_data)4'h0:seg_r=8'hc0;4'h1:seg_r=8'hf9;4'h2:seg_r=8'ha4;4'h3:seg_r=8'hb0;4'h4:seg_r=8'h99;4'h5:seg_r=8'h92;4'h6:seg_r=8'h82;4'h7:seg_r=8'hf8;4'h8:seg_r=8'h80;4'h9:seg_r=8'h90;4'ha:seg_r=8'hbf;default:seg_r=8'hff;endcaseend3.6秒表模塊秒表模塊是一個(gè)相對獨(dú)立的模塊,用單獨(dú)的分、秒、毫秒存放器計(jì)數(shù)。通過key[6:7]=10來選擇功能,key[4]清零,key[5]暫停。秒表的計(jì)數(shù)模塊與時(shí)分秒的大同小異。//先把1k的信號分頻為0.01s的信號always@(posedgeclk_1k)beginf100hz<=(count10<10/2)?1'b1:1'b0;if(count10==10-1)count10<=0;elsecount10<=count10+1;endalways@(posedgef100hz)beginif(key[7:4]==4'b0111)//假設(shè)沒有暫停,〔key[4]=1〕beginms[3:0]=ms[3:0]+1'b1;if(ms[3:0]==4'ha)beginms[3:0]=4'h0;ms[7:4]=ms[7:4]+1'b1;if(ms[7:4]==4'ha)beginms[7:4]=4'h0;sec[3:0]=sec[3:0]+1'b1;if(sec[3:0]==4'ha)beginsec[3:0]=4'h0;sec[7:4]=sec[7:4]+1'b1;if(sec[7:4]==4'h6)beginsec[7:4]=4'h0;min[3:0]=min[3:0]+1'b1;if(min[3:0]==4'ha)beginmin[3:0]=4'h0;min[7:4]=min[7:4]+1'b1;endif(min==8'h60)min=8'h0;endendendendendelseif(key[4]==0)//清零beginms=0;sec=0;min=0;endend3.7鬧鐘模塊鬧鐘模塊主要包括存儲時(shí)分的存放器,設(shè)置鬧鐘,鬧鐘音樂,比照是否到達(dá)設(shè)定時(shí)刻幾個(gè)子模塊。其中音樂模塊最為復(fù)雜,也是本設(shè)計(jì)的亮點(diǎn),單獨(dú)在一個(gè)文件中編寫。//設(shè)置鬧鐘always@(negedgekey)if(key[7:6]==2'b01)//選擇鬧鐘設(shè)置beginif(!key[2])hour1=hour+1;elseif(!key[3])minute1=minute1+1;end//比照是否到達(dá)設(shè)定時(shí)刻always@(minuteorsecond)if(minute==minute1&&hour==hour1)beep2=beep1;elsebeep2=1'b0;//調(diào)用音樂模塊cannonmusic(.clk(clk),.beep1(beep1));//音樂模塊,采用曲子cannon片段產(chǎn)生音樂原理:對嗡鳴器而言,每個(gè)音調(diào)都有其對應(yīng)的頻率。在當(dāng)前節(jié)拍時(shí),給出相應(yīng)的頻率的脈沖即可發(fā)出對應(yīng)的音調(diào)。通過查找相關(guān)資料得出音調(diào)與頻率的對應(yīng)關(guān)系如下:音符頻率/HZ半周期/us(N)
低1DO2621908#1DO#2771805低2RE2941700#2RE#3111608低3MI3301516#3MI#3401470低4FA3491433#4FA#3701350低5SO3921276#5SO#4151205低6LA4401136#6LA#4661072低7SI4941012#7SI#5240954中1DO5230956#1DO#5540903中2RE5780842#2RE#6220804中3MI6590759#3MI#6820733中4FA6980716#4FA#7400676中5SO7840638#5SO#8310602中6LA8800568#6LA#9320536中7SI9880506#7SI#1046478高1DO1046478#1DO#1109451高2RE1175426#2RE#1245402高3MI1318372#3MI#1356368高4FA1397358#4FA#1480338高5SO1568319#5S0#1661292高6LA1760284#6LA#1865268高7SI1976253#7SI#2066242〔——來自百度知道〕卡農(nóng)簡譜:然后通過計(jì)算定義好每個(gè)音階對應(yīng)的頻率。250ms為一個(gè)節(jié)拍,把每一個(gè)節(jié)拍的頻率送到beep即可播放音樂。代碼太長,放到最后。3.8萬年歷模塊萬年歷的存儲計(jì)數(shù)模塊在前面已經(jīng)和時(shí)分秒一起完成,這里只需要調(diào)整設(shè)置模塊。這里采用另外一種設(shè)置的方式,移位設(shè)置。萬年歷一共有三組數(shù),共8位,假設(shè)分別用一個(gè)鍵去設(shè)置,太浪費(fèi)資源,而且如果是年的話要從0到2023一個(gè)一個(gè)累加設(shè)置也不現(xiàn)實(shí)。故采用移位設(shè)置,每一位分別設(shè)置,并控制每一位的最大值。這樣只需要兩個(gè)鍵即可完成功能,一個(gè)移位,一個(gè)控制累加。其中,為了突出當(dāng)前正在設(shè)置的位,將該位閃爍。閃爍的方法是用一個(gè)低頻信號〔2hz〕與原來的高頻掃描的位碼相或。這樣低頻信號為“1〞時(shí)會掩蓋該位的位碼,使其不顯示,只要在低頻信號為“0〞時(shí)才正常顯示。//設(shè)置萬年歷reg[2:0]setpoint;always@(negedgekey[4])if(key[7:6]==2'b00&&key[4]==0)setpoint=setpoint+1;always@(negedgekey[5])if(key[7:6]==2'b00&&key[5]==0)case(setpoint)3'd0:beginday[3:0]=day[3:0]+1;if(day[3:0]==4'ha)day[3:0]=4'h0;dig_blink[0]=clk_2hz;end3'd1:beginday[7:4]=day[7:4]+1;if(day[7:4]==4'h3)day[7:4]=4'h0;dig_blink[1]=clk_2hz;end3'd2:beginmonth[3:0]=month[3:0]+1;if(month[3:0]==4'ha)month[3:0]=4'h0;dig_blink[2]=clk_2hz;end3'd3:beginmonth[7:4]=month[7:4]+1;if(month[7:4]==4'h2)month[7:4]=4'h0;dig_blink[3]=clk_2hz;end3'd4:beginyear[3:0]=year[3:0]+1;if(year[3:0]==4'ha)year[3:0]=4'h0;dig_blink[4]=clk_2hz;end3'd5:beginyear[7:4]=year[7:4]+1;if(year[7:4]==4'ha)year[7:4]=4'h0;dig_blink[5]=clk_2hz;end3'd6:beginyear[11:8]=year[11:8]+1;if(year[11:8]==4'ha)year[11:8]=4'h0;dig_blink[6]=clk_2hz;end3'd7:beginyear[15:9]=year[15:9]+1;if(year[15:9]==4'ha)year[15:9]=4'h0;dig_blink[7]=clk_2hz;endendcase3.9鍵盤掃描模塊通過前面的操作發(fā)現(xiàn)單獨(dú)的操作按鍵進(jìn)行數(shù)碼的設(shè)置不太方便,假設(shè)能夠?qū)?*4矩陣鍵盤利用起來,必將方便的多。鍵盤掃描的原理如下:keyout1——4:key5——key8的管腳keyin1——4:key1——key4的管腳〔通過跳線進(jìn)行復(fù)用〕矩陣鍵盤的鍵值讀取是通過逐行掃描判斷實(shí)現(xiàn)的,如上圖所示,矩陣鍵盤的掃描流程是這樣的,剛開始在KEYOUT[4:1]輸出1110〔KEYOUT1輸出低電平〕,延時(shí)一段時(shí)間后讀取KEYIN的狀態(tài),由于KEYIN接有上拉電阻,平時(shí)無按鍵時(shí)值為1111,假設(shè)讀取的值不為1111,那么說明S1、S5、S9、S13有按鍵按下,KEYIN1-KEYIN4的每一位對應(yīng)一個(gè)按鍵〔如KEYIN[4:1]的值為1110,說明S1按下〕;掃描完一行之后繼續(xù)掃描第二行,KEYOUT[4:1]輸出1101〔KEYOUT2輸出低電平〕,通讀取KEYIN的值可判斷S2、S6、S10、S14按鍵的值。以此類推……通過定義6個(gè)狀態(tài),0狀態(tài)監(jiān)測有按鍵按下,1-4掃描是哪一列按下,假設(shè)檢測到有按下,立即轉(zhuǎn)到5狀態(tài),在按下時(shí)重復(fù)保存下當(dāng)前的行和列。假設(shè)均無按下,回到0狀態(tài)等待按下。主要代碼實(shí)現(xiàn):always@(posedgeclk_500khzornegedgereset)if(!reset)begincol<=4'b0000;state<=3'd0;endelsebegincase(state)3'd0:begincol[3:0]<=4'b0000;key_flag<=1'b0;if(row[3:0]!=4'b1111)beginstate<=3'd1;col[3:0]<=4'b1110;end//有鍵按下,掃描第一列elsestate<=3'd0;end3'd1:beginif(row[3:0]!=4'b1111)beginstate<=3'd5;end//判斷是否是第一列elsebeginstate<=3'd2;col[3:0]<=4'b1101;end//掃描第二列end3'd2:beginif(row[3:0]!=4'b1111)beginstate<=3'd5;end//判斷是否是第二列elsebeginstate<=3'd3;col[3:0]<=4'b1011;end//掃描第三列end3'd3:beginif(row[3:0]!=4'b1111)beginstate<=3'd5;end//判斷是否是第三列elsebeginstate<=3'd4;col[3:0]<=4'b0111;end//掃描第四列end3'd4:beginif(row[3:0]!=4'b1111)beginstate<=3'd5;end//判斷是否是第一行elsestate<=3'd0;end3'd5:beginif(row[3:0]!=4'b1111)begincol_reg<=col;//保存掃描列值row_reg<=row;//保存掃描行值state<=3'd5;key_flag<=1'b1;//有鍵按下endelsebeginstate<=0;endendendcaseendalways@(clk_500khzorcol_regorrow_reg)beginif(key_flag==1'b1)begincase({col_reg,row_reg})8'b1110_1110:key_value<=8'h7;8'b1110_1101:key_value<=8'h4;8'b1110_1011:key_value<=8'h1;8'b1110_0111:key_value<=8'h0;8'b1101_1110:key_value<=8'h8;8'b1101_1101:key_value<=8'h5;8'b1101_1011:key_value<=8'h2;8'b1101_0111:key_value<=8'ha;8'b1011_1110:key_value<=8'h9;8'b1011_1101:key_value<=8'h6;8'b1011_1011:key_value<=8'h3;8'b1011_0111:key_value<=8'hb;8'b0111_1110:key_value<=8'hf;8'b0111_1101:key_value<=8'he;8'b0111_1011:key_value<=8'hd;8'b0111_0111:key_value<=8'hc;endcaseendend4調(diào)試仿真由于之前比賽就有過太多的失敗和教訓(xùn),不過也積累了不少經(jīng)驗(yàn),所以總體在軟件使用方面不存在障礙。提幾點(diǎn)十分重要的地方,當(dāng)然老師上課也都說過的。1.軟件必須完全破解,否那么無法使用高級功能,也不能使用cycloneIII系列FPGA芯片。2.所有的文件必須在英文路徑下面,否那么會有意想不到的各種問題。3.以前我不知道仿真的信號可以自由分組,以方便觀察組合值,以前都是默認(rèn)的總線才有分組的??偠灾?,寫好的工程需要編譯,然后根據(jù)提示的錯(cuò)誤進(jìn)行修改就行。仿真時(shí)需要新建波形文件,選擇感興趣的端口,設(shè)置好輸入信號,使能,時(shí)鐘,功能選擇等等。仿真,然后查看輸出波形。總的仿真波形如下:5編程下載分配好管腳,注意把沒有用到的管腳定義為三態(tài)輸入。再次編譯。分配好管腳如下:6結(jié)論成功地運(yùn)用VerilogHDL設(shè)計(jì)出多功能數(shù)字鐘,完成所有根本功能,并且添加了秒表,鬧鐘,萬年歷功能。7參考文獻(xiàn)《EDA實(shí)驗(yàn)與實(shí)踐》周立功主編《數(shù)字邏輯電路與系統(tǒng)設(shè)計(jì)》蔣立平主編《Verilog_HDL_華為入門教程》8實(shí)驗(yàn)感想遇到了很多的問題,根本上都是Verilog的問題,畢竟沒有系統(tǒng)的學(xué)習(xí)過,下面包括幾個(gè)典型的:只能在一個(gè)進(jìn)程中操作存放器,不然會有沖突。剛開始很不理解,而且覺得限制了很多的功能。比方想在多種信號條件去操作同一個(gè)存放器。解決方法是將所有觸發(fā)信號寫入敏感表,在進(jìn)程中用if語句判斷到底是哪一個(gè)信號觸發(fā)的,從而做出相應(yīng)的操作。不能屢次賦值給網(wǎng)線類型,其實(shí)這個(gè)問題與前面一個(gè)問題有相似之處。解決方法是先將多個(gè)要賦值的信號邏輯運(yùn)算后再進(jìn)行賦值,比方或和與運(yùn)算?!睬懊嬉粋€(gè)問題通過if語句進(jìn)行邏輯運(yùn)算的〕在賦值時(shí)不能偷懶,最好指定好數(shù)據(jù)的位,如4’h0,不然會出現(xiàn)意想不到的錯(cuò)誤。if條件語句〔如果包含〕必須至少有一個(gè)條件指向其中一個(gè)敏感事件〔邊界標(biāo)識符〕設(shè)計(jì)流程最好采用并行設(shè)計(jì),在多個(gè)always@進(jìn)程中處理時(shí)序邏輯或組合邏輯。這樣有利于問題的簡化。通過此次電子設(shè)計(jì),再次復(fù)習(xí)學(xué)習(xí)了一遍VerilogHDL,對其中數(shù)據(jù)流的操作又有了更多的理解。當(dāng)然,還是停留在外表,以后還需要更加深入的學(xué)習(xí),這樣運(yùn)用起來才會。VerilogHDL很強(qiáng)大,既包括低級的邏輯門,又包括高級的數(shù)學(xué)運(yùn)算。其模塊化和結(jié)構(gòu)化足以設(shè)計(jì)大型的數(shù)字電路。個(gè)人認(rèn)為硬件描述語言通過語言主要是直接操作存放器和網(wǎng)線,從而綜合時(shí)序邏輯電路和組合邏輯電路,理論上可以設(shè)計(jì)出任何邏輯功能的電路。9源代碼1.moduleclock(clk,clk_1hz,clk_2hz,clk_500hz,clk_1k,key_in,dig,seg,beep);inputclk,clk_1hz,clk_2hz,clk_500hz,clk_1k;input[7:0]key_in;//key[0]:en,key[1]:clear,key[2]:jiaoshi,key[3]:jiaofen,key[4]:,key[5],key[6],key[7]:functionchooseoutput[7:0]dig;output[7:0]seg;outputbeep;wirebeep1;regbeep2;regbeep_r;//output[7:0]hour,minute,second;assigndig=dig_r|dig_blink;assignseg=seg_r;assignbeep=beep_r|beep2;//naozhong,baoshireg[7:0]key_r1,key_r2,key_r3;wire[7:0]key;reg[7:0]seg_r;//segmentchoosereg[7:0]dig_r,dig_blink;//digitchoosereg[7:0]hour,minute,second;reg[7:0]month,day;reg[15:0]year;reg[7:0]hour1,minute1,second1;//naozhongreg[7:0]min,sec,ms;//miaobiaoreg[3:0]dis_data;//thedatayouwantdisplaynowreg[2:0]count1;reg[32:0]display;//allthedataseriestodisplayregf50hz,f100hz;reg[4:0]count20;reg[3:0]count10;//////////////////////////////////////////////////去抖動電路/assignkey=(key_r1|key_r2|key_r3);//T=20msalways@(posedgeclk_1k)beginf50hz<=(count20<20/2)?1'b1:1'b0;if(count20==20-1) count20<=0;else count20<=count20+1;endalways@(posedgef50hz)begin key_r1<=key_in; key_r2<=key_r1; key_r3<=key_r2;end//second->minute->hour///->day->month->year/////////////////////////////always@(posedgeclk_1hzornegedgekey[1]ornegedgekey[2]ornegedgekey[3])always@(posedgeclk_1hzornegedgekey[1])beginif(key[1]==0)//clearbeginhour=8'b0;minute=8'b0;second=8'b0;endelseif(key[7:6]==2'b11&&key[2]==0)begin hour[3:0]=hour[3:0]+1'b1; if(hour[3:0]==4'ha) begin hour[3:0]=4'h0; hour[7:4]=hour[7:4]+1; if(hour[7:4]==4'h6) hour[7:4]=4'h0; endendelseif(key[7:6]==2'b11&&key[3]==0)begin minute[3:0]=minute[3:0]+1'b1; if(minute[3:0]==4'ha) begin minute[3:0]=4'h0; minute[7:4]=minute[7:4]+1; if(minute[7:4]==4'h6) minute[7:4]=4'h0; endendelseif(key[0])//nopausebegin second[3:0]=second[3:0]+1'b1; if(second[3:0]==4'ha) begin second[3:0]=4'h0; second[7:4]=second[7:4]+1'b1; if(second[7:4]==4'h6) begin second[7:4]=4'h0; minute[3:0]=minute[3:0]+1'b1; if(minute[3:0]==4'ha) begin minute[3:0]=4'h0; minute[7:4]=minute[7:4]+1'b1; if(minute[7:4]==4'h6) begin minute[7:4]=4'h0; hour[3:0]=hour[3:0]+1'b1; if(hour[3:0]==4'ha) begin hour[3:0]=4'h0; hour[7:4]=hour[7:4]+1'b1; if(hour==8'h24) begin hour[7:4]=4'h0; day[3:0]=day[3:0]+1'b1; if(day[3:0]==4'ha) begin day[3:0]=4'h0; day[7:4]=day[7:4]+1'b1; if(day[7:4]==4'h3) begin day[7:4]=4'h0; month[3:0]=month[3:0]+1'b1; if(month[3:0]==4'ha) begin month[3:0]=4'h0; month[7:4]=month[7:4]+1'b1; if(month[7:0]==8'h12) begin month=8'h0; year=year+1; end end end end end end end end end endendend/////////////////////////////////////////////////////////////////////////設(shè)置鬧鐘always@(negedgekey)if(key[7:6]==2'b01)beginif(!key[2])hour1=hour+1;elseif(!key[3])minute1=minute1+1;end/////////////////////////////////////////////////////////////////////////秒表always@(posedgeclk_1k)begin f100hz<=(count10<10/2)?1'b1:1'b0; if(count10==10-1) count10<=0; else count10<=count10+1;endalways@(posedgef100hz)begin if(key[7:4]==4'b0111) begin ms[3:0]=ms[3:0]+1'b1; if(ms[3:0]==4'ha) begin ms[3:0]=4'h0; ms[7:4]=ms[7:4]+1'b1; if(ms[7:4]==4'ha) begin ms[7:4]=4'h0; sec[3:0]=sec[3:0]+1'b1; if(sec[3:0]==4'ha) begin sec[3:0]=4'h0; sec[7:4]=sec[7:4]+1'b1; if(sec[7:4]==4'h6) begin sec[7:4]=4'h0; min[3:0]=min[3:0]+1'b1; if(min[3:0]==4'ha) begin min[3:0]=4'h0; min[7:4]=min[7:4]+1'b1; end if(min==8'h60) min=8'h0; end end end end end else if(key[4]==0) begin ms=0; sec=0; min=0; endend/////////////////////////////////////////////////////////////////////////設(shè)置萬年歷reg[2:0]setpoint;always@(negedgekey[4])if(key[7:6]==2'b00&&key[4]==0)setpoint=setpoint+1;always@(negedgekey[5])if(key[7:6]==2'b00&&key[5]==0)case(setpoint)3'd0:beginday[3:0]=day[3:0]+1;if(day[3:0]==4'ha)day[3:0]=4'h0;dig_blink[0]=clk_2hz;end3'd1:beginday[7:4]=day[7:4]+1;if(day[7:4]==4'h3)day[7:4]=4'h0;dig_blink[1]=clk_2hz;end3'd2:beginmonth[3:0]=month[3:0]+1;if(month[3:0]==4'ha)month[3:0]=4'h0;dig_blink[2]=clk_2hz;end3'd3:beginmonth[7:4]=month[7:4]+1;if(month[7:4]==4'h2)month[7:4]=4'h0;dig_blink[3]=clk_2hz;end3'd4:beginyear[3:0]=year[3:0]+1;if(year[3:0]==4'ha)year[3:0]=4'h0;dig_blink[4]=clk_2hz;end3'd5:beginyear[7:4]=year[7:4]+1;if(year[7:4]==4'ha)year[7:4]=4'h0;dig_blink[5]=clk_2hz;end3'd6:beginyear[11:8]=year[11:8]+1;if(year[11:8]==4'ha)year[11:8]=4'h0;dig_blink[6]=clk_2hz;end3'd7:beginyear[15:9]=year[15:9]+1;if(year[15:9]==4'ha)year[15:9]=4'h0;dig_blink[7]=clk_2hz;endendcase///////////////////////////////////////////////////////////////////////////////scananddisplay/always@(posedgeclk_1k)begin//display_functionchosecase(key[7:6])2'b11:display={hour,4'ha,minute,4'ha,second};//正常計(jì)時(shí)2'b10:display={hour1,4'ha,minute1,4'ha,second1};//設(shè)置鬧鐘2'b01:display={min,4'ha,sec,4'ha,ms};//秒表2'b00:display={year,month,day};//萬年歷endcase case(count1) 3'd0:dis_data=display[3:0]; 3'd1:dis_data=display[7:4]; 3'd2:dis_data=display[11:8]; 3'd3:dis_data=display[15:12]; 3'd4:dis_data=display[19:16]; 3'd5:dis_data=display[23:20]; 3'd6:dis_data=display[27:24]; 3'd7:dis_data=display[31:28]; endcase case(count1) 3'd0:dig_r=8'b11111110; 3'd1:dig_r=8'b11111101; 3'd2:dig_r=8'b11111011; 3'd3:dig_r=8'b11110111; 3'd4:dig_r=8'b11101111; 3'd5:dig_r=8'b11011111; 3'd6:dig_r=8'b10111111; 3'd7:dig_r=8'b01111111; endcase count1<=count1+1;case(dis_data) 4'h0:seg_r=8'hc0; 4'h1:seg_r=8'hf9; 4'h2:seg_r=8'ha4; 4'h3:seg_r=8'hb0; 4'h4:seg_r=8'h99; 4'h5:seg_r=8'h92; 4'h6:seg_r=8'h82; 4'h7:seg_r=8'hf8; 4'h8:seg_r=8'h80; 4'h9:seg_r=8'h90; 4'ha:seg_r=8'hbf; default:seg_r=8'hff;endcaseend//////////////////////////////////////////////////////////////報(bào)時(shí)always@(minuteorsecond) if(minute==8'h59)//59分鐘時(shí) case(second)//秒為53、55、57低音報(bào)時(shí) 8'h53, 8'h55, 8'h57:beep_r<=clk_500hz; 8'h59:beep_r<=clk_1k; default:beep_r<=1'b0; endcase else beep_r<=1'b0;/////////////////////////////////////////////////////////////鬧鐘always@(minuteorsecond)if(minute==minute1&&hour==hour1)beep2=beep1;elsebeep2=1'b0;cannonmusic( .clk(clk), .beep1(beep1));Endmodule2.modulecannon(clk,beep1);inputclk;outputwirebeep1;regbeep_r;reg[7:0]state;reg[15:0]count,count_end;reg[23:0]count1;parameter l5=16'd61224, l6=16'd54545, l7=16'd48593, m1=16'd45863, m2=16'd40864, m3=16'd36420, m4=16'd34359, m5=16'd30612, m6=16'd27273, m7=16'd24296, h1=16'd22956, h2=16'd20431, h3=16'd18203, h4=16'd17181, h5=16'd15306, h6=16'd13636, h7=16'd12149;parameterTIME=12000000;assignbeep1=beep_r;always@(posedgeclk)begin count<=count+1'b1; if(count==count_end) begin count<=16'h0; beep_r<=!beep_r; endendalways@(posedgeclk)beginif(count1<TIME) count1=count1+1'b1;elsebegincount1=24'd0;if(state==8'd147) state=8'd0;else state=state+1'b1;case(state)8'd0,8'd1:count_end=h5;8'd2:count_end=h3;8'd3:count_end=h4;8'd4,8'd5:count_end=h5;8'd6:count_end=h3;8'd7:count_end=h4;8'd8:count_end=h5;8'd9:count_end=m5;8'd10:count_end=m6;8'd11:count_end=m7;8'd12:count_end=h1;8'd13:count_end=h2;8'd14:count_end=h3;8'd15:count_end=h4;8'd16,8'd17:count_end=h3;8'd18:count_end=h1;8'd19:count_end=h2;8'd20,8'd21:count_end=h3;8'd22:count_end=m3;8'd23:count_end=m4;8'd24:count_end=m5;8'd25:count_end=m6;8'd26:count_end=m5;8'd27:count_end=m4;8'd28:count_end=m5;8'd29:count_end=m3;8'd30:count_end=m4;8'd31:count_end=m5;8'd32,8'd33:count_end=m4;8'd34:count_end=m6;8'd35:count_end=m5;8'd36,8'd37:count_end=m4;8'd38:count_end=m3;8'd39:count_end=m2;8'd40:count_end=m3;8'd41:count_end=m2;8'd42:count_end=m1;8'd43:count_end=m2;8'd44:count_end=m3;8'd45:count_end=m4;8'd46:count_end=m5;8'd47:count_end=m6;8'd48,8'd49:count_end=m4;8'd50:count_end=m6;8'd51:count_end=m5;8'd52,8'd53:count_end=m6;8'd54:count_end=m7;8'd55:count_end=h1;8'd56:count_end=m5;8'd57:count_end=m6;8'd58:count_end=m7;8'd59:count_end=h1;8'd60:count_end=h2;8'd61:count_end=h3;8'd62:count_end=h4;8'd63:count_end=h5;8'd64,8'd65:count_end=h3;8'd66:count_end=h1;8'd67:count_end=h2;8'd68,8'd69:count_end=h3;8'd70:count_end=h2;8'd71:count_end=h1;8'd72:count_end=h2;8'd73:count_end=m7;8'd74:count_end=h1;8'd75:count_end=h2;8'd76:count_end=h3;8'd77:count_end=h2;8'd78:count_end=h1;8'd79:count_end=m7;8'd80,8'd81:count_end=h1;8'd82:count_end=m6;8'd83:count_end=m7;8'd84,8'd85:count_end=h1;8'd86:count_end=m1;8'd87:count_end=m2;8'd88:count_end=m3;8'd89:count_end=m4;8'd90:count_end=m3;8'd91:count_end=m2;8'd92:count_end=m3;8'd93:count_end=h1;8'd94:count_end=m7;8'd95:count_end=h1;8'd96,8'd97:count_end=m6;8'd98:count_end=h1;8'd99:count_end=m7;8'd100,8'd101:count_end=m6;8'd102:count_end=m5;8'd103:count_end=m4;8'd104:count_end=m5;8'd105:count_end=m4;8'd106:count_end=m3;8'd107:count_end=m4;8'd108:count_end=m5;8'd109:count_end=m6;8'd110:count_end=m7;8'd111:count_end=m1;8'd112,8'd113:count_end=m6;8'd114:count_end=h1;8'd115:count_end=m7;8'd116,8'd117:count_end=h1;8'd118:count_end=m7;8'd119:count_end=m6;8'd120:count_end=m7;8'd121:count_end=h1;8'd122:count_end=h2;8'd123:count_end=h1;8'd124:count_end=m7;8'd125:count_end=h1;8'd126:count_end=m6;8'd127:count_end=m7;endcaseendendendmodule3.modulefdiv(clk,f1k,f500hz,f200hz,f2hz,f1hz);inputclk;outputf1k,f500hz,f200hz,f2hz,f1hz;regf1k,f500hz,f2hz,f1hz;integercount48k=0,count100=0,count5p=0,count5n=0;//48kdiv,result48mto1kalways@(posedgeclk) begin f1k<=(count48k<48000/2)?1'b1:1'b0; if(count48k==48000-1) count48k<=0; else count48k<=count48k+1; end//2div,result1kto500hzalways@(posedgef1k)begin f500hz=~f500hz;end//5div,result1kto200hz,50%regf200p,f200n;//posedgeocunteralways@(posedgef1k) if(count5p==4) count5p<=0; else count5p<=count5p+1;//posedgewavealways@(posedgef1k) begin if(count5p<2) f200p<=1; else f200p<=0; end//negedgecounteralways@(negedgef1k) if(count5n==4) count5n<=0; else count5n<=count5n+1;//negedgewavealways@(negedgef1k) begin if(count5n<2) f200n<=1; else f200n<=0; endassignf200hz=f200n|f200p;//100div,result200hzto2hzalways@(posedgef200hz) begin f2hz<=(count100<100/2)?1'b1:1'b0; if(count100==99) count100<=0; else count100<=c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)境保護(hù)法規(guī)及污染治理技術(shù)試題
- PROTAC-AR-Degrader-8-生命科學(xué)試劑-MCE
- IL-17-IN-3-生命科學(xué)試劑-MCE
- 交通運(yùn)輸管理手冊
- AR-ligand-33-生命科學(xué)試劑-MCE
- 地皮買賣合同地皮買賣合同
- 公路建設(shè)工程施工承包協(xié)議
- 內(nèi)燃機(jī)金屬零部件產(chǎn)品質(zhì)量監(jiān)督抽查方案
- 建筑工程股份合同
- 應(yīng)用程序運(yùn)行狀態(tài)監(jiān)控細(xì)則
- 備電綜合解決方案服務(wù)合同
- 噴(烤)漆房VOCs治理設(shè)施日常運(yùn)行臺賬
- 往復(fù)式壓縮機(jī)組單機(jī)試運(yùn)方案
- 區(qū)域環(huán)境概況
- 爆破片面積計(jì)算
- 設(shè)備安裝檢驗(yàn)批表格
- 車輛清障救援合作協(xié)議
- 全國書法作品展投稿登記表
- 中醫(yī)師承跟師筆記60篇(共1頁)
- BM 帶小葉片的高壓比壓氣機(jī)葉輪設(shè)計(jì)BladeGen實(shí)例
- 輸變電工程建設(shè)管理程序指南
評論
0/150
提交評論