HDLBITS笔记28:计数器综合题(较难)(包括1-12计数器、1000hz信号计数器、4位BCD计数器计数时钟(12-hour clock))

本文主要是介绍HDLBITS笔记28:计数器综合题(较难)(包括1-12计数器、1000hz信号计数器、4位BCD计数器计数时钟(12-hour clock)),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

题目1:counter 1-12

题目2:counter 1000

题目3:4-digit decimal counter(4位BCD计数器)

题目4:计数时钟(12-hour clock)


题目1:counter 1-12

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

  • Reset同步高电平有效复位,强制计数器为 1
  • Enable 设置为高电平以使计数器运行
  • Clk正边沿触发时钟输入
  • Q[3:0]计数器的输出
  • c_enable、c_load、c_d[3:0]控制信号进入提供的4位计数器,因此可以验证正确的操作。

您有以下可用的组件:

  • 下面的 4 位二进制计数器 (count4),它具有使能和同步并行加载输入(负载的优先级高于使能)。count4 模块已提供给您。在电路中实例化它。
  • 逻辑门
module count4(input clk,input enable,input load,input [3:0] d,output reg [3:0] Q
);

c_enablec_loadc_d输出分别是进入内部计数器使负载d输入的信号。它们的目的是允许检查这些信号的正确性。

由题意可得代码如下:例化使用名称关联法。

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(clk), .(c_enable), .c_load, .c_d /*, ... */ );assign c_enable = enable;assign c_load = reset | ((Q == 4'd12) && (enable == 1'b1));assign c_d = c_load ? 4'b1:4'b0;count4 u1(.clk(clk),.enable(c_enable),.load(c_load),.d(c_d),.Q(Q));endmodule

仿真部分如下:

题目2:counter 1000

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

为您提供以下BCD计数器。Enable必须为高电平,计数器才能运行。Reset是同步的,并设置为高电平以强制计数器为零。电路中的所有计数器必须直接使用相同的 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
); 

代码编写如下:

module top_module (input clk,input reset,output OneHertz,output [2:0] c_enable
); //wire [3:0] one,ten,hundred;assign c_enable = {one == 4'd9 && ten == 4'd9,one == 4'd9,1'd1};assign OneHertz = {one == 4'd9 && ten == 4'd9 && hundred == 4'd9};bcdcount counter0 (clk, reset, c_enable[0],one);bcdcount counter1 (clk, reset, c_enable[1],ten);bcdcount counter2 (clk, reset, c_enable[2],hundred);endmodule

仿真结果如下:

 题目3:4-digit decimal counter(4位BCD计数器)

构建一个 4 位数的 BCD(二进制编码的十进制)计数器。每个十进制数字使用4位进行编码:q[3:0]是1位,q[7:4]是十位,依此类推。对于数字 [3:1],还要输出一个使能信号,指示上三位数字中的每一位何时应递增。

您可能希望实例化或修改一些一位数的十计数器。

模块声明

module top_module (input clk,input reset,   // Synchronous active-high resetoutput [3:1] ena,output [15:0] q);

代码编写如下:其中one、ten、hundred、thousand分别表示从最低位到最高位。

module top_module (input clk,input reset,   // Synchronous active-high resetoutput [3:1] ena,output [15:0] q);reg [3:0] one,ten,hundred,thousand;always @(posedge clk)beginif(reset || (one == 4'd9))one <= 4'b0;elseone <= one +1'b1;endalways @(posedge clk)beginif(reset || ((ten == 4'd9) && (one == 4'd9)))ten <= 4'b0;else if(one == 4'd9)ten <= ten +1'b1;endalways @(posedge clk)beginif(reset || ((ten == 4'd9) &&( one == 4'd9) && (hundred == 4'd9)))hundred <= 4'b0;else if((ten == 4'd9) &&( one == 4'd9))hundred <= hundred +1'b1;endalways @(posedge clk)beginif(reset || ((ten == 4'd9) &&( one == 4'd9 )&& (hundred == 4'd9) &&( thousand == 4'd9)))thousand <= 1'b0;else if((ten == 4'd9) &&( one == 4'd9 )&& (hundred == 4'd9))thousand <= thousand +1'b1;endassign q = {thousand,hundred,ten,one};assign ena[1] = (one == 4'd9) ? 1'b1:1'b0;assign ena[2] = ((one == 4'd9) && (ten == 4'd9)) ? 1'b1:1'b0;assign ena[3] = ((one == 4'd9) && (ten == 4'd9) && (hundred == 4'd9)) ? 1'b1:1'b0;endmodule

部分仿真结果如下:

题目4:计数时钟(12-hour clock)

创建一组适合用作 12 小时制的计数器(带 am/pm 指示器)。您的计数器由快速运行的clk计时,只要您的时钟应该增加(即每秒一次),就会在ena上发出脉冲。

Reset将时钟重置为 12:00 AM。pm 表示 AM 为 0,PM 为 1。hh、mm 和 ss 是两个 BCD(二进制编码十进制)数字,分别表示小时 (01-12)、分钟 (00-59) 和秒 (00-59)。Reset的优先级高于enable,即使未enable,也可能发生Reset

以下时序图显示了从上午 11:59:59 到中午 12:00:00 的翻转行为以及同步复位和使能行为。

模块声明

module top_module(input clk,input reset,input ena,output pm,output [7:0] hh,output [7:0] mm,output [7:0] ss); 

分析:

  • 制作的是一个12小时制的计数器,要求使用BCD计数器来实现
  • 要求有时分秒。
  • 有复位信号,且复位的优先级高于使能端,复位信号有效时能复位到12点,其中pm 表示 AM 为 0,PM 为 1。
  • 要求实现的时间是1点到12点。

代码:

//在顶层模块中实现例化
module top_module(input clk,input reset,input ena,output pm,output [7:0] hh,output [7:0] mm,output [7:0] ss); count60 u1(.clk(clk),.reset(reset),.en(ena),.cnt_out(ss));//秒count60 u2(.clk(clk),.reset(reset),.en(ena&(ss==8'h59)),.cnt_out(mm));//分count12 u3(.clk(clk),.reset(reset),.en(ena&(ss==8'h59)&(mm===8'h59)),.cnt_out(hh));//时reg pm1;always @(posedge clk)beginif(reset)pm1 <= 8'h0;else if((hh == 8'h11)&(ss == 8'h59)&(mm == 8'h59))pm1 <= ~pm1;else;endassign pm =pm1;
endmodule
//设计0-59的模60计数器
module count60(clk,reset,en,cnt_out);input clk,reset,en;output reg [7:0] cnt_out;always @(posedge clk)beginif(reset)cnt_out <= 8'h0;else if(en)if(cnt_out == 8'h59)begincnt_out <= 8'h0;endelse if(cnt_out[3:0] == 9)begincnt_out[3:0] <= 0;cnt_out[7:4] <= cnt_out[7:4] + 1;//bcd计数器实现的递增endelsecnt_out[3:0] <= cnt_out[3:0] + 1;end
endmodule
//设计模12的计数器
module count12(clk,en,reset,cnt_out);input clk,en,reset;output cnt_out;reg [7:0] cnt_out;always @(posedge clk)beginif(reset)cnt_out <= 8'h12;//题意要求复位有效时复位至12点else if(en)beginif(cnt_out == 8'h12)begincnt_out <= 1;endelse if(cnt_out[3:0] == 9)begincnt_out[3:0] <= 0;cnt_out[7:4] <= cnt_out[7:4] + 1;//bcd计数器实现的递增endelsebegincnt_out[3:0] <= cnt_out[3:0] + 1;endendend
endmodule

仿真结果如下:

 使用quartus ii画出逻辑图如下:

 count60(模60计数器)

 count2模12计数器:

 题目4 代码参考:HDLBits 系列(19) 12小时时钟的Verilog设计_李锐博恩的博客-CSDN博客

这篇关于HDLBITS笔记28:计数器综合题(较难)(包括1-12计数器、1000hz信号计数器、4位BCD计数器计数时钟(12-hour clock))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

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

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

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

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

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个