1 項目背景 LED(Light Emitting Diode),發(fā)光二極管,是一種能夠將電能轉化為可見(jiàn)光的固態(tài)的半導體器件,它可以直接把電轉化為光。LED的心臟是一個(gè)半導體的晶片,晶片的一端附在一個(gè)支架上,一端是負極,另一端連接電源的正極,使整個(gè)晶片被環(huán)氧樹(shù)脂封裝起來(lái)。 半導體晶片由兩部分組成,一部分是P型半導體,在它里面空穴占主導地位,另一端是N型半導體,在這邊主要是電子。但這兩種半導體連接起來(lái)的時(shí)候,它們之間就形成一個(gè)P-N結。當電流通過(guò)導線(xiàn)作用于這個(gè)晶片的時(shí)候,電子就會(huì )被推向P區,在P區里電子跟空穴復合,然后就會(huì )以光子的形式發(fā)出能量,這就是LED燈發(fā)光的原理。而光的波長(cháng)也就是光的顏色,是由形成P-N結的材料決定的。 LED可以直接發(fā)出紅、黃、藍、綠、青、橙、紫、白色的光。 最初LED用作儀器儀表的指示光源,后來(lái)各種光色的LED在交通信號燈和大面積顯示屏中得到了廣泛應用,產(chǎn)生了很好的經(jīng)濟效益和社會(huì )效益。以12英寸的紅色交通信號燈為例,在美國本來(lái)是采用長(cháng)壽命,低光視效能的140瓦白熾燈作為光源,它產(chǎn)生2000流明的白光。經(jīng)紅色濾光片后,光損失90%,只剩下200流明的紅光。而在新設計的燈中,Lumileds公司采用了18個(gè)紅色LED光源,包括電路損失在內,共耗電14瓦,即可產(chǎn)生同樣的光效。汽車(chē)信號燈也是LED光源應用的重要領(lǐng)域。 對于一般照明而言,人們更需要白色的光源。1998年發(fā)白光的LED開(kāi)發(fā)成功。這種LED是將GaN芯片和釔鋁石榴石(YAG)封裝在一起做成。GaN芯片發(fā)藍光(λp=465nm,Wd=30nm),高溫燒結制成的含Ce3+的YAG熒光粉受此藍光激發(fā)后發(fā)出黃色光射,峰值550nLED燈m。藍光LED基片安裝在碗形反射腔中,覆蓋以混有YAG的樹(shù)脂薄層,約200-500nm。 LED基片發(fā)出的藍光部分被熒光粉吸收,另一部分藍光與熒光粉發(fā)出的黃光混合,可以得到白光。 對于InGaN/YAG白色LED,通過(guò)改變YAG熒光粉的化學(xué)組成和調節熒光粉層的厚度,可以獲得色溫3500-10000K的各色白光。這種通過(guò)藍光LED得到白光的方法,構造簡(jiǎn)單、成本低廉、技術(shù)成熟度高,因此運用最多。 明德?lián)P的教學(xué)板一共有8個(gè)可發(fā)綠光的LED燈。下面是LED燈的原理圖。 左邊的LED1~LED8是板子上LED燈的絲印。右邊的LED1~LED8_NET是信號線(xiàn)名,讀者在板子上是看不到這些信號線(xiàn)的。 LED燈一端連著(zhù)高電平3.3V,另一端是信號線(xiàn)LED1~LED8_NET。如果LED1~LED8_NET是高電平,則電流不導通,那么LED燈則不會(huì )發(fā)光。如果LED1~LED8_NET是低電平,則電流會(huì )導通,那么LED燈就發(fā)光。所以L(fǎng)ED燈發(fā)光與否,取決于信號LED1~LED8_NET處于什么電平。 信號線(xiàn)LED1~LED8_NET又連到哪里呢?搜索下原理圖文檔,可以發(fā)現這些信號是連到FPGA的管腳上的。 下面信號線(xiàn)和FPGA管腳的連接圖,例如信號線(xiàn)LED1是連接到FPGA的AA4管腳上。 LED1~LED8_NET分別與FPGA的8個(gè)管腳相連,所以L(fǎng)ED1~LED8_NET處于什么電平,即LED燈是否要發(fā)光,就取決于FPGA管腳的輸出了。 例如FPGA管腳AB14連到LED7上。要控制這個(gè)燈的亮滅,FPGA只需要將管腳AB14輸出為低高就可以了。當輸出為高電平時(shí),LED7燈為滅,當輸出為低電平時(shí),LED7燈為暗。8個(gè)LED燈都可由FPGA獨立控制。 2設計目標 本工程使用1個(gè)LED燈---LED1,實(shí)現一個(gè)閃爍燈的功能。工程的工作時(shí)鐘是50M,也就是時(shí)鐘周期為20ns。當管腳AA4輸出低電平時(shí),LED1燈亮,輸出高電平時(shí),LED1燈滅。具體功能要求是:隔1秒,亮N秒。N的變化是:1,2,3,---,9秒,然后再次循環(huán)。下面是波形圖: 上板效果圖如下圖所示: 3設計實(shí)現3.1 頂層信號 新建目錄:D:\mdy_book\my_led。在該目錄中,新建一個(gè)名為my_led.v的文件,并用GVIM打開(kāi),開(kāi)始編寫(xiě)代碼。 我們先分析一下板子上的LED燈。要控制1個(gè)LED燈亮和滅,那就FPGA需要產(chǎn)生一個(gè)信號,假定為led,這個(gè)信號連接到led燈上。要讓LED燈滅,FPGA將信號led輸出為1;要讓LED燈亮,FPGA將信號led輸出為0。下面表格表示了硬件電路圖的連接關(guān)系。 綜上所述,我們這個(gè)工程需要三個(gè)信號,時(shí)鐘clk,復位rst_n和輸出信號led。將module的名稱(chēng)定義為my_led,為此,代碼如下: 綜上所述,我們這個(gè)工程需要三個(gè)信號,時(shí)鐘clk,復位rst_n和輸出信號led。將module的名稱(chēng)定義為my_led,為此,代碼如下: 其中clk、rst_n是輸入信號,led是輸出信號,并且三個(gè)信號都是1比特的,根據這些信息,我們補充輸入輸出端口定義。代碼如下: 3.2 信號設計 我們再分析一下功能需求,LED燈的變化規律是暗1秒,亮N秒,其中N的變化是:1,2,3,---,9秒,然后再次循環(huán)。從現象轉化成信號,其實(shí)就是信號led=1持續1秒,然后led=0持續N秒,其中N的變化是:1,2,3,---,9秒。波形示意圖如下: 上圖就是led信號的變化波形圖。在第1次時(shí),led=1并持續1秒,然后led=0并持續1秒,共2秒時(shí)間;在第2次時(shí),led=1并持續1秒,然后led=0并持續2秒,共3秒時(shí)間;以此類(lèi)推,第9次時(shí),led=1并持續1秒,然后led=0并持續9秒,共10秒時(shí)間。然后又再次重復。 由波形圖可知,我們需要1個(gè)計數器用來(lái)計算時(shí)間,如2秒、3秒等。本工程的工作時(shí)鐘是50MHz,即周期為20ns,計數器計數到2_000_000_000/20=100_000_000個(gè),我們就能知道2秒時(shí)間到了。以此類(lèi)推,在第2次時(shí),數到150_000_000個(gè),就知道了3秒時(shí)間到。第9次時(shí),數到500_000_000個(gè),就表示10秒時(shí)間到。另外,由于該計數器是不停地計數,永遠不停止的,可以認為加1條件一直有效,可寫(xiě)成:assignadd_cnt==1。綜上所述,結合變量法,該計數器的代碼如下。 其中x表示該計數器cnt0要數的個(gè)數。該值如何定義,后面再思考。 再次觀(guān)察波形圖,我們發(fā)現有第1次,第2次直到第9次的字,說(shuō)明這還需要另外一個(gè)計數器來(lái)表示第幾次。該計數器表示次數,自然是一次完成了就加1,因為加1條件可為end_cnt0。該計數器一共要數9次。所以代碼為: 有了兩個(gè)計數器,我們來(lái)思考輸出信號led的變化。概括起來(lái),led有兩種變化點(diǎn):變0和變1。變0的原因都是計數到1秒時(shí)間,也就是cnt0數到1_000_000_000/20=50_000_000個(gè)時(shí),led變0。變1的原因,都是計數時(shí)間到了,即end_cnt0。所以led信號的代碼如下: 最后我們再來(lái)思考變量x,我們在討論計數器cnt0的時(shí)候,曾經(jīng)說(shuō)過(guò)“計數器計數到2_000_000_000/20=100_000_000個(gè),我們就能知道2秒時(shí)間到了。以類(lèi)類(lèi)推,在第2次時(shí),數到150_000_000個(gè),就知道了3秒時(shí)間到。第9次時(shí),數到500_000_000個(gè),就表示10秒時(shí)間到!笨梢钥吹,cnt0要數多少個(gè)是跟第幾次有關(guān)系的。第1次,數100_000_000個(gè),第2次數150_000_000個(gè)。也就是與cnt1有關(guān)。因此x的代碼如下: 此次,主體程序已經(jīng)完成。接下來(lái)是將module補充完整。 3.3 信號定義 接下來(lái)定義信號類(lèi)型。 cnt0是用always產(chǎn)生的信號,因此類(lèi)型為reg。cnt0計數的最大值為500_000_000,需要用29根線(xiàn)表示,即位寬是29位。 因此代碼如下: add_cnt0和end_cnt0都是用assign方式設計的,因此類(lèi)型為wire。并且其值是0或者1,1個(gè)線(xiàn)表示即可。因此代碼如下: cnt1是用always產(chǎn)生的信號,因此類(lèi)型為reg。cnt1計數的最大值為8,需要用4根線(xiàn)表示,即位寬是4位。因此代碼如下: add_cnt1和end_cnt1都是用assign方式設計的,因此類(lèi)型為wire。并且其值是0或者1,1根線(xiàn)表示即可。因此代碼如下: led是用always方式設計的,因此類(lèi)型為reg。并且其值是0或者1,1根線(xiàn)表示即可。因此代碼如下: x是用always方式設計的,因此類(lèi)型為reg。并且其值是最大是500_000_000,需要29根線(xiàn)表示即可。因此代碼如下: 至此,整個(gè)代碼的設計工作已經(jīng)完成。下一步是新建工程和上板查看現象。 4 綜合與上板4.1 新建工程 首先在d盤(pán)中創(chuàng )建名為“my_led”的工程文件夾,將寫(xiě)的代碼命名為“my_led.v”,頂層模塊名為“my_led” 然后打開(kāi)Quartus Ⅱ,點(diǎn)擊File下拉列表中的New Project Wzard...新建工程選項: 3.再出現的界面中直接點(diǎn)擊Next。 4.之后出現的是工程文件夾、工程名、頂層模塊名設置界面。按照之前的命名進(jìn)行填寫(xiě),然后點(diǎn)擊Next,在出現的界面再點(diǎn)擊next。 5.之后是文件添加界面。添加之前寫(xiě)的“my_led.v”文件,點(diǎn)擊右側的“Add”按鈕,之后文件會(huì )在下方顯示出來(lái),之后點(diǎn)擊“Next” 器件型號選擇界面。選擇Cyclone ⅣE,在芯片型號選擇處選擇EP4CE15F23C8,然后點(diǎn)擊“Next”。 EDA工具界面。直接點(diǎn)擊“Next” 8.之后出現的界面,點(diǎn)擊“Finish”。 4.2 綜合 1.新建工程步驟完成后,就會(huì )出現以下界面。選中要編譯的文件,點(diǎn)擊編譯按鈕。 2.編譯成功后會(huì )出現一下界面 4.3 配置管腳 在菜單欄中,選中Assignments,然后選擇Pin Planner,就會(huì )彈出配置管腳的窗口。 在配置窗口最下方中的location一列,參考下表中最右兩列配置好FPGA管腳。 配置完成后,關(guān)閉Pin Planner,軟件自動(dòng)會(huì )保存管腳配置信息。 4.4 再次綜合 在菜單欄中,選中Processing,然后選擇Start Compilation,再次對整個(gè)工程進(jìn)行編譯和綜合。 出現上面的界面,就說(shuō)明編譯綜合成功。 4.5 連接開(kāi)發(fā)板 圖中,下載器接入電腦USB接口,電源接入電源,然后摁下下方藍色開(kāi)關(guān)。 4.6 上板 1.單擊以下界面中的。 2.會(huì )出現如下界面,點(diǎn)擊add file添加.sof文件,點(diǎn)擊“Start”,會(huì )在“Progress”出顯示進(jìn)度。 3.進(jìn)度條中提示成功后,即可在開(kāi)發(fā)板上觀(guān)察到相應的現象。 |