WD的功能特性:系统在工作时,由于程序编制不当、受到外界干扰等一些原因会导致程序跑飞,进而陷入死循环状态,程序的正常运行被打断,系统无法继续正常工作。这时,看门狗的引入可以起到实时监测的作用,防止程序的跑飞。
看门狗,又叫watchdog,本质上是一个计数电路,一般有一个寄存器用来喂狗,一个寄存器用来写入初值,一个输出到PMU,处理器正常工作的时候,每隔一段时间就写一个值输入到喂狗的寄存器内,这样可以使得计数器回到初始值;如果超过规定的时间不喂狗,(一般在程序跑飞时),看门狗计数超时,就会给出一个复位信号,使程序复位。
模式有两种:
(1)单次超时模式
该模式下,每次看门狗由于程序不及时喂狗,导致计数超时后,即在复位输出端发出一个复位信号。
(2)一次超时中断,二次超时复位
该模式下,每次看门狗由于程序不及时喂狗,导致计数第一次超时后,即在中断输出端给出中断信号(拉高),直到处理器接收到中断信号做出处理行为或者发生可消除中断的情况,则中断输出端信号复位(拉低);否则,第二次计数超时后,复位输出端将发出一个复位信号,同时,中断输出端复位(拉低)。
综上,WatchDog功能有:
- 复位功能(超时没有喂狗,系统自动复位,喂狗则不复位)
- 32 位计数初始值可调并可更新
- 支持两种模式,单次超时复位模式和一次超时中断,二次超时复位模式
其verilog代码如下:
module wd(
input pclk,
input presetn,
input [31:0] startvalue,
input feed,
output intr,
output reg timeout_r);
reg [31:0] count;
reg mode;
assign intr=mode&timeout_r;
always@(posedge pclk or negedge presetn)
begin
if(!presetn)
begin
timeout_r<=1'b0;
mode<=1'b0;
count<=32'h0;
end
else if(feed)
begin
timeout_r<=1'b0;
mode<=1'b0;
count<=32'h0;
end
else
begin
if(startvalue==count)
begin
if(mode==1'b0)
begin
timeout_r<=1'b1;
mode<=~mode;
count<=32'h0;
end
else
begin
timeout_r<=1'b1;
mode<=~mode;
count<=32'h0;
end
end
else
count=count+1'b1;
end
end
endmodule
tb文件如下所示:
module tb();
reg pclk;
reg presetn;
reg [31:0] startvalue;
reg feed;
wire intr;
wire timeout_r;
wd u1(
.pclk(pclk),
.presetn(presetn),
.startvalue(startvalue),
.feed(feed),
.intr(intr),
.timeout_r(timeout_r));
initial
begin
pclk=0;
forever #(20) pclk=~pclk;
end
initial
begin
presetn=0;
#60 presetn=1;
startvalue=32'd1000;
#1000 feed=1;
#1000 feed=0;
#20000 startvalue=32'd2000;
end
endmodule