1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【Verilog HDL 训练】第 10 天(PWM 呼吸灯)

【Verilog HDL 训练】第 10 天(PWM 呼吸灯)

时间:2021-10-31 07:55:54

相关推荐

【Verilog HDL 训练】第 10 天(PWM 呼吸灯)

5月8日

PWM

用verilog实现PWM控制呼吸灯。呼吸周期2秒:1秒逐渐变亮,1秒逐渐变暗。系统时钟24MHz,pwm周期1ms,精度1us。

今天的题目我是第一次见,答案借鉴大神的:Verilog没有葵花宝典打卡day10.md

简述PWM

PWM——脉宽调制信号(Pulse Width Modulation),它利用微处理器的数字输出来实现,是对模拟电路控制的一种非常有效的技术,广泛应用于测量、通信、功率控制与变化等许多领域。

LED特效呼吸灯原理

采用pwm的方式,在固定的频率下,采用占空比的方式来实现LED亮度的变化。占空比为0,LED灯不亮,占空比为100%,则LED灯最亮。所以将占空比从0到100%,再从100%到0不断变化,就可以实现LED灯实现特效呼吸。

下面是Verilog描述:

注:上硬件测试时,参数DELAY1000 还是要改为1000,下面代码中的DELAY1000 = 10是愿作者为了仿真方便定的值。

module Breath_LED(input clk, //24Mhzinput rst_n,outputled_out);parameter DELAY24 = 24;//parameter DELAY1000 = 1000;parameter DELAY1000 = 10;//just testwire delay_1us;wire delay_1ms;wire delay_1s;reg pwm;reg[7:0] cnt1;reg[10:0] cnt2;reg[10:0] cnt3;reg display_state;//延时1usalways @(posedge clk or negedge rst_n)beginif(!rst_n)cnt1 <= 6'b0;else if(cnt1 == DELAY24 - 1'b1)cnt1 <= 6'b0;else cnt1 <= cnt1 + 1'b1;endassign delay_1us = (cnt1 == DELAY24 - 1'b1)? 1'b1:1'b0;//延时1msalways @(posedge clk or negedge rst_n)beginif(!rst_n)cnt2 <= 10'b0;else if(delay_1us == 1'b1)beginif(cnt2 == DELAY1000 - 1'b1) cnt2 <= 10'b0;else cnt2 <= cnt2 + 1'b1;endelse cnt2 <= cnt2;endassign delay_1ms = ((delay_1us == 1'b1) && (cnt2 == DELAY1000 - 1'b1))? 1'b1:1'b0;//延时1salways @(posedge clk or negedge rst_n)beginif(!rst_n)cnt3 <= 10'b0;else if(delay_1ms)beginif(cnt3 == DELAY1000 - 1'b1)cnt3 <= 10'b0;else cnt3 <= cnt3 + 1'b1;endelse cnt3 <= cnt3; endassign delay_1s = ((delay_1ms == 1'b1) && (cnt3 == DELAY1000 - 1'b1))? 1'b1:1'b0;//state changealways @(posedge clk or negedge rst_n)beginif(!rst_n)display_state <= 1'b0;else if(delay_1s)//每一秒切换一次led灯显示状态display_state <= ~display_state;else display_state <= display_state;end//pwm信号的产生always @(posedge clk or negedge rst_n)beginif(!rst_n)pwm <= 1'b0;else case(display_state)1'b0: pwm <= (cnt2 < cnt3)? 1'b1:1'b0;1'b1: pwm <= (cnt2 < cnt3)? 1'b0:1'b1;default: pwm <= pwm;endcaseendassign led_out = pwm;endmodule

我给出测试代码:

module Breath_LED_tb();reg clk;reg rst_n;wire led_out;//generate clockinitial beginclk = 0;forever #20 clk = ~clk;end//initializationinitial beginrst_n = 0;#10000rst_n = 1;end//instantiationBreath_LED u_led(.clk(clk),.rst_n(rst_n),.led_out(led_out));endmodule

行为仿真时序图:

参考链接:/ninghechuan/p/6291499.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。