楊翠娥
(太原工業(yè)學(xué)院,山西 太原 030008)
FPGA芯片作為大規(guī)??删幊唐骷?,以其高集成度、高速、可反復(fù)編程等特點(diǎn)在電子產(chǎn)品設(shè)計(jì)中得到了廣泛的應(yīng)用。作為FPGA的數(shù)據(jù)輸出外設(shè),一般有LED數(shù)碼管輸出及LCD液晶顯示輸出較為常見(jiàn)。而對(duì)LCD液晶顯示輸出控制是FPGA設(shè)計(jì)的一個(gè)難點(diǎn),一種方法是可以通過(guò)8051IP核加ROM模塊通過(guò)匯編程序?qū)崿F(xiàn),資源消耗大;另一種方法是直接用Verilog程序設(shè)計(jì)實(shí)現(xiàn)控制時(shí)序,簡(jiǎn)單明了,資源利用率高,而且易于移植。一般資料給出的Verilog程序設(shè)計(jì)完成的LCD顯示控制只能顯示固定地址的字符,本設(shè)計(jì)給出的LCD顯示控制模塊,可以對(duì)輸入端口的數(shù)據(jù)實(shí)時(shí)顯示,且可以移植應(yīng)用到各種需要LCD外設(shè)的FPGA設(shè)計(jì)中。
LCD1602液晶顯示器是一種應(yīng)用廣泛的字符型液晶顯示模塊。1602是指顯示的內(nèi)容為16*2,即顯示兩行,每行16個(gè)字符。目前大多數(shù)的字符液晶都是基于HD44780液晶芯片的,控制原理基本相同,因此基于HD44780寫的Verilog控制程序可以很方便地應(yīng)用于其他型號(hào)的字符型液晶。LCD1602通常有16條引腳線,除了電源、地管腳,其他就是控制讀寫的端口及輸出8位數(shù)據(jù)口。HD44780內(nèi)置了DDRAM、CGROM和CGRAM。其中DDRAM用來(lái)寄存待顯示的字符代碼。共80個(gè)字節(jié),其地址和字符的對(duì)應(yīng)關(guān)系可參考其他資料[1]。1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,每一個(gè)字符都有一個(gè)固定的代碼。在程序中時(shí)可以直接用比如P1=“A”這樣的方法,PC在編譯時(shí)可以自動(dòng)把“A”轉(zhuǎn)換為對(duì)應(yīng)的41H代碼。對(duì)DDRAM中的內(nèi)容和地址進(jìn)行操作,需要通過(guò)不同的指令來(lái)完成。通過(guò)Verilog程序設(shè)計(jì)也可以實(shí)現(xiàn)對(duì)LCD1602的指令控制、寫入數(shù)據(jù)指令控制及如何在指定位置顯示字符等的功能。
圖1所示為用Verilog程序設(shè)計(jì)的LCD時(shí)序控制模塊,輸入端口除了時(shí)鐘和復(fù)位端,還有20位的數(shù)據(jù)輸入端口;輸出端口和LCD字符顯示器管腳對(duì)應(yīng)。根據(jù)Verilog程序設(shè)計(jì)特點(diǎn),完成對(duì)LCD的時(shí)序控制可通過(guò)狀態(tài)機(jī)的設(shè)計(jì)方法。下面一段程序內(nèi)容用關(guān)鍵詞localparam首先定義了12個(gè)不同的參數(shù),分別對(duì)應(yīng)于LCD顯示控制、數(shù)據(jù)、地址的讀寫控制等不同的工作狀態(tài)。
圖1 LCD時(shí)序控制模塊
以dis_temp(顯示數(shù)據(jù))狀態(tài)為例,下面給出了對(duì)應(yīng)的Verilog程序。首先要判斷狀態(tài)執(zhí)行的時(shí)間,LCD1602完成一次數(shù)據(jù)的顯示需要一定的時(shí)間,在此設(shè)定為20ms。如果時(shí)間到就可以進(jìn)行此狀態(tài)的工作及轉(zhuǎn)換到下一個(gè)狀態(tài),如果時(shí)間不到就一直保持此狀態(tài)。顯示輸入數(shù)據(jù)時(shí),因?yàn)橐粋€(gè)字符占8個(gè)字節(jié),所以要完整顯示電壓值比如“0.02V”五個(gè)字符時(shí),要設(shè)定顯示數(shù)據(jù)寬度為40位,即39到0;每次顯示一個(gè)字符,光標(biāo)右移再顯示第二個(gè)字符,所以cnt要計(jì)數(shù)5次,以完成5個(gè)字符的循環(huán)顯示。
下面的程序給出了如何把輸入的二進(jìn)制數(shù)實(shí)時(shí)顯示為對(duì)應(yīng)的顯示字符,如最高4位數(shù)據(jù),除了正常數(shù)字0~9對(duì)應(yīng)顯示“0~9”的字符外,根據(jù)具體設(shè)計(jì)內(nèi)容,還增加了10,11的二進(jìn)制編碼,在此用于顯示小數(shù)點(diǎn)“.”和電壓的單位“V”二個(gè)字符。
如圖2所示給出了基于FPGA的數(shù)字電壓表及LCD顯示設(shè)計(jì)的頂層電路圖,圖中共有四個(gè)模塊:鎖相環(huán)PLL模塊把系統(tǒng)時(shí)鐘clk0通過(guò)分頻和倍頻輸出三個(gè)時(shí)鐘,分別提供給AD轉(zhuǎn)換控制模塊、LCD時(shí)序控制模塊及ROM數(shù)據(jù)讀取模塊作為工作時(shí)鐘所用,其中ADCLK同時(shí)輸出給外部AD0809芯片使用;ADCINT模塊是基于Verilog設(shè)計(jì)的AD0809狀態(tài)轉(zhuǎn)換控制模塊,完成對(duì)外部AD0809芯片模擬量到數(shù)字量的轉(zhuǎn)換控制[2];由于AD0809芯片輸出的是8位二進(jìn)制數(shù),其電壓分辨率為5V/256,約為0.02V,要想通過(guò)LCD直接顯示對(duì)應(yīng)的電壓值,還需要通過(guò)ROM模塊實(shí)現(xiàn)轉(zhuǎn)換。ROM模塊的功能是通過(guò)建立初始化mif文件,形成二進(jìn)制與電壓的對(duì)應(yīng)關(guān)系,然后把AD0809芯片輸出的8位二進(jìn)制數(shù)作為ROM的地址,這樣就完成了二進(jìn)制數(shù)到對(duì)應(yīng)電壓值的轉(zhuǎn)換。ROM模塊數(shù)據(jù)的輸出作為給LCD顯示控制模塊的數(shù)據(jù)輸入,通過(guò)上述實(shí)現(xiàn)的LCD顯示控制模塊完成對(duì)輸入數(shù)據(jù)的LCD顯示輸出。
圖2 數(shù)字電壓表頂層電路圖
如下給出了mif初始化文件的部分內(nèi)容[3]:
可以看出,通過(guò)編碼,設(shè)定1010(A)為顯示小數(shù)點(diǎn)字符,1011(B)為顯示電壓的單位“V”字符,地址每加1,對(duì)應(yīng)顯示的內(nèi)容增加0.02V,這樣就可以通過(guò)LCD控制模塊控制LCD實(shí)時(shí)顯示所輸入的模擬電壓值。圖3為L(zhǎng)CD顯示的實(shí)時(shí)電壓測(cè)量數(shù)據(jù)。
圖3 LCD顯示的實(shí)時(shí)電壓測(cè)量數(shù)據(jù)
Verilog硬件設(shè)計(jì)語(yǔ)言是實(shí)現(xiàn)FPGA設(shè)計(jì)的主要設(shè)計(jì)輸入方法之一,語(yǔ)法簡(jiǎn)單,結(jié)構(gòu)明了,尤其是狀態(tài)機(jī)的設(shè)計(jì)描述方法可以很方便地完成FPGA的各種模塊設(shè)計(jì)。本論文通過(guò)對(duì)LCD顯示控制的Verilog狀態(tài)機(jī)設(shè)計(jì),完成了對(duì)LCD實(shí)時(shí)數(shù)據(jù)顯示控制,該設(shè)計(jì)程序模塊化,標(biāo)準(zhǔn)化,可廣泛應(yīng)用到FPGA的系統(tǒng)設(shè)計(jì)中。