当前位置: 首页 > news >正文

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

文章目录

  • 该系列目录:
  • 设计目标
  • 思路
  • 仿真结果
    • 时间点一:201ns
    • 时间点二:220ns
    • 时间点三:250,000,220ns
    • 时间点四:1,000,000,200ns
    • 时间点五:1,000,000,220ns
  • 总结:

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

该系列目录:

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

设计目标

让主频50MHz的FPGA每0.25s亮,0.75s灭,如图所示:
可以看到其中1s对应50,000,000个周期,即50MHz,每个周期20ns
50MHz时钟下度过的周期和时间对应关系如下:

周期数量对应时间
12,500,0000.25秒
50,000,0001秒
37,500,0000.75秒

在这里插入图片描述

思路

由于需要计数到50,000,000-1,那么我们计数器的位宽可以设置为26位,2^26=67,108,864,足够计数到50,000,000-1。

reg [25:0] count;

我们的核心目标其实是让led亮12,500,000个周期,然后灭37,500,000个周期,如此反复。
想象下现实中的秒表,从0开始计时,到59,再变为0,刚好是60秒,同理,我们的计数器也是从0开始计数,当上升沿检测到50,000,000-1时,说明已经经历了1秒,所以复位为0

Led灯按照0.5秒闪烁的代码如下,我们在这个基础上改一改
在这里插入图片描述

module led_ctrl0(clk,rst_n,led_out
);input clk;input rst_n;output reg led_out;reg [25:0] counter;//第一个always负责counter计数器always@(posedge clk or negedge rst_n) beginif(!rst_n) begincounter <= 0;end else if(counter == 50_000_000-1) begincounter <= 0 ;end else begincounter <= counter + 1'd1;endend//第二个always负责led_out亮灭always@(posedge clk or negedge rst_n) beginif(!rst_n) beginled_out <= 1'b0;end else if(counter == 0 ) beginled_out <= 1'd1;end else if(counter == 1250_0000) beginled_out <= 1'd0;endend
endmodule
`timescale 1ns / 1psmodule led_ctrl_tb();reg clk;reg rst_n;wire led;led_ctrl0 led_ctrl0_inst0(.clk(clk),.rst_n(rst_n),.led_out(led));initial clk = 1;always #10 clk = ~clk;initial beginrst_n = 0;#201rst_n = 1;#2000000000;$stop;endendmodule

仿真结果

我们把变量转换的几个时间点看一遍,请注意我截图中黄色的marker:

时间点一:201ns

在这里插入图片描述
201ns时rst_n低电平复位信号由0变成1,即在此之后复位信号就无效了。

时间点二:220ns

在这里插入图片描述
在220ns,
第一个always负责counter计数器,检测到counter为0,自增为1
第二个always负责led_out亮灭,检测到counter为0,令led为1
后面每次上升沿时检测到的counter的值就是led亮了多久

时间点三:250,000,220ns

在这里插入图片描述在250,000,220ns
第一个always负责counter计数器,检测到counter为12,500,000,还没到1秒对应的50,000,000-1,所以继续自增。
第二个always负责led_out亮灭,检测到counter为12,500,000,说明已经亮了0.25秒,所以直接灭掉。

时间点四:1,000,000,200ns

在这里插入图片描述
第一个always负责counter计数器,检测到counter到了50,000,000-1,所以counter归零。

第二个always负责led_out亮灭,counter为49999999,不是0,所以继续灭。

时间点五:1,000,000,220ns

在这里插入图片描述
第一个always负责counter计数器,检测到counter为0,自增为1
第二个always负责led_out亮灭,counter为0,所以点亮led

总结:

从时间点五这个图中可以看出counter计数器当检测到49999999时,实际上已经计数完1秒了,原因是上升沿检测的时候49999999已经持续了一个周期。
led从counter为0到counter为12,500,000刚好亮0.25秒,因为检测到0时实际上会立刻跳变为1,0时刻并不是一个周期,而12,500,000是完整地过了一个周期。然后从12,500,001到49999999,再加上0时刻刚好是0.75秒。所以功能是没问题的。

相关文章:

  • 【LAMMPS学习】二、LAMMPS安装(1)Linux安装
  • 【web前端】<meta>标签
  • 多线程-初阶
  • 13 秒插入 30 万条数据,这才是 Java 批量插入正确的姿势!
  • PVE强制关闭虚拟机
  • 通过日志恢复sql server数据库
  • 十八、软考-系统架构设计师笔记-真题解析-2022年真题
  • Java推荐算法——特征加权推荐算法(以申请学校为例)
  • python 通过 ast 替换代码
  • Linux环境开发工具之yum
  • 苹果M3芯片可能存在以下几点不足或被指出的缺点
  • 顺序表(数组)的OJ题
  • C++容器适配器与stack,queue,priority_queue(优先级队列)的实现以及仿函数(函数对象)与deque的简单介绍
  • 论文阅读——BLIP
  • 数据结构-基本概念-001
  • 2017年终总结、随想
  • Akka系列(七):Actor持久化之Akka persistence
  • canvas 高仿 Apple Watch 表盘
  • ES6--对象的扩展
  • iOS小技巧之UIImagePickerController实现头像选择
  • JAVA多线程机制解析-volatilesynchronized
  • js正则,这点儿就够用了
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • RxJS: 简单入门
  • Sublime Text 2/3 绑定Eclipse快捷键
  • XForms - 更强大的Form
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端存储 - localStorage
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 前嗅ForeSpider采集配置界面介绍
  • 深入 Nginx 之配置篇
  • 异步
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​如何在iOS手机上查看应用日志
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #define与typedef区别
  • (2)(2.10) LTM telemetry
  • (ibm)Java 语言的 XPath API
  • (JS基础)String 类型
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (蓝桥杯每日一题)love
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (万字长文)Spring的核心知识尽揽其中
  • (原創) 物件導向與老子思想 (OO)
  • .form文件_SSM框架文件上传篇
  • .NET开源快速、强大、免费的电子表格组件
  • // an array of int
  • /var/lib/dpkg/lock 锁定问题