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