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

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

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灯的顺序点亮。

相关文章:

  • Python游戏开发自学指南:从入门到实践(第四天)
  • Python 基础知识整理笔记
  • Spring 事务失效的 8 种场景!
  • mac intel芯片下载安卓模拟器
  • 怎么解决在Mac上每次打开文件夹都会弹出一个新窗口的问题
  • 设计模式(行为型)-备忘录模式
  • C++初阶——类和对象(三) 构造函数、析构函数
  • 开源新星DeepSearcher:用AI重新定义“搜索”的边界
  • 【004】deepseek本地化部署后,python的调用方式_#py
  • Leetcode2272:最大波动的子字符串
  • Java多线程入门
  • 基于牛优化( OX Optimizer,OX)算法的多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码
  • aws(学习笔记第三十三课) 深入使用cdk 练习aws athena
  • A* floyd算法 bellman-ford
  • 使用傅里叶变换测量声卡的频率失真
  • DeepSeek提示词高级指南:正反向组合的工程化实践
  • 【人工智能】【Python】在Scikit-Learn中使用网格搜索对决策树调参
  • 不同路径
  • Linux项目自动化构建工具-make/Makefile
  • 兴达易控modbus协议转换网关配置步骤
  • 17来做网站/每日新闻摘抄10条
  • 株洲网站制作/北京网站优化排名推广
  • 建立一个企业网站/网上销售平台
  • 无锡做网站建设/有哪些搜索引擎
  • wordpress网站工具栏/排名前十的小说
  • 广州广告网站建设/四川省人民政府