脈沖宽(kuān)度(dù)調制(pulse width modelation)簡稱PWM,利用(yòng)微处理器的(de)數字(zì)輸出(chū)来(lái)对(duì)模拟電(diàn)路(lù)進(jìn)行控制的(de)一(yī)種(zhǒng)非(fēi)常有(yǒu)效的(de)技術(shù),廣泛應(yìng)用(yòng)在(zài)從测量(liàng)、通(tòng)信(xìn)到(dào)功率控制與(yǔ)變(biàn)換的(de)许多(duō)領域中(zhōng)脈沖宽(kuān)度(dù)調制是(shì)利用(yòng)微处理器的(de)數字(zì)輸出(chū)来(lái)对(duì)模拟電(diàn)路(lù)進(jìn)行控制的(de)一(yī)種(zhǒng)非(fēi)常有(yǒu)效的(de)技術(shù),廣泛應(yìng)用(yòng)在(zài)從测量(liàng)、通(tòng)信(xìn)到(dào)功率控制與(yǔ)變(biàn)換的(de)许多(duō)領域中(zhōng)。
在(zài)本(běn)章(zhāng)的(de)應(yìng)用(yòng)中(zhōng)可(kě)以(yǐ)認为(wèi)PWM就(jiù)是(shì)一(yī)種(zhǒng)方(fāng)波(bō)。如(rú)图(tú)2-7所(suǒ)示。
图(tú)2-7 PWM波(bō)形图(tú)
一(yī)个(gè)周期(qī)为(wèi)10ms,高(gāo)電(diàn)平为(wèi)6ms,低電(diàn)平时(shí)間(jiān)为(wèi)4ms的(de)PWM,其占空比(高(gāo)電(diàn)平时(shí)間(jiān)占整个(gè)周期(qī)的(de)比例)为(wèi)60%。
明(míng)德揚的(de)FPGA開(kāi)發(fà)板共(gòng)有(yǒu)8个(gè)LED燈(dēng)。産生(shēng)8个(gè)管(guǎn)脚的(de)PWM图(tú),如(rú)图(tú)2-8所(suǒ)示。每个(gè)管(guǎn)脚对(duì)應(yìng)的(de)占空比分(fēn)别为(wèi):80%、70%、60%、50%、40%、30%、20%和(hé)10%。系(xì)統工作时(shí)鐘(zhōng)100MHz。
图(tú)2-8 各(gè)个(gè)LED等对(duì)應(yìng)的(de)PWM波(bō)形
FPGA通(tòng)过(guò)8个(gè)管(guǎn)脚来(lái)分(fēn)别控制8个(gè)LED燈(dēng),管(guǎn)脚值为(wèi)0,对(duì)應(yìng)的(de)LED燈(dēng)亮(liàng),管(guǎn)脚值为(wèi)1,对(duì)應(yìng)的(de)LED燈(dēng)滅(低亮(liàng)高(gāo)滅)。如(rú)果(guǒ)管(guǎn)脚不(bù)停地(dì)變(biàn)化(huà),則LED燈(dēng)会(huì)閃爍;如(rú)果(guǒ)这(zhè)種(zhǒng)高(gāo)低變(biàn)化(huà)非(fēi)常快(kuài),由(yóu)于(yú)人(rén)的(de)視覺暫留現(xiàn)象(xiàng),LED就(jiù)会(huì)出(chū)現(xiàn)不(bù)同(tóng)的(de)亮(liàng)度(dù)。
基于(yú)这(zhè)个(gè)原則,我(wǒ)们(men)也(yě)可(kě)以(yǐ)通(tòng)过(guò)産生(shēng)PWM波(bō)形,来(lái)控制LED燈(dēng)的(de)亮(liàng)度(dù)。
1. 明(míng)确功能(néng)
首先(xiān)确定(dìng)模块(kuài)信(xìn)号(hào)列表(biǎo),如(rú)表(biǎo)2.2。
表(biǎo)2.2信(xìn)号(hào)列表(biǎo)
|
信(xìn)号(hào)名 |
I/O |
位宽(kuān) |
说(shuō)明(míng) |
|
clk |
I |
1 |
系(xì)統工作时(shí)鐘(zhōng)100MHz。 |
|
rst_n |
I |
1 |
系(xì)統複位信(xìn)号(hào),低電(diàn)平有(yǒu)效。 |
|
led |
O |
8 |
LED輸出(chū)信(xìn)号(hào) |
産生(shēng)8个(gè)脈沖,每个(gè)脈沖周期(qī)为(wèi)10s对(duì)應(yìng)的(de)占空比分(fēn)别为(wèi):80%、70%、60%、50%、40%、30%、20%和(hé)10%。
2. 功能(néng)波(bō)形
led所(suǒ)有(yǒu)信(xìn)号(hào)的(de)變(biàn)化(huà)都是(shì)相似的(de),这(zhè)里(lǐ)以(yǐ)led[0]为(wèi)例。見(jiàn)图(tú)2-9。
图(tú)2-9 led[0]信(xìn)号(hào)變(biàn)化(huà)图(tú)
3. 計(jì)數結構
因(yīn)为(wèi)每个(gè)脈沖的(de)高(gāo)低電(diàn)平持(chí)續时(shí)間(jiān)都是(shì)以(yǐ)1s为(wèi)單位的(de),所(suǒ)以(yǐ)引入(rù)两(liǎng)个(gè)計(jì)數器,計(jì)數器cnt_1s計(jì)數1s,計(jì)數器cnt_10s計(jì)數每个(gè)脈沖高(gāo)低電(diàn)平分(fēn)别持(chí)續的(de)时(shí)間(jiān)。具體(tǐ)計(jì)數情(qíng)況如(rú)图(tú)2-10所(suǒ)示:
图(tú)2-10 計(jì)數結構图(tú)
4. 加一(yī)結束(shù)条(tiáo)件(jiàn)
cnt_1s的(de)加1条(tiáo)件(jiàn):計(jì)數器一(yī)直(zhí)在(zài)計(jì)數,即:assign add_cnt_1s=1;
cnt_1s的(de)結束(shù)条(tiáo)件(jiàn):加一(yī)条(tiáo)件(jiàn)下(xià)計(jì)數到(dào)100_000_000-1;
cnt_10s的(de)加1条(tiáo)件(jiàn):cnt_1s的(de)結束(shù)时(shí)刻;
cnt_10s的(de)結束(shù)条(tiáo)件(jiàn):加一(yī)条(tiáo)件(jiàn)下(xià)計(jì)數到(dào)10-1;
5. 定(dìng)義特(tè)殊點(diǎn)
图(tú)2-11有(yǒu)幾(jǐ)个(gè)特(tè)殊點(diǎn),需要(yào)我(wǒ)们(men)記(jì)住。
图(tú)2-11 特(tè)殊定(dìng)義點(diǎn)图(tú)
cnt1s的(de)結束(shù)条(tiáo)件(jiàn):cnt_1s==100_000_000-1,定(dìng)为(wèi)end_cnt_1s。
cnt10s的(de)結束(shù)条(tiáo)件(jiàn):cnt_10s==10-1,定(dìng)为(wèi)end_cnt_10s。
led所(suǒ)有(yǒu)位的(de)新号(hào)變(biàn)化(huà)都是(shì)相似的(de),所(suǒ)以(yǐ)我(wǒ)们(men)以(yǐ)led[0]为(wèi)例定(dìng)義特(tè)殊點(diǎn),
led[0]變(biàn)高(gāo)的(de)条(tiáo)件(jiàn):cnt_10s==1-1,定(dìng)为(wèi)led0_off。
led[0]變(biàn)低的(de)条(tiáo)件(jiàn):cnt_10s==10-1,定(dìng)为(wèi)led_on。
6. 完整性(xìng)檢查
|
(1)計(jì)數器cnt_1s cnt_1s的(de)初值:0; cnt_1s的(de)加1条(tiáo)件(jiàn):assign add_cnt_1s=1; cnt_1s的(de)結束(shù)条(tiáo)件(jiàn): assign end_cnt_1s=add_cnt1s&&cnt_1s ==100_000_000 - 1 |
(6)led[3] led[3]由(yóu)0變(biàn)1:led3_off led[3]由(yóu)1變(biàn)0:led_on |
|
(2)計(jì)數器cnt_10s cnt_10s初值:0; cnt_10s的(de)加1条(tiáo)件(jiàn): assign add_cnt_10s=end_cnt1s; cnt_10s的(de)結束(shù)条(tiáo)件(jiàn): assign end_cnt_10s=add_cnt10s && cnt_10s==10 - 1 |
(7)led[4] led[4]由(yóu)0變(biàn)1:led4_off led[4]由(yóu)1變(biàn)0:led_on |
|
(3)led[0] led[0]由(yóu)0變(biàn)1:led0_off led[0]由(yóu)1變(biàn)0:led_on |
(8)led[5] led[5]由(yóu)0變(biàn)1:led5_off led[5]由(yóu)1變(biàn)0:led_on |
|
(4)led[1] led[1]由(yóu)0變(biàn)1:led1_off led[1]由(yóu)1變(biàn)0:led_on |
(9)led[6] led[6]由(yóu)0變(biàn)1:led6_off led[6]由(yóu)1變(biàn)0:led_on |
|
(5)led[2] led[2]由(yóu)0變(biàn)1:led2_off led[2]由(yóu)1變(biàn)0:led_on |
(10)led[7] led[7]由(yóu)0變(biàn)1:led7_off led[7]由(yóu)1變(biàn)0:led_on |
7. 計(jì)數器代(dài)碼
2
3 always @(posedgeclk or negedgerst_n)begin
4 if(rst_n==1'b0)begin
5 cnt_1s <= 0;
6 end
7 else if(add_cnt_1s)begin
8 if(end_cnt_1s)
9 cnt_1s <= 0;
10 else
11 cnt_1s <= cnt_1s + 1;
12 end
13 end
14 assign add_cnt_1s = 1'b1;
15 assign end_cnt_1s = add_cnt_1s && cnt_1s==TIME_1S-1;
16
17 always @(posedgeclk or negedgerst_n)begin
18 if(rst_n==1'b0)begin
19 cnt_10s <= 0;
20 end
21 else if(add_cnt_10s)begin
22 if(end_cnt_10s)
23 cnt_10s <= 0;
24 else
25 cnt_10s <= cnt_10s + 1;
26 end
27 end
28 assign add_cnt_10s = end_cnt_1s;
29 assign end_cnt_10s = add_cnt_10s && cnt_10s==10-1;
30
8.完整代(dài)碼
2 always @(posedgeclk or negedgerst_n)begin
3 if(rst_n==1'b0)begin
4 led[0] <= 0;
5 end
6 else if(led_on)begin
7 led[0] <= 0;
8 end
9 else if(led0_off)begin
10 led[0] <= 1;
11 end
12 end
13 assign led0_off = add_cnt_10s && cnt_10s==1-1;
14 assign led_on = add_cnt_10s && cnt_10s==10-1;
15
16 //按照第(dì)六(liù)步第(dì)4點(diǎn),写出(chū)len[1]的(de)代(dài)碼
17 always @(posedgeclk or negedgerst_n)begin
18 if(rst_n==1'b0)begin
19 led[1] <= 0;
20 end
21 else if(led_on)begin
22 led[1] <= 0;
23 end
24 else if(led1_off)begin
25 led[1] <= 1;
26 end
27 end
28 assign led1_off = add_cnt_10s && cnt_10s==2-1;
29
30 //按照第(dì)六(liù)步第(dì)5點(diǎn),写出(chū)len[2]的(de)代(dài)碼
31 always @(posedgeclk or negedgerst_n)begin
32 if(rst_n==1'b0)begin
33 led[2] <= 0;
34 end
35 else if(led_on)begin
36 led[2] <= 0;
37 end
38 else if(led2_off)begin
39 led[2] <= 1;
40 end
41 end
42 assign led2_off = add_cnt_10s && cnt_10s==3-1;
43
44 //按照第(dì)六(liù)步第(dì)6點(diǎn),写出(chū)len[3]的(de)代(dài)碼
45 always @(posedgeclk or negedgerst_n)begin
46 if(rst_n==1'b0)begin
47 led[3] <= 0;
48 end
49 else if(led_on)begin
50 led[3] <= 0;
51 end
52 else if(led3_off)begin
53 led[3] <= 1;
54 end
55 end
56 assign led3_off = add_cnt_10s && cnt_10s==4-1;
57
58 //按照第(dì)六(liù)步第(dì)7點(diǎn),写出(chū)len[4]的(de)代(dài)碼
59 always @(posedgeclk or negedgerst_n)begin
60 if(rst_n==1'b0)begin
61 led[4] <= 0;
62 end
63 else if(led_on)begin
64 led[4] <= 0;
65 end
66 else if(led4_off)begin
67 led[4] <= 1;
68 end
69 end
70 assign led4_off = add_cnt_10s && cnt_10s==5-1;
71
72 //按照第(dì)六(liù)步第(dì)8點(diǎn),写出(chū)len[5]的(de)代(dài)碼
73 always @(posedgeclk or negedgerst_n)begin
74 if(rst_n==1'b0)begin
75 led[5] <= 0;
76 end
77 else if(led_on)begin
78 led[5] <= 0;
79 end
80 else if(led5_off)begin
81 led[5] <= 1;
82 end
83 end
84 assign led5_off = add_cnt_10s && cnt_10s==6-1;
85
86 //按照第(dì)六(liù)步第(dì)9點(diǎn),写出(chū)len[6]的(de)代(dài)碼
87 always @(posedgeclk or negedgerst_n)begin
88 if(rst_n==1'b0)begin
89 led[6] <= 0;
90 end
91 else if(led_on)begin
92 led[6] <= 0;
93 end
94 else if(led6_off)begin
95 led[6] <= 1;
96 end
97 end
98 assign led6_off = add_cnt_10s && cnt_10s==7-1;
99
100 //按照第(dì)六(liù)步第(dì)10點(diǎn),写出(chū)len[7]的(de)代(dài)碼
101 always @(posedgeclk or negedgerst_n)begin
102 if(rst_n==1'b0)begin
103 led[7] <= 0;
104 end
105 else if(led_on)begin
106 led[7] <= 0;
107 end
108 else if(led7_off)begin
109 led[7] <= 1;
110 end
111 end
112 assign led7_off = add_cnt_10s && cnt_10s==8-1;
113
技術(shù)交流QQ群(qún):544453837
更(gèng)多(duō)FPGA技術(shù)資訊:明(míng)德揚科教
了(le)解(jiě)>>至(zhì)簡設計(jì)法

















