勇敢的芯伴你玩轉Altera FPGA連載65:數碼管驅動(dòng)實(shí)例 特權同學(xué),版權所有 配套例程和更多資料下載鏈接: http://pan.baidu.com/s/1i5LMUUD ![]() 先來(lái)了解一下數碼管的工作原理。如圖8.30所示,這是一個(gè)典型的帶小數點(diǎn)的一位數碼管。如果忽略小數點(diǎn),我們通常稱(chēng)它為7段數碼管(即便有小數點(diǎn),我們也習慣的稱(chēng)呼為7段數碼管),所謂7段,是指著(zhù)7個(gè)發(fā)光二極管而言的。任意一個(gè)0-9的阿拉伯數字的顯示,只要通過(guò)這7個(gè)發(fā)光二極管進(jìn)行亮或滅的組合都可以實(shí)現。例如,我們要顯示數字0,那么只要讓發(fā)光二極管a、b、c、d、e、f點(diǎn)亮(g和dot熄滅)就可以了。 ![]() 圖8.30 數碼管示意圖 接下來(lái),大家可能就要關(guān)心著(zhù)這7個(gè)發(fā)光二極管是如何控制的,我們又是如何通過(guò)FPGA的I/O口去點(diǎn)亮或熄滅任意一個(gè)發(fā)光二極管?很簡(jiǎn)單,原理上來(lái)講,一個(gè)帶小數點(diǎn)的數碼管的所有8個(gè)發(fā)光二極管的正極或負極有一個(gè)公共端,通常必須接GND(共陰極數碼管)或者接VCC(共陽(yáng)極數碼管),而另一個(gè)非公共端的8個(gè)引腳就留給用戶(hù)的I/O直接控制了。例如,如果我們使用的是共陰極的數碼管,那么我們在使用該數碼管時(shí)就要將其公共端接地(或者接低電平0),我們的應用中,把這個(gè)公共端連接到了FPGA的I/O腳上,這便是數碼管的片選信號。如果FPGA的這個(gè)I/O腳輸出低電平0,那么這個(gè)數碼管就能夠顯示數字;如果這個(gè)I/O輸出高電平1,那么無(wú)論數碼管的8個(gè)段選端輸出0還是1,都無(wú)法將8個(gè)發(fā)光二極管的任意一個(gè)點(diǎn)亮,這也達到了關(guān)閉數碼管顯示的效果。這樣一來(lái),這個(gè)數碼管的公共端被我們當做了數碼管片選引腳使用了,雖然不是名副其實(shí)的“片選”,但還真達到了異曲同工之妙。 我們的例程要實(shí)現的功能比較簡(jiǎn)單基礎:讓4個(gè)數碼管每隔1s不斷的遞增計數顯示,計數范圍為0-F。為了便于代碼編寫(xiě)控制7個(gè)用于段選(不包括小數點(diǎn))的發(fā)光二極管顯示不同的字符,這里只做了一個(gè)簡(jiǎn)單的對應表,把不同字符顯示時(shí)的7個(gè)I/O值進(jìn)行編碼,如表8.2所示。 表8.2 數碼管顯示字符與驅動(dòng)編碼映射表
本實(shí)例的功能框圖如圖8.31所示。PLL產(chǎn)生的25MHz時(shí)鐘,分別供給兩個(gè)子模塊,秒計數器(counter.v)模塊產(chǎn)生一個(gè)每秒遞增的16位數據,這16位數據以16進(jìn)制形式通過(guò)數碼管顯示驅動(dòng)模塊(seg7.v)顯示到數碼管上。數碼管顯示驅動(dòng)模塊以分時(shí)復用的片選方式,將數據送到數碼管的各個(gè)段選位上。 ![]() 圖8.31 數碼管驅動(dòng)功能框圖 該實(shí)例工程的模塊間層級關(guān)系如圖8.32所示。 ![]() 圖8.32 數碼管驅動(dòng)實(shí)例代碼層次 |