首页 > 代码库 > [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}==2b01)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程式