【IC设计】Verilog线性序列机点灯案例(二)(小梅哥课程)

文章目录

  • 该系列目录:
  • 设计目标
  • 设计思路
  • RTL 及 Testbench
  • 仿真结果
  • 存在的问题?
  • 改善后的代码
    • RTL代码
    • testbench代码
  • 仿真结果

案例和代码来自小梅哥课程,本人仅对知识点做做笔记,如有学习需要请支持官方正版。

该系列目录:

Verilog线性序列机点灯案例(一)

设计目标

我们的FPGA的时钟频率为50MHz,即每个周期20ns。
因此,在该时钟下时间和周期数的对应关系为:

持续时间对应周期数
0.25s12,500,000 cycles
0.5s25,000,000 cycles
0.75s37,500,000 cycles
1s50,000,000 cycles

我们的目标是让LED以**【亮0.25秒->灭0.5秒->亮0.75秒->灭1秒】**的规律,持续循环闪烁。

设计思路

在这里插入图片描述
为了完成这样的规律性闪烁,需要一个计数器,计数满2.5秒归零,即:当上升沿采样到125,000,000-1时,计数器归零。
然后,led灯根据当前计数器的数值,设置led的亮灭,图中已经标注了led跳变时的counter数值。下面直接上代码

RTL 及 Testbench

led_ctrl1.v 是RTL代码

module led_ctrl1(clk,rst_n,led_out
);input clk;input rst_n;output reg led_out;reg [26:0] counter;//第一个always负责counter计数器的逻辑always@(posedge clk or negedge rst_n) beginif(!rst_n) begincounter <= 0;end else if(counter == 125_000_000-1) begincounter <= 0;end else begincounter <= counter + 1;endend//第二个always负责led_out闪烁的逻辑//亮0.25s->灭0.5秒->亮0.75秒->灭1秒always@(posedge clk or negedge rst_n) beginif(!rst_n) beginled_out <= 0;end else if(counter == 0) beginled_out <= 1;end else if(counter == 12_500_000) beginled_out <= 0;end else if(counter == 37_500_000) beginled_out <= 1;end else if(counter == 75_000_000) beginled_out <= 0;end endendmodule

tb_led_ctrl1.v是testbench代码

`timescale 1ns / 1nsmodule tb_led_ctrl1();reg clk;reg rst_n;wire led_out;initial clk = 1;always #10 clk = ~clk;led_ctrl1 led_ctrl1_inst0(.clk(clk),.rst_n(rst_n),.led_out(led_out));initial beginrst_n = 0;#201;rst_n = 1;#250_000_000$stop;end
endmodule

仿真结果

从图中黄色marker标注下的时间间隔可以看出,仿真结果和预期目标一致。
在这里插入图片描述

存在的问题?

如果到此就结束了,那么案例(二)和(一)并没有多大区别。
实际上,按照刚才的实现方式可以完成功能,但存在如下问题:

  1. 仿真时间过长
    为了在实际上板时观察到led闪烁的效果,我们的闪烁都是秒级的,vivado仿真一秒时间几乎需要十几秒才能完成,能否减少仿真时间,不影响功能?
  2. 可读性较差
    在我们的代码中0.25s,0.75s这些时间尺度都是用具体的计数器的周期数来表示的,数字太大,不好理解,如何解决?

针对以上问题,观察我们的需求是让LED以**【亮0.25秒->灭0.5秒->亮0.75秒->灭1秒】**循环,那么最基本的单位可以视为0.25秒,我们可以使用两个计数器,第一个计数器计数到0.25秒(12500_000 - 1个cycles)时第二个计数器加1。按照这个思路,我们在设置led时只需要关注好第二个计数器即可,1亮,2、3灭,4、5、6亮,7、8、9、10灭,显然可读性是比0亮,12_500_000灭好多了。
此外,针对仿真时间过长的问题,我们可以在RTL模块中定义一个parameter时间单元,而在testbench仿真中重新缩小该时间单元1000倍,实际上板时只会烧录RTL模块,这样既节省了仿真时间,又不影响功能。
在这里插入图片描述

改善后的代码

RTL代码

module led_ctrl1(clk,rst_n,led_out
);input clk;input rst_n;output reg led_out;parameter MCNT = 12500_000 - 1;reg [26:0] counter0;always@(posedge clk or negedge rst_n) beginif(!rst_n)counter0 <= 0 ;else if(counter0 == MCNT)counter0 <= 0;elsecounter0 <= counter0 + 1'd1;endreg [3:0] counter1;always@(posedge clk or negedge rst_n) beginif(!rst_n)counter1 <= 0 ;else if(counter0 == MCNT) beginif(counter1 == 9)counter1 <= 0;elsecounter1 <= counter1 + 1'd1;endelsecounter1 <= counter1;endalways@(posedge clk or negedge rst_n)if(!rst_n)led_out <= 0;else begincase(counter1)0:led_out <= 1'd1;1:led_out <= 1'd0;2:led_out <= 1'd0;3:led_out <= 1'd1;4:led_out <= 1'd1;5:led_out <= 1'd1;6:led_out <= 1'd0;7:led_out <= 1'd0;8:led_out <= 1'd0;9:led_out <= 1'd0;default:led_out <= led_out;endcaseendendmodule

testbench代码

`timescale 1ns / 1nsmodule tb_led_ctrl1();reg clk;reg rst_n;wire led_out;initial clk = 1;always #10 clk = ~clk;led_ctrl1 led_ctrl1_inst0(.clk(clk),.rst_n(rst_n),.led_out(led_out));defparam led_ctrl1.MCNT = 12500 - 1; initial beginrst_n = 0;#201;rst_n = 1;#20_000_000;$stop;end
endmodule

仿真结果

在这里插入图片描述

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

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

相关文章

考研复习C语言进阶(4)

1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的方式有两个特点&#xff1a; 1. 空间开辟大小是固定的。 2. 数组在申明的时候&#…

OpenOFDM接收端信号处理流程

Overview — OpenOFDM 1.0 documentation 本篇文章为学习OpenOFDM之后的产出PPT&#xff0c;仅供学习参考。 ​​​​​​​

Gitlab部署及使用

1. 简介 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用 Git 作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。Gitlab是目前被广泛使用的基于 git 的开源代码管理平台&#xff0c;基于Ruby on Rails构建&#xff0c;主要针对软件开发过程中产生的代码…

华为配置中心AP内漫游实验

华为配置中心AP内漫游示例 组网图形 图1 配置中心AP内漫游组网图 配置流程组网需求配置思路数据规划配置注意事项操作步骤配置文件 配置流程 WLAN不同的特性和功能需要在不同类型的模板下进行配置和维护&#xff0c;这些模板统称为WLAN模板&#xff0c;如域管理模板、射频模…

基于单片机的自动售货机的设计

摘 要 自动售货机是近些年来兴起的一种通过FPGA或者单片机等硬件支持的智能设备。它广泛的应用于商场&#xff0c;公寓&#xff0c;火车汽车站等人流较密集且购物需求大的地方。自动售货机通过硬件支持&#xff0c;通过以编写好的程序自动出货自动找零&#xff0c;但货物一旦售…

docker 安装minio,详细图解

废话不多说&#xff0c;直接上干货 docker 安装minio 拉取镜像 docker pull minio/minio创建数据目录、配置目录 mkdir /opt/minio/data mkdir /opt/minio/config启动容器 docker run -p 9000:9000 -p 9090:9090 \--name minio \-d --restartalways \-e "MINIO_ACCESS_KE…

Flutter:构建美观应用的跨平台方案

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

笔记本电脑数据恢复:如何轻松地从笔记本电脑恢复文件

不小心从笔记本电脑中删除了一些重要文件&#xff1f;或者恶意软件和其他不可控因素是否导致您的文件消失&#xff1f;人们很容易认为这些文件已经永远消失&#xff0c;并且无法恢复。但这与事实相差甚远。通过遵循正确的数据恢复礼仪并使用良好的数据恢复工具&#xff0c;您可…

老电脑装什么系统流畅

对于一些老旧电脑来说&#xff0c;重装系统是提升电脑性能的最佳选择。那么&#xff0c;老电脑装什么系统流畅呢&#xff1f;推荐Windows 7系统&#xff0c;它对硬件的需求相对较低。配置较低的电脑运行Windows 7可以更好地利用系统资源&#xff0c;提高电脑的运行速度和响应能…

DFS(深度优先搜索)8种题型

&#x1f442; 如果当时2020&#xff08;不曾遗忘的符号&#xff09; - 许嵩/朱婷婷 - 单曲 - 网易云音乐 &#x1f442; 一个深爱的女孩 - 本兮 - 单曲 - 网易云音乐 半年前写了一半的博客.......&#xff08;2023/7/14&#xff09;&#xff0c;今天花6小时给它补充完毕.....…

sqllab第十七关通关笔记

知识点&#xff1a; 错误注入update更新语句 update 表名 set 字段‘输入’ where 字段名数据 通过admin admin进行输入发现是一个数据更新的语句 推测原始语句为update 表 set password‘’ where username 直接构造payload:passwdadminandexp(710) 发现有错误提示&#xf…

了解常用开发模型 -- 瀑布模型、螺旋模型、增量与迭代、敏捷开发

目录 瀑布模型 开发流程 开发特征 优缺点 适用场景 螺旋模型 开发流程 开发特征 优缺点 适用场景 增量与迭代开发 什么是增量开发&#xff1f;什么是迭代开发&#xff1f; 敏捷开发 什么是敏捷开发四原则&#xff08;敏捷宣言&#xff09;&#xff1f; 什么是 s…