• FPGA之旅设计99例之第一例-----LED灯


    一. 简介

    作为我们这个系列的第一个实例,当然是要越简单越好啦,软件里面有打印hello world,硬件里面有点灯,就从点灯开始,开启这个系列吧。

    欢迎关注微信公众号 FPGA之旅

    二. LED硬件电路

    先来认识一下LED电路图,左边接地,右边接FPGA的引脚,可以看出此电路图为FPGA输出高电平,LED才会亮起,输出低电平,LED灭,就是这么简单。

    请添加图片描述

    三. Verilog代码编写

    先来编写驱动模块,一行代码即可,赋值1为高电平亮,赋值0为低电平灭。

    //顶层模块
    module Top(
    	input		clk,    //输入时钟
        input		rst_n,  //复位时钟
        output		led     //led输出
    );
        
    assign led = 1'b1;    //led输出高电平
    
    endmodule 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    驱动模块编写好了,怎么验证驱动模块是正确的呢,这就需要编写测试模块了,俗称testbeach,当然上板看效果也是可以的啦!

    测试模块如下

    `timescale 1ns/1ps   //测试时间基本单位为1ns,精度为1ps
    module testbeach();
        reg    clk;
        reg	   rst_n;
        wire   led;
        always #50 clk <= ~clk;   //产生时钟
        initial begin
        clk = 1'b0;
        rst_n = 1'b1;    
        #100
        rst_n = 1'b0;        //手动产生一次复位
        #100
        rst_n = 1'b1;
        end    
    Top  TopHP(
        .clk		(clk),    //输入时钟
        .rst_n      (rst_n),  //复位时钟
        .led		(led)     //led输出
     );
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    打开modesim来仿真一下
    请添加图片描述

    自此已经成功点亮了LED灯。

    完了?? ? 怎么可能,既然已经学会了如何点亮LED灯,不来点炫酷的东西怎么好就这样结束呢!!

    四. 流水灯

    流水灯嘛,就是依次点亮LED灯,等等好像那里不对,应该是依次点亮下一个LED灯,同时熄灭当前LED灯。

    假如说开发板上有五个LED灯,初始化的时候,可以先点亮一个LED灯。

    led <= 5'b000_01;
    
    • 1

    然后就是流水操作啦,也就是每隔一定的时间间隔,led的值左移一位,就可以达到流水灯的效果啦。

    led <= led < 1;

    基于代码

    //流水灯,顶层模块
    module LSD(
        input       clk,
        input       rst_n,
        output[4:0] led
    );
    
     //led寄存器
    reg[4:0] ledreg;  
    
    assign led = ledreg;
    
    //计时模块,提供一定的时间间隔
    reg[10:0] cnt;
    always @(posedge clk or negedge rst_n) 
    begin
        if(rst_n == 1'b0)
            cnt <= 1'b0;
        else if(cnt == 'd2)
            cnt <= 'd0;
        else
            cnt <= cnt + 1'b1;
    end
    //led流水灯模块,每一个时间间隔,led流动一次
    always@(posedge clk or negedge rst_n)
    begin
        if(rst_n == 1'b0)
            ledreg <= 5'b000_01;
    
        else if(cnt == 'd2)
            if(ledreg == 5'b10_000)
                ledreg <= 5'b00_001;
            else
                ledreg <= ledreg << 1'b1;
        else
            ledreg <= ledreg;
    end
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    通过波形可以出,流水灯成功啦!!
    请添加图片描述

    这就是最基本的流水灯了,至于其它更多炫酷的效果,就各显神通啦!

  • 相关阅读:
    网络安全考研院校推荐
    【Java 语言】读取 properties 配置文件 ( Java 语言中的 properties 配置文件 | 使用 properties 配置文件 )
    浅谈 Web 3.0
    MySQL迁移数据目录(2022.11.01)
    stm32cubemx hal学习记录:FreeRTOS事件
    在 Vue & react 中,哪些地方用到闭包?
    面试题:Flink反压机制及与Spark Streaming的区别
    【正点原子STM32连载】第十三章 跑马灯实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
    专科出身,2年进苏宁,5年跳阿里,论我是怎么快速晋升的?
    javascript-基础知识
  • 原文地址:https://blog.csdn.net/weixin_44678052/article/details/126293155