本文之前写的结合基于Verilog实现呼吸灯以及至芯很久之前的视频,在腾讯课堂,免费的。实现了会呼吸的流水灯(纯粹感觉挺好玩的,工程以及实现的思路 关注公众号:果冻空间 回复:others-002 即可获得相关资料以及源码)最核心的理解在思路分析中

看最终视频点这里

会呼吸的流水灯

1,思路分析

具体实现思路参考之前的博文(代码看下文提供的),这里进行简单分析以及实现流水的简单介绍。具体读者可以直接参考源码与提供的PDF文件。这里进行一点说明,笔者在top文件中写了一些代码,一般情况下最好是封装成一个新的模块,这里因为不是很正式,就在top文件中写入了一些代码,特此说明。为了让这篇博文不那么无趣,这里分析总结下笔者理解的写代码的思路以及理想情况下的一个demo开发的过程。以下为笔者自身愚见,有不足之处望包涵之处。
一个合格的verilog HDL语言实现的demo,其spec应该包括的内容:
1,设计实现的功能
2,设计接口描述(与时序设计,设计思路同时完成)
3,设计思路(时序设计)
4,仿真思路(2,3,4理论上是同步完成的,这些都不需要写出完整的代码来,仅仅需要对关键的部分(若是有需要)进行代码的描述,不需要完全正确,后续有迭代的过程)
5,设计代码分析
6,仿真验证
7,板机验证

1,设计实现的功能为会呼吸的流水灯
首先呼吸灯为,一个灯从暗到亮在到暗,其次流水灯为一排led,从左至右(顺序也可从右到左),依次亮起。将两者结合即为设计需要实现的功能。例如有四个LED,第一个一呼一吸,然后第二个一呼一吸…依次类推
2,设计接口描述
模块breath_led

名称 (I/O)输入输出 功能描述
clk input 时钟信号
rst_n input 复位
LED output 输出一个LED的呼吸状态
flag output 输出LED是进行从亮到暗还是从暗到亮

3,设计思路
设计需要实现一个呼吸灯,首先需要明确,一个LED的亮灭其实是绝对的,我们看到的暗其实是在固定的时间,其亮的时间比较短,我们人眼识别其比较暗而已。例如将2s分为1000份就是2us,然后将2ms分为1000份就是20us,而系统时钟是20ns,因此需要计数0-99,才可以满20us。这时候我们定义三个计数器,设计如下

设计好三个计数器后,我们需要标清楚计数器加一与清零的条件。最后观察,得知两个计数器的关系恰巧可以定义LED的输出,然后同样的思路(使用enable、start、end、valid、flag等信号)这里使用flag,表明从暗到亮,然后取反即可得到相反的逻辑,这里注意flag拉高与拉低的条件即可。同样检测flag的下降沿也可以判断LED的呼吸状态(笔者的代码使用的是打一拍,比较前后的电平是否一样)最后设计流水的功能。
同样有很多的思路,尽量做到简洁(不仅美观,而且在使用功耗以及面积上也可以得到比较好的效果)
这里笔者使用的是case语句进行判断,具体思路见下图。

5,设计代码分析
6,仿真验证
7,板机验证
见下部分

2,代码分享

在进行仿真时,将局部参数换位仿真的局部参数即可。

1,呼吸灯代码

`timescale 1ps / 1ps
//-----------------------------------------------------------------------------------
// Copyright :This document is only for personal learning reference and research.
// Module:  breath_led
// File:    breath_led.v
// Author:  meng guodong
// E-mail:  823300630@qq.com
// Time :   2021-01-05 22:22:35
// Description: 参考至芯培训课程
// Revision: 1.0
//-------------------------------------------------------------------------------------------------
module breath_led (//system signalsinput                      clk             ,input                       rst_n           ,//othersoutput                       LED             ,output                      flag             );
//========================================================================\
// =========== Define Parameter and Internal signals ===========
//========================================================================/
reg     [6:0]         cnt_100 ;
reg     [9:0]         cnt_2us ;
reg     [9:0]         cnt_2ms ;
reg                 PWM     ;
reg                 flag    ;
parameter   MAX_cnt_100 = 99  ,MAX_cnt_2us = 999 ,MAX_cnt_2ms = 999     ;
//仿真
// parameter    MAX_cnt_100 = 99    ,
//          MAX_cnt_2us = 9     ,
//          MAX_cnt_2ms = 9     ;
//=============================================================================
//**************    Main Code   **************
//=============================================================================
//cnt_100
always @ (posedge clk or negedge rst_n)
begin  if(!rst_n)cnt_100 <= 'd0;else if(cnt_100 == MAX_cnt_100)cnt_100 <= 'd0;else cnt_100 <= cnt_100 + 1'b1;
end
//cnt_2us
always @ (posedge clk or negedge rst_n)
begin  if(!rst_n)cnt_2us <= 'd0;else if(cnt_100 == MAX_cnt_100 && cnt_2us == MAX_cnt_2us)cnt_2us <= 'd0;else if(cnt_100 == MAX_cnt_100)cnt_2us <= cnt_2us + 1'b1;
end
//cnt_2ms
always @ (posedge clk or negedge rst_n)
begin  if(!rst_n)cnt_2ms <= 'd0;     else if(cnt_100 == MAX_cnt_100 && cnt_2us == MAX_cnt_2us && cnt_2ms == MAX_cnt_2ms)cnt_2ms <= 'd0;else if(cnt_100 == MAX_cnt_100 && cnt_2us == MAX_cnt_2us)cnt_2ms <= cnt_2ms + 1'b1;
end
//flag
always @ (posedge clk or negedge rst_n)
begin  if(!rst_n)flag <= 'd1;else if(cnt_2ms == MAX_cnt_2ms && cnt_2us == MAX_cnt_2us && cnt_100 == MAX_cnt_100 )flag <= !flag;
end
//PWM
always @ (posedge clk or negedge rst_n)
begin  if(!rst_n)PWM <= 1'b0;else if(cnt_2us <= cnt_2ms && flag == 1'b1)PWM <= 1'b1;else if(cnt_2us >= cnt_2ms && flag == 1'b0)PWM <= 1'b1;else PWM <= 1'b0;
end
assign LED = PWM;
endmodule

2,顶层代码

`timescale 1ps / 1ps
//-----------------------------------------------------------------------------------
// Copyright :This document is only for personal learning reference and research.
// Module:  top_breath_liushui
// File:    top_breath_liushui.v
// Author:  meng guodong
// E-mail:  823300630@qq.com
// Time :     2021-01-05 22:46:02
// Description: 呼吸流水灯
// Revision: 1.0
//-------------------------------------------------------------------------------------------------
module top_breath_liushui (//system signalsinput                         s_clk               ,input                      s_rst_n             ,//othersoutput     reg      [3:0]      LED
);
//========================================================================\
// =========== Define Parameter and Internal signals ===========
//========================================================================/
wire LED_0;
reg LED_0_r;
wire flag;
wire top_flag;
reg [2:0] LED_cnt;
//=============================================================================
//**************    Main Code   **************
//=============================================================================
always @ (posedge s_clk or negedge s_rst_n)
begin  if(!s_rst_n)LED_0_r <= 'd0;elseLED_0_r <= flag;
end
assign top_flag = flag != LED_0_r;always @ (posedge s_clk or negedge s_rst_n)
begin  if(!s_rst_n)LED_cnt <= 'd0;else if(top_flag == 1'b1 && LED_cnt == 'd7)LED_cnt <= 'd0;else if(top_flag == 1'b1)LED_cnt <= LED_cnt + 1'b1;else LED_cnt <= LED_cnt;
end always @ (posedge s_clk or negedge s_rst_n)
begin  if(!s_rst_n)LED <= 4'h0;elsecase (LED_cnt) 3'd0,3'd1    :     LED <= {3'b000,!LED_0}; 3'd2,3'd3    :     LED <= {2'b00,!LED_0,1'b0}; 3'd4,3'd5    :       LED <= {1'b0,!LED_0,2'b00}; 3'd6,3'd7    :       LED <= {!LED_0,3'b000}; default :    LED <= 4'h0; endcase
end breath_led breath_led_0 (.clk(s_clk), .rst_n(s_rst_n), .LED(LED_0),.flag(flag));endmodule

3,仿真代码

`timescale 1ns / 1ps
module tb_top_breath_liushui_led;reg s_clk;reg s_rst_n;wire [3:0] LED;top_breath_liushui top_breath_liushui_0 (.s_clk(s_clk), .s_rst_n(s_rst_n), .LED(LED));
always #10 s_clk = ~s_clk; initial begins_clk = 0;s_rst_n = 0;#100;s_rst_n = 1'b1;end
endmodule

3,仿真截图



关注公众号:果冻空间 回复:others-002 即可获得相关资料以及工程源码呦

基于Verilog-HDL实现会呼吸的流水灯相关推荐

  1. 基于Verilog HDL的数字时钟

    目录 一.实验目的 二.实验概述 三.实验过程 一.实验目的 1.学习相关的设计方法及原理 2.学习设计方法 二.实验概述 基于Verilog HDL设计一个时钟 三.实验过程 新建一个工程 选择芯片 ...

  2. matlab4fsk软件解调代码,4fsk调制与解调基于Verilog HDL语言

    [实例简介] 4fsk调制与解调基于Verilog HDL语言 [实例截图] [核心代码] 4fsk调制与解调基于VerilogHDL语言 └── kechengsheji ├── dac0832(1 ...

  3. 基于Verilog HDL的数字秒表、波形发送器等设计

    基于Verilog HDL的数字秒表设计 一.EDA 二.基于Verilog HDL的数字秒表设计 1. 用Verilog HDL设计一个数字跑表,所需引脚和功能如下所示: 2.代码示例 3. 结果: ...

  4. 单片机串口中断控制流水灯c语言,基于单片机AT89C51控制的中断控制流水灯_课程设计报告...

    <基于单片机AT89C51控制的中断控制流水灯_课程设计报告>由会员分享,可在线阅读,更多相关<基于单片机AT89C51控制的中断控制流水灯_课程设计报告(25页珍藏版)>请在 ...

  5. (多图) 基于Verilog HDL的FIR数字滤波器设计与仿真

    引言:数字滤波器是语音与图像处理.模式识别.雷达信号处理.频谱分析等应用中的一种基本的处理部件,它能满足波器对幅度和相位特性的严格要求,避免模拟滤波器所无法克服的电压漂移.温度漂移和噪声等问题.有限冲 ...

  6. 基于Verilog HDL与虚拟实验平台的【计算机组成】与CPU实验第三章:三态门和多路器

    1判断(2分) 数字逻辑电路有两大种类型,组合逻辑电路和时序逻辑电路,组合逻辑电路"没有记忆",输出由输入决定,时序逻辑电路"有记忆",输出由当前输入和以前的状 ...

  7. 基于Verilog HDL与虚拟实验平台的【计算机组成】与CPU实验第四章:七段译码器

    1单选(2分) 2-4译码器有____位输入,位输出,在输出的所有位中,只有其中1位有效,通常在计算机里用作, 有一些译码器设有一个和多个使能控制输入端,又成为片选端,用来控制允许译码或禁止译码. A ...

  8. 基于 Nios II 的串口打印和流水灯设计【使用 Quartus 软件】【掌握 SOPC 开发流程】

    目录 一.前言 二.实验步骤 第一步:硬件部分设计 1)建立新项目 2)进行 Qsys 系统设计 3)完成 Qsys 设计的后续工作 4)原理图设计 5)编译工程及物理针脚分配. 第二步:软件部分设计 ...

  9. 基于STC89C51单片机设计的心形流水灯软件代码部分

     硬件电路板 (正反面) 根据PCB电路板对LED灯对应的引脚进行定义 声明LED灯的控制引脚 ​ //LED灯引脚,沿逆时针定义sbit LED1=P0^0; sbit LED2=P0^1;sbit ...

最新文章

  1. vue.js 默认选中select_vue.js 解决v-model让select默认选中不生效的问题
  2. 3个图表突出数据显示小技巧,帮你一秒锁定关键信息
  3. js根据数组对象中某属性进行排序
  4. WSL之Emacs中文乱码解决
  5. Structure from Motion综述
  6. 弹性理论法研究桩基受力计算公式_浅谈桩基础沉降计算方法
  7. CSS字体样式属性调试
  8. php fpm listen.owner,php-fpm配置详解
  9. windows内核情景分析--窗口消息
  10. matlab实现色彩迁移,图像的色彩风格迁移
  11. mysql sql语句 查询文章表,评论表(根据评论表文章评论次数排序查询出文章count(),group,left join)
  12. 阿里云CDN 使用问题汇总
  13. 数据结构之线性表----一文看懂顺序表、单链表、双链表、循环链表
  14. 毕业十年,唯有独立面对——记 贺利坚老师新书《逆袭大学——传给IT学子的正能量》
  15. 北四村的蚁族程序员:面朝西二旗
  16. sidebar(侧边栏文字)
  17. rsync同步+inotify实时同步部署
  18. 浅显的谈谈证券公司的信息化
  19. unity中awak,start,update之间的关系
  20. 499张WEBP格式动漫图片

热门文章

  1. Android Studio升级到3.0,抛出Aapt2Exception异常
  2. /usr/bin/ld: 找不到 -lmsc----解决方案
  3. 【Selenium-WebDriver自学】出现的问题和解决方案(十七)
  4. 如何使用jQuery打开Bootstrap模式窗口?
  5. 计算机中的管理应用,计算机在企业管理中应用_29067.doc
  6. 功放前级的左右_TDG Audio达芬奇:什么是前级,后极?
  7. win11开机记录如何查看 Windows11查看开机记录的设备方法
  8. win11更新特别慢怎么办 windows11更新缓慢的解决方法
  9. DBCP,C3P0,druid,HiKariCP连接池配置使用
  10. python趋势回归_Python 回归分析 - 树懒学堂