色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何通過FPGA實現顯示年、月、日、周、時、分、秒且能精準校時的數字時鐘

電子工程師 ? 來源:lp ? 2019-03-07 16:12 ? 次閱讀

數字時鐘FPGA設計中較為常見,其主要包含時鐘、分鐘、秒鐘,以及必備的校時功能,當然還可以根據需要加入年、月,日,周,星期或者鬧鐘設置等元素。

在這里,我們給小伙伴分享如何通過FPGA實現顯示年、月、日、周、時、分、秒且能精準校時的數字時鐘。

一、設計任務

通過FPGA編程驅動實時時鐘芯片DS1340Z,實現時間寫入和讀出的功能,驅動旋轉編碼器獲取操作信息,根據編碼器操作信息控制數字時鐘的邏輯(包括時間調節,顯示控制),最后驅動數碼管顯示數字時鐘信息。

二、設計準備

硬件:小腳丫FPGA核心板、時鐘芯片DS1340Z、旋轉編碼器、數碼

軟件:Quartus Prime/Lattice Diamond

三、設計結構

四、設計原理

1.實時時鐘芯片DS1340Z模塊

實時時鐘芯片DS1340Z模塊電路圖如下(上拉電阻未顯示),模塊電路中有電池座,電池電壓范圍為1.3V~5.5V,當安裝電池后底板掉電不影響實時時鐘芯片的運行,重新上電后讀取實時時鐘數據。另外,芯片內部集成了起振電阻電容,只需外置時鐘晶振32.768KHz直接連接即可。

2.旋轉編碼器模塊

機械增量式旋轉編碼器,旋轉過程中提供周期性輸出,不能定位絕對位置,只能用于感知運動方向和增量,其電路圖如下,本設計所使用的旋轉編碼器為EC11系列的,支持按動開關,共有5個管腳:

1、2管腳支持按動開關,如同獨立按鍵連接方式。

3、4、5管腳支持旋轉編碼,4腳為公共端,3、5管腳分別為旋轉編碼器的A、B相輸出,如上圖所示,4腳接地,3、5管腳則需接上拉電阻,同時為了降低輸出脈沖信號的抖動干擾,增加了電容到地做硬件去抖。

五、設計驅動過程

1.DS1340Z驅動設計

DS1340Z支持I2C通信400KHz快速模式同時兼容100KHz的標準模式,還有兩種模式下時序中的各種時間參數,本設計中,通過分頻得到400KHz的時鐘。

I2C時序基本單元(啟動、停止、發送、接收、發應答、讀應答)協議里統一的,所以所以基本單元狀態的設計也是不需要調整的。

啟動時序狀態設計程序實現同智能接近系統設計實驗。

發送單元和讀應答單元合并,時序狀態設計程序實現同智能接近系統設計實驗。

接收單元和寫應答單元合并,時序狀態設計程序實現同智能接近系統設計實驗。

停止時序狀態設計程序實現同智能接近系統設計實驗。

DS1340Z芯片有很多寄存器,用于存儲實時時鐘的時間信息,同時芯片支持連續讀、寫寄存器操作(寄存器地址自加1),其設計程序實現如下:

連續寫寄存器:

MAIN:begin
if(cnt_main>=6'd11)//對MAIN中的子狀態執行控制cnt_main
cnt_main<=6'd0;?? //
elsecnt_main<=cnt_main+1'b1;??
case(cnt_main)
6'd0:beginstate<=START;end?? //I2C通信時序中的START
6'd1:begindata_wr<=8'hd0;state<=WRITE;end???? //寫地址為8'hd0
6'd2:begindata_wr<=8'h00;state<=WRITE;end???? //8'h00,起始寄存器
6'd3:begindata_wr<=adj_sec;state<=WRITE;end?? //00寄存器地址,寫秒
6'd4:begindata_wr<=adj_min;state<=WRITE;end?? //01寄存器地址,寫分
6'd5:begindata_wr<=adj_hour;state<=WRITE;end? //02寄存器地址,寫時
6'd6:begindata_wr<=adj_week;state<=WRITE;end? //03寄存器地址,寫周
6'd7:begindata_wr<=adj_day;state<=WRITE;end?? //04寄存器地址,寫日
6'd8:begindata_wr<=adj_mon;state<=WRITE;end?? //05寄存器地址,寫月
6'd9:begindata_wr<=adj_year;state<=WRITE;end? //06寄存器地址,寫年
6'd10:begindata_wr<=8'h40;state<=WRITE;end? ?//07寄存器地址,8'h40
6'd11:beginstate<=STOP;end??? //I2C通信時序中的STOP
default:state<=IDLE;//如果程序失控,進入IDLE自復位狀態
endcase
end

連續讀寄存器:

MAIN:begin
if(cnt_main>=6'd32)//對MAIN中的子狀態執行控制cnt_main
cnt_main<=6'd12;???????? //否則只執行時間讀取操作
elsecnt_main<=cnt_main+1'b1;??
case(cnt_main)
6'd12:beginstate<=START;end?? //I2C通信時序中的START
6'd13:begindata_wr<=8'hd0;state<=WRITE;end//寫地址為8'hd0
6'd14:begindata_wr<=8'h00;state<=WRITE;end//8'h00,寄存器初始地址
6'd15:beginstate<=START;end?? //I2C通信時序中的START
6'd16:begindata_wr<=8'hd1;state<=WRITE;end//讀地址為8'hd1
6'd17:beginack<=ACK;state<=READ;end??? //讀秒
6'd18:beginrtc_sec<=rtc_data_r;end
6'd19:beginack<=ACK;state<=READ;end??? //讀分
6'd20:beginrtc_min<=rtc_data_r;end
6'd21:beginack<=ACK;state<=READ;end??? //讀時
6'd22:beginrtc_hour<=rtc_data_r;end
6'd23:beginack<=ACK;state<=READ;end??? //讀周
6'd24:beginrtc_week<=rtc_data_r;end
6'd25:beginack<=ACK;state<=READ;end??? //讀日
6'd26:beginrtc_day<=rtc_data_r;end
6'd27:beginack<=ACK;state<=READ;end??? //讀月
6'd28:beginrtc_mon<=rtc_data_r;end
6'd29:beginack<=ACK;state<=READ;end??? //讀年
6'd30:beginrtc_year<=rtc_data_r;end
6'd31:beginack<=NACK;state<=READ;end?? //控制
6'd32:beginstate<=STOP;end??? //I2C通信時序中的STOP,讀取完成標志
default:state<=IDLE;//如果程序失控,進入IDLE自復位狀態
endcase
end

上面兩段程序就是對于DS1340Z芯片的兩種操作,調時間和讀時間,對于時鐘來說因為有電池供電,實時時鐘一直都處于工作狀態,當給FPGA上電時只需要讀時間即可,只有遇到時間不對的時候才需要調時間,所以DS1340Z驅動模塊平時都在循環讀取時間,所以如果將調時間和讀時間的時序操作融合到同一個狀態下時,對于cnt_main要加以控制,cnt_main初值為12,且運行軌跡在12~32之間,控制程序調整如下:

if(cnt_main>=6'd32)//對MAIN中的子狀態執行控制cnt_main
if(set_flag)cnt_main<=6'd0;?? //當set_flag被置位時才會執行時間寫入操作
elsecnt_main<=6'd12;???????? //否則只執行時間讀取操作
elsecnt_main<=cnt_main+1'b1;??

上面set_flag為時間調整標志位,只有按動編碼器在調時間模式時需要用到寫時間數據的操作流程,可以根據按鍵脈沖置位set_flag并自鎖,每次完成寫入操作后再將set_flag復位。程序實現如下:

reg set_flag;
always@(posedgeclkornegedgerst_n)begin
if(!rst_n)set_flag<=1'b0;
elseif(cnt_main==5'd11)set_flag<=1'b0;? //完成寫入時間操作復位set_flag
elseif(key_set)set_flag<=1'b1;????????? //按鍵脈沖控制set_flag置位
elseset_flag<=set_flag;
end

模塊端口如下:

moduleDS1340Z_driver
(
inputclk,rst_n,//系統時鐘和復位
inputkey_set, //按動脈沖輸入
input[7:0]adj_hour,adj_min,adj_sec,//時分秒調整輸入
input[7:0]adj_year,adj_mon,adj_day,adj_week,//年份調整輸入
outputi2c_scl,//I2C總線SCL
inout i2c_sda,//I2C總線SDA
output[7:0]rtc_hour,rtc_min,rtc_sec,//實時時鐘輸出
output[7:0]rtc_year,rtc_mon,rtc_day,rtc_week //實時年份輸出
);

到這里就完成了萬年歷中DS1340Z模塊的驅動設計,宏觀上講,該模塊的功能可以這樣描述:

正常模式下循環讀取時間信息,并把時間數據輸出

由旋轉編碼器按動脈沖信號key_set觸發進行一次寫操作,用于調節時間

每次寫操作調節時間的時間數據由其他模塊提供

2.旋轉編碼器驅動設計

機械增量式旋轉編碼器的原理示意圖,中間圓形齒輪連接到旋轉編碼器的公共端4管腳,A、B兩個觸點連接到旋轉編碼器的A、B相輸出端3、5管腳,當進行旋轉操作時,A、B觸點會先后接觸和錯開圓形齒輪,從而導致A、B相輸出信號產生相位不同的脈沖信號:

順時針旋轉時,A觸點超前于B觸點接觸和錯開圓形齒輪,A信號脈沖相位超前

逆時針旋轉時,B觸點超前于A觸點接觸和錯開圓形齒輪,B信號脈沖相位超前

對A信號采樣程序實現如下(對B信號一樣):

regkey_a_r,key_a_r1,key_a_r2;
//消除亞穩態
always@(posedgeclk_500us)begin
key_a_r<=? ?key_a;
key_a_r1<=? ?key_a_r;
key_a_r2<=? ?key_a_r1;
end

然后簡單去抖處理程序實現如下(對B信號一樣):

regA_state;
//簡單去抖動處理
always@(key_a_r1orkey_a_r2)begin
case({key_a_r1,key_a_r2})
2'b11: A_state<=1'b1;
2'b00: A_state<=1'b0;
default:A_state<=A_state;
endcase
end

檢測A信號的邊沿程序實現如下:

regA_state_r,A_state_r1;
//對A_state信號進行邊沿檢測
always@(posedgeclk)begin
A_state_r<=A_state;
A_state_r1<=A_state_r;
end
wire A_pos=(!A_state_r1)&&A_state_r;
wire A_neg=A_state_r1&&(!A_state_r);

最后根據A信號邊沿與B信號的狀態組合判定旋轉的信息。

旋轉脈沖輸出程序實現如下:

//當A的上升沿伴隨B的高電平或當A的下降沿伴隨B的低電平為向左旋轉
always@(posedgeclkornegedgerst_n)begin
if(!rst_n)L_pulse<=1'b0;
elseif((A_pos&&B_state)||(A_neg&&(!B_state)))L_pulse<=1'b1;
elseL_pulse<=1'b0;
end
//當A的上升沿伴隨B的低電平或當A的下降沿伴隨B的高電平為向右旋轉
always@(posedgeclkornegedgerst_n)begin
if(!rst_n)R_pulse<=1'b0;
elseif((A_pos&&(!B_state))||(A_neg&&B_state))R_pulse<=1'b1;
elseR_pulse<=1'b0;
end

通過上面程序最終實現了左旋右旋的脈沖輸出,脈沖的脈寬等于系統時鐘的周期。

3.模式控制:

本設計要實現8個模式(常態、調年、調月、調日、調周、調時、調分、調秒),對8個狀態編碼,常態—0、調秒—1、調分—2、調時—3、調周—4、調日—5、調月—6、調年—7,通過按動旋轉編碼器切換,按照常識調時間從大到小調節,先調節年份最后調秒鐘,所以我們這8個狀態的狀態機跳轉順序是固定的(0→7→6→5→4→3→2→1→0),依次循環跳轉,程序實現如下:

//時鐘運行狀態控制
always@(posedgeclkornegedgerst_n)
if(!rst_n)state<=3'd0;
elseif(O_pulse)//按鍵脈沖控制時鐘運行狀態的跳變,
if(state)state<=state-3'd1;
elsestate<=3'd7;
elsestate<=state;

4.調時控制:

調時控制在不同的調節模式對不同時間進行調整,我們分別以常態模式和調秒模式為例進行分析。時間調節要以當時的時間為基礎,常態模式下不需要調整任何時間,但是可以將實時時鐘讀出的時間數據賦給調節變量,這樣等跳轉到調節模式時對調節變量的控制就是以當時的時間為基礎了,程序實現如下:

3'd0: //正常模式
begin
if(O_pulse)begin //在常態下按動編碼器將當前實時時間賦值給調節寄存器
adj_sec<=rtc_sec;
adj_min<=rtc_min;
adj_hour<=rtc_hour;
adj_week<=rtc_week;
adj_day<=rtc_day;
adj_mon<=rtc_mon;
adj_year<=rtc_year;
end
end

調秒模式與其他調節模式操作一樣,不同的是調節的規則不同,例如秒和分的調節范圍為0~59,小時調節范圍0~11或0~23,日期調節范圍需要考慮年和月的值(1、3、5、7、8、10、12月范圍1~31,4、6、9、11月范圍1~30,2月平年范圍1~28,2月閏年范圍1~29),周調節范圍1~7,月調節范圍1~12,年調節范圍0~99。對秒鐘數據進行調節,程序實現如下:

3'd1: //調秒模式
begin
if(L_pulse)begin//逆時針轉
if(adj_sec[3:0])adj_sec<=adj_sec-1'h1;
elseif(adj_sec[7:4])adj_sec<={adj_sec[7:4]-1'h1,4'h9};
elseadj_sec<=8'h59;
endelseif(R_pulse)begin//順時針轉
if(adj_sec[3:0]!=4'h9)adj_sec<=adj_sec+1'h1;
elseif(adj_sec[7:4]!=4'h5)adj_sec<={adj_sec[7:4]+1'h1,4'h0};
elseadj_sec<=8'h00;
endelseadj_sec<=adj_sec;
end

5.顯示控制:

首先使用8位數碼管分兩頁顯示時鐘數據,第一頁顯示年月日周,第二頁顯示時分秒。任何一項時間選項都由兩位數碼管顯示,每頁最多顯示4個時間選項,我們可以使用4位的變量disp_en[3:0]控制4個時間選項的點亮或熄滅,disp_en[3]控制最左側兩個數碼管,disp_en[0]控制最右側兩個數碼管,我們分別以常態模式和調秒模式為例進行顯示使能控制的分析。常態模式下,轉動編碼器控制顯示頁碼,兩個頁碼對應的顯示控制,程序實現如下:

3'd0: //正常模式
if(L_pulse)disp_en<=4'b1111;?? ?//逆時針轉顯示第一頁,數碼管全亮
elseif(R_pulse)disp_en<=4'b0111;//順時針轉顯示第二頁,時分秒亮
elsedisp_en<=disp_en;

調秒模式下,小時和分鐘數碼管點亮,秒鐘閃爍顯示,轉動編碼器時秒鐘強制顯示,最后按動旋轉編碼器切到常態模式時,時分秒數碼管都回復顯示,程序實現如下:

3'd1:begin //調秒模式
disp_en[3:1]<=3'b011;//時和分顯示
if(L_pulse|R_pulse)disp_en[0]<=1'b1;//轉動時強制顯示
elseif(sec_pulse)disp_en[0]<=~disp_en[0];//秒鐘閃爍顯示
elseif(O_pulse)disp_en<=4'b0111;//返回常態時顯示時分秒
elsedisp_en[0]<=disp_en[0];
end

數碼管與時間選項是對應關系,每個選項對應兩位數碼管,程序實現如下:

wire[7:0]data_en=//數碼管位選控制
{{2{disp_en[3]}},{2{disp_en[2]}},{2{disp_en[1]}},{2{disp_en[0]}}};
wire[7:0]dot_en=//數碼管小數點顯示控制
{1'b0,disp_en[3],1'b0,disp_en[2],1'b0,disp_en[1],1'b0,disp_en[0]};

時鐘顯示分兩頁實現,我們以最右側兩個數碼管顯示內容為例,這兩位數碼管在第一頁中顯示周數據,在第二頁中顯示秒數據,那么我們怎么控制顯示內容呢?分析,萬年歷8中模式,

常態模式下,顯示讀取的實時時鐘數據,具體顯示周還是秒再次細化

? disp_en等于4'b1111的時候,對應第一頁,顯示周數據

? disp_en等于4'b0111的時候,對應第二頁,顯示秒數據

常態模式下,根據disp_en選擇顯示周數據還是秒數據,程序實現如下:

//常態下數碼管顯示數據
wire[7:0]data_rtc0=disp_en[3]?rtc_week:rtc_sec;

調節模式下,顯示寫入的調節時鐘數據,具體顯示周還是秒再次細化

? 調年、調月、調日、調周 狀態下(state>=3),對應第一頁,顯示周數據

? 調時、調分、調秒 狀態下(state<3),對應第二頁,顯示秒數據

調節模式下,根據state選擇顯示周數據還是秒數據,程序實現如下:

//調節狀態下數碼管顯示數據
wire[7:0]data_adj0=state[2]?adj_week:adj_sec;

最后根據常態模式還是調節模式控制數碼管顯示實時時鐘數據還是調節時鐘數據

根據state選擇顯示實時時鐘數據還是調節時鐘數據,程序實現如下:

//根據狀態選擇顯示常態數據還是調節狀態數據
assign{data_7,data_8}=state?data_adj0:data_rtc3;

到這里為止,就完成了數字時鐘的設計,當然在本設計中,可以通過簡化只留下時分秒及調時功能,實現24小時計時,省去對于頁的判斷。同時對于旋轉編碼器有難度的,可以改為按鍵調時。有興趣的小伙伴可以動手試試哦~

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1629

    文章

    21748

    瀏覽量

    603975
  • 編碼器
    +關注

    關注

    45

    文章

    3646

    瀏覽量

    134686
  • 數字時鐘
    +關注

    關注

    2

    文章

    150

    瀏覽量

    20375

原文標題:FPGA畢設系列 | 1.數字時鐘

文章出處:【微信號:xiaojiaoyafpga,微信公眾號:電子森林】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    [原創]基于FPGA歷12864顯示-生肖---時---星.....

    ` 本帖最后由 qq274822790 于 2013-1-17 17:01 編輯 [原創]基于FPGA歷12864顯示顯示-生
    發表于 01-17 17:01

    ,時鐘問題

    本人編寫有一個 ,,時鐘時鐘沒有問題了,就是在年,,
    發表于 05-20 23:17

    12時制數字顯示電子鐘,MCU為LPC2103/2106

    12時制數字顯示電子鐘 設計一個數字顯示電子時鐘,要求:(1)時鐘的“時”要求用兩位
    發表于 07-10 19:20

    如何將時間分開顯示 毫秒

    如何將時間分開顯示 毫秒
    發表于 08-06 09:17

    FPGA實現顯示歷電子時鐘

    使用FPGA實現顯示歷電子時鐘,分鐘,小時,月份,年份,,有
    發表于 04-19 14:33

    EAD萬歷實訓報告及Verilog HDL源碼

    設計一個數字日歷。 ⑵數字日歷顯示、、、時、
    發表于 07-03 05:38

    EAD萬歷實訓報告及Verilog HDL源碼

    設計一個數字日歷。 ⑵數字日歷顯示、、、時、
    發表于 07-09 04:35

    89c51時鐘

    keil與protues的聯合仿真,使用的89c51和DS1302芯片,通過編程實現日歷/時鐘的計時顯示功能。具體要求是,開機時DS1302初始化為:19
    發表于 06-14 17:54

    如何去實現一種基于51單片機的電子時鐘歷設計

    、時、、進行計時,還具有閏年補償等多種功能。溫度采集選用DS18B20芯片,萬歷采用直觀的數字顯示,數據
    發表于 11-10 08:12

    基于FPGA設計實現一個多功能數字鐘相關資料分享

    1、基于FPGA設計實現一個多功能數字鐘在FPGA中設計實現一個多功能數字鐘,具備以下功能:準確
    發表于 07-08 17:26

    基于FPGA數字時鐘設計

    基于FPGA數字時鐘設計,可實現鬧鐘的功能,可校時。
    發表于 06-23 17:15 ?69次下載

    基于Multisim數字時鐘的設計與仿真

    數字時鐘具有、時的十進制數字顯示,能夠隨時校正分鐘和小時,當
    發表于 11-27 11:13 ?322次下載
    基于Multisim<b class='flag-5'>數字</b><b class='flag-5'>時鐘</b>的設計與仿真

    鋯石FPGA A4_Nano開發板視頻:數字時鐘的項目工程講解

    數字時鐘,就是以數字顯示取代模擬表盤的鐘表,在顯示上它用數字反應此時的時間,它還能同時
    的頭像 發表于 09-24 07:05 ?1679次閱讀
    鋯石<b class='flag-5'>FPGA</b> A4_Nano開發板視頻:<b class='flag-5'>數字</b><b class='flag-5'>時鐘</b>的項目工程講解

    設計數字時鐘的設計報告

    在QuartusⅡ軟件平臺下,運用verilog硬件描述語言和DE2來實現數字時鐘功能。數字時鐘包括組合邏輯電路和時序電路,能夠正確
    發表于 07-23 17:45 ?44次下載
    設計<b class='flag-5'>數字</b><b class='flag-5'>時鐘</b>的設計報告

    基于FPGA數字電子時鐘設計

    利用數字電子技術、EDA設計方法、FPGA等技術,設計、仿真并實現一個基于FPGA數字電子時鐘
    發表于 05-28 10:47 ?58次下載
    主站蜘蛛池模板: 区久久AAA片69亚洲| 亚洲成人免费在线| 美女裸露胸部100%无遮挡| 麻豆免费高清完整版| 免费的黄直播| 琪琪see色原网站在线观看| 日本无码欧美激情在线视频| 日本一在线中文字幕| 午夜精品久久久久久99热蜜桃 | 纯肉高H种马艳遇风流多| 国产AV精品一区二区三区漫画| 国产精品爽爽久久久久久竹菊 | 9420高清完整版在线电影免费观看| 97人妻AV天天澡夜夜爽| xxnx日本| 国产精品97久久久久久AV色戒 | 99久视频只有精品2019| 成人精品综合免费视频| 国产性夜夜性夜夜爽91| 老色哥网站| 日韩视频在线观看| 亚洲免费网站观看视频| 87.6在线收听| 国产Av影片麻豆精品传媒| 黄色毛片a| 欧美日韩亚洲第一区在线| 窝窝影院午夜看片毛片| 在公交车上被JB草坏了被轮J了| XXX国产麻豆HD真实乱| 国产午夜精AV在线麻豆| 美女的隐私蜜桃传媒免费看| 乳液全集电影在线观看| 一本道综合久久免费| 国产精品久久久久久影院 | 国产精品免费小视频| 俄罗斯性xxxx| 被送到黑人性奴俱乐部| SAO货腿张开JI巴CAO死我| 微福利92合集| 一攻多受高h大总攻| 成人性生交大片|