基於CPLD/FPGA的呼吸燈效果實現(附全部verilog原始碼)

精橙FPGA刘工發表於2024-12-06

一、功能介紹

此設計可以讓你的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

三、各種呼吸燈效果演示

基於CPLD/FPGA的呼吸燈效果實現(附全部verilog原始碼)

基於CPLD/FPGA的呼吸燈效果實現(附全部verilog原始碼)

基於CPLD/FPGA的呼吸燈效果實現(附全部verilog原始碼)

基於CPLD/FPGA的呼吸燈效果實現(附全部verilog原始碼)


基於CPLD/FPGA的呼吸燈效果實現(附全部verilog原始碼)

如您有此功能的定製開發或其他的FPGA設計需求,請檢視下面這篇文章瞭解我們的業務範圍和聯絡方式,我們將竭誠為您服務。

精橙FPGA,一個承接FPGA程式碼設計的資深工程師團隊。

相關文章