FPGA的呼吸灯设计案例(verilog实现)

编程入门 行业动态 更新时间:2024-10-09 22:19:24

FPGA的<a href=https://www.elefans.com/category/jswz/34/1767763.html style=呼吸灯设计案例(verilog实现)"/>

FPGA的呼吸灯设计案例(verilog实现)

呼吸灯设计案例

  • 案例1:呼吸灯0
  • 案例2:呼吸灯1
  • 案例3:呼吸灯2

案例1:呼吸灯0

实现功能:4个LED同时改变,亮度由PWM信号控制。

实验现象:

4个LED,灭→亮,逐渐变亮,到达最亮后熄灭,再从灭→亮,重复进入下一次循环。

代码实现:

module pwm(input clk,input rst_n,output reg  [3:0] led
);reg [15:0] pwm0,count;always @(posedge clk or negedge rst_n) beginif(!rst_n)count <= 16'b0;else begincount <= count + 1'b1;if(count[15]==1)    //打到周期预设定的数值,就清零count <= 16'b0;if(count < pwm0)        //如果本周期中,周期小于PWM脉宽计数,那么LED就=1led <= 4'b1111;else led <= 4'b0000;            //PWM的低脉冲时候,就为0endendalways @(posedge count[14]) begin         //一个周期前面一点,产生PWM加/减 信号pwm0 <= pwm0 + 1'b1;                                //PWM 在一个周期完成之前加1,用于下一个周期的信号宽度if(pwm0[13]==1)                               //脉宽达到预设定的数值pwm0 <= 16'b0;end endmodule

案例2:呼吸灯1

实现功能:4个LED同时改变,亮度由PWM信号控制。

实验现象:

第1秒:灭→亮,逐渐变亮,达到最亮,

第2秒:亮→灭,逐渐变暗;

……

2s一个周期,重复进入下一次循环。

代码实现:

module breath_led(input        clk,input        rst_n,output  reg [3:0] led);reg flag;// 计数器cnt_2us循环计数,计到99为2us parameter cnt_2us_max = 7'd100 - 1'b1;reg [6:0] cnt_2us;always @(posedge clk or negedge rst_n) beginif (!rst_n)cnt_2us <= 7'd0;else if(cnt_2us == cnt_2us_max)cnt_2us <= 7'd0;elsecnt_2us <= cnt_2us + 1'b1;end// 计数器cnt_2ms循环计数,计到999为2ms parameter cnt_2ms_max = 10'd1000 - 1'b1;reg [9:0] cnt_2ms;always @(posedge clk or negedge rst_n) beginif (!rst_n)cnt_2ms <= 10'd0;else if(cnt_2us == cnt_2us_max && cnt_2ms == cnt_2ms_max)cnt_2ms <= 10'd0;else if(cnt_2us == cnt_2us_max)cnt_2ms <= cnt_2ms + 1'b1;elsecnt_2ms <= cnt_2ms;end// 计数器cnt_2s循环计数,计到999为2s parameter cnt_2s_max = 10'd1000 - 1'b1;reg [9:0] cnt_2s;always @(posedge clk or negedge rst_n) beginif (!rst_n)cnt_2s <= 10'd0;else if(cnt_2us == cnt_2us_max && cnt_2ms == cnt_2ms_max && cnt_2s == cnt_2s_max)cnt_2s <= 10'd0;else if(cnt_2us == cnt_2us_max && cnt_2ms == cnt_2ms_max)cnt_2s <= cnt_2s + 1'b1;elsecnt_2s <= cnt_2s;end//flag标志always @(posedge clk or negedge rst_n) beginif (!rst_n)flag <= 1'd0;else if(cnt_2us == cnt_2us_max && cnt_2ms == cnt_2ms_max && cnt_2s == cnt_2s_max)flag <= ~flag;else flag <= flag;end //brearh_led控制always @(posedge clk or negedge rst_n) beginif (!rst_n)led <= 4'b0000;else if(cnt_2s >= cnt_2ms && flag == 1'b0)led <= 4'b1111;else if(cnt_2s < cnt_2ms && flag == 1'b0)led <= 4'b0000; else if(cnt_2s >= cnt_2ms && flag == 1'b1)led <= 4'b0000;  else if(cnt_2s < cnt_2ms && flag == 1'b1)led <= 4'b1111;      else led <= 4'b0000;endendmodule

案例3:呼吸灯2

实现功能:4个LED同时改变,亮度由PWM信号控制。

实验现象:

占空比越大,LED灯越暗;
占空比越小,LED灯越亮。

第1个2秒: pwm_time <= 19’d450_000;//占空比90%

第2个2秒: pwm_time <= 19’d350_000;//占空比70%

第3个2秒:pwm_time <= 19’d250_000;//占空比50%

第4个2秒:pwm_time <= 19’d100_000;//占空比20%

第5个2秒:pwm_time <= 19’d50_000;//占空比10%

第6个2秒: pwm_time <= 19’d5_000;//占空比1%

第7个2秒: pwm_time <= 19’d100_000;//占空比20%

第8个2秒:pwm_time <= 19’d250_000;//占空比50%

第9个2秒:pwm_time <= 19’d350_000;//占空比70%

第10个2秒: pwm_time <= 19’d450_000;//占空比90%

……

20s一个周期,重复进入下一次循环。

代码实现:

module breathing_led(input        clk,input        rst_n,output  reg [3:0] led);reg flag;// 计数器cnt_10ms循环计数,计到499999为10ms parameter cnt_10ms_max = 19'd500_000 - 1'b1;reg [18:0] cnt_10ms;always @(posedge clk or negedge rst_n) beginif (!rst_n)cnt_10ms <= 19'd0;else if(cnt_10ms == cnt_10ms_max)cnt_10ms <= 19'd0;elsecnt_10ms <= cnt_10ms + 1'b1;end// 计数器cnt_2s循环计数,计到199为2s parameter cnt_2s_max = 8'd200 - 1'b1;reg [7:0] cnt_2s;always @(posedge clk or negedge rst_n) beginif (!rst_n)cnt_2s <= 8'd0;else if(cnt_10ms == cnt_10ms_max && cnt_2s == cnt_2s_max)cnt_2s <= 8'd0;else if(cnt_10ms == cnt_10ms_max)cnt_2s <= cnt_2s + 1'b1;elsecnt_2s <= cnt_2s;end// 计数器cnt_20s循环计数,计到9为20s parameter cnt_20s_max = 4'd10 - 1'b1;reg [3:0] cnt_20s;always @(posedge clk or negedge rst_n) beginif (!rst_n)cnt_20s <= 4'd0;else if(cnt_10ms == cnt_10ms_max && cnt_2s == cnt_2s_max && cnt_20s == cnt_20s_max)cnt_20s <= 4'd0;else if(cnt_10ms == cnt_10ms_max && cnt_2s == cnt_2s_max)cnt_20s <= cnt_20s + 1'b1;elsecnt_20s <= cnt_20s;endreg [18:0] pwm_time;//pwm控制brearhing_ledalways @(posedge clk or negedge rst_n) beginif (!rst_n)led <= 4'b0000;else if(cnt_10ms == pwm_time-1'b1)led <= 4'b1111;     else if(cnt_10ms == cnt_10ms_max) led <= 4'b0000;elseled <= led;end//改变pwm信号的占空比always @(*) begincase(cnt_20s)4'd0: pwm_time <= 19'd450_000;//90%     4'd1: pwm_time <= 19'd350_000;//70% 4'd2: pwm_time <= 19'd250_000;//50% 4'd3: pwm_time <= 19'd100_000;//20%4'd4: pwm_time <= 19'd50_000;//10%4'd5: pwm_time <= 19'd5_000;//1%4'd6: pwm_time <= 19'd100_000;//20% 4'd7: pwm_time <= 19'd250_000;//50% 4'd8: pwm_time <= 19'd350_000;//70%  4'd9: pwm_time <= 19'd450_000;//90% default: pwm_time <= 19'd0;endcase endendmodule

说明:

本文的3个案例,在正点原子FPGA开拓者开发板上亲测有效。

案例中LED的管脚分配如下:

参考资料0: 最简单的FPGA verilog写的 PWM 例子.

参考资料1: FPGA实现呼吸灯功能实验.

更多推荐

FPGA的呼吸灯设计案例(verilog实现)

本文发布于:2024-02-06 06:37:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1747354.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:呼吸   案例   FPGA   verilog

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!