打印
[FPGA]

单位时间数脉冲Verilog程序求教

[复制链接]
1285|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
whw3245906|  楼主 | 2016-12-24 10:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,小弟最近刚刚入手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

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝