FPGA学习(二)——实现LED流水灯

news2025/3/17 14:51:02

FPGA学习(二)——实现LED流水灯

目录

  • FPGA学习(二)——实现LED流水灯
  • 一、DE2-115时钟源
  • 二、控制6个LED灯实现流水灯
    • 1、核心逻辑
    • 2、代码实现
    • 3、引脚配置
    • 4、实现效果
  • 三、模块化代码
    • 1、分频模块
    • 2、复位暂停模块
    • 3、顶层模块
  • 四、总结

一、DE2-115时钟源

DE2-115板子包含一个50MHz的石英晶体振荡器,通过一个时钟缓冲器产生3路抖动低的50MHz时钟信号送到FPGA的时钟输入引脚,如下图所示:

image-20250316165546564

因此可以计算出,时钟信号的周期T=1/(50*10^6)=20ns1s=10^9ns,则1秒所需的时钟周期数为N=10^9/20=50000000

所以cnt计数器从0计数到50000000-1时,表示1秒。

二、控制6个LED灯实现流水灯

1、核心逻辑

  • 时钟和复位信号的处理

    • 代码通过always块监听时钟信号clk的上升沿、复位信号rst_n的下降沿以及停止信号stop_n的下降沿。
    • 当复位信号rst_n为低电平时,计数器cnt被重置为0,并且LED灯的状态被设置为6'b000001,即第一个LED亮起
  • 按键停止信号的处理

    • 当按键停止信号stop_n为低电平时,计数器cnt和LED灯的状态led保持不变,即停止计数和LED状态的变化。
  • 计数器的计数逻辑

    • 如果复位信号和停止信号都无效(即rst_nstop_n都为高电平),计数器cnt开始计数。
    • 当计数器cnt达到50_000_000 - 1时(即1秒的时钟周期,时钟频率为50MHz),计数器cnt被重置为0,并且LED灯的状态led进行循环右移一位,实现流水灯效果。

2、代码实现

module LedBlink(
    input wire clk,       // 50MHz时钟输入
    input wire rst_n,     // 复位信号,低电平有效
    input wire stop_n,      //停止信号
    output reg [5:0] led  // 6个LED灯输出
);
    reg [25:0] cnt;       // 26位计数器,用于计数1秒周期
    // 计数器模块
    always @(posedge clk or negedge rst_n or negedge stop_n) begin // posedge是指clk的上升沿 negedge是指rst_n的下降沿
        if (!rst_n) begin
            cnt <= 26'd0; // 复位时,计数器从0开始计数
            led <= 6'b000001; // 复位时,第一个LED亮
			end
		  else if (!stop_n) begin
				cnt <= cnt;
				led <= led;
			end 
		  else if (cnt == 50_000_000 - 1) begin // 计数到50,000,000 - 1
            cnt <= 26'd0; // 重置计数器
            led <= {led[4:0], led[5]}; // 循环右移一位,保持流水灯效果
        end 
		  else begin
            cnt <= cnt + 1; // 增加计数器
        end
    end 
endmodule

3、引脚配置

image-20250316170739928

4、实现效果

FPGA流水灯

三、模块化代码

1、分频模块

module clock(
    input wire clk,       // 50MHz时钟输入
    input wire rst_n,     // 复位信号,低电平有效
    output reg clk_1Hz    // 1Hz分频时钟输出
);
    reg [25:0] cnt;       // 26位计数器,用于计数1秒周期

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            cnt <= 26'd0;          // 复位时,计数器清零
            clk_1Hz <= 1'b0;        // 复位时,1Hz时钟信号置低
        end
        else if (cnt == 50_000_000 - 1) begin // 计数到50,000,000 - 1
            cnt <= 26'd0;           // 重置计数器
            clk_1Hz <= ~clk_1Hz;    // 翻转1Hz时钟信号
        end
        else begin
            cnt <= cnt + 1;         // 计数器递增
        end
    end
endmodule

2、复位暂停模块

module control(
    input wire clk_1Hz,   // 1Hz时钟输入
    input wire rst_n,     // 复位信号,低电平有效
    input wire stop_n,    // 停止信号,低电平有效
    output reg [5:0] led  // 6个LED灯输出
);
    always @(posedge clk_1Hz or negedge rst_n or negedge stop_n) begin
        if (!rst_n) begin
            led <= 6'b000001; // 复位时,第一个LED亮
        end
        else if (!stop_n) begin
            led <= led;        // 停止时,LED状态保持不变
        end
        else begin
            led <= {led[4:0], led[5]}; // 循环右移一位,实现流水灯效果
        end
    end
endmodule

3、顶层模块

module led(
    input wire clk,       // 50MHz时钟输入
    input wire rst_n,     // 复位信号,低电平有效
    input wire stop_n,    // 停止信号,低电平有效
    output wire [5:0] led // 6个LED灯输出
);
    wire clk_1Hz; // 1Hz时钟信号

    // 实例化时钟模块
    clock  u_clock(
        .clk(clk),
        .rst_n(rst_n),
        .clk_1Hz(clk_1Hz)
    );

    // 实例化控制模块
    control u_control(
        .clk_1Hz(clk_1Hz),
        .rst_n(rst_n),
        .stop_n(stop_n),
        .led(led)
    );
endmodule

四、总结

本次实验的核心目的在于通过实践操作,熟悉FPGA的开发流程,并通过编写Verilog代码来实现FPGA的流水灯效果,以此来练习和巩固Verilog编程的相关知识。实验关键点在于时钟和复位信号的处理: 理解时钟信号在数字设计中的重要性,以及如何使用复位信号来初始化和同步系统状态。计数器的设计: 学习如何利用计数器产生定时信号,以实现LED灯的顺序点亮。
,并通过编写Verilog代码来实现FPGA的流水灯效果,以此来练习和巩固Verilog编程的相关知识。实验关键点在于时钟和复位信号的处理: 理解时钟信号在数字设计中的重要性,以及如何使用复位信号来初始化和同步系统状态。计数器的设计: 学习如何利用计数器产生定时信号,以实现LED灯的顺序点亮。

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

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

相关文章

Linux如何在设备树中表示和引用设备信息

DTS基本知识 dts 硬件的相应信息都会写在.dts为后缀的文件中&#xff0c;每一款硬件可以单独写一份xxxx.dts&#xff0c;一般在Linux源码中存在大量的dts文件&#xff0c;对于arm架构可以在arch/arm/boot/dts找到相应的dts&#xff0c;一个dts文件对应一个ARM的machie。 dtsi 值…

Matlab 汽车振动多自由度非线性悬挂系统和参数研究

1、内容简介 略 Matlab 169-汽车振动多自由度非线性悬挂系统和参数研究 可以交流、咨询、答疑 2、内容说明 略 第二章 汽车模型建立 2.1 汽车悬架系统概述 2.1.1 悬架系统的结构和功能 2.1.2 悬架分类 2.2 四分之一车辆模型 对于车辆动力学&#xff0c;一般都是研究其悬…

生活中的可靠性小案例11:窗户把手断裂

窗户把手又断了&#xff0c;之前也断过一次&#xff0c;使用次数并没有特别多。上方的图是正常的把手状态&#xff0c;断的形状如下方图所示。 这种悬臂梁结构&#xff0c;没有一个良好的圆角过渡&#xff0c;导致应力集中。窗户的开关&#xff0c;对应的是把手的推拉&#xff…

[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅

074_ai辅助编程_水果程序_fruits_加法 回忆上次内容 上次直接从模块中导入变量、函数 from my_file import pi 导入my_file.pi 并作为 pi 使用 from my_file import pi as my_pi 导入变量 并 重命名 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; …

【图论】并查集的学习和使用

目录 并查集是什么&#xff1f; 举个例子 组成 父亲数组&#xff1a; find函数&#xff1a; union函数&#xff1a; 代码实现&#xff1a; fa[] 初始化code: find code&#xff1a; 递归实现: 非递归实现: union code : 画图模拟&#xff1a; 路径压缩&#xff1a…

欢乐力扣:反转链表

文章目录 1、题目描述2、思路 1、题目描述 反转链表。  给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 2、思路 借助cur指针和pre双指针来调整链表的前后指向。 # Definition for singly-linked list. # class ListNode: # def __i…

什么是大带宽服务器

什么是大带宽服务器&#xff1f; 在深入探讨大带宽之前&#xff0c;让我们先明确带宽的概念。带宽与我们日常所说的宽带有所不同&#xff0c;宽带是运营商为满足家庭或商业上网需求所提供的服务&#xff0c;而带宽则特指数据的传输速度&#xff0c;尤其是上行速度。大带宽服务…

【TCP】三次挥手,四次挥手详解--UDP和TCP协议详解

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

SSM基础专项复习4——Maven项目管理工具(1)

系列文章 1、SSM基础专项复习1——SSM项目整合-CSDN博客 2、SSM基础专项复习2——Spring 框架&#xff08;1&#xff09;-CSDN博客 3、SSM基础专项复习3——Spring框架&#xff08;2&#xff09;-CSDN博客 文章目录 系列文章 1. Maven 的概念 1.1. 什么是 Maven 1.2. 什…

使用c#进行串口通信

一、串口通信协议 1.串口通信协议简介 串口通信&#xff08;serial communication&#xff09;是一种设备间非常常用的串行通信方式&#xff0c;大部分电子设备都支持&#xff0c;电子工程师再调试设备时也经常使用该通信方式输出调试信息。讲到某一种通信协议&#xff0c;离…

Web开发-PHP应用鉴别修复AI算法流量检测PHP.INI通用过滤内置函数

知识点&#xff1a; 1、安全开发-原生PHP-PHP.INI安全 2、安全开发-原生PHP-全局文件&单函数 3、安全开发-原生PHP-流量检测&AI算法 一、演示案例-WEB开发-修复方案-PHP.INI配置 文章参考&#xff1a; https://www.yisu.com/ask/28100386.html https://blog.csdn.net/…

蓝桥模拟+真题讲解

今天谁一篇文章哈 &#xff01; 由于本篇文章有些的题目只有图片&#xff0c;因此还望各位见谅。 目录 第一题 题目解析 代码原理 代码编写 填空技巧---巧用python 第二题 题目解析 ​编辑 填空技巧---巧用python 第三题 题目链接 题目解析 必备知识 解题技巧 …

C语言【数据结构】:时间复杂度和空间复杂度.详解

引言 详细介绍什么是时间复杂度和空间复杂度。 前言&#xff1a;为什么要学习时间复杂度和空间复杂度 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时…

基于Python的selenium入门超详细教程(第2章)--单元测试框架unittest

学习路线 自动化测试介绍及学习路线-CSDN博客 ​自动化测试之Web自动化&#xff08;基于pythonselenium&#xff09;-CSDN博客 基于Python的selenium入门超详细教程(第1章)--WebDriver API篇-CSDN博客 目录 前言&#xff1a; 一、单元测试 1. 单元测试的定义 2. 单元测…

日志、类加载器、XML(配置文件)

目录 一、日志1.日志技术的概述2.日志技术的体系a. Logback 3.日志的级别 二、类加载器1.概述2.类加载时机3.类加载过程3.类加载器的分类4.常用方法 三、XML&#xff08;配置文件&#xff09;1.概述2.XML的基本语法3.XML的文档约束a.DTD约束b.schema约束 4.XML文档解析a.Dom4jb…

AI大白话(一):5分钟了解AI到底是什么?

&#x1f31f;引言&#xff1a; 在这个信息爆炸的时代&#xff0c;“人工智能”、“AI”、“机器学习”、"深度学习"等词汇频繁出现在我们的生活中。 从手机里的语音助手&#xff0c;到网购平台的个性化推荐&#xff0c;再到最近大火的AI绘画和ChatGPT&#xff0c;人…

蓝桥与力扣刷题(蓝桥 字符统计)

题目&#xff1a;给定一个只包含大写字母的字符出 S, 请你输出其中出现次数最多的字符。如果有多个字母均出现了最多次, 按字母表顺序依次输出所有这些字母。 输入格式 一个只包含大写字母的字等串 S. 输出格式 若干个大写字母&#xff0c;代表答案。 样例输入 BABBACAC样…

AtCoder Beginner Contest 397(ABCDE)

目录 A - Thermometer 翻译&#xff1a; 思路&#xff1a; 实现&#xff1a; B - Ticket Gate Log 翻译&#xff1a; 思路&#xff1a; 实现&#xff1a; C - Variety Split Easy 翻译&#xff1a; 思路&#xff1a; 实现&#xff1a; D - Cubes 翻译&#xff1a…

Profinet转Profinet以创新网关模块为核心搭建西门子和欧姆龙PLC稳定通讯架构案例​

你是否有听过PROFINET主站与PROFINET主站之间需要做数据通讯有需求&#xff1f; 例如西门子1500与霍尼韦尔DCS系统两个主站之间的通讯。应用于PROFINET为主站设备还有欧姆龙、基恩士、罗克韦尔、施耐德、GE、ABB等品牌的PLC或DCS、FCS等平台。在生产或智能领域有通讯需求。两头…

计算机视觉|Swin Transformer:视觉 Transformer 的新方向

一、引言 在计算机视觉领域的发展历程中&#xff0c;卷积神经网络&#xff08;CNN&#xff09; 长期占据主导地位。从早期的 LeNet 到后来的 AlexNet、VGGNet、ResNet 等&#xff0c;CNN 在图像分类、目标检测、语义分割等任务中取得了显著成果。然而&#xff0c;CNN 在捕捉全…