原創(chuàng) Daniel
收錄于話題
#數(shù)字電路
9個(gè)
繼年前介紹的時(shí)序邏輯電路之時(shí)鐘分頻后,今天我們來(lái)介紹第7講:流水燈。
流水燈,有時(shí)候也叫跑馬燈,是一個(gè)簡(jiǎn)單、有趣又經(jīng)典的實(shí)驗(yàn),基本所有單片機(jī)的玩家們?cè)诔跗趯W(xué)習(xí)的階段都做過(guò)。本次我們也來(lái)介紹一下如何通過(guò)小腳丫FPGA實(shí)現(xiàn)一個(gè)流水燈。
流水燈就是讓一連串的燈在一定時(shí)間內(nèi)先后點(diǎn)亮并循環(huán)往復(fù),所以其中的關(guān)鍵要領(lǐng)就在于控制每?jī)蓚€(gè)相鄰LED亮滅的時(shí)間差,以及所有LED燈完成一組亮滅動(dòng)作后的循環(huán)。很久都沒(méi)有用過(guò)小腳丫的朋友可以再回顧一下,這上面有8個(gè)LED燈,且低電平點(diǎn)亮。
實(shí)現(xiàn)流水燈的方法絕不止一種,在這里我們采用模塊化的設(shè)計(jì)思路,因?yàn)槟K化設(shè)計(jì)對(duì)于之后構(gòu)建大型電路系統(tǒng)非常有幫助,并且我們還可以借機(jī)溫習(xí)一下以前學(xué)過(guò)的內(nèi)容。
現(xiàn)在我們的目標(biāo)是每過(guò)1秒后點(diǎn)亮下一個(gè)LED燈并且熄滅當(dāng)前燈,且在第8個(gè)燈熄滅之后循環(huán)整個(gè)流程,該如何設(shè)計(jì)整個(gè)模塊?我們先上圖后解釋。
毫無(wú)疑問(wèn),第一步需要做的就是通過(guò)分頻來(lái)生成一個(gè)周期為1秒的時(shí)鐘信號(hào),不了解時(shí)鐘分頻童鞋可以讀一下本系列的第6篇內(nèi)容。
有了一個(gè)1秒鐘嘀嗒一次的時(shí)鐘后,我們還要考慮到循環(huán)問(wèn)題,因?yàn)樵诘?個(gè)LED燈熄滅之后還需要再返回到第1個(gè)。那么這個(gè)時(shí)候我們就需要一個(gè)計(jì)數(shù)器,它的作用就是數(shù)羊,一只,兩只…...數(shù)到第八只后重頭再來(lái)。數(shù)8只羊需要一個(gè)3位寬的變量(23=8)。
最后,由于我們是要依次點(diǎn)亮,也就是說(shuō)8位的輸出中每次只有1位是低電平,其余均為高電平(小腳丫LED燈為低電平點(diǎn)亮)。這個(gè)特性正好對(duì)應(yīng)了我們之前學(xué)過(guò)的3-8譯碼器。
現(xiàn)在我們?cè)賮?lái)捋一遍。首先,通過(guò)分頻在小腳丫上生成一個(gè)周期為1秒的慢速時(shí)鐘信號(hào),這個(gè)時(shí)鐘信號(hào)傳送到計(jì)數(shù)器之中;這個(gè)計(jì)數(shù)器是3位寬的,因此最多可以計(jì)八次慢速時(shí)鐘的嘀嗒,并且計(jì)數(shù)每增加1時(shí),都對(duì)應(yīng)著3-8譯碼器的下一種輸出,也就對(duì)應(yīng)著流水燈的下一個(gè)狀態(tài)。
現(xiàn)在我們上代碼:
module runningled (clk,led); input clk,rst; output[7:0] led; reg [2:0] cnt ; //定義了一個(gè)3位的計(jì)數(shù)器,輸出可以作為3-8譯碼器的輸入 wire clk1hz; //定義一個(gè)中間變量,表示分頻得到的時(shí)鐘,用作計(jì)數(shù)器的觸發(fā) //例化分頻模塊,產(chǎn)生一個(gè)1Hz時(shí)鐘信號(hào) divide #(.WIDTH(24),.N(12000000)) u2 ( //除數(shù)為12,000,000,因此頻率為1Hz .clk(clk), .rst_n(rst), .clkout(clk1hz) ); //生成計(jì)數(shù)器,上沿觸發(fā)并循環(huán)計(jì)數(shù) always@(posedge clk1hz) cnt <=< span=""> cnt +1; // 達(dá)到位寬上限后可自動(dòng)溢出清零 //例化3-8譯碼器模塊 decode38 u1 ( .X(cnt), //例化的輸入端口連接到cnt,輸出端口連接到led .D(led) );endmodule在第四篇講譯碼器的文章里,我們介紹過(guò),如果需要調(diào)用/例化子模塊時(shí),需要將各子模塊與大模塊放入同一個(gè)工程文件下進(jìn)行編譯。最后我們?cè)賮?lái)對(duì)小腳丫進(jìn)行管腳配置并燒錄就可以了。
對(duì)應(yīng)變量
小腳丫管腳
FPGA管腳
clk
Clock
J5
led [0]
LED1
N15
led [1]
LED2
N14
led [2]
LED3
M14
led [3]
LED4
M12
led [4]
LED5
L12
led [5]
LED6
K12
led [6]
LED7
L11
led [7]
LED8
K11
如果大家成功地在小腳丫上實(shí)現(xiàn)了流水燈的程序,還可以自己玩一個(gè)有意思的實(shí)驗(yàn):比如,你可以通過(guò)修改程序來(lái)提高流水燈的刷新頻率,然后看看LED燈的刷新率為多少時(shí)你的肉眼無(wú)法分別。同時(shí)再打開(kāi)手機(jī)的攝像頭,也以同樣的方法試驗(yàn)一番。結(jié)合到你觀察的現(xiàn)象,可以自己琢磨并思考一下,說(shuō)不定能挖掘出更多的知識(shí)。
備注一些大伙都知道的常識(shí):我國(guó)交流電工頻為50Hz,電腦常用顯示器的刷新率有60,75和144赫茲。華為Mate30刷新頻率為90赫茲,蘋果6-12的刷新頻率為60赫茲。
下一講我們來(lái)學(xué)習(xí)脈沖寬度調(diào)制技術(shù)(PWM)。目前
《小腳丫FPGA在數(shù)字電路設(shè)計(jì)中的應(yīng)用》直播課程也正在進(jìn)行中,且針對(duì)在校學(xué)生免費(fèi)開(kāi)放,還沒(méi)申請(qǐng)的同學(xué)快來(lái)申請(qǐng)吧,點(diǎn)擊“閱讀原文”或掃描下方二維碼了解詳情,每天下午兩點(diǎn)跟著Daniel老師來(lái)學(xué)習(xí)數(shù)字電路。交流群也已建好,請(qǐng)關(guān)注“硬禾學(xué)堂”公眾號(hào),回復(fù)關(guān)鍵字“數(shù)字電路”或“FPFA”,即可獲取。