FPGA开发——实现流水灯的设计

一、概述

众所周知,在我们学习任何一款硬件,不管是单片机MCU,DSP以及其他的一系列硬件在内的最开始接触的都是LED流水灯的实现,这就和我们在学习编程时的输出"Hello World"一样,我们在学习FPGA的过程当中也是要从LED流水灯开始学起。

在FPGA开发中我们不管是实现什么功能,基本上都是需要使用计数器作为基础,这里也不例外。

二、设计代码的编写

cpp 复制代码
//模块定义
module  led(
    input rst_n,
    input clk,
    output reg [3:0]  led_out
);


//参数定义
parameter TIME_500ms= 25_000_000;
//内部信号定义
reg [24:0]  cnt;//计数500ms所需要的二进制位数
wire        add_cnt;//计数器开启条件
wire        end_cnt;//计数器结束条件
reg  [3:0]  state_n;
//计数器实现功能,0.5秒技术
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt<=0;
    end
    else if(add_cnt)begin
        if(end_cnt)
            cnt<=0;
        else
            cnt<=cnt+1;
    end
    else
        cnt<=0; 
end
assign add_cnt=1'b1;
assign end_cnt=add_cnt && cnt ==(TIME_500ms-1);

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        led_out<=4'b0011;
    else if(end_cnt)begin
        led_out<={led_out[2:0],led_out[3]};
    end 
    else
        led_out<=led_out;
end 
endmodule

在这个代码中我们需要注意的就是使用拼接符实现LED灯的循环移动led_out<={led_out[2:0],led_out[3]};这句代码实现的就是将最高位和最低位进行不断交换。

三、测试文件的编写

cpp 复制代码
//定义时间尺度
`timescale 1ns/1ps
module led_tb();

//重定义
defparam  led_inst.TIME_500ms = 25;
//内部变量定义
reg clk;
reg rst_n;
wire [3:0] led_out;

//模块实例化
led led_inst(
    /*input              */ .rst_n    (rst_n     ),
    /*input            */ .clk      (clk       ),
    /*output reg [3:0] */ .led_out  (led_out   )
);

//时钟
parameter CLK_CLY =20;
initial clk=0;
always  #(CLK_CLY/2) clk=~clk;

//复位
initial begin
    rst_n =1'b0;
    #(CLK_CLY*2);
    #3;
    rst_n =1'b1;
end 
//激励

endmodule

因为这里我们设置的周期是ms计数,相比于硬件本身的20ns来说非常大,所在我在测试文件中对于周期做了一个重定义------defparam led_inst.TIME_500ms = 25;在测试文件中的重定义不会影响设计文件中的值,所以可以放心使用。

四、波形仿真

在波形图中我们可以看到LED灯从 0001------1000进行不断的循环流水。

四、下板验证

相关推荐
xiaobobo333012 小时前
vscode+clangd打开头文件发现某些标识符不识别为“白色”语言模型识别为C++
vscode·识别头文件错误·标识符为白色·语言模型识别错误
FPGA的花路15 小时前
基于脚本的ModelSim自动化仿真(Xilinx FPGA篇)
fpga开发·xilinx·自动化脚本·modelsim仿真
接着奏乐接着舞19 小时前
vscode 给 Maven 启动的 JVM 加上 `-Dfile.encoding=UTF-8`
jvm·vscode·maven
资深流水灯工程师21 小时前
STM32CubeIDE for VSCode 完整安装与使用指南
vscode
小则又沐风a21 小时前
一步搞定Xshell远程连接vscode的问题
ide·vscode·编辑器
汽车仪器仪表相关领域1 天前
Kvaser Hybrid Pro 2xCAN/LIN 双通道可编程CAN/LIN通讯接口:一机双模可编程,汽车车身混合总线测试专用设备
人工智能·功能测试·安全·fpga开发·汽车·压力测试
szxinmai主板定制专家1 天前
电力设备RK3568/RK3576+FPGA,多系统混合部署Linux+RTOS RT-THREAD,强实时性
linux·运维·服务器·人工智能·嵌入式硬件·fpga开发
ALINX技术博客2 天前
【黑金云课堂】FPGA技术教程Vitis开发:PS端DP接口解析
fpga开发·fpga
97zz2 天前
Claude+deepseek-v4pro+cc switch+VSCode AI编程配置教程(Java开发专属)
java·vscode·ai编程
FakeOccupational2 天前
fpga系列 HDL:跨时钟域同步 shift register同步(CDC)毛刺滤除&解码前去抖动滤波模块
fpga开发