各位大侠,小弟最近刚刚入手Verilog,最近写了小程序。要实现的功能就是在单位时间500ms内数st信号的边沿数目,类似M法测电机转速。
添加到工程中起初会把,SYS_ret信号锁到CLKBUF,会报错。
网上 查找,加限制条件 /* synthesis syn_noclockbuf = 1 */,会通过,但是程序烧进去之后运行一段时间会出现异常,输出I/O会乱跳边。
以下是我写的程序,请各位指导
module MIP_WD(sys_rst,clk,st,en,status,rst);
input sys_rst;
input clk; //10k
input st; //喂狗
input en; //1=Enable;0=Disable
input status;
output rst; //0=Active
parameter TIME_ACTIVE =13'd5000; //单位100us
parameter CNT_FEEDOG =13'd10; //单位100us
reg [13:0]Cnt_Timer; //500ms定时器计数器
reg [13:0]Cnt_Feedog; //喂狗次数计数器
reg wdo;
reg sig_r0;
reg sig_r1;
wire both_edge;
//检测DSP喂狗时,发送过来信号的边沿
always @ (negedge sys_rst or posedge clk)
if (!sys_rst) begin
sig_r0 <= 1'b0;
sig_r1 <= 1'b0;
end else begin
sig_r0 <= st;
sig_r1 <= sig_r0;
end
assign both_edge = sig_r1 ^ sig_r0; //(~sig_r1) & (sig_r0);//sig_r1 ^ sig_r0;
//500ms内对DSP喂狗次数进行检测,如果小于等于CNT_FEEDOG,则认为DSP死机
//判定死机后发送周期为1的方波,复位DSP
always@(negedge sys_rst or posedge clk)
begin
if(!sys_rst)
begin
wdo<=1;
Cnt_Timer<=0;
Cnt_Feedog<=0;
end
else
begin
if(Cnt_Timer>=TIME_ACTIVE) //定时器溢出
begin
Cnt_Timer<=0;
Cnt_Feedog<=0;
if(Cnt_Feedog<=CNT_FEEDOG && status) //定时器溢出时,判断喂狗次数,如果小于预
wdo<=~wdo; //wdo的初值初始化为了1,通过取反即可产生周期为1的方波信号
end //end of 定时器溢出
else
begin
Cnt_Timer<=Cnt_Timer+1; //定时器没有溢出的情况下,定时计数器自加
if(both_edge) //检测到DSP发送过来喂狗的边沿信号时
Cnt_Feedog<=Cnt_Feedog+1; //喂狗计数器自加
end
end
end
assign rst= (!sys_rst)?0:
(!en)?1:
wdo;
endmodule |