設(shè)計(jì)背景:
呼吸燈廣泛應(yīng)用于手機(jī)之上,并成為各大品牌新款手機(jī)的賣點(diǎn)之一。如果手機(jī)里面有未處理的通知,比如說(shuō)未接來(lái)電,未查收的短信等等,呼吸燈就會(huì)在控制之下完成由亮到暗的逐漸變化,感覺(jué)好像是人在呼吸,起到一個(gè)通知提醒的作用。
設(shè)計(jì)原理:
關(guān)于呼吸燈設(shè)計(jì)實(shí)現(xiàn)的理論主要是PWM有關(guān)知識(shí)。PWM(Pluse Width Modulation)脈沖寬度調(diào)制,是一種對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼的方法。通過(guò)高分辨率計(jì)數(shù)器的使用,方波的占空比被調(diào)制用來(lái)對(duì)一個(gè)具體模擬信號(hào)的電平進(jìn)行編碼。并廣泛應(yīng)用在從測(cè)量、通信、功率控制與變換及LED照明等許多領(lǐng)域中。顧名思義,就是占空比可調(diào)的信號(hào),那么什么是占空比呢?
占空比(Duty Cycle or Duty Ratio),可以解釋為,在一脈沖序列中(方波),正脈沖序列的持續(xù)時(shí)間與脈沖總周期的比值。也可理解為,電路釋放能量的有效時(shí)間與總釋放時(shí)間的比值。
PWM是怎樣實(shí)現(xiàn)調(diào)光呢?想要調(diào)節(jié)LED的亮度變化,實(shí)則是調(diào)節(jié)控制流經(jīng)LED的電流。電流增大則LED亮度增強(qiáng),反之減弱。但由于電流為模擬信號(hào),所以這時(shí)就用到了PWM。正如下圖所示:
使用一系列等幅不等寬的脈沖來(lái)代替一個(gè)正弦波,脈沖的寬度根據(jù)正弦波a的幅度變化,幅度高,則脈沖寬,反之。
多數(shù)負(fù)載需要的PWM調(diào)制頻率都高于10Hz,要想實(shí)現(xiàn)呼吸燈的效果,必須提高調(diào)制頻率,通常調(diào)制頻率為1Khz~200Khz之間。在LED控制中PWM作用于電源部分,脈寬調(diào)制的脈沖頻率通常大于100Hz,人眼就不會(huì)感到閃爍。這里我們?nèi)WM調(diào)制頻率為1KHz,PWM周期為1ms。
脈沖頻率一定時(shí),輸出脈沖的占空比越大,相當(dāng)于輸出的有效電平越大,隨著占空比的不同,LED的亮度也將不同。如占空比為0時(shí),則LED不亮,為100%時(shí),則LED最量,我們讓占空比從0~100%變化,再?gòu)?/span>100%~0不斷變化,則就可實(shí)現(xiàn)呼吸燈效果。
本設(shè)計(jì)呼吸燈的一個(gè)周期為2s,分為占空比增“吸”和占空比減“呼”兩種模式,每個(gè)為1s,一個(gè)PWM周期為2ms,所以每個(gè)模式包含1000個(gè)PWM周期,將每個(gè)PWM周期分為1000份,即每個(gè)時(shí)間段2us。
設(shè)計(jì)架構(gòu)圖:
時(shí)鐘50M
設(shè)計(jì)代碼:
設(shè)計(jì)模塊
0modulehuxi_led_state(clk,led,rst_n);
1 inputclk;
2 inputrst_n;
3
4 outputregled;
5
6 parameterT =100_000;
7
8 localparams0 =1'b0;
9 localparams1 =1'b1;
10
11 reg[25:0]lw;
12 reg[25:0]hw;
13
14 reg[16:0]count;
15
16 // 產(chǎn)生2MS的脈沖
17 always@(posedgeclk ornegedgerst_n)
18 if(!rst_n)
19 begin
20 count <=1'b0;
21 end
22 else
23 begin
24 if(count ==T -1)
25 begin
26 count <=1'b0;
27 end
28 else
29 begin
30 count <=count +1'b1;
31 end
32 end
33
34 wireflag;
35 assignflag =(count ==T -1)?1'b1:1'b0;
36
37 regstate;
38
39 // 通過(guò)在一個(gè)周期中加減高低電平的時(shí)間來(lái)產(chǎn)生PWM波
40 always@(posedgeclk ornegedgerst_n)
41 if(!rst_n)
42 begin
43 lw <=T -100;
44 hw <=100;
45 state <=1'b0;
46 end
47 else
48 begin
49 case(state)
50 s0:begin
51 if(flag &&(lw >100))//判斷低電平的時(shí)間
52 begin
53 lw <=lw -100;
54 hw <=hw +100;
55 state <=s0;
56 end
57 elseif(flag &&(lw ==100))
58 begin
59 hw <=hw -100;
60 lw <=lw +100;
61 state <=s1;
62 end
63 else
64 begin
65 hw <=hw;
66 lw <=lw;
67 state <=s0;
68 end
69 end
70 s1:begin
71 if(flag &&(hw >100))//判斷高電平的時(shí)間
72 begin
73 hw <=hw -100;
74 lw <=lw +100;
75 state <=s1;
76 end
77 elseif(flag &&(hw ==100))
78 begin
79 hw <=hw +100;
80 lw <=lw -100;
81 state <=s0;
82 end
83 else
84 begin
85 hw <=hw;
86 lw <=lw;
87 state <=s1;
88 end
89 end
90 default:state <=s0;
91 endcase
92 end
93
94 reg[25:0]cnt;
95 regsum;
96
97 //分頻模塊,產(chǎn)生不同占空比的LED亮的時(shí)間
98 always@(posedgeclk ornegedgerst_n)
99 if(!rst_n)
100 begin
101 sum <=1'b0;
102 led <=1'b1;
103 cnt <=1'b0;
104 end
105 else
106 case(sum)
107 s0:begin
108 if(cnt <hw -1)//高電平的時(shí)間
109 begin
110 led <=1'b0;
111 cnt <=cnt +1'b1;
112 end
113 else
114 begin
115 cnt <=1'b0;
116 sum <=s1;
117 end
118 end
119 s1:begin
120 if(cnt <lw -1)//低電平的時(shí)間
121 begin
122 led <=1'b1;
123 cnt <=cnt +1'b1;
124 end
125 else
126 begin
127 cnt <=1'b0;
128 sum <=s0;
129 end
130 end
131 default:sum <=s0;
132 endcase
133
134endmodule
測(cè)試模塊
0`timescale1ns/1ps
1 modulehuxi_led_state_tb();
2 regclk;
3 regrst_n;
4
5 wireled;
6
7 parameterT =100_000;
8
9 initialbegin
10 clk =1'b1;
11 rst_n =1'b0;
12
13 #200.1rst_n =1'b1;
14
15
16 end
17
18 always#10clk =~clk;
19
20
21
22 huxi_led_state huxi_led_state_date(//例化設(shè)計(jì)
23 .clk(clk),
24 .led(led),
25 .rst_n(rst_n)
26 );
27 endmodule
仿真圖:
仿真中可以看到點(diǎn)亮led等高電平在不停的增高,然后會(huì)降低,通過(guò)驗(yàn)證我們的設(shè)計(jì)是正確的。
-
FPGA
+關(guān)注
關(guān)注
1625文章
21636瀏覽量
601315
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論