1位閃爍燈設(shè)計(jì)
一、項(xiàng)目背景LED(Light Emitting Diode),發(fā)光二極管,是一種能夠?qū)㈦娔苻D(zhuǎn)化為可見(jiàn)光的固態(tài)的半導(dǎo)體器件,它可以直接把電轉(zhuǎn)化為光。LED的心臟是一個(gè)半導(dǎo)體的晶片,晶片的一端附在一個(gè)支架上,一端是負(fù)極,另一端連接電源的正極,使整個(gè)晶片被環(huán)氧樹(shù)脂封裝起來(lái)。 半導(dǎo)體晶片由兩部分組成,一部分是P型半導(dǎo)體,在它里面空穴占主導(dǎo)地位,另一端是N型半導(dǎo)體,在這邊主要是電子。但這兩種半導(dǎo)體連接起來(lái)的時(shí)候,它們之間就形成一個(gè)P-N結(jié)。當(dāng)電流通過(guò)導(dǎo)線(xiàn)作用于這個(gè)晶片的時(shí)候,電子就會(huì)被推向P區(qū),在P區(qū)里電子跟空穴復(fù)合,然后就會(huì)以光子的形式發(fā)出能量,這就是LED燈發(fā)光的原理。而光的波長(zhǎng)也就是光的顏色,是由形成P-N結(jié)的材料決定的。 LED可以直接發(fā)出紅、黃、藍(lán)、綠、青、橙、紫、白色的光。 最初LED用作儀器儀表的指示光源,后來(lái)各種光色的LED在交通信號(hào)燈和大面積顯示屏中得到了廣泛應(yīng)用,產(chǎn)生了很好的經(jīng)濟(jì)效益和社會(huì)效益。以12英寸的紅色交通信號(hào)燈為例,在美國(guó)本來(lái)是采用長(zhǎng)壽命,低光視效能的140瓦白熾燈作為光源,它產(chǎn)生2000流明的白光。經(jīng)紅色濾光片后,光損失90%,只剩下200流明的紅光。而在新設(shè)計(jì)的燈中,Lumileds公司采用了18個(gè)紅色LED光源,包括電路損失在內(nèi),共耗電14瓦,即可產(chǎn)生同樣的光效。汽車(chē)信號(hào)燈也是LED光源應(yīng)用的重要領(lǐng)域。 對(duì)于一般照明而言,人們更需要白色的光源。1998年發(fā)白光的LED開(kāi)發(fā)成功。這種LED是將GaN芯片和釔鋁石榴石(YAG)封裝在一起做成。GaN芯片發(fā)藍(lán)光(λp=465nm,Wd=30nm),高溫?zé)Y(jié)制成的含Ce3+的YAG熒光粉受此藍(lán)光激發(fā)后發(fā)出黃色光射,峰值550nLED燈m。藍(lán)光LED基片安裝在碗形反射腔中,覆蓋以混有YAG的樹(shù)脂薄層,約200-500nm。 LED基片發(fā)出的藍(lán)光部分被熒光粉吸收,另一部分藍(lán)光與熒光粉發(fā)出的黃光混合,可以得到白光。 對(duì)于InGaN/YAG白色LED,通過(guò)改變YAG熒光粉的化學(xué)組成和調(diào)節(jié)熒光粉層的厚度,可以獲得色溫3500-10000K的各色白光。這種通過(guò)藍(lán)光LED得到白光的方法,構(gòu)造簡(jiǎn)單、成本低廉、技術(shù)成熟度高,因此運(yùn)用最多。
明德?lián)P的教學(xué)板一共有8個(gè)可發(fā)綠光的LED燈。下面是LED燈的原理圖。 左邊的LED6~LED13是板子的絲印。右邊的LED1~LED8是信號(hào)線(xiàn)名,讀者在板子上是不可見(jiàn)的。 LED燈一端連著高電平3.3V,另一端是信號(hào)線(xiàn)LED1~LED8。如果LED1~LED8是高電平,則電流不導(dǎo)通,那么LED燈則不會(huì)發(fā)光。如果LED1~LED8是低電平,則電流會(huì)導(dǎo)通,那么LED燈就發(fā)光。所以LED燈發(fā)不發(fā)光,是取決于信號(hào)LED1~LED8是處于什么電平。
信號(hào)線(xiàn)LED1~LED8又連到哪里呢?搜索下原理圖文檔,可以發(fā)現(xiàn)這些信號(hào)是連到FPGA的管腳上的。 下面信號(hào)線(xiàn)和FPGA管腳的連接圖,例如信號(hào)線(xiàn)LED1是連接到FPGA的AA4管腳上。
LED1~LED8分別與FPGA的8個(gè)管腳相連,所以LED1~LED8處于什么電平,即LED燈是否要發(fā)光,就取決于FPGA管腳的輸出了。 例如FPGA管腳AB14連到LED7上。要控制這個(gè)燈的亮滅,FPGA只需要將管腳AB14輸出為低高就可以了。當(dāng)輸出為高電平時(shí),LED7燈為滅,當(dāng)輸出為低電平時(shí),LED7燈為暗。8個(gè)LED燈都可由FPGA獨(dú)立控制。 二、設(shè)計(jì)目標(biāo)本工程使用1個(gè)LED燈---LED1,實(shí)現(xiàn)一個(gè)閃爍燈的功能。工程的工作時(shí)鐘是50M,也就是時(shí)鐘周期為20ns。當(dāng)管腳AA4輸出低電平時(shí),LED1燈亮,輸出高電平時(shí),LED1燈滅。具體功能要求是:隔1秒,亮N秒。N的變化是:1,2,3,---,9秒,然后再次循環(huán)。下面是波形圖: 上板效果圖如下圖所示。
上板的演示視頻,請(qǐng)登陸網(wǎng)址查看:www.mdy-edu.com/xxxx。 三、模塊設(shè)計(jì)我們先分析一下板子上的LED燈。要控制1個(gè)LED燈亮和滅,那就FPGA需要產(chǎn)生一個(gè)信號(hào),假定為led,這個(gè)信號(hào)連接到led燈上。要讓LED燈滅,FPGA將信號(hào)led輸出為1;要讓LED燈亮,FPGA將信號(hào)led輸出為0。 綜上所述,我們這個(gè)工程需要三個(gè)信號(hào),時(shí)鐘clk,復(fù)位rst_n和輸出信號(hào)led。 我們?cè)俜治鲆幌鹿δ苄枨螅?/font>LED燈的變化規(guī)律是暗1秒,亮N秒,其中N的變化是:1,2,3,---,9秒,然后再次循環(huán)。從現(xiàn)象轉(zhuǎn)化成信號(hào),其實(shí)就是信號(hào)led=1持續(xù)1秒,然后led=0持續(xù)N秒,其中N的變化是:1,2,3,---,9秒。波形示意圖如下: 上圖就是led信號(hào)的變化波形圖。在第1次時(shí),led=1并持續(xù)1秒,然后led=0并持續(xù)1秒,共2秒時(shí)間;在第2次時(shí),led=1并持續(xù)1秒,然后led=0并持續(xù)2秒,共3秒時(shí)間;以此類(lèi)推,第9次時(shí),led=1并持續(xù)1秒,然后led=0并持續(xù)9秒,共10秒時(shí)間。然后又再次重復(fù)。 由波形圖可知,我們需要1個(gè)計(jì)數(shù)器用來(lái)計(jì)算時(shí)間,如2秒、3秒等。本工程的工作時(shí)鐘是50MHz,即周期為20ns,計(jì)數(shù)器計(jì)數(shù)到2_000_000_000/20=100_000_000個(gè),我們就能知道2秒時(shí)間到了。以此類(lèi)推,在第2次時(shí),數(shù)到150_000_000個(gè),就知道了3秒時(shí)間到。第9次時(shí),數(shù)到500_000_000個(gè),就表示10秒時(shí)間到。另外,由于該計(jì)數(shù)器是不停地計(jì)數(shù),永遠(yuǎn)不停止的,可以認(rèn)為加1條件一直有效,可寫(xiě)成:assignadd_cnt==1。綜上所述,結(jié)合變量法,該計(jì)數(shù)器的代碼如下。 其中x表示該計(jì)數(shù)器cnt0要數(shù)的個(gè)數(shù)。該值如何定義,后面再思考。 再次觀(guān)察波形圖,我們發(fā)現(xiàn)有第1次,第2次直到第9次的字,說(shuō)明這還需要另外一個(gè)計(jì)數(shù)器來(lái)表示第幾次。該計(jì)數(shù)器表示次數(shù),自然是一次完成了就加1,因?yàn)榧?/font>1條件可為end_cnt0。該計(jì)數(shù)器一共要數(shù)9次。所以代碼為: 有了兩個(gè)計(jì)數(shù)器,我們來(lái)思考輸出信號(hào)led的變化。概括起來(lái),led有兩種變化點(diǎn):變0和變1。變0的原因都是計(jì)數(shù)到1秒時(shí)間,也就是cnt0數(shù)到1_000_000_000/20=50_000_000個(gè)時(shí),led變0。變1的原因,都是計(jì)數(shù)時(shí)間到了,即end_cnt0。所以led信號(hào)的代碼如下:
最后我們?cè)賮?lái)思考變量x,我們?cè)谟懻撚?jì)數(shù)器cnt0的時(shí)候,曾經(jīng)說(shuō)過(guò)“計(jì)數(shù)器計(jì)數(shù)到2_000_000_000/20=100_000_000個(gè),我們就能知道2秒時(shí)間到了。以類(lèi)類(lèi)推,在第2次時(shí),數(shù)到150_000_000個(gè),就知道了3秒時(shí)間到。第9次時(shí),數(shù)到500_000_000個(gè),就表示10秒時(shí)間到。”可以看到,cnt0要數(shù)多少個(gè)是跟第幾次有關(guān)系的。第1次,數(shù)100_000_000個(gè),第2次數(shù)150_000_000個(gè)。也就是與cnt1有關(guān)。因此x的代碼如下:
此次,主體程序已經(jīng)完成。接下來(lái)是將module補(bǔ)充完整。 將module的名稱(chēng)定義為my_led。并且我們已經(jīng)知道該模塊有三個(gè)信號(hào):clk、rst_n和led。為此,代碼如下:
其中clk、rst_n是輸入信號(hào),led是輸出信號(hào),并且三個(gè)信號(hào)都是1比特的,根據(jù)這些信息,我們補(bǔ)充輸入輸出端口定義。代碼如下:
接下來(lái)定義信號(hào)類(lèi)型。 cnt0是用always產(chǎn)生的信號(hào),因此類(lèi)型為reg。cnt0計(jì)數(shù)的最大值為500_000_000,需要用29根線(xiàn)表示,即位寬是29位。因此代碼如下: add_cnt0和end_cnt0都是用assign方式設(shè)計(jì)的,因此類(lèi)型為wire。并且其值是0或者1,1個(gè)線(xiàn)表示即可。因此代碼如下:
cnt1是用always產(chǎn)生的信號(hào),因此類(lèi)型為reg。cnt1計(jì)數(shù)的最大值為8,需要用4根線(xiàn)表示,即位寬是4位。因此代碼如下: add_cnt1和end_cnt1都是用assign方式設(shè)計(jì)的,因此類(lèi)型為wire。并且其值是0或者1,1根線(xiàn)表示即可。因此代碼如下: led是用always方式設(shè)計(jì)的,因此類(lèi)型為reg。并且其值是0或者1,1根線(xiàn)表示即可。因此代碼如下: x是用always方式設(shè)計(jì)的,因此類(lèi)型為reg。并且其值是最大是500_000_000,需要29根線(xiàn)表示即可。因此代碼如下:
至此,整個(gè)代碼的設(shè)計(jì)工作已經(jīng)完成。下一步是新建工程和上板查看現(xiàn)象。 如果你覺(jué)得有用的話(huà),就請(qǐng)你回個(gè)貼或者贊,證明我的付出沒(méi)有白費(fèi),大家都不容易,q328908175,讓們共同學(xué)習(xí)。
|