PWM 采用任意寬度的輸入值,并創(chuàng)建只有一位寬度的輸出。使用自由運(yùn)行計(jì)數(shù)器的 PWM,這是能做的最簡(jiǎn)單的 PWM。
module PWM( input clk, input rst_n, input [3:0] PWM_in, output PWM_out);
reg [3:0] cnt;always @(posedge clk or negedge rst_n) if(!rst_n) cnt《=0; else cnt 《= cnt + 1‘b1; // free-running counter
assign PWM_out = (PWM_in 》 cnt)?1’b1:1‘b0; // comparatorendmodule
選擇了一個(gè)4位的 PWM 這里,所以 PWM 周期是16。輸入可以從0到15,因此 PWM 輸出比從0% 到15/16 = 93% 。如果需要能夠達(dá)到100% ,輸入需要有一個(gè)額外的bit位。
這段代碼工作得很好,盡管當(dāng)前形式的代碼有點(diǎn)幼稚,因?yàn)檩斎氡仨毷枪潭ǖ模ɑ蛘咧挥挟?dāng)計(jì)數(shù)器溢出 = 返回到0時(shí)才會(huì)更改)。否則輸出將出現(xiàn)故障。因此,很可能需要一些額外的邏輯(通常是在正確的時(shí)間捕獲輸入的閂鎖)
使用可加載的上下計(jì)數(shù)器的 PWM,這是一個(gè)稍微復(fù)雜一點(diǎn)的設(shè)計(jì)。
module PWM2( input clk, input rst_n, input [3:0] PWM_in, output PWM_out);
reg [3:0] cnt;reg cnt_dir; // 0 to count up, 1 to count downwire [3:0] cnt_next = cnt_dir ? cnt-1’b1 : cnt+1‘b1;wire cnt_end = cnt_dir ? cnt==4’b0000 : cnt==4‘b1111;
always @(posedge clk or negedge rst_n ) if(!rst_n) cnt 《= 0; else cnt 《= cnt_end ? PWM_in : cnt_next;always @(posedge clk or negedge rst_n) if(!rst_n) cnt_dir《=1’b0; else cnt_dir 《= cnt_dir ^ cnt_end;assign PWM_out = cnt_dir;endmodule
它使用一個(gè)可加載的上下計(jì)數(shù)器,不需要輸出比較器。有趣的是,它并不完全等同于第一個(gè)設(shè)計(jì),因?yàn)檩敵鲋芷谟?7個(gè)狀態(tài)而不是16個(gè)(輸出從1/17 = 6% 到16/17 = 94%)。
編輯:jq
-
PWM
+關(guān)注
關(guān)注
116文章
5344瀏覽量
217785 -
比較器
+關(guān)注
關(guān)注
14文章
1839瀏覽量
108398 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2283瀏覽量
95975
原文標(biāo)題:verilog 實(shí)現(xiàn)PWM DAC
文章出處:【微信號(hào):leezym0317,微信公眾號(hào):FPGA開源工作室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
芯知識(shí) 語音芯片中的音頻輸出,PWM和DAC的比較
Verilog 與 ASIC 設(shè)計(jì)的關(guān)系 Verilog 代碼優(yōu)化技巧
Verilog 測(cè)試平臺(tái)設(shè)計(jì)方法 Verilog FPGA開發(fā)指南
Verilog與VHDL的比較 Verilog HDL編程技巧
使用PWM實(shí)現(xiàn)電源管理的策略
如何利用Verilog-A開發(fā)器件模型

使用DAC8760系列實(shí)現(xiàn)HART?通信

用于現(xiàn)場(chǎng)發(fā)送器的高性能16位PWM 4-20 MA DAC

技術(shù)分享:國產(chǎn)工業(yè)級(jí)HMI芯片Model系列PWM-DAC實(shí)現(xiàn)指南

使用MSP430高分辨率定時(shí)器的PWM DAC

在低成本MSP430 MCU上使用PWM實(shí)現(xiàn)數(shù)字DAC應(yīng)用說明

評(píng)論