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