HDLBits(八)学习笔记——Counters(计数器)

2023-10-07 03:40

本文主要是介绍HDLBits(八)学习笔记——Counters(计数器),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Count15
  • Count10
  • Count 1to10
  • Countslow
  • Count 1-12
  • Count 1000
  • Count bcd
  • Count clock

Count15

构建一个 4 位二进制计数器,该计数器的计数范围为 0 到 15(包括 15),周期为 16。复位输入是同步的,应将计数器复位至0
在这里插入图片描述
改题目两个注意点:

  • 同步复位
  • 图片可知低电平有效
module top_module (input clk,input reset,      // Synchronous active-high resetoutput [3:0] q
);always @ (posedge clk )beginif(reset)beginq <= 0;endelse q <= q+4'b1;end
endmodule

Count10

构建一个从 0 到 9(含)计数的十进制计数器,周期为 10。复位输入是同步的,应将计数器复位至0。
在这里插入图片描述
此题与上题的注意点相同,不同主要在于q为4位,如果不进行清零操作,那么就会一直计数到15,因此要想周期为10,就要计数到9的时候清零。

module top_module (input clk,input reset,        // Synchronous active-high resetoutput [3:0] q);always @ (posedge clk )beginif(reset)beginq <= 0;endelse if (q == 4'd9)begin //q >= 4'd9也可q <= 0;endelse beginq <= q+4'b1;endendendmodule

Count 1to10

制作一个十进制计数器,包括 1 到 10。复位输入是同步的,应将计数器复位至1
在这里插入图片描述
此题的区别在于计数器的初值从1开始。

module top_module (input clk,input reset,output [3:0] q
);always @ (posedge clk )beginif(reset)beginq <= 4'b1;endelse if(q >= 4'd10)begin q <= 4'b1;endelse    q <= q+4'b1;end
endmodule

Countslow

构建一个从 0 到 9 计数的十进制计数器,周期为 10复位输入是同步的,应将计数器复位至0。我们希望能够暂停计数器,而不是总是在每个时钟周期递增,因此 slowena 输入指示计数器何时应该递增。
在这里插入图片描述
此题相当于加入了使能信号

module top_module (input clk,input slowena,input reset,output [3:0] q
);always @ (posedge clk)beginif(reset)q <= 4'b0;else if(slowena)beginif(q == 4'd9)q <= 4'b0;elseq <= q + 4'b1; endelseq <= q;end
endmodule

Count 1-12

设计具有以下输入和输出的 1-12 计数器

  • 重置同步****高电平有效复位,强制计数器为 1
  • enable信号设置为高电平以使计数器运行
  • 时钟正边沿触发时钟输入 Q[3:0]计数器的输出
  • c_enable、c_load、c_d[3:0]输出分别是进入内部计数器使能、负载和d输入的信号。它们的目的是允许检查这些信号的正确性。

您有以下可用的组件:4 位二进制计数器 (count4)
如下,它具有使能enable和同步并行加载输入load(load的优先级高于enable)。count4 模块可在电路中实例化它。

module count4(input clk,input enable,input load,input [3:0] d,output reg [3:0] Q
);

代码如下:

module top_module (input clk,input reset,input enable,output [3:0] Q,output c_enable,output c_load,output [3:0] c_d
); count4 the_counter (clk, c_enable, c_load, c_d, Q );assign c_enable = enable;assign c_load = reset | ((Q == 4'd12) && (enable == 1'b1));assign c_d = c_load ? 4'd1 : 4'd0;endmodule

Count 1000

从 1000 Hz 时钟派生一个 1 Hz 信号(OneHertz)(计数到999),该信号可用于驱动一组小时/分钟/秒计数器的 Enable 信号,以创建数字挂钟。
由于我们希望时钟每秒计数一次,因此必须每秒精确地置位一个周期的一赫兹信号。使用模 10 (BCD) 计数器和尽可能少的其他门构建分频器。同时输出来自您使用的每个BCD计数器的使能信号(c_enable[0]表示最快的计数器,c_enable[2]表示最慢的计数器)。

为您提供以下BCD计数器。启用必须为高电平,计数器才能运行。复位是同步的,并设置为高电平以强制计数器为零。电路中的所有计数器必须直接使用相同的 1000 Hz 信号。

module bcdcount (input clk,input reset,input enable,output reg [3:0] Q
);
module top_module (input clk,input reset,output OneHertz,output [2:0] c_enable
); wire[3:0]	one;wire[3:0]	ten;wire[3:0]	hundred;assign c_enable = {one == 4'd9 && ten == 4'd9, one == 4'd9, 1'b1};assign OneHertz = (one == 4'd9 && ten == 4'd9 && hundred == 4'd9);bcdcount u_counter0 (clk, reset, c_enable[0],one );bcdcount u_counter1 (clk, reset, c_enable[1],ten);bcdcount u_counter2 (clk, reset, c_enable[2], hundred);endmodule

Count bcd

构建一个 4 位数的 BCD(二进制编码的十进制)计数器。每个十进制数字使用4位进行编码:q[3:0]是1位,q[7:4]是十位,依此类推。对于数字 [3:1],还要输出一个使能信号,指示上三位数字中的每一位何时应递增。在这里插入图片描述
建议将if else的所有情况的输出都给出,避免锁存器的生成

module top_module(input clk,input reset,   // Synchronous active-high resetoutput [3:1] ena,output [15:0] q
);reg [3:0] ones;reg [3:0] tens;reg [3:0] hundreds;reg [3:0] thousands;//个位计数器always @ (posedge clk)beginif(reset)ones <= 4'b0;else if(ones == 4'd9)ones <= 4'b0;else ones <= ones + 4'b1;end//十位计数器
always @ (posedge clk)beginif(reset)tens <= 4'b0;else if(ones == 4'd9 && tens == 4'd9  )tens <= 4'b0;else if(ones == 4'd9)  tens <= tens + 4'b1;elsetens <= tens;end//百位计数器
always @ (posedge clk)beginif(reset)hundreds <= 4'b0;else if(ones == 4'd9 && tens == 4'd9  && hundreds == 4'd9  )hundreds <= 4'b0;else if(tens == 4'd9 && ones == 4'd9)hundreds <= hundreds + 4'b1;elsehundreds <= hundreds ;end//千位计数器
always @ (posedge clk)beginif(reset)thousands <= 4'b0;else if(ones == 4'd9&& tens == 4'd9  && hundreds == 4'd9 && thousands == 4'd9 )thousands <= 4'b0;else if(hundreds == 4'd9 && tens == 4'd9 && ones == 4'd9)thousands <= thousands + 4'b1;elsethousands <= thousands;end
//输出q为四个四位的个位,十位,百位,千位拼接,且题目给出是从低位到高位  
assign q = {thousands,hundreds,tens,ones};
//使能信号有效assign ena[1] = (ones == 4'd9  ) ? 1'b1 : 1'b0;assign ena[2] = ((ones == 4'd9) && (tens == 4'd9 ) ) ? 1'b1 : 1'b0;assign ena[3] = ((ones == 4'd9) && (tens == 4'd9) &&( hundreds == 4'd9  )) ? 1'b1 : 1'b0;endmodule

Count clock

创建一组适合用作 12 小时时钟使用的的计数器(带 am/pm 指示器)。您的计数器由clk驱动,时钟clk每增加一次,(即每增加秒一次),就会在ena上发出脉冲(1)。

复位信号可将时钟重置为 中午12时(12:00 AM)。上午pm 为 0(AM),下午pm 为 1。hh、mm 和 ss 是两个 BCD(二进制编码十进制)数字,分别表示小时 (01-12)、分钟 (00-59) 和秒 (00-59)。

复位信号的优先级高于ena,即使ena无效,也可能发生复位。

以下时序图显示了从AM 11:59:59 到PM 12:00:00 的翻转行为以及同步复位和使能行为。
在这里插入图片描述
其中 ss mm hh 均包含个位和十位,因此对于这三个信号我们要设计六个计数器。

module top_module(input clk,input reset,input ena,output pm,output [7:0] hh,output [7:0] mm,output [7:0] ss); reg pm_temp;reg [3:0] ss_ones; // SS个位的暂存reg [3:0] ss_tens; // SS十位的暂存reg [3:0] mm_ones; // mm个位的暂存reg [3:0] mm_tens; // mm十位的暂存reg [3:0] hh_ones; // hh个位的暂存reg [3:0] hh_tens; // hh十位的暂存wire		add_ss_ones;wire		end_ss_ones;wire		add_ss_tens;wire		end_ss_tens;wire		add_mm_ones;wire		end_mm_ones;wire		add_mm_tens;wire		end_mm_tens;wire		add_hh_ones;wire		end_hh_ones_0;wire		end_hh_ones_1;wire		add_hh_tens;wire		end_hh_tens_0;wire		end_hh_tens_1;wire		pm_ding;assign add_ss_ones = ena;assign end_ss_ones = add_ss_ones && (ss_ones == 4'd9);always @(posedge clk)beginif(reset)beginss_ones <= 4'b0;endelse if(add_ss_ones)beginif(end_ss_ones)beginss_ones <= 4'b0;endelse beginss_ones <= ss_ones + 4'b1;endendelsess_ones <= ss_ones;endassign add_ss_tens = end_ss_ones;assign end_ss_tens = add_ss_tens && (ss_tens == 4'd5);always @(posedge clk)beginif(reset)beginss_tens <= 4'b0;endelse if(add_ss_tens)beginif(end_ss_tens)beginss_tens <= 4'b0;endelse beginss_tens <= ss_tens + 4'b1;endendelse ss_tens <= ss_tens;endassign add_mm_ones = end_ss_tens;assign end_mm_ones = add_mm_ones && (mm_ones == 4'd9);always @(posedge clk)beginif(reset)beginmm_ones <= 4'b0;endelse if(add_mm_ones)beginif(end_mm_ones)beginmm_ones <= 4'b0;endelse beginmm_ones <= mm_ones + 4'b1;end    endelse mm_ones <= mm_ones;endassign add_mm_tens = end_mm_ones;assign end_mm_tens = add_mm_tens && (mm_tens == 4'd5);always @(posedge clk)beginif(reset)beginmm_tens <= 4'b0;endelse if(add_mm_tens)beginif(end_mm_tens)beginmm_tens <= 4'b0;endelse beginmm_tens <= mm_tens + 4'b1;endendelsemm_tens <= mm_tens;endassign add_hh_ones = end_mm_tens;assign end_hh_ones_0 = add_hh_ones && (hh_ones == 4'd9);assign end_hh_ones_1 = add_hh_ones && ((hh_ones == 4'd2) && (hh_tens == 4'd1));always @(posedge clk)beginif(reset)beginhh_ones <= 4'd2;endelse if(add_hh_ones)beginif(end_hh_ones_0)beginhh_ones <= 4'b0;endelse if(end_hh_ones_1)beginhh_ones <= 4'b1;endelse beginhh_ones <= hh_ones+4'b1;endendelsehh_ones <= hh_ones ;  endassign add_hh_tens = end_mm_tens;assign end_hh_tens_0 = add_hh_tens && end_hh_ones_1;assign end_hh_tens_1 = add_hh_tens && end_hh_ones_0;always @(posedge clk)beginif(reset)beginhh_tens <= 4'b1;endelse if(add_hh_tens)beginif(end_hh_tens_0)beginhh_tens <= 4'b0;endelse if(end_hh_tens_1)beginhh_tens <= hh_tens + 4'b1;endendelsehh_tens <= hh_tens ;endalways@(posedge clk)beginif(reset)beginpm_temp <= 1'b0;endelse if(pm_ding)beginpm_temp <= ~pm_temp;endelsepm_temp <= pm_temp ;endassign pm_ding = hh_tens == 4'd1 && hh_ones == 4'd1 && end_mm_tens;assign ss = {ss_tens, ss_ones};assign mm = {mm_tens, mm_ones};assign hh = {hh_tens, hh_ones};assign pm = pm_temp;endmodule

这篇关于HDLBits(八)学习笔记——Counters(计数器)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/155799

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件