0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FPGA的呼吸燈設(shè)計(jì)

CHANBAEK ? 來(lái)源:小小研究生 ? 作者: xxyjs2020 ? 2023-06-27 17:39 ? 次閱讀

設(shè)計(jì)規(guī)劃

呼吸燈的效果是LED燈在一段時(shí)間內(nèi)從完全熄滅的狀態(tài)逐漸變到最亮,再在同樣的時(shí)間段內(nèi)逐漸達(dá)到完全熄滅的狀態(tài)。這里我們需要實(shí)現(xiàn)1s內(nèi)實(shí)現(xiàn)從滅到亮,1s內(nèi)從亮到滅。

LED的明亮有兩種方式,第一種是在安全范圍內(nèi)給LED燈不同的供電電壓可以控制明滅;第二種是通過(guò)控制PWM的 占空比 ,同一時(shí)間段內(nèi)供給LED燈一個(gè)脈沖信號(hào)的低電平持續(xù)時(shí)間越長(zhǎng),LED燈越亮。我們?nèi)個(gè)相同的時(shí)間段,讓低電平的持續(xù)時(shí)間按照相等的時(shí)間間隔逐漸增多,led燈就會(huì)越來(lái)越亮了。

首先我們將1s分為1000個(gè)時(shí)間段,每段1ms。再將1ms分為1000個(gè)時(shí)間小段,每段1us。第一個(gè)1ms內(nèi)亮0us(滅),并在第二個(gè)1ms內(nèi)亮1us,...,在第1000個(gè)1ms內(nèi)亮999us。劃分的等級(jí)越多,看上去效果越好,但是人眼分辨率有限,大于這個(gè)分辨率就看起來(lái)幾乎沒(méi)有差異。

我們至少需要三個(gè)計(jì)數(shù)器,用來(lái)計(jì)時(shí)1s,1ms,1us。cnt_1us需要從0計(jì)數(shù)到49,不復(fù)位就計(jì)數(shù),計(jì)滿就清零。cnt_1ms完全沒(méi)必要重新產(chǎn)生,每當(dāng)cnt_1ms計(jì)數(shù)到999且cnt_1us計(jì)數(shù)到49,cnt_1ms就清零。cnt_1s同理在cnt_1ms計(jì)數(shù)到999且cnt_1us計(jì)數(shù)到49時(shí)就清零。

圖片

led_out要在不同時(shí)間段低電平持續(xù)時(shí)長(zhǎng)慢慢增加,需要一個(gè)小技巧。觀察上圖,LED為低電平時(shí),cnt_1s是0時(shí),cnt_1ms是1-999;cnt_1s是1時(shí),cnt_1ms是2-999...

圖片

LED燈從亮到滅是相反的過(guò)程,LED燈為高電平時(shí),cnt_1s>cnt_1ms。

區(qū)分從滅到亮和從亮到滅,可以使用一個(gè)電平標(biāo)志信號(hào)(使能)cnt_1s_en。cnt_1s_en為低電平時(shí)實(shí)現(xiàn)呼吸燈從滅到亮的過(guò)程,cnt_1s_en為高的時(shí)候?qū)崿F(xiàn)呼吸燈從亮到滅的過(guò)程,cnt_1s清零時(shí)cnt_1s_en取反。

圖片

圖片

編寫(xiě)代碼

module breath_led
#(
parameter CNT_1US_MAX = 6'd49 ,
parameter CNT_1MS_MAX = 10'd999 ,
parameter CNT_1S_MAX = 10'd999
)
(
input wire sys_clk , 
input wire sys_rst_n , 
output reg led_out 
 );


 //reg define
 reg [5:0] cnt_1us ;
 reg [9:0] cnt_1ms ;
 reg [9:0] cnt_1s ;
 reg cnt_1s_en ;


 //cnt_1us:1us計(jì)數(shù)器
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt_1us <= 6'b0;
 else if(cnt_1us == CNT_1US_MAX)
 cnt_1us <= 6'b0;
 else
 cnt_1us <= cnt_1us + 1'b1;


 //cnt_1ms:1ms計(jì)數(shù)器
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt_1ms <= 10'b0;
 else if(cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)
 cnt_1ms <= 10'b0;
 else if(cnt_1us == CNT_1US_MAX)
 cnt_1ms <= cnt_1ms + 1'b1;


 //cnt_1s:1s計(jì)數(shù)器
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt_1s <= 10'b0;
 else if(cnt_1s == CNT_1S_MAX && cnt_1ms == CNT_1MS_MAX
 && cnt_1us == CNT_1US_MAX)
 cnt_1s <= 10'b0;
 else if(cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)
 cnt_1s <= cnt_1s + 1'b1;


 //cnt_1s_en:1s計(jì)數(shù)器標(biāo)志信號(hào)
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt_1s_en <= 1'b0;
 else if(cnt_1s == CNT_1S_MAX && cnt_1ms == CNT_1MS_MAX
 && cnt_1us == CNT_1US_MAX)
 cnt_1s_en <= ~cnt_1s_en;


 //led_out:輸出信號(hào)連接到外部的led燈
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 led_out <= 1'b0;
 else if((cnt_1s_en == 1'b1 && cnt_1ms < cnt_1s)||
 (cnt_1s_en == 1'b0 && cnt_1ms > cnt_1s))
 led_out <= 1'b0;
 else
 led_out <= 1'b1;
 endmodule

參數(shù)定義,輸入輸出定義,中間信號(hào)(計(jì)數(shù)器和使能信號(hào))定義都是很熟悉的。

1us計(jì)數(shù)器 :復(fù)位有效時(shí)拉低電平;計(jì)滿時(shí)清零;其他情況+1。

1ms計(jì)數(shù)器 :復(fù)位有效時(shí)拉低電平;計(jì)滿時(shí)清零(計(jì)滿條件是達(dá)到CNT_1MS_MAX和CNT_1US_MAX);達(dá)到CNT_1US_MAX時(shí)+1。

1s計(jì)數(shù)器 :復(fù)位有效時(shí)拉低電平;計(jì)滿時(shí)清零(計(jì)滿條件是達(dá)到CNT_1S_MAX,CNT_1MS_MAX和CNT_1US_MAX);達(dá)到CNT_1MS_MAX且CNT_1US_MAX時(shí)+1。

1s使能 :復(fù)位有效時(shí)拉低電平,計(jì)滿1s時(shí)取反(達(dá)到CNT_1S_MAX,CNT_1MS_MAX和CNT_1US_MAX,和1s計(jì)數(shù)器的清零條件一樣)。

led_out :復(fù)位有效時(shí)拉低電平,使能為高電平且cnt_1mscnt_1s時(shí)led_out拉低,反之拉高。

圖片

編寫(xiě)testbench

`timescale 1ns/1ns
module tb_breath_led();
//wire define
wire led_out ;
//reg define
reg sys_clk ;
reg sys_rst_n ;


 //初始化系統(tǒng)時(shí)鐘、全局復(fù)位
 initial begin
 sys_clk = 1'b1;
 sys_rst_n <= 1'b0;
 #20
 sys_rst_n <= 1'b1;
 end


//sys_clk:模擬系統(tǒng)時(shí)鐘,每10ns電平翻轉(zhuǎn)一次,周期為20ns,頻率為50MHz
 always #10 sys_clk = ~sys_clk;


//-------------------- breath_led_inst --------------------
 breath_led
 #(
 .CNT_1US_MAX(6'd4 ),
 .CNT_1MS_MAX(10'd9 ),
 .CNT_1S_MAX (10'd9 )
 )
 breath_led_inst
 (
 .sys_clk (sys_clk ), 
 .sys_rst_n (sys_rst_n ), 
 .led_out (led_out ) 
 );


 endmodule

信號(hào)定義,初始化,規(guī)定時(shí)鐘頻率,參數(shù)設(shè)置(參數(shù)設(shè)置得小一點(diǎn)節(jié)省時(shí)間),實(shí)例化

對(duì)比波形

cnt_1ns,cnt_1ms,cnt_1s,cnt_1s_en是中間信號(hào),查看波形需要手動(dòng)添加

圖片

將要查看的信號(hào)拖進(jìn)波形圖中

圖片

我們可以觀察到,計(jì)數(shù)器的最大值分別為4,9,9,與我們?cè)趖estbench中設(shè)置的參數(shù)一致。輸出信號(hào)的波形也達(dá)到了預(yù)期效果,先由滅到亮,再由亮到滅

分配管腳

圖片

全編譯后上板驗(yàn)證

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1625

    文章

    21621

    瀏覽量

    601241
  • led燈
    +關(guān)注

    關(guān)注

    22

    文章

    1592

    瀏覽量

    107751
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5118

    瀏覽量

    213168
  • 脈沖信號(hào)
    +關(guān)注

    關(guān)注

    6

    文章

    392

    瀏覽量

    36884
  • 呼吸燈
    +關(guān)注

    關(guān)注

    10

    文章

    109

    瀏覽量

    42688
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于CPLD/FPGA呼吸效果實(shí)現(xiàn)(附全部verilog源碼)(by 大飛)

    你的CPLD/FPGA里吧,瞬間實(shí)現(xiàn)你盼望已久的呼吸效果,賦予她(LED)生命的氣息! 2. 曬干貨例化時(shí),僅需要按您的需求修改代碼中帶★號(hào)的參數(shù)ps. 只有一處需要修改哦親
    發(fā)表于 11-19 22:58

    xilinx ISE 中異步FIFO ip的使用、仿真及各信號(hào)的討論(圖文教程)

    傳輸協(xié)議b2s (附全部verilog源碼)2.脈沖信號(hào)正常與否的判斷(附全部verilog源碼)3.基于CPLD/FPGA呼吸效果實(shí)現(xiàn)(附全部verilog源碼)4.“同頻異寬”脈沖的選擇(附
    發(fā)表于 07-16 15:09

    霧盈FPGA筆記之(一):基于FPGA呼吸簡(jiǎn)單實(shí)驗(yàn)程序(Verilog)

    ` 本帖最后由 西疆木 于 2016-8-29 10:37 編輯 基于FPGA呼吸簡(jiǎn)單實(shí)驗(yàn)程序(Verilog)霧盈 2016-7-26 1.呼吸
    發(fā)表于 07-28 19:03

    FPGA呼吸

    基于FPGA呼吸一、目標(biāo)1、占空比(pwm)的理解。2、計(jì)數(shù)器的應(yīng)用。3、分頻的應(yīng)用。二、要求四個(gè)LED從暗逐漸變亮,然后從亮逐漸變暗形成呼吸
    發(fā)表于 10-26 21:01

    基于CPLD/FPGA呼吸效果實(shí)現(xiàn)_呼吸源碼_明德?lián)P資料

    特效呼吸1功能概述顧名思義,特效呼吸是指在電路控制之下,LED燈光完成由滅到亮、由亮到滅的逐漸變化,感覺(jué)像是在呼吸一樣。最原始的表現(xiàn)形式
    發(fā)表于 08-02 18:03

    至芯昭哥帶你學(xué)FPGAFPGA_100天之旅_呼吸

    至芯昭哥帶你學(xué)FPGAFPGA_100天之旅_呼吸
    發(fā)表于 08-22 09:54

    如何制作鍵盤(pán)呼吸

    說(shuō)到呼吸的設(shè)計(jì),也許大家最先想到的就是蘋(píng)果。很多人也都想自己做一個(gè)呼吸,起到裝飾和工作狀態(tài)指示效果。下面,我們就介紹幾種呼吸
    發(fā)表于 06-11 10:04 ?6357次閱讀
    如何制作鍵盤(pán)<b class='flag-5'>呼吸</b><b class='flag-5'>燈</b>

    呼吸有什么用_華為呼吸在哪設(shè)置

    本文開(kāi)始介紹了呼吸的概念和呼吸的作用,其次介紹了呼吸電路以及修改手機(jī)
    發(fā)表于 03-29 08:29 ?7.3w次閱讀
    <b class='flag-5'>呼吸</b><b class='flag-5'>燈</b>有什么用_華為<b class='flag-5'>呼吸</b><b class='flag-5'>燈</b>在哪設(shè)置

    基于FPGA呼吸設(shè)計(jì)

    呼吸主要是利用PWM的方式,在固定的頻率下,通過(guò)調(diào)整占空比的方式來(lái)控制LED的亮度的變化,從而實(shí)現(xiàn)由暗漸亮再由亮漸暗的過(guò)程。
    的頭像 發(fā)表于 09-27 11:43 ?2012次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>呼吸</b><b class='flag-5'>燈</b>設(shè)計(jì)

    仿真測(cè)試:呼吸PWM

    呼吸的效果是逐漸由暗變亮再逐漸由亮變暗,FPGA的引腳電壓只有“0”和“1”兩個(gè)等級(jí)。
    的頭像 發(fā)表于 10-10 14:52 ?1037次閱讀
    仿真測(cè)試:<b class='flag-5'>呼吸</b><b class='flag-5'>燈</b>PWM