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