用FPGA实现呼吸灯功能代码

时间:2019-09-17
本文章向大家介绍用FPGA实现呼吸灯功能代码,主要包括用FPGA实现呼吸灯功能代码使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
module breathing_led_top
(
  input        i_sys_clk,
  input        i_sys_rst_n,
  output [3:0] o_led
);
/* 计数器r_cnt_2us循环计数,计到99为2us */
parameter p_cnt_2us_max = 7'd100 - 1'b1;
reg [7:0] r_cnt_2us = 7'b0;
always @(posedge i_sys_clk or negedge i_sys_rst_n)
begin
  if (i_sys_rst_n == 1'b0)
    r_cnt_2us <= 7'd0;
  else if(r_cnt_2us == p_cnt_2us_max)
    r_cnt_2us <= 7'd0;
  else
    r_cnt_2us <= r_cnt_2us + 1'b1;
end
/* 计数器r_cnt_2ms,每2us加一,计到999为2ms */
parameter p_cnt_2ms_max = 10'd1000 - 1'b1;
reg [9:0] r_cnt_2ms = 10'b0;
always @(posedge i_sys_clk or negedge i_sys_rst_n)
begin
  if (i_sys_rst_n == 1'b0)
    r_cnt_2ms <= 10'd0;
  else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max)
    r_cnt_2ms <= 10'd0;
  else if(r_cnt_2us == p_cnt_2us_max)
    r_cnt_2ms <= r_cnt_2ms + 1'b1;
  else 
    r_cnt_2ms = r_cnt_2ms;
end
/* 计数器r_cnt_2s,每2ms加一,计到999为2s */
parameter p_cnt_2s_max = 10'd1000 - 1'b1;
reg [9:0] r_cnt_2s = 10'b0;
reg [3:0] r_led = 4'b0;
always @(posedge i_sys_clk or negedge i_sys_rst_n)
begin
  if (i_sys_rst_n == 1'b0)
    r_cnt_2s <= 10'd0;
  else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max && r_cnt_2s == p_cnt_2s_max)
    r_cnt_2s <= 10'd0;
  else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max)
    r_cnt_2s <= r_cnt_2s + 1'b1;
  else
    r_cnt_2s <= r_cnt_2s;
end
/* r_flag标志 */
reg r_flag = 1'b0;
always @(posedge i_sys_clk or negedge i_sys_rst_n)
begin
  if (i_sys_rst_n == 1'b0)
    r_flag <= 1'b0;
  else if(r_cnt_2us == p_cnt_2us_max && r_cnt_2ms == p_cnt_2ms_max && r_cnt_2s == p_cnt_2s_max)
    r_flag <= ~r_flag;
  else
    r_flag <= r_flag;
end
/* control */
always @(posedge i_sys_clk or negedge i_sys_rst_n)
begin
  if (~i_sys_rst_n)
    r_led <= 4'b0000;
  else if (r_cnt_2s >= r_cnt_2ms && r_flag == 1'b0)
    r_led <= 4'b1111;
  else if (r_cnt_2s < r_cnt_2ms && r_flag == 1'b0)
    r_led <= 4'b0000;
  else if (r_cnt_2s >= r_cnt_2ms && r_flag == 1'b1)
    r_led <= 4'b0000;
  else if (r_cnt_2s < r_cnt_2ms && r_flag == 1'b1)
    r_led <= 4'b1111;
  else
    r_led <= 4'b0000;
end

/* 信号输出 */
assign o_led = r_led;

endmodule

  

原文地址:https://www.cnblogs.com/ltybk/p/11535630.html