📄 wdt.v
字号:
`define SECOND_2 2'b10 // 2秒定时清狗
`define SECOND_30 5'b10010 // 30秒定时清狗
module wdt(Wdi,Wdo,reset,clk,Mr,softrst,wdt_flag,time_flag,Clr_WDT_Reg,cycle);
input Wdo;
output Wdi;
input reset;
output Mr;
input clk;
input softrst;
input time_flag;
input wdt_flag;
input Clr_WDT_Reg;
output cycle;
reg Mr_Out_Reg; // AMD706_MR输出寄存器
reg Wdo_Dly_Reg; // Wdo延时一拍
reg [4:0] Wdo_Cnt_Reg; // Wdo输入计数寄存器
reg Wdi; // 输出清狗信号
wire [4:0] Timer; // 清狗时间间隔变量
//wire Clr_WDT_Flag; // CPU清狗标志
/* *************************** 看门狗控制******************************** */
// 清狗时间间隔选择
assign Timer = time_flag? `SECOND_30:`SECOND_2; // watchdog[0]为1时,选择30S清狗间隔;
// watchdog[0]为0时,选择2S清狗间隔;
// 当看门狗打开后,在Wdo的下降沿计数器增1
always @(negedge reset or posedge clk) //将WDO信号用内部时钟同步,保证CPLD对
begin //信号的可靠采集
if(!reset)
Wdo_Dly_Reg <= 1'b0;
else
Wdo_Dly_Reg <= Wdo;
end
always @(negedge reset or posedge clk) //同步后的信号直接输出对ADM706的定时器清零
begin
if(!reset)
Wdi <= 1'b0;
else
Wdi <= Wdo_Dly_Reg;
end
always @(negedge reset or posedge clk or negedge softrst)
begin
if(!reset| (!softrst))
Wdo_Cnt_Reg <= 5'b00000;
else if(Clr_WDT_Reg)
Wdo_Cnt_Reg <= 5'b00000;
else if(!Wdo_Dly_Reg && Wdi&& (wdt_flag==1'b1))
Wdo_Cnt_Reg <= Wdo_Cnt_Reg + 5'b00001;
end
// 当CPU执行全局复位或看门狗计数器计数值超过设定值时,输出706_MR低电平
always @(negedge reset or posedge clk)
begin
if(!reset)
Mr_Out_Reg <= 1'b1;
else if((Wdo_Cnt_Reg == Timer)&& (wdt_flag==1'b1))
Mr_Out_Reg <= 1'b0;
end
// 看门狗MR输出
assign Mr = Mr_Out_Reg;
assign cycle=!Wdo_Dly_Reg & Wdi;
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -