看門狗計時器是一種計時裝置,當系統的主程式發生某些錯誤事件時,如假死機或未定時的清除看門狗計時器的內含計時值(多半是向對計時器發送清除信號),這時看門狗計時器就會對系統發出重設、重新開機或關閉的信號,使系統從懸停狀態回復到正常運作狀態。看門狗一旦使用則不能停止。一般情況下計數器在系統休眠時依然計數,但在某些晶片上,處於低功耗模式下的看門狗僅僅保留暫存器資料但不計數。
簡單來說就是防止系統死當,在程式設計時常會發生系統當機,而需要重新開機,那如何用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 Revision 13 // -------------------------------------------------------------------- 14 module WatchDogTimer( 15 iClk_50M, // 50M 16 iRst_n, // rst_n 17 // input 18 iWGT_En, // Enable WGT 19 iLive, // reset WGT counter, 0->1 trigger 20 oTimerOut // Timeout 21 22 ); 23 24 //======================================================= 25 // PARAMETER declarations 26 //======================================================= 27 parameter CLK_Freq = 50000000; // input clk frequency 28 29 //======================================================= 30 // PORT declarations 31 //======================================================= 32 input iClk_50M; // 50M 33 input iRst_n; // rst_n 34 input iWGT_En; 35 input iLive; // a 0->1 trigger 36 // output 37 output oTimerOut; // Timer Out 38 39 40 //======================================================= 41 // REG/WIRE declarations 42 //======================================================= 43 reg rTimerOut; 44 reg rWGT_En; 45 reg [31:0] rWGT_Cnt; 46 reg rLive_Dly; 47 //======================================================= 48 // Structural coding 49 //======================================================= 50 51 assign oTimerOut = rTimerOut; 52 //watch dog timer 53 always@(posedge iClk_50M or negedge iRst_n) begin 54 if(!iRst_n) begin 55 rWGT_En <= 0; 56 rWGT_Cnt <= 0; 57 rTimerOut <= 0; 58 rLive_Dly <= 0; 59 end 60 else begin 61 rWGT_En <= iWGT_En; 62 rWGT_Cnt <= rWGT_Cnt; 63 rTimerOut <= rTimerOut; 64 rLive_Dly <= iLive; 65 66 if(rWGT_En) begin 67 if({rLive_Dly, iLive}==2‘b01)begin 68 rWGT_Cnt <= 0; 69 rTimerOut <= 0; 70 end 71 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 end 75 else begin 76 rWGT_Cnt <= rWGT_Cnt+1; 77 rTimerOut <= 0; 78 end 79 end 80 else begin 81 rWGT_Cnt <= 0; 82 rTimerOut <= 0; 83 end 84 end 85 end 86 87 endmodule
程式說明
67行 偵測iLive的觸發訊號。
71行 當rWGT_Cnt計數值超過 (CLK_Freq*秒數)時送出Timeout訊號。
reference
引用請標明出處。
时间: 2024-08-06 22:03:09