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

FPGA-VIVADO学习:使用D触发器和计数器实现LED灯闪烁

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

FPGA-VIVADO学习:使用D触发器和计数器实现LED灯闪烁

引用
CSDN
1.
https://blog.csdn.net/waS_511/article/details/146316915

本教程将介绍如何使用FPGA开发工具VIVADO实现LED灯闪烁的功能。通过学习D触发器和计数器的工作原理,以及Verilog代码的编写和仿真测试,读者可以掌握基本的FPGA开发技能。

原理详解

D触发器

CK是时钟,Q是输出。


D触发器在时钟信号CK的上升沿读取输入D的值,并将其存储和输出。

计数器

计数器通过加法器add在每个时钟上升沿递增计数值。

Verilog实现

本设计采用低电平有效的复位信号。根据系统时钟频率33.333333MHz(周期30ns)和目标闪烁周期500ms,计算出计数器的最大值:

500ms = 500 * 1000 * 1000 ns = 16,666,666.666666

Verilog代码如下:

module led_twinkle(
    Clk,
    Reset_n,
    Led
    );
    
    input Clk;
    input Reset_n;
    output reg Led;
    
    reg [24:0]counter;
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        counter<=0;
    else if (counter==16666666)//25000000
        counter<=0;
    else
        counter<=counter+1'd1;
        
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
    Led<=1'b0;
    else if(counter==16666666)
        Led<=!Led;
     
endmodule  

仿真代码

`timescale 1ns / 1ns
module led_twinkle_tb(    );
    reg Clk;
    reg Reset_n;
    wire Led;
 
led_twinkle led_twinkle_inst0(
    .Clk(Clk),
    .Reset_n(Reset_n),
    .Led(Led)
    );
    
    initial Clk=1;
    always #15 Clk=~Clk;
    
    initial begin
        Reset_n=0;
        #301;
        Reset_n=1;
        #2000_000_000;
        $stop;
    
    end
      
endmodule

板块验证

在硬件平台上,可以通过按键产生复位信号。根据设计要求配置IO口并生成比特流文件。需要注意的是,实际测试中发现频率计算有误,应使用50MHz而非33.333333MHz进行计算。

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