【FPGA】Verilog:时序电路设计 | 自循环移位寄存器 | 环形计数 | 扭环计数 | 约翰逊计数器

前言:本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载

 

示例:计数器

 ​​

  • 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片 
  • 配置方式:USB-JTAG/SPI Flash
  • 高达100MHz 的内部时钟速度 
  • 存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A)
  • 通用IO:Switch :x8LED:x16Button:x5DIP:x8   通用扩展IO:32pin
  • 音视频/显示: 7段数码管:x8 VGA视频输出接口 Audio音频接口 
  • 通信接口:UART:USB转UART   Bluetooth:蓝牙模块 
  • 模拟接口: DAC:8-bit分辨率   XADC:2路12bit 1Msps ADC

目录

Ⅰ. 前置知识

0x00 利用D触发器构造环形计数器(自循环移位寄存器)

0x01  扭环形计数器(约翰逊计数器)

 Ⅱ. Verilog实现:

0x00 环形计数器

0x01 扭环计数器


Ⅰ. 前置知识

0x00 利用D触发器构造环形计数器(自循环移位寄存器)

下图为利用D触发器构造的计数器电路,如果初始时将A、B、C、D置为1000,CP接单脉冲计数,则计数器可以实现one-hot计数。

环形计数器原理

参考程序如下,

module circle_counter(rst_n, clk, cnt ); 
parameter CNT_SIZE = 8;
input rst_n;
input clk;
output [CNT_SIZE-1 : 0] cnt;
reg [CNT_SIZE-1 : 0] cnt;
always@(posedge clk)if(!rst_n)cnt <= 8'b0000_0001;  //初始值elsecnt <= {cnt[0],cnt[CNT_SIZE-1 : 1]};//注意是循环移位,而非简单的移位//cnt <= cnt>>1;
Endmodule

在下图中,用74LS10的三输入端与非门修改上述电路,使得初始值0000启动时,下一个CP脉冲时计数器状态可以自行跳至1000。

请自行总结自启动的体会。(注意:74LS10有一个门起非门作用)

  自启式环形计数器

参考程序如下:

module circle_counter(rst_n, clk, cnt ); 
parameter CNT_SIZE = 8;
input rst_n;
input clk;
output [CNT_SIZE-1 : 0] cnt;
reg [CNT_SIZE-1 : 0] cnt;
always@(posedge clk)if(!rst_n)cnt <= 8'b0000_0001;  //初始值elsecnt <= {cnt[0],cnt[CNT_SIZE-1 : 1]};//注意是循环移位,而非简单的移位//cnt <= cnt>>1;
Endmodule

上面的代码仅仅是简单的实现,模拟环形计数器的工作方式,并没有过多的考虑自启动的问题。

对于环形计数器,功能上又被称作one-hot(独热码)计数器,优点是速度快,且每次只有两个bit发生跳变,而且不需外加译码电路,可以直接以各个触发器输出端的1状态表示计数。

主要缺点是没有有效利用电路的状态,对于n bit,有2n-n个状态没有利用。应用中,在状态机的状态编码时,经常用到此类计数器,如4bit one-hot计数器的计数序列即为:0001-0010-0100-1000循环。也因此,大多情况下这种计数器不被称作计数器,而是状态编码的一种。

若要设计可以自启动(自动从无效状态转移到有效状态,进入有效循环)的电路,可参考附加实验中状态机设计的实验内容,通过修改状态逻辑实现,本质是改变无效状态的次态,使其为有效状态。

0x01  扭环形计数器(约翰逊计数器)

基本原理:设置一个初始状态,将最高位取反,作为最低位的输入,通过移位即可得到。

如图:

  扭环形计数器原理示意

参考代码:

module john_counter(rst_n, clk, cnt );
parameter CNT_SIZE = 4;
input rst_n;
input clk;
output [CNT_SIZE-1 : 0] cnt;
reg [CNT_SIZE-1 : 0] cnt;
always@(posedge clk)if(!rst_n)cnt <= 4'b0000 ;  //初始值elsecnt <= {~cnt[0],cnt[CNT_SIZE-1 : 1]}; //注意是循环移位,而非简单的移位
endmodule

 Ⅱ. Verilog实现:

0x00 环形计数器

设计代码:

module circle_counter(rst_n, clk, cnt ); 
parameter CNT_SIZE = 8;
input rst_n;
input clk;
output [CNT_SIZE-1 : 0] cnt;
reg [CNT_SIZE-1 : 0] cnt;
always@(posedge clk)if(!rst_n)cnt <= 8'b0000_0001; elsecnt <= {cnt[0],cnt[CNT_SIZE-1 : 1]};
endmodule

仿真代码:

module test();
reg rst_n,clk;
wire [7:0]cnt;
circle_counter uut(.rst_n(rst_n),. clk(clk),. cnt(cnt));
initial begin clk = 'b0;rst_n = 'b0;# 10rst_n = 'b1;# 2000$finish;endalways #5 clk = ~clk;
endmodule

仿真波形图:

0x01 扭环计数器

 设计文件:

module john_counter(rst_n, clk, cnt );
parameter CNT_SIZE = 4;
input rst_n;
input clk;
output [CNT_SIZE-1 : 0] cnt;
reg [CNT_SIZE-1 : 0] cnt;
always@(posedge clk)if(!rst_n)cnt <= 4'b0000 ; elsecnt <= {~cnt[0],cnt[CNT_SIZE-1 : 1]}; endmodule

仿真文件:

module tb_john_counter();reg clk, rst_n;wire [3:0] cnt;
john_counter uut(.rst_n(rst_n),. clk(clk),. cnt(cnt));initial begin clk = 'b0;rst_n = 'b0;# 10rst_n = 'b1;# 2000$finish;endalways #5 clk = ~clk;
Endmodule

仿真波形图:

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

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

相关文章

将当前conda环境导出为yaml文件

conda环境的转移和复制 conda导出已有环境&#xff0c;环境会被保存在environment.yaml文件中。 conda env export > environment.yaml 当我们想再次创建该环境&#xff0c;或根据别人提供的.yaml文件复现环境时&#xff0c;就可以通过下面的命令来复现安装环境了。 conda …

【Docker】子系统与其相关名词的界定、Control Groups等详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

tcp、udp调试工具

NetAssist(网络调试助手) 下载地址&#xff1a;http://www.cmsoft.cn/resource/102.html tcp-server代码 # codingutf-8 # 多线程TCP服务器import socket import threadingbind_ip "192.168.137.1" # 监听的IP 地址 bind_port 5100 # 监听的端口# 建立一个socke…

用OpenCV进行OCR字符分割

1. 引言 本文重点介绍如何利用传统的图像处理的方法来进行OCR字符切分&#xff0c;进而可以用分割后的单个字符做相应的后续任务&#xff0c;虽然现在计算机视觉依然是卷积神经网络的天下&#xff0c;但是对于一些相对简单的落地场景传统方案还是很有效的。 闲话少说&#xff…

c#学习笔记

目录 1.语句块2.Write和WriteLine的区别&#xff1a;3.params4.托管代码和非托管代码5.DllImport的使用&#xff1a;6.WriteLine、ReadLine和ReadKey&#xff1a;7.C#中访问修饰符8.类型的实例化9.成员可以分为两种&#xff1a;数据成员和函数成员10.枚举enum和结构struct的区别…

Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型

Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型 VScode&#xff08;Visual Studio Code&#xff09; 安装模型必要插件VScode 预览自定义关节&#xff08;articulations&#xff09;动作VScode 导入 GLB 格式模型VScode 导出 GLB 格式模型Cesium 在线示例…

内网穿透技术

文章目录 前言1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 转载自内…

SpringBoot3.0整合RocketMQ时出现未能加载bean文件

SpringBoot3.0整合RocketMQ时出现未能加载bean文件 问题 APPLICATION FAILED TO START Description: Field rocketMQTemplate in com.spt.message.service.MqProducerService required a bean of type ‘org.apache.rocketmq.spring.core.RocketMQTemplate’ that could not …

STM32F4 点亮灯泡【顺序点亮、按键点亮】

一、顺序点亮灯泡 ①初始化 在user.c文件中&#xff0c;我们需要对LED进行初始化设置。 在函数LED_GPIO_Config中&#xff0c;可以修改代码如下&#xff1a; /*********************************************************************** LED初始化 备注 LED 接在GPC14引脚上…

设计模式第18讲——中介者模式

目录 一、什么是中介者模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构 5.1 抽象中介者&#xff08;Mediator&#xff09;——LogisticsCenter 5.2 抽象同事类&#xff08;Colleague&#xff09;——Participant 5…

搭建SpringBoot项目 详细教程

一、搭建SpringBoot项目 这个项目&#xff0c;可以作为种子项目&#xff0c;我打算把它放置Gitee上。包含大部分web开发的相关功能&#xff0c;后期所有的Spring Boot项目都可以用这个项目&#xff0c;简单修改一下配置&#xff0c;就可以快速开发了。 选择Spring initializr…

uniapp 开发小程序之实现不同身份展示不同的 tabbar(底部导航栏),附带相关问题解答

效果展示&#xff1a; 引言 在开发过程中逐渐意识到uniapp原生的tabbar可能不能满足开发要求&#xff0c;通过浏览博客才选择使用uView的Tabbar 底部导航栏来实现&#xff0c;我选择用的是2X版本 安装 我是使用Hbuilder插件的方式引入的组件库&#xff0c;安装配置可以看这篇…