当前位置:   article > 正文

FPGA学习——verilog实现流水灯_实现开发板载的四个led灯闪烁,要求四个灯以1s的时钟周期闪烁,编写代码并下载到开

实现开发板载的四个led灯闪烁,要求四个灯以1s的时钟周期闪烁,编写代码并下载到开

学习芯片: EP4CE6F17C8

一、使用verilog实现电亮fpga板上的四个灯

verilog代码如下:

module led1(

    output wire  [3:0] led_on
);

assign led_on = 4'b1111 ;

endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

配置引脚,查看芯片的指导书:
在这里插入图片描述
烧录运行结果如下:
在这里插入图片描述
如图我们可以看见开发板上四个led灯同时被电亮。

二、进阶——使led灯间隔一秒闪烁

代码如下:

module led1(
    input wire clk,//时钟信号,50MHz
    input wire rst_n,//复位信号,下降沿有效
    output wire  [3:0] led_on
);

parameter MAX1S = 26'd50_000_000;
reg [25:0] cnt1s;//计数寄存器器1s
reg [3:0]   led_r;//led信号寄存器

always @(posedge clk or negedge rst_n) begin
    if (!rst_n ) begin//复位,重新计数
       cnt1s<=26'd0;
    end
    else if (cnt1s == MAX1S-1'b1)begin//记到最大数,重新计数
       cnt1s<=26'd0;
    end
    else begin//其他情况+1
      cnt1s <= cnt1s + 1'd1;
    end

   
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n ) begin//复位
        led_r = 4'b0000;
    end
    else if (cnt1s == MAX1S-1'b1)begin//记到最大数,翻转
        led_r = ~led_r;
    end
    else begin
        led_r = led_r;
    end
    
end

assign led_on = led_r;

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
  • 40

配置引脚,查看clock和key的引脚:
在这里插入图片描述
运行结果如下图:
在这里插入图片描述

此时可以看见四个led灯同时闪烁。

三、进阶——流水灯及跑马灯实现

流水灯代码实现:

module led1(
    input wire clk,//时钟信号,50MHz
    input wire rst_n,//复位信号,下降沿有效
    output wire  [3:0] led_on
);

parameter MAXS = 25'd25_000_000;
reg [24:0] cnt1s;//计数寄存器器0.5s
reg [3:0]   led_r;//led信号寄存器

always @(posedge clk or negedge rst_n) begin
    if (!rst_n ) begin//复位,重新计数
       cnt1s<=26'd0;
    end
    else if (cnt1s == MAXS-1'b1)begin//记到最大数,重新计数
       cnt1s<=26'd0;
    end
    else begin//其他情况+1
      cnt1s <= cnt1s + 1'd1;
    end

   
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n ) begin//复位
        led_r = 4'b0001;
    end
    else if (cnt1s == MAXS-1'b1)begin//记到最大数,翻转
        led_r = {led_r[2:0],led_r[3]};
    end
    else begin
        led_r = led_r;
    end
    
end

assign led_on = led_r;

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
  • 40

实验效果图如下:
在这里插入图片描述

此时可以看见led灯依次闪烁。

跑马灯代码:

module led1(
    input wire clk,//时钟信号,50MHz
    input wire rst_n,//复位信号,下降沿有效
    output wire  [3:0] led_on
);

parameter MAXS = 25'd25_000_000;
reg [24:0] cnt1s;//计数寄存器器0.5s
reg [3:0]   led_r;//led信号寄存器

always @(posedge clk or negedge rst_n) begin
    if (!rst_n ) begin//复位,重新计数
       cnt1s<=26'd0;
    end
    else if (cnt1s == MAXS-1'b1)begin//记到最大数,重新计数
       cnt1s<=26'd0;
    end
    else begin//其他情况+1
      cnt1s <= cnt1s + 1'd1;
    end

   
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n ) begin//复位
        led_r = 4'b0001;
    end
    else if (cnt1s == MAXS-1'b1)begin//记到最大数,翻转
        led_r = {led_r[2:0],~led_r[3]};
    end
    else begin
        led_r = led_r;
    end
    
end

assign led_on = led_r;

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
  • 40

实验效果图如下:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/630102
推荐阅读
相关标签
  

闽ICP备14008679号