首页 > 代码库 > [Verilog]寫一個 Watch Dog Timer程式
[Verilog]寫一個 Watch Dog Timer程式
看門狗計時器是一種計時裝置,當系統的主程式發生某些錯誤事件時,如假死機或未定時的清除看門狗計時器的內含計時值(多半是向對計時器發送清除信號),這時看門狗計時器就會對系統發出重設、重新開機或關閉的信號,使系統從懸停狀態回復到正常運作狀態。看門狗一旦使用則不能停止。一般情況下計數器在系統休眠時依然計數,但在某些晶片上,處於低功耗模式下的看門狗僅僅保留暫存器資料但不計數。
簡單來說就是防止系統死當,在程式設計時常會發生系統當機,而需要重新開機,那如何用FPGA來寫呢?
Q: 請寫出一個硬體電路,必須在1秒內送一個iLive訊號給WGT程式,否則WGT會送出Timeout訊號。
1 // -------------------------------------------------------------------- 2 // Copyright (c) 2016 by Shih-An Li. 3 // -------------------------------------------------------------------- 4 // -------------------------------------------------------------------- 5 // 6 // Major Functions: Watch Dog Timer, 7 // 8 // -------------------------------------------------------------------- 9 // // Revision History :10 // --------------------------------------------------------------------11 // Ver :| Author :| Mod. Date :| Changes Made:12 // V1.0 :| Shih-An Li :| 2016/08/29 :| Initial Revision13 // --------------------------------------------------------------------14 module WatchDogTimer(15 iClk_50M, // 50M16 iRst_n, // rst_n17 // input 18 iWGT_En, // Enable WGT19 iLive, // reset WGT counter, 0->1 trigger20 oTimerOut // Timeout2122 );23 24 //=======================================================25 // PARAMETER declarations26 //=======================================================27 parameter CLK_Freq = 50000000; // input clk frequency28 29 //=======================================================30 // PORT declarations31 //=======================================================32 input iClk_50M; // 50M33 input iRst_n; // rst_n34 input iWGT_En;35 input iLive; // a 0->1 trigger36 // output37 output oTimerOut; // Timer Out38 39 40 //=======================================================41 // REG/WIRE declarations42 //=======================================================43 reg rTimerOut;44 reg rWGT_En;45 reg [31:0] rWGT_Cnt;46 reg rLive_Dly;47 //=======================================================48 // Structural coding49 //=======================================================50 51 assign oTimerOut = rTimerOut;52 //watch dog timer53 always@(posedge iClk_50M or negedge iRst_n) begin54 if(!iRst_n) begin55 rWGT_En <= 0;56 rWGT_Cnt <= 0;57 rTimerOut <= 0;58 rLive_Dly <= 0;59 end60 else begin61 rWGT_En <= iWGT_En;62 rWGT_Cnt <= rWGT_Cnt;63 rTimerOut <= rTimerOut;64 rLive_Dly <= iLive;65 66 if(rWGT_En) begin67 if({rLive_Dly, iLive}==2‘b01)begin68 rWGT_Cnt <= 0;69 rTimerOut <= 0;70 end71 else if(rWGT_Cnt >= (CLK_Freq*1 -1)) begin // count to one second to send timeout 72 rWGT_Cnt <= rWGT_Cnt;73 rTimerOut <= 1;74 end75 else begin76 rWGT_Cnt <= rWGT_Cnt+1;77 rTimerOut <= 0;78 end79 end80 else begin81 rWGT_Cnt <= 0;82 rTimerOut <= 0;83 end84 end85 end86 87 endmodule
程式說明
67行 偵測iLive的觸發訊號。
71行 當rWGT_Cnt計數值超過 (CLK_Freq*秒數)時送出Timeout訊號。
reference
[1] 看門狗計時器- 维基百科,自由的百科全书
引用請標明出處。
[Verilog]寫一個 Watch Dog Timer程式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。