基于verilog设计一个硬件看门狗

2023-11-16


一、 看门狗简介

  看门狗:也称看门狗定时器,是常见于系统的一种外设;
看门狗似乎就是一条看门的狗,如果系统一切正常则看门狗不叫,如果程序不正常,则看门狗则会将程序咬死(即程序强制复位)。
  看门狗的作用:当一段程序跑飞,卡死或不受控制时,能使得系统强制重启;
  喂狗:当看门狗被初始化后,需要在程序中每进行一段时间就重置看门狗模块的定时器计数值,防止程序被咬死;
  程序咬死:当程序出现问题时(跑飞或锁死),导致看门狗定时器的计数值没能及时重置,当计数值达到设置的阈值后,看门狗定时器则输出复位信号,使得CPU强制复位;


二、看门狗分类

  硬件看门狗:看门狗实际上就是一个计数器,硬件看门狗就是以硬件实现的一种计数器,其可以集成在单片机,SOC等系统中,使用硬件看门狗不用消耗额外的软件资源;
  软件看门狗:利用软件实现软件计数器,利用该计数器判断是否计数达到阈值,达到阈值则调用软件复位程序,常与定时器中断一起使用;
  窗口看门狗:独立看门狗在0-重载值之间都可以进行喂狗操作,这样如果程序跑飞反复在喂狗,则程序无法复位;窗口看门狗则对喂狗的时间设置了阈值(上下限),喂狗操作只能在阈值间进行喂狗,其他时间喂狗都无效;


三、看门狗模块设计

3.1 看门狗模块设计框图

在这里插入图片描述

3.2 顶层

module wtd_counter_top#(
    parameter integer   COUNTER_WIDTH = 16,
    parameter integer   RST_SIG_WIDTH = 2
    )(
        input  wire                            ref_clk,//system reference clock
        input  wire                               nrst,//system reset signal, Valid: 1'b0
        input  wire                                 en,//system enable signal, Valid: 1'b1
        input  wire [COUNTER_WIDTH - 1:0] up_threshold,//system upside threshold
        output wire [COUNTER_WIDTH - 1:0]        count,//system clock counter
        output wire                            wtd_rst 
    );

   wire                    rst_req;
   wire [RST_SIG_WIDTH :0] rst_req_dff; 

   assign rst_req  = (count == up_threshold) ? 1'b1:1'b0;
   assign wtd_rst = |rst_req_dff;

   genvar DFF_inist_index;
   generate 
        for(DFF_inist_index = 0;
            DFF_inist_index < RST_SIG_WIDTH;
            DFF_inist_index = DFF_inist_index +1)
         begin: dff_cell_inist//
            dff#(.DFF_LEVEL(1),.DATA_WIDTH(1)
            )dff_inist(
                .clk(ref_clk),
                .din(rst_req_dff[DFF_inist_index]),
                .dout(rst_req_dff[DFF_inist_index+1]),
                .nrst(nrst)
            );
         end
    endgenerate

    edge_check edge_check_inist0(
        .ref_clk(ref_clk),
        .nrst(nrst),
        .din(rst_req),
        .dout(rst_req_dff[0])
    );
     wtd_counter#(
        .COUNTER_WIDTH(COUNTER_WIDTH)
    )wtd_counter_inist0(
        .ref_clk(ref_clk),//system reference clock
        .nrst(nrst),//system reset signal, Valid: 1'b0
        .en(en),//system enable signal, Valid: 1'b1
        .up_threshold(up_threshold),//system upside threshold
        .count(count) //system clock counter 
    );
endmodule

3.3 计数器

module wtd_counter#(
        parameter integer   COUNTER_WIDTH = 16
    )(
        input  wire                            ref_clk,//system reference clock
        input  wire                               nrst,//system reset signal, Valid: 1'b0
        input  wire                                 en,//system enable signal, Valid: 1'b1
        input  wire [COUNTER_WIDTH - 1:0] up_threshold,//system upside threshold
        output wire [COUNTER_WIDTH - 1:0]        count //system clock counter 
    );

    /**************************wtd inner signal design**************************/
    reg  [COUNTER_WIDTH - 1:0]      count_r;

    /**************************wtd inner signal connect**************************/
    assign   count = count_r;

    always @(posedge ref_clk) begin : proc_
        if(~nrst) begin
            count_r <= 'b0;
        end else begin
            if(en)
            begin
                if(count_r != up_threshold)
                    count_r <= count_r + 1'b1;
                else
                    count_r <= count_r;
            end
            else
            begin
                count_r <= count_r;
            end
        end
    end

endmodule

3.4 边沿检测器

module edge_check(
        input  wire    ref_clk,
        input  wire       nrst,
        input  wire        din,
        output wire       dout
    );

    reg  din_dff;

    assign dout = (din) & (~din_dff);

    always @(posedge ref_clk ) begin
        if(~nrst) begin
            din_dff <= 0;
        end 
        else begin
            din_dff <= din;
        end
    end

endmodule

3.5 信号延迟模块

module dff#(
        parameter integer DFF_LEVEL  = 1,
        parameter integer DATA_WIDTH = 8
)(
        input wire                     clk,
        input wire [DATA_WIDTH - 1:0]  din,
        input wire [DATA_WIDTH - 1:0] dout,
        input wire                    nrst
    );

    reg [DATA_WIDTH - 1:0] din_buff [DFF_LEVEL-1:0];
    assign dout = din_buff[DFF_LEVEL-1];
    integer i;

    always @(posedge clk or negedge nrst) begin
        if (~nrst) begin
            // reset
            for(i=0;i<DFF_LEVEL;i=i+1)
            begin
                din_buff[i] <= 'b0;
            end
        end
        else begin
            for(i=1;i<DFF_LEVEL;i=i+1)
            begin
                din_buff[i] <= din_buff[i-1];
            end
                din_buff[0] <= din;
        end
    end
    
endmodule

结束在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于verilog设计一个硬件看门狗 的相关文章

  • uniapp打包之配置MacOS虚拟机生成iOS打包证书

    前言 uniapp是一款跨端开发框架 可用于快速开发iOS Android H5等多端应用 本文将详细介绍如何实现uniapp开发的iOS应用打包 详细步骤 一 下载苹果原版镜像文件 点击此处下载 二 安装VMware uniapp打包iO

随机推荐

  • 【android】巧用android:divider属性设置LinearLayout中元素之间的间隔

    如上图 要想实现3个button线性排列并且使它们的大小相同 间隔相等 而且整体填充满整个linearlayout 我们一般的做法是在每两个button之间放一个固定宽度的view 然后设置button的宽度为0 layout weight
  • IDEA maven 项目修改后代码不生效,需要mvn install 后才生效

    错误描述 每次更新完代码 还需要手动install一下才生效 太令人头疼了 错误原因 应该是idea的问题 解决方案 删除idea文件夹 重新打开项目就好了
  • nas linux手机照片备份,本身着手,组建简洁好用的NAS!(存储同步篇)

    之前老张给人人带来了NAS安装 戳这里 和根基设置 戳这里 过程 那么接下来就是正戏了 此次包含了共享设置 速度测试 多盘设置 照片视频同步设置的过程 也是NAS在内网情况中的本职工作 事实要怎么做呢 一路来看看吧 原文来自 www pp0
  • Word文档标题编号调整

    现象 标题目录编号错乱 工具 Word2016 1 先选中第一个一级目录 自定义多级目录样式 包含所有的文档目录级别 1 2 3 4 5 2 将第2章标题下的2级目录标题 2 1环境说明 使用格式刷刷成1级标题中设置的样式 3 选中 第3章
  • Python小游戏————滑雪小游戏代码开源

    作者 小刘在这里 每天分享云计算网络运维课堂笔记 励志爬上IT介顶峰 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的 绽放 愿所有的美好 再疫情结束后如约而至 目录 一 主代码 二 cfg 三 README
  • Java实现音频播放

    import java io File import java io IOException import javax sound sampled AudioFormat import javax sound sampled AudioIn
  • Day2 Data Management I

    This article is based on R 4 1 2 1 Data import Export 1 1 Import data 1 1 1 import data by base R Example General import
  • jsp向服务器上传文件,jsp ftp 上传文件到服务器

    jsp ftp 上传文件到服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ exe 在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器
  • 转:java实现 阿拉伯数字转换为汉字数字 算法

    转载链接 http blog csdn net zhanghao hulk article details 28594105 转载代码 public class NumberFormatUtil static String units 十
  • yum使用源安装Nginx

    Nginx 使用源安装 进入源的目录 sudo vim etc yum repos d 创建nginx源文件 touch nginx repo 添加nginx repo配置文件 https nginx org en linux packag
  • git仓库的创建以及连接远程仓库

    供自己后期复习使用 如果哪里不对希望大佬指正 1 先创建远程仓库 2 本地仓库创建以及连接远程仓库 1 配置个人信息 git config global user name 自己git的name git config global user
  • linux下使用 du查看某个文件或目录占用磁盘空间的大小

    du ah max depth 1 这个是我想要的结果 a表示显示目录下所有的文件和文件夹 不含子目录 h表示以人类能看懂的方式 max depth表示目录的深度 du命令用来查看目录或文件所占用磁盘空间的大小 常用选项组合为 du sh
  • 关于云成本管理和优化 FinOps,你需要知道的一切

    FinOps 是什么 FinOps 是一种云成本管理和优化的解决方案 并为组织 企业 团队提供了系统化的方法论 其中每个人都应该对自己的云资源成本负责 FinOps 是 Finance 和 DevOps 的合成词 强调业务团队和研发团队的沟
  • xrd计算晶面间距_origin分析XRD(6.晶格常数计算立方晶系举例)

    微信公众号试行乱序推送 为了不错过更新 请点击本页面最上方的 结构分析表征 进入公众号主页 点击右上角的三个小点点 在弹出的界面点击 设为星标 并在看完图文或视频后点击右下角的 在看 和 赞 本公众号以各类仪器的测试 分析教程 欢迎关注同名
  • Windows10 配置ftp实现局域网文件共享

    准备两台电脑能相互ping通 设置网络共享 控制面板 gt gt 网络和Internet gt gt 网络和共享中心 gt gt 高级共享设置 开启WindowsDefender 防火墙允许FTP文件共享 这里我在自己电脑上没找到FTP的选
  • iOS17适配指南-新版

    文章目录 一 iOS17适配点 二 具体代码 一 iOS17适配点 UIView与UIViewController 可以设置数据为空时的占位视图 增加SymbolAnimations 通过addSymbolEffect 与removeSym
  • Unuty3D开发ai2thor

    一 Edit 用Uinity3D打开ai2thor unity项目进行编辑 二 Build 方法一 1 修改ai2thor目录下的task py文件 注释86 89行 并添加一行Unity3D软件的路径 if os path exists
  • Qt5中通过信号槽传递多个参数

    在Qt中的信号槽机制中 信号能携带的参数最多不超过6个 那么超过6个时怎么办呢 这时 可以使用QByteArray作为参数 把需要传递的参数全部打包到这一个参数里 在槽函数里再将打包的参数逐项解析出来 信号发送 void signal ms
  • Unity学习记录——空间与运动

    Unity学习记录 空间与运动 前言 本文是中山大学软件工程学院2020级3d游戏编程与设计的作业3 编程题 1 模拟太阳系 首先向unity中Assets添加所找的贴图素材Solar Textures Solar System Scope
  • 基于verilog设计一个硬件看门狗

    文章目录 一 看门狗简介 二 看门狗分类 三 看门狗模块设计 3 1 看门狗模块设计框图 3 2 顶层 3 3 计数器 3 4 边沿检测器 3 5 信号延迟模块 一 看门狗简介 看门狗 也称看门狗定时器 是常见于系统的一种外设 看门狗似乎就