1 系統設計
1.1 設計要求
1.1.1 設計任務
設計并制作一臺數字日歷。
1.1.2 性能指標要求
① 用EDA實訓儀的I/O設備和PLD芯片實現數字日歷的設計。
② 數字日歷能夠顯示年、月、日、時、分和秒。
③ 用EDA實訓儀上的8只八段數碼管分兩屏分別顯示年、月、日和時、分、秒,即在一定時間段內顯示年、月、日(如20080101),然后在另一時間段內顯示時、分、秒(如00123625),兩個時間段能自動倒換。
④ 數字日歷具有復位和校準年、月、日、時、分、秒的按鈕,但校年和校時同用一個按鈕,即在顯示年、月、日時用此按鈕校年,在顯示時、分、秒時則用此按鈕校時,依此類推。
1.2 設計思路及設計框圖
1.2.1設計思路
根據萬年歷的實際特點,本設計最基礎的部分就是24小時計數器部分。它由兩片60進制計數器和一片24進制計數器構成,輸入clk為1Hz(秒)的時鐘,經過60分頻后產生1分鐘的時鐘信號,再經過60分頻后,產生1小時的時鐘信號,最后進行24分頻,得到1天的脈沖送cout輸出。
當計時器設計完成后,可以為它產生一個元件符號,作為萬年歷設計的基本元件。除了基礎的計時器模塊(day),萬年歷電路還包括年月日模塊(nyr2013),控制模塊(contr),校時選擇模塊(mux_4)和顯示選擇模塊(mux_16)。
在基礎計數器完成的天計數脈沖完成之后,送入年月日模塊中進入進一步的計數,最終進一步得到日,月,年的計數結果。由于設計要求8只八段數碼管分兩屏分別顯示年、月、日和時、分、秒,所以控制模塊便通過控制信號k來控制數碼管是顯示時、分、秒還是年、月、日,或者自動輪流顯示。
相應的顯示選擇模塊也是通過k信號來控制是選擇將計時器模塊的時、分、秒結果信號,還是將年月日模塊的年、月、日結果信號送到數碼管顯示。設計還要求數字日歷具有復位和校準年、月、日、時、分、秒的按鈕,但校年和校時同用一個按鈕,所以應運而生有校時選擇模塊,同樣也是在k信號的控制下,對j1、j2、j3這三個公共校時按鈕所產生的校時信號選擇是送到計時器模塊的校時端,還是年月日模塊的校年端,從而實現校時選擇功能。以上就是大體的設計思路,各個模塊相輔相成,最終滿足設計要求。
1.2.2總體設計框圖
2 各個模塊程序的設計
2.1 控制模塊contr的設計
控制模塊的元件符號如上圖所示。由于設計要求8只八段數碼管分兩屏分別顯示年、月、日和時、分、秒,因此需要通過在控制模塊中通過分頻電路來實現,在此模塊中采用了一個16秒的分頻電路,占空比為50%,即8秒高電平,8秒低電平,因此很容易實現萬年歷年、月、日和時、分、秒的自動切換顯示功能。其中clk是1秒脈沖信號輸入端,k1和k2是控制輸入端:當{k1,k2}=00或11時即進入自動切換顯示模式,當{k1,k2}=01時,數碼管僅顯示時、分、秒,當{k1,k2}=10時,數碼管僅顯示年、月、日。{k1,k2}的值決定了控制信號k的輸出。
2.2 校時選擇模塊mux_4v的設計
校時選擇模塊的元件符號如上圖所示。k是控制信號的輸入端,由控制模塊輸出,控制對j1、j2、j3這三個公共校時按鈕所產生的校時信號選擇是送到計時器模塊的校時端,還是年月日模塊的校年端,其中當k=0時,將j1、j2、j3產生的信號送到計時器模塊的jm(校秒)、jf(校分)、js(校時)端;其中當k=1時,將j1、j2、j3產生的信號送到年月日模塊的jr(校日)、jy(校月)、jn(校年)端,從而校年和校時可以同用一組按鈕。
2.3 年月日模塊nyr2020的設計
年月日模塊的元件符號如上圖所示。k是控制信號的輸入端,由控制模塊輸出。其中,clrn是異步清除輸入端,低電平有效;clk是時鐘輸入端,上升沿有效;jn、jy、jr分別是校年、校月。校日的輸入端,qn、qy、qr則分別是年、月、日的狀態輸出端。
2.4 顯示選擇模塊mux_16v的設計
顯示選擇模塊的元件符號如上圖所示。k是控制信號的輸入端,由控制模塊輸出。因為控制模塊決定了數碼管有多中不同的顯示模式,所以當k=0時,將計時器模塊輸出的qm、qf、qs的狀態信號送到數碼管顯示;而當k=1時,將年月日模塊輸出的qr、qy、qn的狀態信號送到數碼管顯示。其中我加入了擴展功能,在數碼管只顯示時、分、秒的時候,有2個數碼管并沒有數值顯示,因此我將其中一個數碼管選擇顯示A或F,當時間在12點之前是顯示A,代表上午(AM),當時間在12點之后時顯示F,代表下午(FM)。
2.5 計時器模塊jsq的設計
計時器模塊的元件符號如上圖所示。clk是秒時鐘輸入端;clrn是清除輸入端,低電平有效;jm、jf、js分別是校秒、校分、校時的輸入端,下降沿有效;qm、qf、qs分別是秒、分、時的輸出端;day是“天”脈沖輸出端。計時器模塊是萬年歷電路最基礎的組成部分。它由分頻器、兩片60進制計數器和一片24進制計數器構成,具體構成如下圖:
2.6 LED顯示模塊LED1的設計(擴展功能的實現)
qy和qr和nyr模塊中的輸出相連,LED是輸出,在實驗時用一個LED燈把管腳鎖住鎖住,每到節日來的脈沖便會使LED燈亮。加入的擴展功能,能讓萬年歷在節日的時候能亮一盞LED燈,比如在元旦節、情人節一些比較重要的節日,起到提醒的作用,也可以從而使萬年歷的顯示內容更為完整。
3 調試過程
把寫好的程序經驗證仿真確認無誤并且鎖定好管腳后經下載端口下載到EDA實訓儀上,通過實際操作來驗證是否能實現相應功能。
4 功能測試
4.1 測試儀器與設備
① EDA實訓儀 1臺
② 電腦 1臺
4.2 性能指標測試
① 數字日歷能夠正確顯示年、月、日、時、分和秒。
② EDA實訓儀上的8只八段數碼管能夠分兩屏分別顯示年、月、日和時、分、秒。
③ EDA實訓儀上的8只八段數碼管能夠自動切換顯示年、月、日和時、分、秒。
④ 數字日歷具有復位和校準年、月、日、時、分、秒的按鈕,且校年和校時同用一個按鈕就能實現。
4.3 誤差分析
由于在程序編寫的過程中經過了反復的思考和檢查,因此在下載到硬件電路后,所有基礎功能都達到了設計要求,并且自己的擴展功能也成功的實現。
部分程序清單
1、計算器模塊(jsq)
(1)分頻器
module fenpin(clk,cout);
input clk;
output reg cout;
reg[24:0]qq;
always @(posedge clk)
begin
if(qq==19999999) begin qq=0;cout=1;end
else begin qq=qq+1;cout=0;end
end
endmodule
(2)cnt60
module cnt60(clk,clrn,j,q,cout);
input clrn,clk,j;
output reg[7:0]q;
output reg cout;
always @(posedge clk^j or negedge clrn)
begin
if(~clrn) q=0;
else begin
if(q=='h59) q=0;
else q=q+1;
if(q[3:0]=='ha) begin q[3:0]=0; q[7:4]=q[7:4]+1;end
if(q=='h59) cout=1;
else cout=0;
end
end
endmodule
-
分頻器
+關注
關注
43文章
447瀏覽量
49952 -
數碼管
+關注
關注
32文章
1882瀏覽量
91169 -
LED顯示
+關注
關注
0文章
361瀏覽量
38047 -
計時器
+關注
關注
1文章
421瀏覽量
32730 -
PLD芯片
+關注
關注
0文章
35瀏覽量
17816
發布評論請先 登錄
相關推薦
評論