一、功能介紹
此設計可以讓你的FPGA板子上那顆LED具有呼吸效果,像智慧手機上的呼吸燈一樣。以下原始碼已上板驗證透過,大家可直接使用。二、呼吸燈Verilog原始碼
ps1. 帶★號處可根據需要進行修改.
ps2. 有需要的話可自行新增rst復位訊號.
/***************************************** Declaration *************************************************** File Name: breathe_led.v Function: 實現呼吸燈功能 **********************************************************************************************************/ module breathe_led ( input clk, output reg led ); parameter FREQUENCE=50_000_000; //★呼叫的時候僅僅需要將此值改為連線到clk埠上的實際頻率值即可(此時呼吸一次為2s),以下所有引數均不需改動; 如果想加快呼吸速度,可減小此值,反之增大此值 parameter WIDTH=9; reg [WIDTH:0] state0; reg [WIDTH-1:0] state1; //============================================= //控制每個佔空比的持續時間 //============================================= reg [31:0] cnt0; always @ (posedge clk) begin if(cnt0==(FREQUENCE/(2**WIDTH))) begin cnt0<=0; state0<=state0+1'b1; end else begin cnt0<=cnt0+1'b1; end end //============================================= //控制佔空比增大與減小 //============================================= always @ (posedge clk) begin if(state0[WIDTH]) state1<=state0[WIDTH-1:0]; else state1<=~state0[WIDTH-1:0]; end //============================================= //生成與state1進行大小比較的計數器cnt1 //============================================= wire [WIDTH-1:0] time_over; assign time_over={WIDTH{1'b1}}; reg [WIDTH-1:0] cnt1; always @ (posedge clk) begin if(cnt1==time_over) begin cnt1<=0; end else begin cnt1<=cnt1+1'b1; end end //============================================= //計數器cnt1與state1進行大小比較,以使led脈衝的佔空比實現漸變 //============================================= always @ (posedge clk) begin if((cnt1+time_over/3)<=state1) //其實寫成if(cnt1<=state1)即可實現led的漸亮與漸滅,但為了真實的模擬呼吸燈(可參考手機上的呼吸燈),在此增加了time_over/3這個量,是為了使led呼吸一次之後保持1/3時間的熄滅狀態 led<=0; //led亮; 如果led高電平亮,此處改為led<=1; else led<=1; //led滅; 如果led低電平滅,此處改為led<=0; end endmodule
三、各種呼吸燈效果演示
如您有此功能的定製開發或其他的FPGA設計需求,請檢視下面這篇文章瞭解我們的業務範圍和聯絡方式,我們將竭誠為您服務。
精橙FPGA,一個承接FPGA程式碼設計的資深工程師團隊。