数字IC,三大核心代码架构之计数器(verilo实列)

2023-11-07

简介:

计数器设计是数字IC设计 的核心,也是最常用的代码片段,通过记录时钟周期个数,可以控制电路的时序,通过计数器可以实现测量,计数,状态控制,分频,计数器有触发器和逻辑门共同构成。

计数器设计要素:

1 初始值是多少?

这里要考虑的是复位信号和其他标志信号,一般复位是计数器清0,其他标志信号看情况。

2 结束值是多少?

结束值同样重要,默认在计数满的时候自动清0,

3 往哪个方向计数

加计数,还是减计数,在同一个设计里面,计数的方向要保持一致。

4计数步长是多少

每次计数的步长是多少,默认是1

5计数条件是啥

一般条件是时钟沿跳变,还有可能是使能信号,标志信号等

计数器示例(Verilog实现)

1 加法计数器

一个指令周期或外部脉冲时将计数器内容加1

module up_counter(
    input clk ,
    input rst_n,
    output reg [7:0] cnt ,

)
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)
    begin
        cnt<= 8'b0;
    end 
    else 
    begin
        cnt <= cnt+1'b1;
    end 
end 
endmodule

2减计数器

一个指令周期或外部脉冲时将计数器内容减1

module down_counter(
    input clk ,
    input rst_n,
    output reg [7:0] cnt ,

)
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)
    begin
        cnt<= 8'hff;
    end 
    else 
    begin
        cnt <= cnt-1'b1;
    end 
end 
endmodule

3带使能标志计数器

使能信号有效是计数

module ena_counter(
    input clk ,
    input rst_n,
    input ena ,
    output reg [7:0] cnt ,

)
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)
    begin
        cnt<= 8'b0;
    end 
    else if(ena ==1)
    begin
        cnt <= cnt+1'b1;
    end 
    else begin
         cnt <= cnt ;
    end 
end 
endmodule

4 格雷码计数

格雷码计数器是为了在异步时钟域之间传递计数结果而用到的计数器

module gray_counter(
    input clk ,
    input rst_n,
 output [7:0] gray_out ,

)
reg [7:0] cnt ;

always@(posedge clk or negedge rst_n)begin
    if(!rst_n)
    begin
        cnt<= 8'b0;
    end 
   else 
    begin
        cnt <= cnt+1'b1;
    end 

end 

always@(*)begin
    if(!rst_n) 
    gray_out = 8'b0;
    else 
    gray_out = cnt[8:1] ^ (cnt[8:1] >> 1) ;

end 

endmodule

5 环形计数器

最简单的移位寄存器,对应n位环形计数器有n个状态

module ring_counter(
    input clk ,
    input rst_n,
    input ena ,
    output reg  [7:0] cnt ,

)

always@(posedge clk or negedge rst_n)begin
    if(!rst_n)
    begin
        cnt<= 8'b0000_0001;
    end 
   else if(ena == 1'b1)
    begin
        cnt <= {cnt[0],cnt[7:1]};
    end 
    else 
    begin
    cnt <= cnt ;
    end 
end 

endmodule

6 Johnson计数器

约翰逊(Johnson)计数器又称扭环计数器,是一种n位触发器来表示2n个状态的计数器,约翰逊计数器相邻两组数只有一位不同,避免竞争冒险

module johnson_counter(
    input clk ,
    input rst_n,
    input ena ,
    output reg  [7:0] cnt ,

)

always@(posedge clk or negedge rst_n)begin
    if(!rst_n)
    begin
        cnt<= 8'd0;
    end 
   else if(ena == 1'b1)
    begin
        cnt <= {~cnt[0],cnt[7:1]};
    end 
    else 
    begin
    cnt <= cnt ;
    end 
end 

endmodule

7 Ripple计数器(低功耗计数器的一种)

行波计数器一般指异步计数器,使用触发器输出作为下一级触发器时钟的输入。

缺点:

信号延迟偏移

sta和综合麻烦,验证工作量大

优点

module ripple_counter(
    input clk ,
    input rst ,
    output [3:0] cnt ,
);
        T_FF tff0(cnt[0], clk		, 		rst);
        T_FF tff1(cnt[1], cnt[0]	, 		rst);
        T_FF tff2(cnt[2], cnt[1]	, 		rst);
        T_FF tff3(cnt[3], cnt[2]	, 		rst);

endmodule

module T_FF(
    output t_out,
    input clk ,
    input rst ,

);

wire d_in;
D_FF dff0(t_out,d_in,clk,rst);
not n1 (d_in,t_out);
endmodule


module D_FF(
    input reg d_out,
    input d_in ,
    input clk ,
    input rst ,

);

always @(posedge clk or negedge rst) begin
    if(rst)
    d_out <= 1'b0 ;
    else 
    d_out <= d_in;
    
end
endmodule

 8 BCD 计数器

用4 位二进制,来表示一位十进制数,十进制计数,计满进位

module bcd_counter(
    input clk ,
    input rst_n ,
    input cin ,        //carry input 
    output reg cout ,   //carry output 
    output reg [3:0] cnt 
);

//count
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
    cnt <= 1'b0;
    else if(cin==1'b1)begin
        if(cnt==4'd9)
        cnt <= 1'b0;
    end 
    else 
        cnt <= cnt+4'b1 ;
    else 
        cnt <= cnt ;

end

//carry out 
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
    cout <= 1'b0 ;
    else if(cin==1'b1 && cnt = 4'd9)begin
        cout <= 1'b1 ;
    end 
    else 
        cout <= 1'b0;
    
end
endmodule

其他的计数器就不一一列举了,有兴趣可以再研究一下。

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

数字IC,三大核心代码架构之计数器(verilo实列) 的相关文章

  • FPGA零基础学习之Vivado-ROM使用教程

    FPGA零基础学习之Vivado ROM使用教程 本系列将带来FPGA的系统性学习 从最基本的数字电路基础开始 最详细操作步骤 最直白的言语描述 手把手的 傻瓜式 讲解 让电子 信息 通信类专业学生 初入职场小白及打算进阶提升的职业开发者都
  • PRBS笔记

    1 概述 PRBS 伪随机二进制序列 也称为伪随机码 通常被用来测试高速信号的信号质量 伪随机 也说明了该码流并不是真正的随机 而是具有特性属性 码流由 多项式 决定 具有重复周期 PRBS具有多种阶数 如PRBS7 PRBS15 PRBS
  • 平头哥(T-Head )开源RISCV处理器OpenC906 RTL仿真

    在过去的几年里 阿里集团平头哥陆续推出了几款RISCV处理器 有些处理器已经在产业界得到了应用 比如在某志的D1处理器中 就嵌入了平头哥的玄铁C906内核为 芯 RISCV虽然是一个开放标准 并且网络上也不乏一些开源核的RTL实现 但是商用
  • modelsim 关联 notepad++

    modelsim 控制窗口敲入 1 proc external editor filename linenumber exec I notepad notepad exe filename 2 set PrefSource altEdito
  • Verilog中forever、repeat、while、for四类循环语句(含Verilog实例)

    当搭建FPGA逻辑时 使用循环语句可以使语句更加简洁易懂 Verilog中存在四类循环语句 如标题 几种循环语句的具体介绍和用法如下 1 forever 连续的执行语句 语法格式 forever
  • MIPI D-PHY介绍(二) FPGA

    MIPI D PHY介绍 二 FPGA 随着移动设备的广泛普及 MIPI D PHY作为其最主要的物理层标准之一 被越来越多地使用在各种嵌入式系统中 本文将详细介绍MIPI D PHY的工作原理和在FPGA设计中的实现方法 MIPI D P
  • 【FPGA入门】第八篇、FPGA驱动VGA实现动态图像移动

    目录 第一部分 实现效果 第二部分 动态VGA显示的原理 1 将动态显示的区域提前进行赋值 2 图像块的移动是每张图片叠加后的效果 3 如何实现图像块位置的改变 第三部分 系统结构和驱动波形 1 系统的Top down结构 2 图像块移动的
  • 二、RISC-V SoC内核注解——译码 代码讲解

    tinyriscv这个SoC工程的内核cpu部分 采用经典的三级流水线结构进行设计 即大家所熟知的 取值 gt 译码 gt 执行三级流水线 另外 在最后一个章节中会上传额外添加详细注释的工程代码 完全开源 如有需要可自行下载 上一篇博文中注
  • 跨时钟域处理方法(一)——打拍

    一 说明 处理跨时钟域的数据可以分为单bit数据和多bit数据 而打拍的方法主要常见于处理单bit数据的跨时钟域问题 打拍的本质是通过添加寄存器 对输入的数据进行延拍 其主要目标是消除亚稳态的影响 常见的是打2拍 也就是添加2级寄存器 二
  • Verilog实现两路组相联cache

    cache代码 timescale 1ns 1ps cache共32块 分为16组 每组2块 即两路组相联 1块 4字 1字 4字节 主存共1024块 4096个字 主存地址共12位 1 0 为块内偏移 5 2 为组地址 11 6 为Tag
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • 吃透Chisel语言.18.Chisel模块详解(五)——Chisel中使用Verilog模块

    Chisel模块详解 五 Chisel中使用Verilog模块 上一篇文章讲述了用函数实现轻量级模块的方法 可以大幅度提升编码效率 Chisel中也提供了一些好用的函数 方便我们编写代码 也方便Chisel编译器优化生成的硬件电路 在Chi
  • 关于xilinx BRAM IP的延迟以及流程

    关于RAM IP的延迟 1 选择了output registers 可以在RAM输出端口添加register 也可以在core的输出添加 在primitives添加 降低clock to out到primitive的延迟 在core添加re
  • xilinx xdma PCIe中断bug

    xilinx xdma PCIe中断存在bug bug1 此中断虽然是msi或者msx中断 但是不中断cpu bug2 此中断不是边沿中断 而是电平中断 在驱动层需要不断地轮训查询中断事件 bug3 此中断持续时间必须长 而且在收到中断应答
  • 【DDR3 控制器设计】(3)DDR3 的写操作设计

    写在前面 本系列为 DDR3 控制器设计总结 此系列包含 DDR3 控制器相关设计 认识 MIG 初始化 读写操作 FIFO 接口等 通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等 附上汇总博客直达链接 DD
  • BUCK电路分析(二)

    BUCK电路分析 二 PSIM仿真同步BUCK电路 在上片文章中 初步的分析了BUCK电路的工作原理 本章使用PSIM软件仿真BUCK电路 观察分析BUCK电路器件关键波形 图1是同步BUCK电路图 开关频率设置为200K 固定占空比 在仿
  • 【电子技术】什么是LFSR?

    目录 0 前言 1 数学基础 1 1 逻辑异或 1 2 模2乘法 和 模2除法 2 线性反馈移位寄存器LFSR 3 抽头和特征多项式 4 阶线性反馈移位寄存器实例 0 前言 线性反馈移位寄存器 Linear Feedback Shift R
  • MINI-UTDE 10 BASE-T 集成控制器

    MINI UTDE 10 BASE T 集成控制器 MINI UTDE 10 BASE T 拥有多达三个本地I O板和远程I OS总线通信 为用户提供了一系列生产单元功能的单一控制点 包括诸如夹头 反馈器和辅助机器等外围生产设备 支持所有主
  • TRICONEX MA2211-100 芯片上相互连接

    TRICONEX MA2211 100 芯片上相互连接 TRICONEX MA2211 100 所有相同的组件 io的电源 处理器 和内存将需要 但是 你可以看到所有这些带存储器和处理器的OO板 针不能嵌入到一个小的单片机上 现在是 普拉克
  • ESP10B 锁定连接器

    ESP10B 锁定连接器 ESP10B 电机新增内容包括双极型号标准 NEMA 尺寸 17 23 和 34 的步进电机现在包括输出扭矩范围从 61 盎司英寸到 1291 盎司英寸的双极型号 该电机配有带锁定连接器的尾缆 可轻松连接 每转可步

随机推荐

  • 阿里java编程规范之异常处理、安全规约、MySql数据库

    注 本文内容整理自 阿里java编码规范 除 编程规约 外的其它规则 异常处理 强制 1 Java类库中可以通过预检查方式规避的 RuntimeException不应该通过catch的方式来处理 如 IndexOutOfBoundsExce
  • LruCache基本使用和原理分析

    最近在研究时区问题时 时区的底层实现涉及到BasicLruCache集合的使用 故而对LruCache做了部分的了解 BasicLruCache 是 Android 提供的一个简单的 LRU 缓存实现 但在标准的 Java 类库中并不存在
  • 基于SpringBoot的校园志愿者管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SpringBoot 前端 HTML Vue 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse
  • windows 安装 minio

    windows 安装 minio 1 通过powershell 安装 Invoke WebRequest Uri https dl min io server minio release windows amd64 minio exe Ou
  • 小试一下Google App Engine

    这两天关心了一下云 所以也看到google app engine了 今天小小试了一下 做下记录 主页 登录http code google com intl zh CN appengine 下载 App Engine SDK GoogleA
  • 使用StarRocks导入大数据:详细教程及示例代码

    使用StarRocks导入大数据 详细教程及示例代码 StarRocks是一个快速 可扩展的大数据分析引擎 它提供了高性能的数据导入功能 在本文中 我们将介绍如何使用StarRocks导入大数据 并提供相应的示例代码 步骤1 准备工作 在开
  • 云计算平台常用命令

    云计算IAAS篇 mysql篇 mysql uroot p000000 使用root账号登录mysql use mysql 切换到mysql层 show tables 查询mysql数据库列表 select from mysq
  • linux高性能服务器开发之TCP/IP协议族(1)

    TCP IP协议族体系结构以及主要协议 每层协议完成不一样的功能 上层协议得借助下层协议提供的服务 计网 数据链物层 数据链物层实现网卡接口的网络驱动程序 网络驱动程序隐藏一些 物理层不同电气特性 为上层提供一个统一的接口 常用的协议ARR
  • 【中兴ZXV10 B860A1.1】

    这里写自定义目录标题 开启adb 开启adb 部分盒子的ADB调试位置 在设置页面中可以有开启开发者选项 地区界面不同 位置不同有的在设置里 如果找不到 直接按住遥控器 返回 不放 5秒后 快速不停按 左键 点击 打开ADB调试 这时侯让你
  • 2021-08-04 读书笔记:Python 学习手册(2)

    读书笔记 Python 学习手册 2 结于2021 08 04 OREILY的书籍 可读性很强 入门类 而且这本书很厚 第三部分 语句和语法 第四部分 函数 第三部分 语句和语法 第10章 Python语句简介 Python是面向过程的 基
  • 程序或-内存区域分配(五个段)--终于搞明白了

    一 在学习之前我们先看看ELF文件 ELF分为三种类型 o 可重定位文件 relocalble file 可执行文件以及共享库 shared library 三种格式基本上从结构上是一样的 只是具体到每一个结构不同 下面我们就从整体上看看这
  • DC系列漏洞靶场-渗透测试学习复现(DC-1)

    最近闲着冲浪玩发现了DC系列漏洞靶场 下载了8个靶场 DC 1到DC 8 从信息收集到最后拿到超级管理员权限 可以说几乎贯穿了渗透测试的每一步 寻找一个个flag 通过flag中的指引内容 帮助我们拿到最后的root身份 过程还是挺有趣的
  • Jvm之垃圾回收机制

    判断一个对象是否可被回收 1 引用计数算法 给对象添加一个引用计数器 当对象增加一个引用时计数器加 1 引用失效时计数器减 1 引用计数为 0 的对象可被回收 两个对象出现循环引用的情况下 此时引用计数器永远不为 0 导致无法对它们进行回收
  • vue中使用闭包(例如防抖和节流)失效问题(直接调用)

    文章目录 1 出现问题 2 问题原因 3 解决办法 4 防抖节流函数 1 出现问题 防抖 节流使用无效 例如防抖 按钮点击多次依旧执行多次 gt 查看是闭包无效 定义的局部变量依旧为初值 gt 没有相应清除定时器
  • Ubuntu安装MonoDevelop

    安装步骤 在ubuntu终端执行下面步骤代码 第一步 安装源 根据自己的版本在Ubuntu上安装Mono 运行下面代码授权注册repo源并更新软件列表 Ubuntu 18 04 sudo apt install apt transport
  • Vue3之Vuex

    1 Vuex的基本使用 2 Module 2 1 vuex中模块化的基本使用 2 2 在命名空间中访问全局内容 3 vuex的typescript用法 3 1 不使用模块化 3 2 使用模块化 1 Vuex的基本使用 vuex的安装 npm
  • python利用selenium(webdriver chrome)模拟登陆获取cookie

    我是在windows下进行实验的 准备工作 1 安装python环境 2 python安装selenium插件 执行以下命令就行 pip install selenium 3 Windows下配置webdriver chrome 如果以上准
  • 天气预报小程序 微信小程序期末大作业(含文档)

    天气预报微信小程序 运行正常无错误 下载链接在文末 详情如下图 点我下载资源 https download csdn net download weixin 43474701 58813129
  • golang中的TLS

    HTTP和 HTTPS https和http都属于应用层 基于TCP 以及UDP 协议 但是不同的是 HTTP 缺省工作在TCP协议80端口 HTTPS缺省工作在TCP协议443端口 HTTPS服务不同于HTTP服务 HTTPS是HTTP
  • 数字IC,三大核心代码架构之计数器(verilo实列)

    简介 计数器设计是数字IC设计 的核心 也是最常用的代码片段 通过记录时钟周期个数 可以控制电路的时序 通过计数器可以实现测量 计数 状态控制 分频 计数器有触发器和逻辑门共同构成 计数器设计要素 1 初始值是多少 这里要考虑的是复位信号和