FPGA-流水灯

news2025/3/19 19:27:14

Quartus中使用Verilog实现

根据之前所学内容,打开Quartus 软件,新建FPGA项目文件,建立好空项目过后,选择Verilog HDL File,因为我们要使用Verilog代码实现仿真。

详细操作可参考往期博客:

FPGA 实验报告:四位全加器与三八译码器仿真实现_quartus 四位二进制全加器-CSDN博客

然后输入以下代码:

代码展示

module led_flow #(parameter TIME_1S = 50_000_000)(  

    input               sys_clk     ,

    input               sys_rst_n   ,

    output  reg [5:0]   led         

);

    reg     [25:0]      cnt     ;  

    wire                add_cnt ;

    wire                end_cnt ;

    reg     [2:0]       cnt1;

    wire                add_cnt1;

    wire                end_cnt1;

    // 时间基准计数器模块

    always @(posedge sys_clk or negedge sys_rst_n)begin

        if(!sys_rst_n) begin

            cnt <= 26'b0;  // 修改为26位清零

        end

        else if(add_cnt) begin

            if(end_cnt) begin

                cnt <= 26'b0;  // 26位清零

            end

            else begin

                cnt <= cnt+1'b1;

            end

        end

        else begin

            cnt <= cnt;

        end

    end

    // LED状态计数器模块

    always @(posedge sys_clk or negedge sys_rst_n) begin

        if(!sys_rst_n)begin

            cnt1 <= 3'b0;

        end

        else if(add_cnt1) begin

            if(end_cnt1)begin

                cnt1 <= 3'b0;

            end

            else begin

                cnt1 <= cnt1 + 1'b1;

            end

        end

    end

    // LED控制逻辑模块

    always @(posedge sys_clk or negedge sys_rst_n)begin

        if(!sys_rst_n)begin

            led <= 6'b0;  // 6位LED清零

        end

        else begin

            case (cnt1)

                3'b000 : led <= 6'b000001;  // 6位LED的点亮顺序

                3'b001 : led <= 6'b000010;

                3'b010 : led <= 6'b000100;

                3'b011 : led <= 6'b001000;

                3'b100 : led <= 6'b010000;

                3'b101 : led <= 6'b100000;

                3'b110 : led <= 6'b000001;  // 循环回到第一个LED

                default: led <= led;

            endcase

        end

    end

    // 信号赋值模块

    assign add_cnt = 1'b1;

    assign end_cnt = add_cnt && cnt == TIME_1S - 1;  // 1秒的时间基准

    assign add_cnt1 = (cnt == TIME_1S-1);  

    assign end_cnt1 = add_cnt1 && cnt1 == 3'b110;  // 6个LED的状态计数器最大值

endmodule

模块讲解

在上述代码中共有四个显著的模块,分别为

时间基准计数器模块

这部分实现了一个计数器,用于产生1秒的时间基准。在代码中定义了一个26位的寄存器cnt,用于存储计数值。当系统复位信号sys_rst_n为低电平时,计数器cnt被清零。

在每个时钟上升沿,如果add_cnt信号有效(始终为高电平),计数器cnt会增加。当计数器cnt达到TIME_1S - 1(即49,999,999)时,end_cnt信号有效,表示1秒的时间基准已到,计数器会清零并重新开始计数。

LED状态计数器模块:

这部分实现了一个计数器,用于控制6个LED的点亮顺序。在代码中定义了一个3位的寄存器cnt1,用于存储LED的状态计数值。

当系统复位信号sys_rst_n为低电平时,计数器cnt1被清零。

在每个时钟上升沿,如果add_cnt1信号有效(当时间基准计数器达到预设值时),计数器cnt1会增加。当计数器cnt1达到6(即3'b110)时,end_cnt1信号有效,表示LED状态计数器已到最大值,计数器会清零并重新开始计数。

LED控制逻辑模块:

这部分实现了控制6个LED灯的点亮顺序。当系统复位信号sys_rst_n为低电平时,所有LED被设置为熄灭状态。

根据LED状态计数器cnt1的值,控制6个LED灯的点亮顺序。使用case语句实现不同状态下的LED点亮模式。

当cnt1为3'b000时,点亮第一个LED(led[0])。

当cnt1为3'b001时,点亮第二个LED(led[1])。

依此类推,直到cnt1为3'b101时,点亮第六个LED(led[5])。

当cnt1为3'b110时,循环回到第一个LED,实现跑马灯效果。

信号赋值模块:

这部分实现了对控制信号进行赋值,用于协调计数器和LED控制逻辑的工作。

dd_cnt:始终为高电平(1'b1),表示时间基准计数器cnt始终在计数。

end_cnt:当时间基准计数器cnt达到TIME_1S - 1(即49,999,999)时,end_cnt信号有效,表示1秒的时间基准已到。

add_cnt1:当时间基准计数器cnt达到TIME_1S - 1时,add_cnt1信号有效,表示需要增加LED状态计数器cnt1的值。

end_cnt1:当LED状态计数器cnt1达到6(即3'b110)时,end_cnt1信号有效,表示LED状态计数器已到最大值,需要清零。

在这里要注意:module led_flow #(......)中,led_flow要和顶层模块名称相同,不然编译会出错。

运行与烧录

完成代码的copy过后,点击保存:

然后选择file文件,右键led.v将其设置为顶层文件;

点击Assignments',选择目录下的Pin Planner进行引脚分配;

随后进行烧录,详细烧录教程可以参考CSDN博客:

Nios实验入门——用Verilog编程方式完成LED流水灯显示并使用串口输出“Hello Nios-II”字符到笔记本电脑_verilog led灯-CSDN博客

运行效果截图:

VScode分模块化实现

vscode下载与汉化

首先下载VScode:code.visualstudio.com

在官网链接下载并成功安装过后,打开软件,根据操作,选择汉化扩展:

扩展下载

随后再下载两个扩展,实现FPGA的Verilog代码;

代码示例

随后根据我们的代码,用模块化设计实现,在这里分为top顶层模块(比如LedBlink.v)、分频模块(fenpin.v)、显示模块(display.v);

1、顶层模块 LedBlink.v

module LedBlink (

    input sys_clk,      // 系统时钟

    input sys_rst_n,    // 系统复位信号,低电平有效

    output reg [5:0] led // 6个LED输出

);

    // 分频模块信号

    wire clk_1s; // 1秒时钟信号

    // 实例化分频模块

    fenpin #(.TIME_1S(50_000_000)) u_fenpin (

        .sys_clk(sys_clk),

        .sys_rst_n(sys_rst_n),

        .clk_out(clk_1s)

    );

    // 实例化显示模块

    display u_display (

        .sys_clk(sys_clk),

        .sys_rst_n(sys_rst_n),

        .clk_1s(clk_1s),

        .led(led)

    );

endmodule

2、分频模块 fenpin.v

module fenpin #(

    parameter TIME_1S = 50_000_000 // 1秒的时间基准,假设系统时钟为50MHz

)(

    input sys_clk,      // 系统时钟

    input sys_rst_n,    // 系统复位信号,低电平有效

    output reg clk_out  // 分频后的1秒时钟信号

);

    reg [25:0] cnt; // 计数器,用于产生1秒的时间基准

    always @(posedge sys_clk or negedge sys_rst_n) begin

        if (!sys_rst_n) begin

            cnt <= 26'b0; // 复位时计数器清零

            clk_out <= 1'b0; // 分频时钟信号初始化

        end

        else begin

            if (cnt == TIME_1S - 1) begin

                cnt <= 26'b0; // 计数器达到预设值时清零

                clk_out <= ~clk_out; // 翻转分频时钟信号

            end

            else begin

                cnt <= cnt + 1'b1; // 计数器加1

            end

        end

    end

endmodule

3、显示模块 display.v

module display (

    input sys_clk,      // 系统时钟

    input sys_rst_n,    // 系统复位信号,低电平有效

    input clk_1s,       // 1秒时钟信号

    output reg [5:0] led // 6个LED输出

);

    reg [2:0] cnt1; // LED状态计数器

    always @(posedge sys_clk or negedge sys_rst_n) begin

        if (!sys_rst_n) begin

            cnt1 <= 3'b0; // 复位时计数器清零

            led <= 6'b0; // LED初始化为熄灭状态

        end

        else if (clk_1s) begin // 在1秒时钟信号的上升沿更新LED状态

            case (cnt1)

                3'b000: led <= 6'b000001; // 点亮第一个LED

                3'b001: led <= 6'b000010; // 点亮第二个LED

                3'b010: led <= 6'b000100; // 点亮第三个LED

                3'b011: led <= 6'b001000; // 点亮第四个LED

                3'b100: led <= 6'b010000; // 点亮第五个LED

                3'b101: led <= 6'b100000; // 点亮第六个LED

                3'b110: begin

                    led <= 6'b000001; // 循环回到第一个LED

                    cnt1 <= 3'b000; // 计数器清零

                end

                default: led <= led; // 默认情况保持当前状态

            endcase

            if (cnt1 != 3'b110) begin

                cnt1 <= cnt1 + 1'b1; // 计数器加1

            end

        end

    end

endmodule

  分模块化设计能降低复杂度,让每个模块功能明确且简单,同时提高代码可读性和维护性,便于团队协作和后期功能扩展。它还能增强代码复用性,减少重复开发,通过清晰的模块接口和职责划分,使系统更灵活、更易调试和升级,从而提升整体设计质量和开发效率。

实验结果

fpga流水灯视频

总结与思考

  本次实验让我对FPGA开发有了更深入的理解和实践,不仅掌握了Verilog HDL编程的基本技巧,还学会了如何运用模块化设计思想将复杂系统分解为功能明确的模块,从而降低开发难度并提高代码的可维护性和复用性。在实验中遇到的问题,如顶层模块名称不匹配、信号连接错误以及时钟分频不准确等,通过仔细检查和逻辑分析得以解决,这个过程显著提升了我的问题解决能力。展望未来,我将继续深入学习FPGA的高级功能,探索其与物联网技术的结合点,并积极参与实际项目和竞赛,以积累更多经验,为未来的职业发展打下坚实基础。

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

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

相关文章

browser-use WebUI + DeepSeek 基于AI的UI自动化解决方案

browser-use WebUI 一、browser-use是什么Browser-use采用的技术栈为&#xff1a; 二、browser-use webui 主要功能使用场景 三、使用教程1.python 安装2、把项目clone下来3、安装依赖4、配置环境5、启动6、配置1.配置 Agent2.配置要用的大模型3.关于浏览器的一些设置 四、Deep…

什么是YApi?开源接口管理平台部署教程

YApi 到底是个啥&#xff1f; 各位小伙伴们好呀&#xff01;今天要给大家介绍的是一款超级好用的接口管理神器——YApi&#xff01;它是一个高效、易用、功能强大的 API 管理平台&#xff0c;简直就是开发、产品、测试人员的福音啊&#xff01;&#xff01;&#xff01;它能帮…

深入理解事务

在数据库管理中&#xff0c;事务是一个至关重要的概念。无论是金融交易、库存管理还是用户数据更新&#xff0c;事务都确保了数据的完整性和一致性。本文将详细介绍为什么需要事务、什么是事务、事务的四大特征、如何在MySQL中使用事务以及MyBatis对事务的配置。 一、为什么需…

基于SpringBoot + Vue 的药店药品信息管理系统

基于SpringBootVue的药品药店药房信息系统(带文档) 角色: 用户&#xff0c;管理员&#xff0c;员工 功能: 管理员: 首页、个人中心、用户管理、员工管理、药品类别管理、药品信息管理、药品入库管理、药品出库管理、在线咨询管理、留言板管理、系统管理、订单管理。 用户:…

ubuntu下TFTP服务器搭建

tftp 命令的作用和 nfs 命令一样&#xff0c;都是用于通过网络下载东西到 DRAM 中&#xff0c;只是 tftp 命令 使用的 TFTP 协议&#xff0c; Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器&#xff0c; 需要安装 tftp-hpa 和 tftpd-hpa&#xff0c;命令…

解决:ModuleNotFoundError: No module named ‘_sqlite3‘

报错&#xff1a; from _sqlite3 import * ModuleNotFoundError: No module named _sqlite3安装sqlite3支持组件: sudo apt-get install libsqlite3-dev进入之前下载的python包下&#xff0c;重新编译和安装Python ./configure --enable-loadable-sqlite-extensions make &a…

技术债务的隐患:何时重构,何时妥协?

在快节奏的软件开发环境中&#xff0c;企业为了抢占市场或满足紧迫需求&#xff0c;往往不得不在短期内采取“捷径”来加速产品交付&#xff0c;这便引入了“技术债务”。短期内看似能迅速交付&#xff0c;但随着时间推移&#xff0c;这些未优化的代码和架构缺陷会逐渐累积&…

c#Winform也可以跨平台了GTK框架GTKSystem.Windows.Forms

一、简介 >> 新版下载&#xff0c;问题求助 QQ群&#xff1a;1011147488 1032313876 236066073&#xff08;满&#xff09; Visual Studio原生开发&#xff0c;无需学习&#xff0c;一次编译&#xff0c;跨平台运行. C#桌面应用程序跨平台&#xff08;windows、linux、…

ABAP PDF预览

画个屏幕 PDF JPG TXT都可以参考预览&#xff0c;把二进制流传递给标准函数就行 *&---------------------------------------------------------------------* *& Report YDEMO2 *&---------------------------------------------------------------------* *&am…

网络爬虫【爬虫库urllib】

我叫不三不四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲爬虫 urllib介绍 Urllib是Python自带的标准库&#xff0c;无须安装&#xff0c;直接引用即可。 Urllib是一个收集几个模块来使用URL的软件包&#xff0c;大致具备以下功能。 ● urlli…

卷积神经网络 - 卷积层

卷积神经网络一般由卷积层、汇聚层和全连接层构成&#xff0c;本文我们来学习卷积层。 卷积层&#xff08;Convolutional Layer&#xff09;是卷积神经网络&#xff08;CNN&#xff09;的核心组件&#xff0c;专门用于处理具有网格结构的数据&#xff08;如图像、音频、时间序…

玩转 Tailwind CSS:深入解析函数与指令

玩转 Tailwind CSS&#xff1a;深入解析函数与指令 如果你正在使用 Tailwind CSS&#xff0c;可能已经习惯了各种 text-center、mt-4 这样的类名&#xff0c;但你知道吗&#xff1f;Tailwind 其实还隐藏着一套 强大的函数与指令系统&#xff0c;可以让你的代码更加优雅、可维护…

Axure设计之下拉多选框制作教程C(中继器)

利用Axure制作下拉多选器组件可以极大地提升原型制作的效率和效果。以下是基于你提供的详细步骤的详细指导&#xff0c;帮助你在Axure中实现一个功能完善、高保真且可复用的下拉多选器组件。 一、案例预览 预览地址&#xff1a;https://pghy0i.axshare.com 实现效果包括&#…

Java基础语法练习42(基本绘图-基本的事件处理机制-小坦克的绘制-键盘控制坦克移动)

目录 一、图形的基本绘制 1.基本介绍&#xff1a; 2.入门代码如下&#xff1a; 3.常用图形的绘制, 示例代码如下&#xff1a; 二、坦克的绘制 三、事件处理机制 四、坦克的移动 一、图形的基本绘制 1.基本介绍&#xff1a; Component 类提供了两个和绘图相关最重要的方…

RabbitMQ 入门

RabbitMQ 入门 1RabbitMQ 介绍 RabbitMQ 是信息传输的中间者。本质上&#xff0c;他从生产者&#xff08;producers&#xff09;接收消息&#xff0c;转发这些消息给消费者&#xff08;consumers&#xff09;.换句话说&#xff0c;他能够按根据你指定的规则进行消息转发、缓冲…

yolo环境 pytorch环境配置 CUDA安装

我的成功案例&#xff1a;首先安装python 3.12.9的conda虚拟环境 &#xff08;如果不安装3.12的会报错误ModuleNotFoundError&#xff1a;没有名为“numpy._core”的模块&#xff09; 然后安装11.8cuda &#xff08;其实我是可以最高安装12.6的cuda但我实测&#xff0c;太高版…

ESP32(4)TCP通信

本章重点讲解 lwIP 的 Socket接口如何配置 TCP客户端&#xff0c;并在此基础上实现收发功能。 TCP Client 连接流程 在实现 TCP 协议之前&#xff0c;用户需要按照以下步骤配置结构体 sockaddr_in 的成员变量&#xff0c;以便建立 TCPClient 连接&#xff1a; ①&#xff1a;…

数学建模:MATLAB循环神经网络

一、简述 1.循环神经网络 循环神经网络&#xff08;RNN&#xff09;是一种用于处理序列数据的神经网络。不同于传统的前馈神经网络&#xff0c;RNN在隐藏层中加入了自反馈连接&#xff0c;使得网络能够对序列中的每个元素执行相同的操作&#xff0c;同时保持一个“记忆”状态…

EagleTrader为何重申重要数据前后2分钟禁止交易?

3月12日&#xff0c;美国公布了2月份的CPI数据。 美国2月未季调CPI年率录得2.8%&#xff0c;为去年11月来新低&#xff0c;低于市场预期的2.9%。 美国2月季调后CPI月率录得0.2%&#xff0c;为去年10月来新低&#xff0c;预期值为0.3%&#xff0c;前值为0.5%。 数据公布后&#…

个人blog系统 前后端分离 前端js后端go

系统设计&#xff1a; 1.使用语言&#xff1a;前端使用vue&#xff0c;并使用axios向后端发送数据。后端使用的是go的gin框架&#xff0c;并使用grom连接数据库实现数据存储读取。 2.设计结构&#xff1a; 最终展示&#xff1a;仅展示添加模块&#xff0c;其他模块基本相似 前…