




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、中國石油大學(華東)本科畢業(yè)設計(論文)通信電子實習報告題 目: 多功能數(shù)字時鐘學生姓名: * * *學 號:12073322 12073323 12073324專業(yè)班級:通信工程1203指導教師:張錫嶺2014年7月11日課題簡介一:任務定義多功能數(shù)字時鐘基本功能:1、日歷功能,顯示年月日2、計時功能,包括時、分、秒。3、定時與鬧鐘功能,能在設定的時間提示4、能夠對小時、分、秒進行手動調整以校正時間5、正點報時,逢正點給予一定的指示。6、跑表功能,百分秒技術。記錄多個值。擴展功能:7、同步時間功能,從網上獲得時間并下載到DE2上。8、便簽功能,在某時某刻顯示之前所要提醒的事務。采用veril
2、og設計,在de2上實現(xiàn),實現(xiàn)LCD、七段管顯示,整點報時等提示或告警信息用LED跑馬燈實現(xiàn)。二:團隊成員簡要介紹團隊成員及負責工作*:跑表功能顯示功能計時功能*:日歷功能鬧鈴設置功能調整時間功能*:整點報時功能 七段管顯示功能第1章 系統(tǒng)分析和設計 本部分,詳細描述設計思路.,系統(tǒng)整體功能,模塊的劃分,注明每部分的作者設計思路: 擬定數(shù)字鐘的組成框圖,劃分模塊,采用分模塊、分層次的方法設計電路,。通過模式的切換來選擇顯示不同的內容,在計時器、鬧鈴。跑表之間實現(xiàn)切換,通過使能信號來控制調節(jié)。系統(tǒng)框圖如下:跑表電路分段顯示多個時間在LCD屏上顯示便簽提示(待解決)鬧鈴響起與整點報時模式選擇 鬧鈴
3、調節(jié)日歷調節(jié)日歷電路鬧鈴電路計時器調節(jié)計時器電路分段計時、LCD記錄是的系統(tǒng)輸入:SW17:14 KEY3:0 ;KEY3 計時器復位信號KEY2 自增調節(jié)信號(跑表復位信號)KEY1 選擇信號(跑表暫停讀數(shù)信號)KEY0 模式切換信號(通過觀察LEDR16:12可看出)SW17 日歷模式信號SW16 日歷調節(jié)選擇信號SW15 自增信號SW14 跑表讀數(shù)信號系統(tǒng)輸出:LCD液晶顯示屏輸出 七段管顯示輸出 LEDR,LEDG提示信號輸出。系統(tǒng)功能具體如下:1. 計時:正常工作狀態(tài)下,每日24h計時制顯示并會進位到日期。2. 設置鬧鈴時間:在計時模式下,按KEY0鍵,將會切換狀態(tài),第一次將會切換到
4、調節(jié)鬧鐘狀態(tài),此時若是按KEY1鍵將會選擇調節(jié)鬧鐘時間的時或是分,選擇后按KEY2將會實現(xiàn)自增。3. 調整計時器時間:若在計時器狀態(tài)下連續(xù)按兩次KEY0鍵,將會切換到調節(jié)計時器時間狀態(tài),此時若是按KEY1鍵將會選擇調節(jié)計時器時間的時、分、秒,選擇后按KEY2件會實現(xiàn)自增。4. 整點報時鬧鈴提醒:逢整點時間,跑馬燈將會閃爍。當?shù)竭_鬧鈴設置的時間時跑馬燈也將會閃爍,并且優(yōu)先級高于整點報時。5. 跑表分段計時:系統(tǒng)以100Hz頻率計時,并且在七段管上顯示。并且在觸發(fā)條件KEY1下將時間顯示到LCD顯示屏上,當再次觸發(fā)SW14時,將會把記錄的四個數(shù)值以1hz的頻率一一顯示在LCD顯示屏上。6. 日歷:
5、SW17 控制顯示日歷時間,高電平為調節(jié)模式,低電平為普通運行模式。調節(jié)模式下,在觸發(fā)SW16時 將會選擇調節(jié)年、月、日,觸發(fā)SW15時,將會自增。 在調節(jié)狀態(tài)或是在滿24小時進位時將會閃爍刷新。7. 分頻:將內置50Mhz時鐘信號分到各種所需的頻率時鐘信號。8. 解碼以及顯示:將數(shù)字信號解碼到七段管顯示以及LCD液晶顯示屏上,并且令其顯示。9. 防抖動:顧名思義,主要是為了防止觸發(fā)信號的抖動。計時器模塊(*)由于計時器模塊包含手動調節(jié)時間功能,每當KEY出現(xiàn)一個下降沿,產生一個自增信號,所以每個七段管時鐘應等于自身的自增信號或進位信號,代碼如下:assign carryclk0=clk_1h
6、z_md | incplus0;(carryclk5:0為時鐘信號,carry4:0為進位信號,incplus5:0為自增信號)當處于手動計時模塊時,KEY1為選位信號模塊代碼如下:module bitsel(alarmmode,checkmode,sel,selcode,reset);/對時分秒的選擇,并分成實在時鐘或是鬧鈴模式下input alarmmode; /當前所處的調節(jié)模式(鬧鈴或計時)input checkmode; /當前狀態(tài)(計時或手動調節(jié))input sel; /手動調節(jié)選位信號(KEY1)input reset;output reg2:0 selcode; /輸出調節(jié)選位
7、信號reg 2:0 check_code; /計時選位變量reg 1:0 alarm_code; /鬧鈴選位變量always (negedge sel or negedge reset)begin if(!reset) check_code<=3'b000; /復位信號else begincase (check_code) 3'b000: check_code<=3'b001; /計時狀態(tài) 3'b001: check_code<=3'b010; /調節(jié)秒位 3'b010: check_code<=3'b100; /
8、調節(jié)分位 3'b100: check_code<=3'b001; /調節(jié)時位 default: check_code<=3'b000; endcase end end鬧鐘選位同上always begin if(alarmmodecheckmode) /兩個之中只有一個是1 begin if(checkmode) selcode=check_code; else selcode=alarm_code,1'b0 ; end else selcode=3'b000;endendmodule以上模塊得到時分秒自增信號,再由下面代碼得到incplus5
9、:0(時分秒各位的自增信號),inc為輸入自增信號(KEY2)always begin case(check) 3'b001: begin clk_1hz_md=0; incplus=5'b00000,inc;end 3'b010: begin clk_1hz_md=0; incplus=3'b000,inc,2'b00;end 3'b100: begin clk_1hz_md=0; incplus=1'b0,inc,4'b0000;end default:begin incplus =6'b000000; clk_1hz
10、_md=clk_1hz;end endcaseend 最后再有下面代碼得到進位信號module hexcounter(clk,set,max,setdata,dataout,carryout); /調增時間input clk; /輸入的時鐘信號input set; /復位信號input 3:0 max,setdata; /max:每一位七段管的最大顯示值; setdata:每一位七段管的最小顯示值output carryout; /每一位七段管的進位信號output 3:0 dataout; /每一位七段管的輸出reg 3:0 counter;reg carrybit;assign carry
11、out=carrybit;assign dataout=counter;always (posedge clk or negedge set) begin if(!set) begin counter<=setdata; carrybit<=0; end else begin if(counter=max)|(counter>max) begin counter<=0;carrybit<=1; end else begin counter<=counter+1'b1; carrybit<=0;end end end endmodule 最后由下
12、面代碼使每一位七段管顯示時間:module led(datain,dotin,ledout); /七段管顯示input 3:0 datain; /每一位時間的值input dotin; /小數(shù)點(本次實習的板子好像不帶這功能)output7:0 ledout;reg 6:0 dataout;wire dotout;assign ledout6:0=dataout;assign ledout7=dotout;assign dotout=dotin; always*begin case(datain) 0: dataout<=7'b1000000; default: dataout&
13、lt;=7'b1000000; endcase endendmodule LCD顯示模塊(*)module view(c,a,b,CLOCK_50,shuru,LCD_EN,LCD_RW,LCD_RS,LCD_DATA,LCD_ON,LCD_BLON);input CLOCK_50;input 32*8:1 shuru; / 傳入顯示信息數(shù)據input a,b,c; /清屏信號(關閉電源刷新屏幕)output LCD_EN; /刷屏信號(此信號控制LCD顯示刷新頻率,大于一定值的時候才能穩(wěn)定顯示信息)output LCD_RW; /寄存器選擇,指令寄存器output LCD_RS; /
14、低電平為寫操作;同為低電平可以寫入指令或顯示地址output LCD_ON; /電源信號output LCD_BLON; /output reg7:0 LCD_DATA; /每一個LCD小格子顯示的信息reg LCD_RW,LCD_RS,clk4hz,LCD_ON;reg10:0 state;reg6:0 count;reg5:0 disp_count;reg 23:0 cnt;reg255:0 data_in_buf;parameter CLEAR=8'b00000001;/清屏parameter SETCGRAM=8'b00000010;/設置 CGRAMparameter
15、 SETFUNCTION=8'b00000100;parameter SWITCHMODE=8'b00001000;parameter SETMODE=8'b00010000;parameter RETURNCURSOR=8'b00100000;/歸home位parameter SHIFT=8'b01000000;parameter WRITERAM=8'b10000000;/write RAMparameter CUR_INC=1;parameter CUR_NOSHIFT=0;parameter OPEN_DISPLAY=1;paramete
16、r OPEN_CUR=0;parameter BLANK_CUR=0;parameter DATAWIDTH8=1;parameter DATAWIDTH4=0;parameter TWOLINE=1;parameter ONELINE=0;parameter FONT5X10=1;parameter FONT5X7=0;wire 255:0DATA_IN;assign DATA_IN=shuru;/傳入數(shù)值assign LCD_BLON=1;always (posedge CLOCK_50) /分頻 begin if (cnt = 24'd62500) /6250000 24'
17、;h5F5E10 begin cnt <= 0; clk4hz <= clk4hz; end else cnt <= cnt+1; end assign LCD_EN = clk4hz;always (posedge clk4hz) if(a|b|!c) begin state <= CLEAR; /清屏 LCD_ON <= 0; /電源端 disp_count <= 6'b0; end else begin LCD_ON <=1; /電源端case (state)CLEAR :begin LCD_RS<=0; /寄存器選擇,指令寄存器L
18、CD_RW <= 0; /低電平為寫操作;同為低電平可以寫入指令或顯示地址 LCD_DATA <= 8'b0000_0001;/輸入指令集,data_in_buf <=DATA_IN;state<=SETCGRAM;endSETCGRAM: begin /讀寫數(shù)據 LCD_RS<=0; LCD_RW <= 0; /同為低電平可以寫入指令或顯示地址 LCD_DATA <= 8'b1000_0000; state <= SETFUNCTION;endSETFUNCTION: begin /工作方式設置 LCD_RS<=0; LC
19、D_RW<=0; LCD_DATA7:5<=3'b001; LCD_DATA4<=DATAWIDTH8;/1 LCD_DATA3<=TWOLINE;/1 LCD_DATA2<=FONT5X10;/1 LCD_DATA1:0<=2'b00; state<=SWITCHMODE; end SWITCHMODE: begin /顯示狀態(tài)設置 LCD_RS<=0; LCD_RW<=0; LCD_DATA7:3<=5'b00001; LCD_DATA2<=OPEN_DISPLAY;/1 LCD_DATA1<=
20、OPEN_CUR;/0 LCD_DATA0<=BLANK_CUR;/0 state<=SETMODE;endSETMODE: begin /輸入方式設置 LCD_RS<=0; LCD_RW<=0; LCD_DATA7:2<=6'b000001; LCD_DATA1<=CUR_INC; /1 LCD_DATA0<=CUR_NOSHIFT;/0 state<=WRITERAM; endRETURNCURSOR: begin /光標歸位 LCD_RS<=0; LCD_RW<=0; LCD_DATA<=8'b0000_0
21、010; state<=WRITERAM; endSHIFT: begin /移位 LCD_RS<=1; /高電平為數(shù)據寄存器 LCD_RW<=0; /RS1,RW0,寫入數(shù)據 LCD_DATA<=data_in_buf255:248; data_in_buf<=(data_in_buf<<8); disp_count<=disp_count+1'b1; state<=WRITERAM; endWRITERAM: begin /寫RAM狀態(tài) LCD_RS<=1; LCD_RW<=0; /寫入數(shù)據 if(disp_coun
22、t=32) begin LCD_RW<=1; disp_count<=4'b0; /xiugaizaizhe state<=CLEAR; end else if(disp_count=16) begin LCD_RS<=0; LCD_RW<=0;/寫入指令或顯示地址 LCD_DATA<=8'b1100_0000; state<=SHIFT; end else begin LCD_DATA<=data_in_buf255:248; data_in_buf<=(data_in_buf<<8); disp_count&
23、lt;=disp_count+1'b1; state<=WRITERAM; end end endcase endendmodule從網上了解到LCD輸入信號只需在原輸入信號的字符上加上雙引號即可,轉碼模塊如下:module change(in,out);input3:0 in;output reg 7:0out;always*begin case(in) 4'd0:out="0" default :out="?" endcaseendendmodule跑表模塊(*)由于跑表不需要手動調節(jié)時間,所以每一位時間的時鐘信號都是前一位的進
24、位信號,跑表模塊如下:module paobiao(enable,CLOCK_50,KEY,fs0,fs1,s0,s1,minu0,minu1);input CLOCK_50;input KEY;input enable; /暫停使能信號output reg3:0 fs0; /百分秒個位reg fscarry0; /百分秒個位進位. wire zero; /暫停標志switch switchzero(CLOCK_50,KEY,zero);reg18:0 counter_100hz; /從50Mhz分頻到100hz的計數(shù)器wire clk100;clk50mto100(CLOCK_50,clk1
25、00,state); /分頻得到100hz的時鐘parameter i0=1'b0,i1=1'b1;reg state,next_state;always (negedge clk100 or negedge zero ) /異步復位,s0為起始狀態(tài)begin if(!zero) state<=i0; else state<=next_state;endalways(posedge clk100 or negedge zero) /百分秒個位進位 begin if(!zero) begin fs0<=0;fscarry0<=0; end else if(
26、clk100=1) begin if(fs0=9) begin fs0<=0;fscarry0<=1; end else begin fs0<=fs0+1'b1;fscarry0<=0; end end end秒分進位同上led ledfs0(fs0,1,HEX0);.最后調用led模塊使跑表數(shù)值顯示在七段管上;當按下KEY1后,取值顯示在LCD顯示屏上,SW0為1時將取出的值依次顯示在LCD顯示屏上,我們設計能存4個值(僅僅只是測試用,其實可以存更多的值),用寄存器save實現(xiàn),代碼如下:always (posedge clk_1hz) begin if(pa
27、obiao) begin if(!KEY1) begin /在LCD屏上顯示跑表暫停時的時間 shuru<="Now Time:"," ",show5,show4,":",show3,show2,":",show1,show0; save<=save767:0,"Save Time:"," ",show5,show4,"-",show3,show2,"-",show1,show0; /寄存器移位存儲 d<=1'
28、b0; end else if(SW0)/ 重復讀取之前的數(shù)據(顯示4個) begin shuru<=save1023:768; /讀取寄存器最后一位(即最早存入的數(shù)據) e<=1'B1; save<=save767:0,save1023:768; /寄存器的值移位 d<=1'b0; end else begin d<=1'b1; e<=1'B0; end end else shuru<=LCD_show; end 鬧鈴模塊(*)module alarm(ledr,clk50m,alarmon,alarmout,rese
29、t);input 1:0 alarmon;input clk50m;input reset;output reg alarmout;output reg ledr;reg 15:0 counter_1k;wire clk_1k; assign clk_1k= counter_1k15;always (posedge clk50m) begin if(counter_1k=50000) counter_1k<=0; else counter_1k<=counter_1k+1'b1; endendmodule 七段管顯示模塊(*)module led(datain,dotin,
30、ledout);/七段管顯示always*begin case(datain) 0: dataout<=7'b1000000; 1: dataout<=7'b1111001; 2: dataout<=7'b0100100; 3: dataout<=7'b0110000; default: dataout<=7'b1000000; endcase end解碼模塊(*)module change(in,out);input3:0 in; output reg 7:0out;always*begin case(in) 4'
31、d0:out="0" 4'd1:out="1" 4'd2:out="2" . default :out="?" endcaseendendmodule防抖動模塊(*)module switch(clk,keyin,keyout);/防抖動模塊wire clk_use;input clk,keyin;output reg keyout;reg 7:0 counter;assign clk_use=counter7;always (posedge clk)counter<=counter+1
32、9;b1;always (posedge clk_use)keyout<=keyin;endmodule鬧鈴提醒及整點報時模塊(*)module sound(clk50m,clkt5,clkt4,clkt3,clkt2,alarm3,alarm2,alarm1,alarm0,voice);/鬧鈴顯示及整點報時模塊always(posedge clk50m)begin if(clkt5=alarm3&&clkt4=alarm2&&clkt3=alarm1&&clkt2=alarm0) begin voice3<=c1; voice2&l
33、t;=c1; /跑馬燈閃爍 end else if(clkt3=0&&clkt2=0) begin voice1<=c1; voice0<=c1; end/跑馬燈閃爍 else voice<=2'b00; end endmodule 其中鬧鈴的優(yōu)先級要高于整點報時功能鬧鈴設置時間模塊(*)module bitsel(alarmmode,checkmode,sel,selcode,reset);/對時分秒的選擇,并分成實在時鐘或是鬧鈴模式下其中selcode是對時分秒的解碼,決定自增信號的所在。always (posedge inc or negedge
34、 reset) if(sel=2'b10) begin if(hour1,hour0=8'h23) hour1,hour0<=8'h00; else if(hour0=9) begin hour0<=0;hour1=hour1+1'b1;end else hour0=hour0+1'b1; end else if(sel=2'b01) begin if(min1,min0=8'h59) min1,min0<=8'b00; else if(min0=4'h9) begin min0=4'h0;min
35、1=min1+4'h1; end else min0= min0+1'b1; end else hour1,hour0,min1,min0<=16'b0;.上述模塊功能為調整鬧鐘的時間。日歷模塊(*)module date(SW,LEDG,inc,CLOCK_50,LCD_show,yy,mm,dd);/日期模塊always (state or SW16)begin case (state) /對于年月日的選擇 s0: begin if(SW16) next_state<=s1; /調整日 else next_state=s0; end s1:begin i
36、f(SW16) next_state<=s2; /調整月份 else next_state<=s1; end s2: begin if(SW16)next_state<=s0; / 調整年份 else next_state<=s2; end s3: begin if(SW16)next_state<=s0; /日期自增模塊(依賴于小時時間進位) else next_state<=s3; end default: begin next_state<=s3;end endcaseend通過對SW16的觸發(fā)切換狀態(tài) 。其中在調整模式下調整不會有進位現(xiàn)象,而在
37、正常運行狀態(tài)下日期級應該存在進位,所以必須存在兩個不同的累加模式,即S0和S3 的區(qū)別。其中進位的產生如下:always (posedge clock_2)/小時到日期進位的產生beginif(clkt5=4'd2&&clkt4=4'd3&&clkt3=4'd5&&clkt2=4'd9&&clkt1=4'd5&&clkt0=4'd9) inc<=1;else inc<=0; end不使用1hz的信號是因為和在測試過程出現(xiàn)問題,產生的進位信號不能使得日期自增
38、,所以采用了較大頻率的信號,這樣能夠使得進位信號觸發(fā)日期內自增功能。分頻模塊(*)module clk50mto1(clock_in,clock_out);/分頻信號always (posedge clock_in)begin if(i=24999999) begin clock_out<=clock_out; i<=0;end else i<=i+1;end因為在做之前的實習的過程中,發(fā)現(xiàn)如果是將i=25000000作為判斷條件,會慢50MHz一個周期,然后累加下來會使得誤差特別大,所以做了這個嘗試,結果正好。通過做1hz和1/3600Hz的比較,發(fā)現(xiàn)如果將i=25000000作為判斷條件誤差很大,而后者誤差很小。第3章系統(tǒng)功能測試模塊測試:日歷:當處于非調節(jié)模式時,日期能夠正常進位,并且滿足當月月份天數(shù)的條件。當處于調節(jié)模式時,能夠正常調節(jié),且無進位現(xiàn)象,能夠循環(huán)調節(jié)。跑表:跑表能夠在七段管上正常顯示運行,暫停之后會把當時的數(shù)值傳到LCD顯示屏上顯示。復位后能夠歸零。計時器:能夠正常在七段管上顯示,當切換狀態(tài)時,提
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年五金制品行業(yè)跨境電商市場潛力與增長策略分析報告
- 藥品采購安全管理制度
- 藥店人員培訓管理制度
- 藥店總部倉庫管理制度
- 藥店藥品采購管理制度
- 設備人員考核管理制度
- 設備停用閑置管理制度
- 設備數(shù)據采集管理制度
- 設備物資基礎管理制度
- 設備維修風險管理制度
- 我的家鄉(xiāng)廣西河池宣傳簡介
- 產業(yè)命題賽道命題解決對策參考模板
- 二輥矯直機的原理
- 985、211和雙一流大學名單
- 云南省昆明市官渡區(qū)2022-2023學年七年級下學期期末語文試題(含答案)
- 山東財經大學成人高考線性代數(shù)復習自測題及參考答案
- 蛇類解剖生理特征(特種寵物疾病防治)
- 高中日語學習宣講+課件
- 最全廣聯(lián)達教程全套
- 廣東省全國大學英語四、大級考試考務手冊
- 年產10噸功能益生菌凍干粉的工廠設計改
評論
0/150
提交評論