当前位置:   article > 正文

02.2 基于Verilog控制LED以不同频率闪烁

02.2 基于Verilog控制LED以不同频率闪烁

02_led_blink_v2

本段代码是为Verilog初学者提供的一个名为led_blink简单实例Verilog模块,其功能是控制6个LED灯同步闪烁,每秒钟闪烁一次。

02_led_blink_v1版本相比新增内容:

  1. 增加一组dip控制引脚,用于控制LED闪烁的速度;

  2. 使用模块级parameter关键词定义一些常量,模块级参数可以在例化模块的时候给出具体值,参数化模块使得代码更具灵活,提高可复用性

  3. 在模块接口的output接口使用reg型变量,因此代码中不再需要assign led = led_q这样的代码,代码更简洁。

  4. 使用唯一的三目运算符( ? :)处理组合逻辑的多路分支。

知识点:

  • 参数化模块 #(parameter)
  • 三目运算符(?:)的用法
module led_blink #(
    parameter ONE_MSECOND = 50*1000,    //clock periods of one millsecond
    parameter ALL_LED_ON  = 6'b000000   //led active low
)(
    input  clk,  
    input  rst_n,

    input wire [5:0] dip_u5,
    output reg [5:0] led
);

localparam ALL_LED_OFF = ~ALL_LED_ON; 

reg [31:0] count; 

wire [1:0] speed = dip_u5[5:4];
wire [31:0] count_max = 
    (speed == 2'b00) ? ONE_MSECOND*1000 :
    (speed == 2'b01) ? ONE_MSECOND*500 :
    (speed == 2'b10) ? ONE_MSECOND*250 : ONE_MSECOND*125;

always @(posedge clk) begin
    if(~rst_n) count <= 0;
    else if(count == count_max-1) count <= 0;
    else count <= count + 1;
end

always @(posedge clk) begin
    if(~rst_n) led <= ALL_LED_ON;
    else if(count == count_max-1) begin
        if(led == ALL_LED_ON) led <= ALL_LED_OFF;
        else led <= ALL_LED_ON;
    end
    //else led <= led;
end

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

闽ICP备14008679号