4位閃爍燈一、項目背景 LED燈的理論、教學板的原理圖,已經在案例1位閃爍燈中有詳細的描述,在此不再講述,有興趣的讀者可以返回去閱讀。 二、設計目標本工程使用4個LED燈---LED1~LED4,實現一個呼吸燈的功能。這4個燈具體的變化情況為: 第1個燈隔1秒后,亮1秒;然后第2個燈隔1秒后,亮2秒;然后第3個燈隔1秒后,亮3秒,最后第4個燈隔1秒,亮4秒。如此循環往復。 下面是波形圖: 上板效果圖如下圖所示。 上板的演示視頻,請登陸網址查看:www.mdy-edu.com/xxxx。 三、模塊設計我們先分析一下板子上的LED燈。每個LED燈都有一個信號來控制,該信號為0,則燈亮,如果該信號為1,則燈來。現在我們要控制4個LED燈亮滅,那就需要4個信號,假設分別為led0、led1、led2和led3。這4個信號分別連接到4個led燈上。如果要讓LED0燈0亮,LED1~3燈來,那FPGA就讓led0信號為0,led1~3信號都為1。 綜上所述,我們這個工程需要6個信號:時鐘clk,復位rst_n、led0、led1、led2和led3。 我們再分析一下功能需求,第1個燈隔1秒后,亮1秒;然后第2個燈隔1秒后,亮2秒;然后第3個燈隔1秒后,亮3秒,最后第4個燈隔1秒,亮4秒。如此循環往復。 上面的功能需求,也可以翻譯成:對于LED0,復位后,先滅1秒,亮1秒,然后再滅12秒,循環往復;對于LED1,復位后,先滅3秒,亮2秒,然后再滅9秒,循環往復;對于LED2,復位后,先滅6秒,亮3秒,然后再滅5秒,循環往復;對于LED3,先滅10秒,亮4秒,循環往復。 再將其翻譯成信號來理解: 復位后,讓信號led0=1并持續1秒,然后讓led0=0并持續1秒,然后讓led0=1持續12秒。循環往復。 復位后,讓信號led1=1并持續3秒,然后讓led1=0并持續2秒,然后讓led1=1持續9秒。循環往復。 復位后,讓信號led2=1并持續6秒,然后讓led2=0并持續3秒,然后讓led2=1持續5秒。循環往復。 復位后,讓信號led3=1并持續10秒,然后讓led3=0并持續4秒。循環往復。 再將其翻譯成波形如下圖所示。 由圖中可看到,信號led0~led3的變化單位最小是1秒,同時4個信號都是經過14秒后就循環一次。由至簡設計法的思想,很容易就得出我們需要2個計數器,1個計數器用來計算1秒時間,另1個計數器用來計算14秒。有了這兩個計數器,led0~led3的變化時間就有了標準。 我們用1個計數器用來計算1秒時間,該計數器名稱為cnt0。本工程的工作時鐘是50MHz,即周期為20ns,計數器計數到1_000_000_000/20=50_000_000個,我們就能知道1秒時間到了。該計數器是不停地計數,永遠不停止的,可以認為加1條件一直有效,可寫成:assignadd_cnt==1。綜上所述,該計數器的代碼如下。 我們再用1個計數器用來表示14秒,名稱為cnt1。該計數器表示次數,自然是每隔1秒就加1,那就是end_cnt0。該計數器一共要數14次。所以代碼為: 有了兩個計數器,我們來思考輸出信號led0的變化。概括起來,led0有兩種變化點:變0和變1。變0的原因都是計數到1秒時間,也就是add_cnt1 &&cnt1==1-1時,led0變0。變1的原因,則是數到2秒時間時,即add_cnt1 &&cnt1==2-1時,led0變1。所以led0信號的代碼如下: 接下來我們思考輸出信號led1的變化。概括起來,led1有兩種變化點:變0和變1。變0的原因都是計數到3秒時間,也就是add_cnt1 &&cnt1==3-1時,led1變0。變1的原因,則是數到5秒時間時,即add_cnt1 &&cnt1==5-1時,led1變1。所以led1信號的代碼如下: 接下來我們思考輸出信號led2的變化。概括起來,led2有兩種變化點:變0和變1。變0的原因都是計數到6秒時間,也就是add_cnt1 &&cnt1==6-1時,led2變0。變1的原因,則是數到9秒時間時,即add_cnt1 &&cnt1==9-1時,led2變1。所以led2信號的代碼如下: 接下來我們思考輸出信號led3的變化。概括起來,led3有兩種變化點:變0和變1。變0的原因都是計數到10秒時間,也就是add_cnt1 &&cnt1==10-1時,led3變0。變1的原因,則是數到14秒時間時,即add_cnt1 &&cnt1==14-1,也就是end_cnt1時,led3變1。所以led3信號的代碼如下: 此次,主體程序已經完成。接下來是將module補充完整。 將module的名稱定義為huxiled。并且我們已經知道該模塊有六個信號:clk、rst_n、led0、led1、led2、led3。為此,代碼如下: 其中clk、rst_n是輸入信號,led0、led1、led2、led3是輸出信號,并且六個信號都是1比特的,根據這些信息,我們補充輸入輸出端口定義。代碼如下: 接下來定義信號類型。 cnt0是用always產生的信號,因此類型為reg。cnt0計數的最大值為500_000_000,需要用29根線表示,即位寬是29位。因此代碼如下: add_cnt0和end_cnt0都是用assign方式設計的,因此類型為wire。并且其值是0或者1,1個線表示即可。因此代碼如下: cnt1是用always產生的信號,因此類型為reg。cnt1計數的最大值為8,需要用4根線表示,即位寬是4位。因此代碼如下: add_cnt1和end_cnt1都是用assign方式設計的,因此類型為wire。并且其值是0或者1,1根線表示即可。因此代碼如下: led0、led1、led2、led3是用always方式設計的,因此類型為reg。并且其值是0或者1,1根線表示即可。因此代碼如下: 至此,整個代碼的設計工作已經完成。下一步是新建工程和上板查看現象。 四、綜合工程和上板新建工程首先在d盤中創建名為“huxiled”的工程文件夾,將寫的代碼命名為“huxiled.v”,頂層模塊名為“huxiled”。 然后打開Quartus Ⅱ,點擊File下拉列表中的New Project Wzard...新建工程選項。 3.再出現的界面中直接點擊Next。 4.之后出現的是工程文件夾、工程名、頂層模塊名設置界面。按照之前的命名進行填寫,然后點擊Next。 5.之后是文件添加界面。點擊紅色箭頭處,添加之前寫的“huxiled.v”文件,點擊右側的“Add”按鈕,之后文件還會出現在黑色箭頭處,點擊,之后點擊“Next”。 器件型號選擇界面。在上方紅色箭頭處選擇CycloneⅣE,在中間紅色箭頭處選擇EP4CE6F17C8,然后點擊“Next”。 EDA工具界面。直接點擊“Next”。 8.之后出現的界面,點擊“Finish”。 1.新建工程步驟完成后,就會出現以下界面。選中要編譯的文件,點擊編譯按鈕。 2.編譯成功后會出現一下界面,點擊“OK”。 1.點擊箭頭所指的管腳配置按鈕。 2.下圖是我們要用的原理圖,其中箭頭所指就是我們要配置的六個管腳,分別是clk、rst、led0、led1、led2、led3。 3.在下圖箭頭處雙擊填上對應的管腳號,回車即可。 管腳配置完成后,在進行一次編譯。 連接開發板圖中,下載器接入電腦USB接口,電源接入電源,然后摁下下方藍色開關。 1.雙擊箭頭所指位置。 2.會出現如下界面,點擊“Start”,會在“Progress”出顯示進度。 3.進度條中提示成功后,即可在開發板上觀察到相應的現象。 |
1.6 MB, 下載積分: 積分 -1