【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.mzph.cn/news/747682.shtml

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

相关文章

Nexus如何导入jar以及批量导入Maven的本地库目录

上传依赖包到Nexus 服务器的方式有多种, 包含: 1.单个jar上传: 在Nexus管理台页面上传单个jar 2.源码编译上传:在源码项目中使用 Maven的deploy 命令发布 3. 使用脚本批量上传Maven本地库的目录 前言 本篇基于 Nexus 的版本是 nexus-3.55.0-01本方法适用Linux和WindowsWind…

MySQL-HMA 高可用故障切换

本章内容&#xff1a; 了解MySQL MHA搭建MySQL MHAMySQL MHA故障切换 1.案例分析 1.1.1案例概述 目前 MySQL 已经成为市场上主流数据库之一&#xff0c;考虑到业务的重要性&#xff0c;MySQL 数据库 单点问题已成为企业网站架构中最大的隐患。随着技术的发展&#xff0c;MHA…

【四 (2)数据可视化之 Matplotlib 常用图表及代码实现 】

目录 文章导航一、介绍二、安装Matplotlib三、导入Matplotlib四、设置可以中文显示四、常用图形1、散点图&#xff08;Scatter Plot&#xff09;2.1、线性图&#xff08;Line Plot&#xff09;2.2、堆叠折线图2.3、多图例折线图3.1、柱状图/条形图&#xff08;Bar Chart&#x…

PostgreSQL中vacuum 物理文件truncate发生的条件

前言 前段时间&#xff0c;有些同学说到vacuum截断的行为时&#xff0c;认为&#xff0c;只要末尾是空页&#xff0c;无论多少&#xff0c;都会被截断&#xff0c;真是这样的吗&#xff1f; PostgreSQL当中&#xff0c;由于vacuum的操作并不总能将死元组的空间进行”物理截断…

HNU-计算机系统-实验1-原型机vspm1.0-(二周目玩家视角)

前言 二周目玩家&#xff0c;浅试一下这次的原型机实验。总体感觉跟上一年的很相似&#xff0c;但还是有所不同。 可以比较明显地感觉到&#xff0c;这个界面越来越好看了&#xff0c;可操作与可探索的功能也越来越多了。 我们HNU的SYSTEM真的越来越好了&#xff01;&#x…

JMeter 查看 TPS 数据,详细指南

TPS 是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时&#xff0c;收到服务器响应后结束计时&#xff0c;以此来计算使用的时间和完成的事务个数。在 JMeter 中&#xff0c;我们可以使用以下方法查看 T…

量子遗传算法优化VMD参数,五种适应度函数任意切换,最小包络熵、样本熵、信息熵、排列熵、排列熵/互信息熵...

关于量子遗传算法&#xff0c;在众多文献均有应用。下面简述一下原理。 &#xff08;1&#xff09;量子比特编码 子遗传算法通过引入量子比特来完成基因的存储和表达。量子比特是量子信息中的概念&#xff0c;它与经典比特不同&#xff0c;是因为它可以在同一时刻处于两个状态的…

Unreal发布Android App如何面对混乱的Android SDK开发环境

Unreal发布Android App如何面对混乱的Android SDK开发环境 混乱的Android SDK开发环境Unreal 4可以借用Unity3D安装的Android环境Unreal 5需要安装Android Studio开发环境Android Studio的DK版本目录处理gradle和java版本gradle提示错误总结 混乱的Android SDK开发环境 Unreal…

Python爬虫 Day1

要注意看网页的请求方式是request还是get 一、小型爬虫 &#xff08;爬百度首页&#xff09; from urllib.request import urlopen url "https://www.baidu.com" resp urlopen(url) print(resp.read().decode(utf-8)) print("over!") //&#xff01;&am…

【Hadoop】Hadoop概述与核心组件

目录 Hadoop概述Hadoop 发展历史Hadoop 三大发行版本1.Apache Hadoop&#xff08;常用&#xff09;2.Cloudera Hadoop3.Hortonworks Hadoop优势优势总结——4高&#xff08;高可靠、高扩展、高效、高容错&#xff09; Hadoop组成1.HDFS管理者&#xff1a;NameNode&#xff08;n…

css3 实现html样式蛇形布局

文章目录 1. 实现效果2. 实现代码 1. 实现效果 2. 实现代码 <template><div class"body"><div class"title">CSS3实现蛇形布局</div><div class"list"><div class"item" v-for"(item, index) …

音视频如何快速转二维码?在线生成音视频活码的教程

音频文件的二维码制作步骤是什么样的呢&#xff1f;扫描二维码来展现内容是很流行的一种方式&#xff0c;基本上日常生活中经常会用的图片、音频、视频等都可以使用生成二维码的方式。现在很多的幼儿园或者学校会录制孩子的音频或者视频内容用来展示&#xff0c;那么二维码制作…

鸿蒙开发实战:【音频组件】

简介 音频组件用于实现音频相关的功能&#xff0c;包括音频播放&#xff0c;录制&#xff0c;音量管理和设备管理。 图 1 音频组件架构图 基本概念 采样 采样是指将连续时域上的模拟信号按照一定的时间间隔采样&#xff0c;获取到离散时域上离散信号的过程。 采样率 采样…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:RelativeContainer)

相对布局组件&#xff0c;用于复杂场景中元素对齐的布局。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 规则说明 容器内子组件区分水平方向&#xff0c;垂直方向&#xff1a; 水平方向为left&…

HTTPS的工作过程

一、HTTPS 是什么 HTTPS 也是⼀个应用层协议&#xff0c;是在 HTTP 协议的基础上引入了⼀个加密层. HTTP 协议内容都是按照文本的方式明文传输的。这就导致在传输过程中出现⼀些被篡改的情况. 在互联网上, 明文传输是比较危险的事情!!! HTTPS 就是在 HTTP 的基础上进行了加密…

platform设备注册驱动模块的测试

一. 简介 上一篇文章编写了 platform设备注册代码&#xff0c;文章地址如下&#xff1a; 无设备树platform驱动实验&#xff1a;platform设备注册代码实现-CSDN博客 本文继续无设备树platform驱动实验&#xff0c;本文对编译好的 设备注册程序进行测试&#xff0c;测试所实…

(二)丶RabbitMQ的六大核心

一丶什么是MQ Message Queue(消息队列&#xff09;简称MQ&#xff0c;是一种应用程序对应用程序的消息通信机制。在MQ中&#xff0c;消息以队列形式存储&#xff0c;以便于异步传输&#xff0c;在MQ中&#xff0c;发布者&#xff08;生产者&#xff09;将消息放入队列&#xff…

LeetCode 面试经典150题 80.删除有序数组中的重复项II

题目&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件…

百度paddleocr GPU版部署

显卡&#xff1a;NVIDIA GeForce RTX 4070&#xff0c;Nvidia驱动程序版本&#xff1a;537.13 Nvidia驱动程序能支持的最高cuda版本&#xff1a;12.2.138 Python&#xff1a;python3.10.11。试过python3.12&#xff0c;安装paddleocr失败&#xff0c;找不到相关模块。 飞桨版本…

Linux从0到1——Linux第一个小程序:进度条

Linux从0到1——Linux第一个小程序&#xff1a;进度条 1. 输出缓冲区2. 回车和换行的本质3. 实现进度条3.1 简单原理版本3.2 实际工程版本 1. 输出缓冲区 1. 小实验&#xff1a; 编写一个test.c文件&#xff0c;&#xff1a; #include <stdio.h> #include <unistd.h…