【FPGA】Verilog:计数器 | 异步计数器 | 同步计数器 | 2位二进制计数器的实现 | 4位十进制计数器的实现

news2024/11/18 6:25:51

目录

Ⅰ. 实践说明

0x00 计数器(Counter)

0x01 异步计数器(Asynchronous Counter)

0x02 同步计数器(Synchronous Counter)

Ⅱ. 实践:2位二进制计数器

0x00 实践说明

0x01 输出表

0x02 代码和仿真

Ⅲ. 实践:四位十进制计数器

0x00 实践说明

0x01 输出表

0x02 代码和仿真


Ⅰ. 实践说明

0x00 计数器(Counter)

计数器是一种状态周期性循环的顺序电路 (sequential circuit)。计数器接收一个时钟值 (high / low) 和一个要计数的输入值,输出结果是接收到输入的次数,并使用触发器对输入的累积次数进行计数。

计数器根据其工作方式分为 同步 (Synchronous) 和 异步 (Asynchronous) 两种,最简单的计数器形式是 上/下 计数器 (UP/DOWN)。

Up/Down Counter

上/下计数器接受单个 "上 "或 "下 "输入,并根据该输入将计数器的当前值递增或递减 1。

  • UP=1 时顺时针计数,DOWN=1 时逆时针计数。
  • U=D=0 时停止计数,不接受 U=D=1 的输入。

0x01 异步计数器(Asynchronous Counter)

异步计数器 (Asynchronous Counter) 又称纹波计数器,由多个串联的触发器组成。

第一个 flip-flop 接收时钟值作为输入,随后的 flip-flop 接收前一个 flip-flop 的输出作为输入。

Asynchronous Counter

0x02 同步计数器(Synchronous Counter)

在异步计数器中,由于触发器是串联连接的,上一个触发器的输出被传递到下一个触发器的输入端,而不是所有触发器的输出同时发生。

由于这种结构,运算过程存在延迟,因此在需要精确时间尺度运算的电路中很难使用异步计数器。

同步计数器是对异步计数器上述问题的一种补充。为防止出现延迟,通过将时钟连接到每个触发器,触发器被并行连接起来。

由于触发器是并联的,因此可以同时工作,适合高速运行,但缺点是电路结构复杂。

Synchronous Counter

Ⅱ. 实践:2位二进制计数器

0x00 实践说明

Verilog 实现带复位操作的 2 位二进制计数器,根据 A 的状态图创建状态表 B。

0x01 输出表

Present State Q

Next State Q*

input x = 0

input x = 1

00

00

01

01

01

10

10

10

11

11

11

00

0x02 代码和仿真

💬 Source Code:

`timescale 1ns / 1ps

module BC(
    input reset,
    input clk,
    input x,
    output z,
    output[1:0] out
);

reg [1:0]out;
reg z;

always @(posedge !clk) begin
    if(reset) begin
        out[0] <= 1'b0;
        out[1] <= 1'b0;
        z <= 1'b0;
    end
    else begin
        if((x == 1'b1)) begin
            if((out[0] && out[1])) z <= 1'b1;
            if((out[0] == 1'b1)) begin
                out[0] <= (~out[0]);
                out[1] <= (~out[1]);
            end
            else out[0] <= (~out[0]);
        end
    end
end


endmodule

💬 Testbench:

`timescale 1ns / 1ps

module BC_tb;

reg clk,reset,x;
wire [1:0]out,z;

BC u_BC(
    .clk(clk ),
    .reset(reset ),
    .x(x ),
    .out(out ),
    .z(z )

);

initial clk = 1'b0;
initial reset = 1'b1;
initial x = 1'b0;

always clk = #20 ~clk;

always@(reset) begin
    reset = #50 ~reset;
end

always@(x) begin
    x = #110 ~x;
    x = #20 ~x;
    x = #60 ~x;
    x = #20 ~x;
    x = #60 ~x;
    x = #20 ~x;
    x = #60 ~x;
    x = #20 ~x;
end

initial begin
    #380
    $finish;
end

endmodule

🚩 运行结果如下:

💡 解读:2 位二进制计数器是一个在数字 0,1,2,3 上迭代的计数器,这些数字可以用 2 位来表示。您可以编写这样的代码:当输入值 x 为 0 时,计数器保持当前状态;当输入值 x 为 1 时,计数器进入下一个数字。在数到 3(11)后,我们需要处理返回 0(00)。我们将其编写为下降沿触发器,模拟结果表明,每当时钟值从 1 下降到 0 时,输入值 x 就会反映到输出上,计数就会顺利进行。

Ⅲ. 实践:4位十进制计数器

0x00 实践说明

Verilog 实现带复位操作的 4 位十进制计数器,创建状态图和状态表,验证 Verilog 的仿真结果。
通过 FPGA 验证行为。

0x01 输出表

Present State Q

Next State Q*

input x=0

input x=1

0000

0000

0001

0001

0001

0010

0010

0010

0011

0011

0011

0100

0100

0100

0101

0101

0101

0110

0110

0110

0111

0111

0111

1000

1000

1000

1001

1001

1001

0000

0x02 代码和仿真

💬 Source Code:

`timescale 1ns / 1ps

module DC(
    input reset,
    input clk,
    input x,
    output z,
    output [3:0]out
);

reg [3:0]out;
reg z;

always @(posedge !clk) begin
    if(reset) begin
        out[0] = 1'b0;
        out[1] = 1'b0;
        out[2] = 1'b0;
        out[3] = 1'b0;
        z = 1'b0;
    end
    else begin
        if((x == 1'b1)) begin
            if((out[0] == 1'b1)) begin
                out[0] = (~out[0]);
                out[1] = (~out[1]);
            end
            else out[0] = (~out[0]);
            
            if((~out[0]) && (~out[1]) && (~out[2])) out[2] = 1'b1;
            
            else if ((~out[0]) && (~out[1]) && out[2]) begin
                out[2] = 1'b0;
                out[3] = 1'b1;
            end
            
            if((out[3] && (~out[2]) && out[1] && (~out[0]))) begin 
                z = 1'b1;
                out[0] = 1'b0;
                out[1] = 1'b0;
                out[2] = 1'b0;
                out[3] = 1'b0;
            end
        end
    end
end

endmodule

💬 Testbench:

`timescale 1ns / 1ps

module DC_tb;

reg clk,reset,x;
wire [3:0]out,z;

DC u_DC(
    .clk(clk ),
    .reset(reset ),
    .x(x ),
    .out(out ),
    .z(z )
);

initial clk = 1'b0;
initial reset = 1'b1;
initial x = 1'b0;

always clk = #20 ~clk;

always@(reset) begin
    reset = #50 ~reset;
end

always@(x) begin
    x = #110 ~x;
    x = #20 ~x;
    x = #60 ~x;
    x = #20 ~x;
    x = #60 ~x;
    x = #20 ~x;
    x = #60 ~x;
    x = #20 ~x;
    x = #60 ~x;
    x = #20 ~x;
    x = #60 ~x;
    x = #20 ~x;
    x = #60 ~x;
    x = #20 ~x;
    x = #60 ~x;
    x = #20 ~x;
    x = #60 ~x;
    x = #20 ~x;
    x = #60 ~x;
    x = #20 ~x;
end

initial begin
    #860
    $finish;
end

endmodule

🚩 运行结果如下:

💡 解读:4 位十进制计数器是一种对 0 到 9 的数字进行迭代的计数器,可以用 4 位来表示。您可以编写这样的代码:当输入值 x 为 0 时,计数器保持当前状态;

当输入值 x 为 1 时,计数器进入下一个数字。一旦数到 9(1001),就应该进行处理,以便返回到 0(0000)。我们将其编写为下降沿触发器,模拟结果表明,每当时钟值从 1 下降到 0 时,x 的输入值就会反映在输出中,计数也就顺利进行了。

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2023.11.11
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Introduction to Logic and Computer Design, Alan Marcovitz, McGrawHill, 2008

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1196688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

由于找不到dll无法执行代码的解决方法,深度解析5个dll修复方法

在使用计算机的过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到dll无法执行代码”。这个错误通常发生在程序运行时&#xff0c;系统无法找到所需的动态链接库&#xff08;DLL&#xff09;文件。这个问题可能由多种原因引起&#xff0c;包括缺少…

前端如何结合mock模拟假数据

由于某人不想写后端接口&#xff0c;不想用真数据对接vue-element-admin框架&#xff0c;用以前的接口&#xff0c;改token有点点麻烦&#xff0c;所以咱试试mock.js

《算法通关村——透彻理解二叉树中序遍历的应用》

《算法通关村——透彻理解二叉树中序遍历的应用》 直接上题 108. 将有序数组转换为二叉搜索树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高…

【电工基础】

电工基础 11.1 简介1.2 电路作用1.3 电路模型1.4 电流定义1.5 电压定义1.6 电动势1.7 电阻元件1.7.1 电阻元件定义1.7.2 电阻原件的特性1.7.31.7.4 1.81.91.10 345 1 1.1 简介 电源外部&#xff0c;正电荷移动的方向是由电源正极向电源负极方向&#xff0c;负电荷移动的方向是…

GEE:遥感影像二值化

作者:CSDN @ _养乐多_ 在Google Earth Engine(GEE)中,图像二值化是将图像中的像素值转换为二进制(0或1)的过程。这通常用于将连续的遥感图像转换为只有两个值的二值图像,以突出图像中的特定特征或区域。 结果如下图所示,将NDVI图像中,大于0.3的值设置为1(黑色),小…

VBA_MF系列技术资料1-217

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

超详细的性能测试流程

一、性能测试概念 我们经常看到的性能测试概念&#xff0c;有人或称之为性能策略&#xff0c;或称之为性能方法&#xff0c;或称之为性能场景分类&#xff0c;大概可以看到性能测试、负载测试、压力测试、强度测试等一堆专有名词的解释。 针对这些概念&#xff0c;我不知道你…

Harbor了解及部署

Harbor 无论是使用Docker-distribution去自建仓库&#xff0c;还是通过官方镜像跑容器的方式去自建仓库&#xff0c;通过前面的演示我们可以发现其是非常的简陋的&#xff0c;还不如直接使用官方的Docker Hub去管理镜像来得方便&#xff0c;至少官方的Docker Hub能够通过web界…

认识继承和多态

1 继承 1.1 为什么需要继承 Java 中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是现实世界错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0c;那在设计程序里就需要考虑 比如&a…

赶紧收藏!阿里内部使用的127页k8s实战手册,不能再详细了!

2022 年 12 月 8 号Kubernetes 发布了1.26新版本&#xff0c;此版本中有两个突出的新功能&#xff0c;它们有可能改变用户与 Kubernetes 交互的方式&#xff0c;此外&#xff0c;其他功能将使集群管理员的工作更轻松。 说起来&#xff0c;Kubernetes从诞生初期就广泛受到业界的…

英国访问学者类型签证详解

近年来&#xff0c;英国作为世界上优秀的学术研究中心之一&#xff0c;吸引了众多国际学者的目光。为了促进国际学术交流&#xff0c;英国设立了多种类型的访问学者签证&#xff0c;以满足不同学者的需求。在本文中&#xff0c;我们将深入探讨英国访问学者类型签证及其特点。 1…

金字塔原理小节

目录 第1章 为什么要用金字塔结构 一、归类分组&#xff0c;将思想组织成金字塔 二、奇妙的数字“7” 三、归类分组搭建金字塔 四、找出逻辑关系&#xff0c;抽象概括 五、自上而下表达&#xff0c;结论先行 第1章 为什么要用金字塔结构 如果受众希望通过阅读你的文章、听…

osg点云加载与渲染

目录 效果 laslib 关键代码 完整代码 效果 las点云读取使用了laslib这个库。 laslib 关键代码 {// 这里演示读取一个 .txt 点云文件const char* lasfile path.c_str();std::ifstream ifs;ifs.open(lasfile, std::ios::in | std::ios::binary);liblas::ReaderFactory f;libl…

MySQL数据库基础和操作

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; MYSQL数据库 &#x1f319;请不要相信胜利就像山坡上的蒲公英一…

C++ 开发【深入浅出】笔记02

多态 同一种类型的不同表现形式基类指针指向基类对象基类对象调用的成员函数&#xff0c;基类指针指向派生类对象则调用派生类得成员函数&#xff0c;这种现象就称为多态构成多态的条件 继承关系基类多态函数必须声明为虚函数&#xff08;virtual&#xff09;派生类必须覆盖&am…

【原创课设】java+swing+mysql药店管理系统设计与实现

摘要&#xff1a; 药店管理系统对于药店运营具有重大的意义。首先&#xff0c;它可以提高药店的运营效率&#xff0c;减少人工操作成本&#xff0c;通过信息化的管理方式&#xff0c;可以提高药店的服务质量和管理水平&#xff0c;增强药店的市场竞争力。用户可以登录系统直接…

Spring Boot (三)

1、热部署 热部署可以替我们节省大把花在重启项目本身上的时间。热部署原理上&#xff0c;一个springboot项目在运行时实际上是分两个过程进行的&#xff0c;根据加载的东西不同&#xff0c;划分成base类加载器与restart类加载器。 base类加载器&#xff1a;用来加载jar包中的类…

Unity中【UniTask异步流程】如何进行【步骤分段】、【步骤撤销】、【步骤跳转】、【取消异步任务】

一、UniTask和Task UniTask是Unity中的Task实现&#xff0c;Task是C#中实现异步操作的一个模块(类)。UniTask与Task有着同样的使用思路&#xff08;使用习惯&#xff0c;常用API等&#xff09;&#xff0c;可以说UniTask是借鉴Task而开发出来的。 二、需求的来源 以前有一个…

Android---内存泄漏的优化

内存泄漏是一个隐形炸弹&#xff0c;其本身并不会造成程序异常&#xff0c;但是随着量的增长会导致其他各种并发症&#xff1a;OOM&#xff0c;UI 卡顿等。 为什么要将 Activity 单独做预防&#xff1f; 因为 Activity 承担了与用户交互的职责&#xff0c;因此内部需要持有大…

3D渲染原理及朴素JavaScript实现【不使用WebGL】

在网页中显示图像和其他平面形状非常容易。 然而&#xff0c;当涉及到显示 3D 形状时&#xff0c;事情就变得不那么容易了&#xff0c;因为 3D 几何比 2D 几何更复杂。 为此&#xff0c;你可以使用专用技术和库&#xff0c;例如 WebGL 和 Three.js。 但是&#xff0c;如果你只…