HDLBits刷题笔记9:Circuits.Sequential Logic.Counters + Shift Registers

Counters

Four-bit binary counter

module top_module (input clk,input reset,      // Synchronous active-high resetoutput reg [3:0] q);always @(posedge clk) beginif(reset)q <= 0;elseq <= q + 1;end
endmodule

Decade counter

建立一个计数器,从0计数到9

module top_module (input clk,input reset,        // Synchronous active-high resetoutput reg [3:0] q);always @(posedge clk) beginif(reset)q <= 0;else if(q == 9)q <= 0;elseq <= q + 1;end
endmodule

Decade counter again

建立一个计数器,从1计数到10

module top_module (input clk,input reset,output reg [3:0] q);always @(posedge clk) beginif(reset)q <= 1;else if(q == 10)q <= 1;elseq <= q + 1; end
endmodule

Slow decade counter

建立一个计数器,从0计数到9,带使能

module top_module (input clk,input slowena,input reset,output reg [3:0] q);always @(posedge clk) beginif(reset)q <= 0;else if(slowena) beginif(q == 9)q <= 0;elseq <= q + 1;endend
endmodule

Counter 1-12

提供一个4bit的计数器,接口如下:

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

用这个模块实现一个计数器,从1计数到12,并输出上面模块的enable、load、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
); //assign c_enable = enable;assign c_load = reset | (Q == 12 & enable);assign c_d = 4'h1;count4 the_counter (clk, c_enable, c_load, c_d, Q);
endmodule

Counter 1000

提供一个BCD计数器模块,接口如下

module bcdcount (input clk,input reset,input enable,output reg [3:0] Q
);

输入1000hz的时钟,使用该模块输出1hz信号,保证每秒该信号只有一个时钟周期高电平,并输出每个BCD计数器的使能

module top_module (input clk,input reset,output OneHertz,output [2:0] c_enable
); //wire [3:0] bcd0, bcd1, bcd2;assign c_enable[0] = 1'b1;assign c_enable[1] = bcd0 == 9;assign c_enable[2] = c_enable[1] & bcd1 == 9;bcdcount counter0 (clk, reset, c_enable[0], bcd0);bcdcount counter1 (clk, reset, c_enable[1], bcd1);bcdcount counter2 (clk, reset, c_enable[2], bcd2);assign OneHertz = c_enable[2] & bcd2 == 9;
endmodule

4-digit decimal counter

建立一个四位数的bcd计数器,并输出十位、百位、千位的使能

module top_module (input clk,input reset,   // Synchronous active-high resetoutput [3:1] ena,output [15:0] q);assign ena[1] = q[3:0] == 9;assign ena[2] = ena[1] & q[7:4] == 9;assign ena[3] = ena[2] & q[11:8] == 9;bcd_counter u0(clk, reset, 1'b1, q[3:0]);bcd_counter u1(clk, reset, ena[1], q[7:4]);bcd_counter u2(clk, reset, ena[2], q[11:8]);bcd_counter u3(clk, reset, ena[3], q[15:12]);
endmodulemodule bcd_counter(input clk,input reset,input ena,output reg [3:0] q
);always @(posedge clk) beginif(reset)q <= 0;else if(ena) beginif(q == 9)q <= 0;elseq <= q + 1;endend
endmodule

12-hour-clock

建立一个12小时制的时钟,带一个am/pm指示器,复位将时钟设定为12:00AM,指示器pm为0时,表示AM,为1时,表示PM。

注意:11点过后为12:00,而不是0:00

下面波形展示了从11:59:59AM翻转到12:00:00PM和复位的波形。

在这里插入图片描述

解题思路:

秒、分的计时范围为00-59,用bcd计数器实现,个位数计数范围为0-9,直接用bcd计数器即可,十位数计数范围0-5,需要在溢出时用reset清零

时钟的计时范围为01-12,不太好用bcd计数器实现,所以单独写always解决

pm只需在11点跳转到12点时翻转即可

module top_module(input clk,input reset,input ena,output reg pm,output [7:0] hh,output [7:0] mm,output [7:0] ss); wire [1:0] h_ena, m_ena, s_ena;assign s_ena[0] = ena;assign s_ena[1] = s_ena[0] & ss[3:0] == 9;assign m_ena[0] = s_ena[1] & ss[7:4] == 5;assign m_ena[1] = m_ena[0] & mm[3:0] == 9;assign h_ena[0] = m_ena[1] & mm[7:4] == 5;assign h_ena[1] = h_ena[0] & (hh == 8'h09 || hh == 8'h12);bcd_counter s0(clk, reset, s_ena[0], ss[3:0]);bcd_counter s1(clk, reset | m_ena[0], s_ena[1], ss[7:4]);bcd_counter m0(clk, reset, m_ena[0], mm[3:0]);bcd_counter m1(clk, reset | h_ena[0], m_ena[1], mm[7:4]);// h0always @(posedge clk) beginif(reset)hh[3:0] <= 2;else if(h_ena[0]) beginif(hh == 8'h12)hh[3:0] <= 1;else if(hh == 8'h09)hh[3:0] <= 0;elsehh[3:0] <= hh[3:0] + 1;endend// h1always @(posedge clk) beginif(reset)hh[4] <= 1;else if(h_ena[1])hh[4] <= ~hh[4];end// pmalways @(posedge clk) beginif(reset)pm <= 0;else if(h_ena[0] && hh == 8'h11)pm <= ~pm;end
endmodulemodule bcd_counter(input clk,input reset,input ena,output reg [3:0] q
);always @(posedge clk) beginif(reset)q <= 0;else if(ena) beginif(q == 9)q <= 0;elseq <= q + 1;endend
endmodule

Shift Registers

4-bit shift register

建立一个4bit的移位寄存器,右移,带异步复位、load、ena

module top_module(input clk,input areset,  // async active-high reset to zeroinput load,input ena,input [3:0] data,output reg [3:0] q); always @(posedge clk, posedge areset) beginif(areset)q <= 0;else if(load)q <= data;else if(ena)q <= {1'b0, q[3:1]};end
endmodule

Left/right rotator

建立一个循环左移/右移寄存器,带load、移位使能,当ena为2'b01时右移,当ena为2'b10时左移,其他情况不移位

module top_module(input clk,input load,input [1:0] ena,input [99:0] data,output reg [99:0] q);always @(posedge clk) beginif(load)q <= data;else if(ena == 2'b01) // rightq <= {q[0], q[99:1]};else if(ena == 2'b10) // leftq <= {q[98:0], q[99]};end
endmodule

Left/right arithmetic shift by 1 or 8

建立一个64bit的算数移位寄存器,带load,该移位寄存器可以左移、右移1bit或8bit,算数右移时,左侧填充的是符号位,而不是0。左移时和逻辑左移没有区别,移位方向、移位多少是有amount决定的:

  • 2’b00: 左移1bit
  • 2’b01: 左移8bit
  • 2’b10: 右移1bit
  • 2’b11: 右移8bit
module top_module(input clk,input load,input ena,input [1:0] amount,input [63:0] data,output reg [63:0] q); always @(posedge clk) beginif(load)q <= data;else if(ena) begincase(amount)2'b00: q <= {q[62:0], 1'b0};2'b01: q <= {q[55:0], 8'h00};2'b10: q <= {q[63], q[63:1]};2'b11: q <= {{8{q[63]}}, q[63:8]};endcaseendend
endmodule

5-bit LFSR

LFSR: (linear feedback shift register),线性反馈移位寄存器,通常有几个异或门来产生移位寄存器的下一个状态。实现如下图所示的5bit位宽LFSR,其在5和3位置处添加了taps(tap即表示该寄存器D端和q[0]进行异或,tap位置从1开始):

在这里插入图片描述

module top_module(input clk,input reset,    // Active-high synchronous reset to 5'h1output reg [4:0] q
); always @(posedge clk) beginif(reset)q <= 5'h1;elseq <= {q[0], q[4], q[3] ^ q[0], q[2:1]};end
endmodule

3-bit LFSR

实现如下电路:

在这里插入图片描述

module top_module (input [2:0] SW,      // Rinput [1:0] KEY,     // L and clkoutput reg [2:0] LEDR);  // Qalways @(posedge KEY[0]) beginLEDR[0] <= KEY[1] ? SW[0] : LEDR[2];LEDR[1] <= KEY[1] ? SW[1] : LEDR[0];LEDR[2] <= KEY[1] ? SW[2] : (LEDR[1] ^ LEDR[2]);end
endmodule

32-bit LFSR

实现一个32bit的LFSR,在第32、22、2、1位置添加taps,参考5-bit LFSR题目

module top_module(input clk,input reset,    // Active-high synchronous reset to 32'h1output reg [31:0] q
); always @(posedge clk) beginif(reset)q <= 32'h1;elseq <= {q[0], q[31:23], q[0] ^ q[22], q[21:3], q[0] ^ q[2], q[0] ^ q[1]};end
endmodule

Shift register

实现如下电路:

在这里插入图片描述

module top_module (input clk,input resetn,   // synchronous resetinput in,output out);reg [3:0] taps;always @(posedge clk) beginif(~resetn)taps <= 0;elsetaps <= {in, taps[3:1]};endassign out = taps[0];
endmodule

Shift register

如下为n-bit的Shift Register:

在这里插入图片描述

编写一个模块实现上述电路,假设n=4,编写MUXDFF模块,在顶层实例化4个MUXDFF子模块,假设你要在DE2开发板上实现,端口对应如下:

  • R to SW
  • clk to KEY[0]
  • E to KEY[1]
  • L to KEY[2] and
  • w to KEY[3]
  • Q to LEDR
module top_module (input [3:0] SW,input [3:0] KEY,output [3:0] LEDR
); //MUXDFF u0(KEY[0], KEY[1], SW[0], KEY[2], LEDR[1], LEDR[0]);MUXDFF u1(KEY[0], KEY[1], SW[1], KEY[2], LEDR[2], LEDR[1]);MUXDFF u2(KEY[0], KEY[1], SW[2], KEY[2], LEDR[3], LEDR[2]);MUXDFF u3(KEY[0], KEY[1], SW[3], KEY[2], KEY[3], LEDR[3]);
endmodulemodule MUXDFF (input clk,input E,input R,input L,input W,output reg Q
);always @(posedge clk) beginQ <= L ? R : (E ? W : Q);end
endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】深度强化学习初学者指南

一、说明 GAN&#xff08;Generative Adversarial Networks&#xff09;是一种深度学习模型&#xff0c;它由两个神经网络组成&#xff1a;一个生成网络和一个判别网络。生成网络学习如何生成类似于给定数据集的新数据&#xff0c;而判别网络则学习如何区分生成网络生成的数据和…

vscode 插件系统的运行机制!

做vscode二次开发有一段时间了&#xff0c;平时都是任务比较重&#xff0c;最近有时间做下总结&#xff0c;详细的讲解下vscode 插件系统的运行机制&#xff0c;vscode做为最受欢迎的编辑器&#xff0c;有着庞大的插件市场。其插件系统确实很复杂&#xff0c;文章很长&#xff…

Maven基础概念

仓库 作用&#xff1a;用于存储资源&#xff0c;包含各种jar包 仓库分类 本地仓库远程仓库 2.1中央仓库 2.2私服&#xff08;用于解决下载速度慢&#xff0c;版权问题等&#xff09; 1.maven坐标 <groupId></groupId>当前MAVEN项目隶属组织名称 <artifactId…

nginx纳入skywalking调用链监控

nginx纳入skywalking调用链监控 一、说明二、nginx部署2.1 OpenResty介绍2.2 准备SkyWalking Nginx Agent2.3 docker方式部署OpenResty2.3.1 修改配置文件2.3.2 启动OpenResty容器 2.4 验证 一、说明 服务器中已部署好skywalking&#xff0c;并将tomcat纳入skywalking监控(tom…

Unity包体积优化实践

目录 简述优化前优化中assets目录资源ab包动态下发资源大小优化dll大小优化场景模型动态下载和加载优化assets目录后大小 lib目录优化目标架构裁剪代码优化代码和引用 其他优化项Shader优化Release模式编译选项 优化后 简述 在移动端App混合Unity开发的项目中&#xff0c;Unit…

MATLAB图像处理实现高光抑制

下面是的几个用MATLAB进行高光抑制的处理例子。 1. 基于最大值滤波的亮光抑制方法 原理是用某像素周围一定大小的邻域中的最大值减去该像素值&#xff0c;可达到亮光抑制的效果。在MATLAB中&#xff0c;可以使用mat2gray函数将图像归一化后&#xff0c;再使用imextendedmax函…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册10

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

目标检测的评估指标

Precision(精确率/查准率)&#xff1a;是指在所有被预测为正的样本中&#xff0c;确实是正样本的占比。当Precision越大时&#xff0c;FP越小&#xff0c;此时将其他类别预测为本类别的个数也就越少&#xff0c;可以理解为预测出的正例纯度越高。Precision越高&#xff0c;误检…

ORA-01122 ORA-01200故障处理---惜分飞

由于某种原因客户的数据库启动报ORA-01122 ORA-01200错误 让客户把system01.dbf文件发给我进行分析,发现system01.dbf文件大于32G(在8k的blocksize库中,默认情况system01.dbf文件不会超过32G),这个明显异常 检测坏块情况发现4096000之后的block全部为全0块 通过bbed分析文…

uniapp-设置全屏

需求&#xff1a;就是想要小程序不受限制&#xff0c;可以把图片或者文字全屏的展示&#xff0c;如下图 vue代码如下&#xff1a; <template><view class"content"><image class"image-bg" src"/static/logo.png" /><imag…

学生成绩管理系统的设计与实现(论文+源码)_kaic

摘要 该系统在开发过程中&#xff0c;要注意使其与业务流程的运作相一致&#xff0c;力争使该系统全面&#xff0c;通用&#xff0c;以便该系统不仅适用于教育机构。在开发方法的选择上&#xff0c;选择生命周期方法和原型方法&#xff0c;并按照四个主要阶段的系统研究&#x…

Jvm jmx_exporter Prometheus dubbo Grafana 重点看端口要对应上 单独进程和程序进程内jmx_exporter

目录 JMX Exporter 的两种用法 启动独立进程 jmx_prometheus_httpserver-0.18.0.jar 方式 下载 jmx_exporter 找地方随便一放 创建配置文件 config_jmx_exporter.yaml 增加 启动 jvm 配置 一定要是jvm参数 可别意外写成程序参数 启动jmx_exporter Prometheus yml 配置 …