楊斌 李亞峻 喬廣欣 李松 李毅
摘要:介紹了LED點陣顯示模塊的硬件連接、MAX7219的初始化與工作時序,用VHDL語言編程實現(xiàn)了時鐘分頻、數(shù)據(jù)的存儲與調(diào)用、MAX7219控制器的設(shè)計。將Basys2開發(fā)板與點陣模塊相連,將程序下載到FPGA上,實現(xiàn)了8×8點陣的顯示,驗證了設(shè)計的正確性,該設(shè)計具有實際應(yīng)用價值。
關(guān)鍵詞:現(xiàn)場可編程門陣列;VHDL語言;MAX7219芯片;點陣顯示
中圖分類號:TP273 文獻標(biāo)識碼:A 文章編號:1007-9416(2018)05-0006-03
LED點陣顯示系統(tǒng)不僅能夠靜態(tài)顯示字符和圖像,而且能夠動態(tài)顯示文字、動畫、視頻等信息,在廣告、信息發(fā)布、體育比賽、工業(yè)等各個領(lǐng)域都有廣泛應(yīng)用。
LED點陣顯示控制器的種類不少,包括單片機[1]、ARM[2, 3]、FPGA[4],等等。本文采用DIGILENT公司的Basys2便攜式開發(fā)板,它是完整的即用型硬件系統(tǒng),適于從基本邏輯器件到復(fù)雜控制器的電路設(shè)計,其上嵌有Xilinx Spartan-3E系列FPGA器件[5]。
8×8點陣有16個引腳,如果直接與微處理器相連占用引腳資源太多,實際多用譯碼器、串并轉(zhuǎn)換芯片控制點陣。本文采用的8×8點陣模塊由一片MAX7219驅(qū)動。
1 基于MAX7219的8×8點陣模塊
1.1 8×8點陣模塊的硬件連接
圖1所示為MAX7219芯片的主要引腳。它只有三個輸入端DIN、CS、CLK,可以與所有通用的微處理器相連,所以由MAX7219驅(qū)動的8×8點陣模塊克服了點陣引腳過多的問題。
MAX7219芯片的輸出端DIG0~DIG7連到8×8點陣H1~H8行,SEG DP、SEG A~G連到8×8點陣L1~L8列,DOUT作為串行輸出可用于級聯(lián)擴展。MAX7219中含有BCD編碼器(本文未用到)、多路掃描回路(對DIG0~DIG7以不低于800Hz的頻率自動輪詢掃描)、段驅(qū)動器(驅(qū)動SEG DP、SEG A~G8段)和8×8 SRAM靜態(tài)隨機存儲器(用于存儲數(shù)據(jù))。
1.2 MAX7219的初始化與數(shù)據(jù)的存取
在DIN端輸入串行的16位數(shù)據(jù),數(shù)據(jù)中包含如表1所示的信息。
MAX7219芯片的寄存器分為控制寄存器和數(shù)據(jù)寄存器兩種。
控制寄存器有五個,分別是譯碼模式、亮度、掃描限、掉電和顯示檢測,寄存器地址依次為9、A、B、C、F,每個寄存器初始化的所有可能設(shè)置詳見MAX7219說明文檔[6]。本設(shè)計的初始化設(shè)定值如下:0900,譯碼模式設(shè)為不譯碼,數(shù)據(jù)存儲器中的8位數(shù)據(jù)直接輸出給8×8點陣的8列;0A08,設(shè)為中等亮度;0B07,掃描限設(shè)為8個,對8×8點陣的8行輪詢掃描;0C01,設(shè)為正常工作模式,不掉電;0F00,設(shè)為正常工作模式,關(guān)顯示檢測。
數(shù)據(jù)寄存器由片上的8×8 SRAM 實現(xiàn)。寄存器地址從1到8,對應(yīng)于MAX7219芯片的DIG0~DIG7引腳、對應(yīng)于8×8點陣的H1~H8行。SRAM的數(shù)據(jù)寬度為8,其中存儲的數(shù)據(jù)值對應(yīng)于MAX7219芯片的SEG DP、SEG A~SEG G引腳、對應(yīng)于8×8點陣的L1~L8列。地址nH中存儲的數(shù)據(jù)值就是8×8點陣第n行待顯示的信息。
在VHDL程序設(shè)計中,將MAX7219的初始化設(shè)定值與8×8點陣中待顯示的信息存儲在ROM IP核(romip模塊)中,數(shù)據(jù)的存儲格式如下:
memory_initialization_radix=16;
memory_initialization_vector=
0900, 0A08, 0B07, 0C01, 0F00,
0146, 02C9, 0349, 0446, 0549, 0649, 07E6, 0800;
圖2所示的ctrl_addr模塊用于產(chǎn)生romip模塊所需的地址addr,使addr自加1(如圖3所示),按照地址依次從romip模塊中取出這13個16位并行數(shù)據(jù)dout,輸入到MAX7219控制器模塊。
2 MAX7219控制器設(shè)計
2.1 MAX7219的工作時序
如圖4所示,當(dāng)數(shù)據(jù)鎖存信號CS為低電平時,從DIN串行輸入的數(shù)據(jù)D15~D0在每個時鐘CLK上升沿依次被移入內(nèi)部的16 位移位寄存器。連續(xù)輸入16位數(shù)據(jù)后,在CS上升沿,根據(jù)這16位數(shù)據(jù)的D11~D8位地址將其D7~D0位的值鎖存到相應(yīng)的控制寄存器或數(shù)據(jù)寄存器中。
2.2 MAX7219控制器的VHDL程序設(shè)計
為了使MAX7219正常工作,需要按照圖4所示的工作時序用VHDL語言編寫MAX7219的控制程序ctrl_dot.vhd,圖5為其輸入輸出端口信息。
ctrl_dot模塊實現(xiàn)的是在輸入時鐘clk的每個上升沿,將16位并行數(shù)據(jù)data(15:0)轉(zhuǎn)換為串行數(shù)據(jù)輸出給din,同時產(chǎn)生MAX7219芯片所需的數(shù)據(jù)鎖存信號load_cs和時鐘信號clk_max7219,分別與8×8點陣模塊的DIN、CS、CLK端相連,控制8×8點陣模塊顯示。用if語句編程實現(xiàn)的主要程序段及解讀如下。
if rising_edge(clk) then
if (loadcs_tmp='1') then -- ①
clk_max7219<='0';
if (data/=data_cmp) then
data_cmp <= data; --用于判斷數(shù)據(jù)是否更新
data_tmp <= data; --裝載新數(shù)據(jù)
loadcs_tmp<='0'; shift_f<='1';
end if;
else
if shift_f='1' then -- ②允許移位
din<=data_tmp(15); --高位輸出給din
data_tmp(15 downto 1)<=data_tmp(14 downto 0); --低15位左移一位
clk_max7219<='0'; shift_f<='0';
else --③
clk_max7219<='1'; --產(chǎn)生時鐘clk_max7219的上升沿
if cnt cnt:=cnt+1; shift_f<='1'; else --16位移完 cnt:=X"0"; shift_f<='0'; loadcs_tmp<='1'; --產(chǎn)生load_cs的上升沿,鎖存數(shù)據(jù) end if; end if; end if; load_cs<=loadcs_tmp; end if; ①當(dāng)loadcs_tmp為1時,使clk_max7219為0;當(dāng)檢測到輸入值data與原數(shù)據(jù)data_cmp不同時,用data值更新data_cmp(準(zhǔn)備下一次比較的數(shù)據(jù))和data_tmp(裝載新數(shù)據(jù));使loadcs_tmp為0,移位標(biāo)志位shift_f置1,允許數(shù)據(jù)移位。當(dāng)data與data_cmp相同時,表明數(shù)據(jù)未更新,loadcs_tmp為1,保持在①狀態(tài)繼續(xù)檢測數(shù)據(jù)是否更新。 ②當(dāng)loadcs_tmp為0、shift_f為1時,將data_tmp的最高位輸出給din,其他位左移一位,實現(xiàn)16位并行數(shù)據(jù)data_tmp的逐位左移串行輸出,先高位后低位;使clk_max7219為0、shift_f為0。 ③當(dāng)loadcs_tmp為0、shift_f為0時,使clk_max7219由0變?yōu)?,din每移一位產(chǎn)生一個clk_max7219時鐘。當(dāng)cnt<15時,16位數(shù)據(jù)未傳完,cnt自加1,使shift_f為1,在下一個clk時鐘上升沿返回到②繼續(xù)串行輸出。當(dāng)cnt=15時,表明16位數(shù)據(jù)全部串行輸出完畢,使cnt清零,shift_f為0;使 loadcs_tmp由0變?yōu)?,產(chǎn)生數(shù)據(jù)鎖存信號的上升沿,鎖存數(shù)據(jù),在下一個clk時鐘上升沿返回到①檢測數(shù)據(jù)是否更新。 3 時鐘分頻模塊設(shè)計 時鐘分頻模塊clkdiv_50M將Basy2開發(fā)板上提供的50MHz時鐘分頻,需保證提供給ctrl_dot的時鐘clk_16data與提供給ROM IP核的時鐘clk_rom匹配,只有當(dāng)ctrl_dot中的16位數(shù)據(jù)全部串行輸出后才允許更新data。通過分析ctrl_dot.vhd程序可知,16位數(shù)據(jù)傳輸至少需要34個clk_16data周期,所以clk_16data的時鐘頻率必須高于34倍的clk_rom時鐘頻率。 4 基于MAX7219的8×8點陣顯示效果 將時鐘分頻模塊clkdiv_50M、ROM地址模塊ctrl_addr、ROM IP核romip和MAX7219驅(qū)動模塊ctrl_dot連接起來,添加引腳約束文件后,進行綜合、實現(xiàn)、產(chǎn)生可編程文件,下載到Basys2開發(fā)板上,顯示出如圖7所示的效果。 5 結(jié)語 本文著重介紹了MAX7219控制器的VHDL程序設(shè)計。將MAX7219的寄存器地址、初始化設(shè)定值和點陣待顯示信息組成16位數(shù)據(jù)存入ROM IP核中,然后用if嵌套語句編程實現(xiàn)了16位并行數(shù)據(jù)的串行輸出,從而控制MAX7219驅(qū)動LED點陣顯示。 本文將大量數(shù)據(jù)存入ROM中提高了編程效率。另外,一個8×8點陣模塊只需一片MAX7219芯片,無論從軟件編程還是從硬件實現(xiàn)來看,都比用譯碼器與74HC595的組合驅(qū)動更實用,有更廣泛的應(yīng)用價值。 參考文獻 [1]朱海洋,歐陽明星,張俊武.基于Android控制的LED點陣顯示設(shè)計與實現(xiàn)[J].液晶與顯示,2016,31(11):1064-1069. [2]趙婷婷,王先全,姜增暉,王培懿.基于ARM的LED點陣自動調(diào)光控制系統(tǒng)的設(shè)計[J].儀表技術(shù)與傳感器,2016,(8):63-66,96. [3]文瑾,施連敏.基于KW01-Zigbee MCU無線LED點陣屏控制系統(tǒng)的設(shè)計與實現(xiàn)[J].福州大學(xué)學(xué)報(自然科學(xué)版),2017,45(1):32-36.