在一家做嵌入式公司實習已經兩個月了,需要學習整理的東西很多,決定堅持寫一些總結,留下一些記憶更有意義,呼吸燈這個題目剛拿到沒有思路,網上的參考示例也沒有找到合適的,不過最后找到一個YHXT機構(不是廣告,很簡單的實作了這個功能,放到博客一起學習,控制LED的亮度變化,就是要控制電壓,讓電壓高低變化,是一個電壓從低到高再到低的一個線性變換程序,這里用PWM控制電壓最合適,產生PWM需要分別產生載波信號和調制信號,最后對兩者的大小進行比較產生pwm,
載波:用cnt1計數器生成一個鋸齒波就是載波,這里計數器cnt1從0開始計數到N,計數到最大值再次從0開始計數,不斷的回圈計數,cnt1的最大值是N-1,根據你的時鐘(系統時鐘,FPGA的作業時鐘,大多情況是50mhz,我這里用的是40mhz,25ns)來計數,每來一次時鐘上升沿計數器加一,那么從0到N-1,所需的時間就是N*T,這個就是一個鋸齒波的周期,
調制信號:呼吸燈是一個亮度又低到高再到低的程序,這里再用一個計數器cnt2生成一個三角波,這個三角波的周期就是呼吸燈作業一次的周期,三角波計數器從0到最大值N ,相當于對調制信號N等份,每一個等份是一個載波周期,這里有一個公式 N^2 * T = 呼吸燈周期/2 ,知道呼吸燈周期和時鐘的情況下容易得到計數器最大值N,(這里為了方便,我設定整個led周期5s,T = 25ns,則N = 10000,)這里相當于cnt1計數到最大值,cnt2加一,當cnt2從0計數到N-1的程序就是一個上升的斜線,由N-1遞減到0就是下降的斜線,在cnt2計數到最大值時設定一個標志位信號flag,flag為1,代表開始遞減,
大小比較:通過載波和調制信號的大小比較,就可以生成一個pwm波,載波大于調制信號時,pwm = 0,載波小于調制信號時,pwm =1,

verilog邏輯代碼:
|
module hxled(clk,led1,led2); input clk;//系統時鐘40mhz output led1; reg [13:0]cnt1; //cnt2 assign led1 = (cnt1 < cnt2)?1'b1:1'b0;//大小比較 endmodule |
testbench檔案:
|
`timescale 1ns/1ps reg clk; hxled u1( initial clk = 1; endmodule |
這次波形比較簡單就不分析仿真波形了,板級驗證通過,要注意quartus軟體的操作,不同的作業時鐘可以更改一下計數器值,也可以加入復位信號,如果實驗現象不明顯可能是計數器值設定的問題,
再次感謝YH學堂 這次學習 了解如何用計數器產生載波信號 調制信號 如何產生PWM 以及控制呼吸燈的原理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/173981.html
標籤:Verilog
