21.呼吸灯拓展练习,控制四颗led以不同的频率“呼吸”

news2024/10/3 8:18:47

(1)Verilog代码:

module ex_breath_led(clk,reset_n,led_out);

    input clk;
    input reset_n;
    
    output [3:0]led_out;
    
    reg [5:0]cnt_1us;
    reg [9:0]cnt_1ms;
    reg [10:0]cnt_2ms;
    reg [11:0]cnt_4ms;
    reg [12:0]cnt_8ms;
    reg [9:0]cnt_1s;
    reg overturn;
    
    parameter MCNT_1us = 6'd49;
    parameter MCNT_1ms = 10'd999;
    parameter MCNT_2ms = 11'd1999;
    parameter MCNT_4ms = 12'd3999;
    parameter MCNT_8ms = 13'd7999;
    parameter MCNT_1s  = 10'd999;  
    
//1us计数器模块
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_1us <= 6'd0;
        else if(cnt_1us == MCNT_1us)
            cnt_1us <= 6'd0;
        else 
            cnt_1us <= cnt_1us + 6'd1;
            
//1ms计数器模块
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_1ms <= 10'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms))
            cnt_1ms <= 10'd0;
        else if(cnt_1us == MCNT_1us)
            cnt_1ms <= cnt_1ms + 10'd1;
        else 
            cnt_1ms <= cnt_1ms;
            
//2、4、8ms计数器模块
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_2ms <= 11'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_2ms == MCNT_2ms))
            cnt_2ms <= 11'd0;
        else if(cnt_1us == MCNT_1us)
            cnt_2ms <= cnt_2ms + 11'd1;
        else 
            cnt_2ms <= cnt_2ms;
            
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_4ms <= 12'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_4ms == MCNT_4ms))
            cnt_4ms <= 12'd0;
        else if(cnt_1us == MCNT_1us)
            cnt_4ms <= cnt_4ms + 12'd1;
        else 
            cnt_4ms <= cnt_4ms;
            
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_8ms <= 13'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_8ms == MCNT_8ms))
            cnt_8ms <= 13'd0;
        else if(cnt_1us == MCNT_1us)
            cnt_8ms <= cnt_8ms + 13'd1;
        else 
            cnt_8ms <= cnt_8ms;
            
//1s计数器模块
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_1s <= 10'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms)&&(cnt_1s == MCNT_1s))
            cnt_1s <= 10'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms))
            cnt_1s <= cnt_1s + 10'd1;
        else 
            cnt_1s <= cnt_1s;
            
//翻转逻辑overturn信号
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            overturn <= 1'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms)&&(cnt_1s == MCNT_1s))
            overturn <= ~overturn;
        else 
            overturn <= overturn;

//led_out主程序设计
    assign led_out[0] = (((overturn == 1'd0)&&(cnt_1ms <= cnt_1s))||((overturn == 1'd1)&&(cnt_1ms <= MCNT_1s - cnt_1s)));
    assign led_out[1] = (((overturn == 1'd0)&&((cnt_2ms>>1) <= cnt_1s))||((overturn == 1'd1)&&((cnt_2ms>>1) <= MCNT_1s - cnt_1s)));
    assign led_out[2] = (((overturn == 1'd0)&&((cnt_4ms>>2) <= cnt_1s))||((overturn == 1'd1)&&((cnt_4ms>>2) <= MCNT_1s - cnt_1s)));
    assign led_out[3] = (((overturn == 1'd0)&&((cnt_8ms>>3) <= cnt_1s))||((overturn == 1'd1)&&((cnt_8ms>>3) <= MCNT_1s - cnt_1s)));

            
endmodule

(2)仿真文件代码:

`timescale 1ns / 1ps

module ex_breath_led_tb;

    reg clk;
    reg reset_n;
    
    wire [3:0]led_out;

    ex_breath_led ex_breath_led_inst(
        .clk(clk),
        .reset_n(reset_n),
        .led_out(led_out)
    );
    
    defparam ex_breath_led_inst.MCNT_1us = 4;
    defparam ex_breath_led_inst.MCNT_1ms = 99;
    defparam ex_breath_led_inst.MCNT_2ms = 199;
    defparam ex_breath_led_inst.MCNT_4ms = 399;
    defparam ex_breath_led_inst.MCNT_8ms = 799;
    defparam ex_breath_led_inst.MCNT_1s  = 99;

    initial clk = 1'd1;
    always #10 clk = ~clk;
    
    initial begin
        reset_n <= 1'd0;
        #15;
        reset_n <= 1'd1;
        #5_000_000;
        $stop;
    end

endmodule

(3)仿真波形:

(4)引脚绑定:

(5)上版验证后,发现该Verilog代码是错的,在肉眼看来,四个灯是在同频呼吸,因此修改代码为:

module ex_breath_led(clk,reset_n,led_out);

    input clk;
    input reset_n;
    
    output [3:0]led_out;
    
    reg [5:0]cnt_1us;
    reg [9:0]cnt_1ms;
    reg [9:0]cnt_1s;
    reg [10:0]cnt_2s;
    reg [11:0]cnt_4s;
    reg [12:0]cnt_8s;
    reg [3:0]overturn;
    
    parameter MCNT_1us = 6'd49;
    parameter MCNT_1ms = 10'd999;
    parameter MCNT_1s  = 10'd999;  
    parameter MCNT_2s  = 11'd1999; 
    parameter MCNT_4s  = 12'd3999; 
    parameter MCNT_8s  = 13'd7999; 
    
//1us计数器模块
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_1us <= 6'd0;
        else if(cnt_1us == MCNT_1us)
            cnt_1us <= 6'd0;
        else 
            cnt_1us <= cnt_1us + 6'd1;
            
//1ms计数器模块
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_1ms <= 10'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms))
            cnt_1ms <= 10'd0;
        else if(cnt_1us == MCNT_1us)
            cnt_1ms <= cnt_1ms + 10'd1;
        else 
            cnt_1ms <= cnt_1ms;
    
//1s计数器模块
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_1s <= 10'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms)&&(cnt_1s == MCNT_1s))
            cnt_1s <= 10'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms))
            cnt_1s <= cnt_1s + 10'd1;
        else 
            cnt_1s <= cnt_1s;
            
//2、4、8秒计数器模块设计
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_2s <= 11'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms)&&(cnt_2s == MCNT_2s))
            cnt_2s <= 11'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms))
            cnt_2s <= cnt_2s + 11'd1;
        else 
            cnt_2s <= cnt_2s; 
            
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_4s <= 12'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms)&&(cnt_4s == MCNT_4s))
            cnt_4s <= 12'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms))
            cnt_4s <= cnt_4s + 12'd1;
        else 
            cnt_4s <= cnt_4s;

    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt_8s <= 13'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms)&&(cnt_8s == MCNT_8s))
            cnt_8s <= 13'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms))
            cnt_8s <= cnt_8s + 13'd1;
        else 
            cnt_8s <= cnt_8s;          
            
//翻转逻辑overturn信号
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            overturn <= 4'd0;
        else if((cnt_1us == MCNT_1us)&&(cnt_1ms == MCNT_1ms)&&(cnt_1s == MCNT_1s))
            overturn <= overturn + 4'd1;
        else 
            overturn <= overturn;

//led_out主程序设计
    assign led_out[0] = (((overturn[0] == 1'd0)&&(cnt_1ms <= cnt_1s))||((overturn[0] == 1'd1)&&(cnt_1ms <= MCNT_1s - cnt_1s)));
    assign led_out[1] = (((overturn[1] == 1'd0)&&(cnt_1ms <= (cnt_2s >> 1)))||((overturn[1] == 1'd1)&&(cnt_1ms <= MCNT_1s - (cnt_2s >> 1))));
    assign led_out[2] = (((overturn[2] == 1'd0)&&(cnt_1ms <= (cnt_4s >> 2)))||((overturn[2] == 1'd1)&&(cnt_1ms <= MCNT_1s - (cnt_4s >> 2))));
    assign led_out[3] = (((overturn[3] == 1'd0)&&(cnt_1ms <= (cnt_8s >> 3)))||((overturn[3] == 1'd1)&&(cnt_1ms <= MCNT_1s - (cnt_8s >> 3))));

            
endmodule
`timescale 1ns / 1ps

module ex_breath_led_tb;

    reg clk;
    reg reset_n;
    
    wire [3:0]led_out;

    ex_breath_led ex_breath_led_inst(
        .clk(clk),
        .reset_n(reset_n),
        .led_out(led_out)
    );
    
    defparam ex_breath_led_inst.MCNT_1us = 4;
    defparam ex_breath_led_inst.MCNT_1ms = 9;
    defparam ex_breath_led_inst.MCNT_1s  = 9;
    defparam ex_breath_led_inst.MCNT_2s  = 19;
    defparam ex_breath_led_inst.MCNT_4s  = 39;
    defparam ex_breath_led_inst.MCNT_8s  = 79;

    initial clk = 1'd1;
    always #10 clk = ~clk;
    
    initial begin
        reset_n <= 1'd0;
        #15;
        reset_n <= 1'd1;
        #500_000;
        $stop;
    end

endmodule

仿真波形:

PS:实验现象正确,实现了预定目标,但我觉得可以以0.25s、0.5s、1s、2s的频率去呼吸,8s太长了,效果不佳。

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

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

相关文章

2024 Q3 NAND闪存价格|企业级依然猛涨,消费级放缓

在企业领域持续投资于服务器基础设施&#xff0c;特别是在人工智能应用的推动下&#xff0c;企业级SSD需求增加的同时&#xff0c;消费电子市场却依旧疲软。加之NAND供应商在2024年下半年积极扩大生产&#xff0c;预计到2024年第三季度&#xff0c;NAND闪存供应充足率将上升至2…

【CPP】CPP的命名空间输入输出缺省参数函数重载

目录 1 命名空间 -- namespace2 CPP的输入与输出(io)2.1 输入输出流的一些规定2.2 实操一下2.3 关于endl2.4 关于精度控制2.5 效率提高 3 缺省参数(默认参数)3.1 样例3.2 全缺省与半缺省3.3 缺省参数的意义 4 函数重载4.1 函数重载的基本使用4.2 函数重载调用歧义 这里是oldkin…

产品原型设计:从概念到实现的完整指南

如果你是一位产品经理&#xff0c;那么你一定会和原型图打交道&#xff0c;产品原型是产品设计方案和底层逻辑的可视化表达&#xff0c;需要完整清晰地表达出产品目的及需求&#xff0c;在整个产品创造的过程中发挥着不可或缺的作用。而对于一些刚入行的产品经理来说&#xff0…

Docker学习笔记(三)Dockerfile

一、什么是Dockerfile Dockerfile 是一个用于自动化构建 Docker 镜像的文本文件&#xff0c;其中包含了从一个基础镜像开始&#xff0c;到最终形成所需定制镜像的所有指令集。这个文件中的每一条指令都对应着构建镜像过程中的一个步骤或一层&#xff0c;指导 Docker 如何安装软…

tk 文本生成器

import random import tkinter as tk import ttkbootstrap as ttk from tkinter import messagebox import pyperclipdef wenben_run():def generate_text(original_text, length):# 去掉原始文本中的换行符和空格original_text original_text.replace(\n, )original_text or…

【文档智能】LACE:帮你自动生成文档布局的方法浅尝

前言 往期很多文章都介绍了【文档智能】上布局识别&#xff08;版式分析&#xff09;的技术思路&#xff0c;版式分析是通过对文档版式进行布局识别&#xff0c;识别文档中的元素类型的过程。这次来看看一个有趣的思路&#xff0c;通过已有的元素类型&#xff0c;来生成可控的…

解决安卓tv 蓝牙遥控器配对后输入法弹不出来的问题

t972在蓝牙配对后,自带的LatinIME 输入法会出现弹不出来的现象。 经过分析,主要为蓝牙的kl 文件适配存在问题。解决如下: 1.新建 kl文件Vendor_2b54_Product_1600.kl 放到 /vendor/usr/keylayout/下 内容: #for bl remote add by jason 20240709 key 113 VOLUME_MUTE …

【RAG KG】GraphRAG开源:查询聚焦摘要的图RAG方法

前言 传统的 RAG 方法在处理针对整个文本语料库的全局性问题时存在不足&#xff0c;例如查询&#xff1a;“数据中的前 5 个主题是什么&#xff1f;” 对于此类问题&#xff0c;是因为这类问题本质上是查询聚焦的摘要&#xff08;Query-Focused Summarization, QFS&#xff09…

FL Studio 24.1.1.4234 (Windows) / 24.1.1.3884 (Mac OS X)

FL Studio 24.1.1.4234 (Windows) / 24.1.1.3884 (Mac OS X) 主页多媒体音频编辑FL Studio 24.1.1.4234 (Windows) / 24.1.1.3884... FL Studio 图标 FL Studio&#xff08;前身为 FruityLoops&#xff09;是一款功能强大的音乐制作环境或数字音频工作站&#xff08;DAW&#x…

用于视频生成的扩散模型

学习自https://lilianweng.github.io/posts/2024-04-12-diffusion-video/ 文章目录 3D UNet和DiTVDMImagen VideoSora 调整图像模型生成视频Make-A-Video&#xff08;对视频数据微调&#xff09;Tune-A-VideoGen-1视频 LDMSVD稳定视频扩散 免训练Text2Video-ZeroControlVideo 参…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥协商(ArkTS)】

密钥协商(ArkTS) 以协商密钥类型为X25519 256&#xff0c;并密钥仅在HUKS内使用为例&#xff0c;完成密钥协商。 开发步骤 生成密钥 设备A、设备B各自生成一个非对称密钥&#xff0c;具体请参考[密钥生成]或[密钥导入]。 密钥生成时&#xff0c;可指定参数HUKS_TAG_DERIVE…

STL--栈(stack)

stack 栈是一种只在一端(栈顶)进行数据插入(入栈)和删除(出栈)的数据结构,它满足后进先出(LIFO)的特性。 使用push(入栈)将数据放入stack,使用pop(出栈)将元素从容器中移除。 使用stack,必须包含头文件: #include<stack>在头文件中,class stack定义如下: namespace std…

前端面试题32(浅谈前端热部署)

前端热部署&#xff08;Hot Deployment&#xff09;是指在开发过程中&#xff0c;当开发者修改了前端代码后&#xff0c;这些修改能够立即反映到正在运行的前端应用上&#xff0c;而无需重新启动整个应用或服务器。这种能力极大地提高了开发效率&#xff0c;因为开发者可以即时…

算法学习笔记(8.2)-动态规划入门进阶

目录 问题判断: 问题求解步骤&#xff1a; 图例&#xff1a; 解析&#xff1a; 方法一&#xff1a;暴力搜索 实现代码如下所示&#xff1a; 解析&#xff1a; 方法二&#xff1a;记忆化搜索 代码示例&#xff1a; 解析&#xff1a; 方法三&#xff1a;动态规划 空间…

如何在JetBrains中写Codeforce?

目录 前言 正文 leetcode 个人喜好 参考资料 具体操作步骤 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f4…

硬件:CPU和GPU

一、CPU与GPU 二、提升CPU利用率&#xff1a;计组学过的 1、超线程一般是给不一样的任务的计算使用&#xff0c;而非在计算密集型工作中 2、Cpu一次可以计算一个线程&#xff0c;而gpu有多少个绿点一次就能计算多少个线程&#xff0c;Gpu比cpu快是因为gpu它的核多&#xff0c;…

如何在 PostgreSQL 中确保数据的异地备份安全性?

文章目录 一、备份策略1. 全量备份与增量备份相结合2. 定义合理的备份周期3. 选择合适的备份时间 二、加密备份数据1. 使用 PostgreSQL 的内置加密功能2. 使用第三方加密工具 三、安全的传输方式1. SSH 隧道2. SFTP3. VPN 连接 四、异地存储的安全性1. 云存储服务2. 内部存储设…

RK3568------Openharmony 4.0-Release WIFI/BT模组适配

RK3568------Openharmony 4.0-Release WIFI/BT模组(ap6236)适配 文章目录 RK3568------Openharmony 4.0-Release WIFI/BT模组(ap6236)适配前言一、驱动移植二、设备树配置三 、内核配置四、遇到的问题五、效果展示总结 前言 随着RK3568适配工作的推进&#xff0c;整体适配工作…

泛微E9开发 控制日期浏览按钮的可选日期范围

控制日期浏览按钮的可选日期范围 1、需求说明2、实现方法3、扩展知识点控制日期浏览按钮的可选日期范围格式参数说明演示 1、需求说明 控制日期浏览按钮的可选日期范围为2024/07/01~2024/07/31&#xff0c;如下图所示 2. 控制日期浏览按钮的可选日期范围在当前时间的前一周~当…

【基于R语言群体遗传学】-13-群体差异量化-Fst

在前几篇博客中&#xff0c;我们深度学习讨论了适应性进化的问题&#xff0c;从本篇博客开始&#xff0c;我们关注群体差异的问题&#xff0c;建议大家可以先看之前的博客&#xff1a;群体遗传学_tRNA做科研的博客-CSDN博客 一些新名词 Meta-population:An interconnected gro…