FPGA之流水灯

LED(Light Emitting Diode)发光二极管
特点:工作电流小,可靠性高,寿命长。
直插式二极管,管脚长的一端为阳极,短的一端为阴极;单项导电
里插入图片描述
贴片式二极管,有颜色标记的是阴极,对应另一侧是阳极。
在这里插入图片描述

电路原理图:
在这里插入图片描述
LED灯与FPGA开发版的管脚连接:
在这里插入图片描述

流水灯设计

在这里插入图片描述
50Mhz时钟是外部50MHz晶振提供的,整个系统的驱动时钟。
复位信号低电平有效,与外部复位按键连接。
计时器用来计算0.2s的时间,即四个LED灯轮流亮的间隔。
移位寄存器控制四个LED灯的亮灭。

移位寄存器:分别对应LED0,LED1,LED2,LED3
在这里插入图片描述
小插曲:系统时钟是50Mhz,所以时钟周期是20ns。计数器需要对系统时钟进行计数,计时0.2秒。
1秒=1000毫秒(ms)
1秒=1000,000微妙(us)
1秒=1000,000,000纳秒(ns)
0.2秒/20ns = 2000,000,00/20=1000,000,0,需要24bit数据
对系统时钟计数1000,000,0次。

流水灯代码:

module flow_led_1(
    input            sys_clk50,  //50Mhz的系统时钟,所以时钟周期是20ns
    input            rst_n,     //复位按键
    
    output reg [3:0] led        //led灯的寄存器
);

reg [23:0] cnt; //计数器  对系统时钟进行计数,计时0.2秒

//0.2秒计数器
always @(posedge sys_clk50 or negedge rst_n)
begin
    if(!rst_n)
        cnt <= 1'b0;
    else
        if(cnt < 24'd1000_0000)
            cnt <= cnt + 1'b1;
        else 
            cnt <= 24'd0;
end 

//使用移位寄存器控制LED灯
always @(posedge sys_clk50 or negedge rst_n)
begin
    if(!rst_n)
        led <= 4'b0001;
    else
        if(cnt == 24'd1000_0000)  //检测计数到0.2秒
            led <= {led[2:0],led[3]}; //将led寄存器的第三位放到前面,第四位放置第一位
         else
         led <= led; //计数还未到达0.2秒,保持灯的状态不变
end

endmodule 

运行后,设置管脚
在这里插入图片描述
编译并下载到开发版。

发布了9 篇原创文章 · 获赞 7 · 访问量 3196

猜你喜欢

转载自blog.csdn.net/yijiancmy/article/details/104178892