问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

FPGA开发入门:实现流水灯设计详解

创作时间:
作者:
@小白创作中心

FPGA开发入门:实现流水灯设计详解

引用
CSDN
1.
https://m.blog.csdn.net/weixin_63553972/article/details/140699845

在FPGA开发中,流水灯设计是一个经典的入门项目,类似于编程中的"Hello World"。本文将详细介绍如何使用FPGA实现流水灯功能,包括代码编写、测试验证和实际硬件测试的全过程。

一、概述

在学习任何硬件开发时,LED流水灯都是入门级的经典项目,无论是单片机MCU、DSP还是其他硬件平台,LED流水灯都是最基础的实践项目之一。在FPGA开发中,实现流水灯功能同样需要使用计数器作为基础。

二、设计代码的编写

以下是实现流水灯功能的核心代码:

//模块定义
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]}。这行代码通过将最高位和最低位不断交换,实现LED灯的流水效果。

三、测试文件的编写

为了验证设计的正确性,需要编写测试文件:

//定义时间尺度
`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  

需要注意的是,在测试文件中对周期进行了重定义:defparam led_inst.TIME_500ms = 25。这种重定义仅在测试环境中有效,不会影响实际设计文件中的参数值。

四、波形仿真

通过波形仿真,可以观察到LED灯从00011000的循环流水效果。

五、下板验证

实际硬件测试结果如下:




© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号