Sterowanie wyświetlacza LCD typu HD4478 Laboratorium Języków Opisu Sprzętu AGH WFiIS Wyświetlacz LCD
Matrycowy moduł LCD E RW RS BF Wyświetlacz LCD CG RAM DD RAM DB[7:] Licznik Adresu Rejestr Danych Rejestr Komendy BF Busy Flag znacznik zajętości magistrali typ HD4478 Wyświetlacz LCD 2
Reset Sequence 5ms Power On Incjalizacja modułu LCD 4,ms µs 38H 38H 4µs 4µs 4µs 4µs,64ms 38H 38H Function set DL N F X X 6H Entry mode ID S EH Display on/off D C B H Display clear DL 8 bit (), 4 bit) N 2 lines(), line() F 5*7 dots() ID increment(), decrement) S shift on(), off() D display on(), off() C cursor on(), off() B - blink on(), off() 4µs CCH Set DD RAM address A6 A5 A4 A3 A2 A A CCH oznacza ostatnie cztery widoczne pozycje w drugiej linii. Wyświetlacz LCD 3
DB 38 6 E CC 39 35 33 3 init_sel [:] Proces inicjalizacji - komendy: reset sequence & function set >4,3ms entry mode Przebiegi czasowe display on display clear >,6ms 3 2 Adres DD RAM Na wyświetlaczu pojawią się cyfry: 9, 5, 3, mux_sel [:] 3 2 DB_sel RS data_sel E Wyświetlacz LCD 4
Parametryzacja projektu Liczbę dekad licznika sparametryzować na definicji modułu szczytowego: #(parameter ndec = 4; n =clogb2(ndec) Gdzie n jest liczba bitów licznika danych o nazwie mux_sel. Liczbę wysyłanych w inicjacji komend określić za pomocą dyrektywy kompilacji: `define ncmd 4, a następnie w module szczytowym ustalić liczbę bitów licznika komend: localparam nc = clogb2(`ncmd); Uwaga: W wersji wstępnej projektu zrezygnować z parametryzacji ustalając ręcznie rozmiary liczników: [:] mux_sel [:] init_sel i parametr size dla licznika BCD. Wyświetlacz LCD 5
E RW RS 6 x 2 matryca LCD typ HD4478 DB - 7 8 FPGA E_out RW_out RS_out LCD_controller co ok. ms en clk_div DB_sel mux_sel[n-:] data_sel init_sel [nc-:] LCD_driver DB_out[7:] LCD_dp bcd_val[ndec*4-:] 4 4 4 4 LCD_counter Parametryzowalna liczba dekad z licznika BCD Licznik BCD rst clk Z przycisku lub generatora in Wyświetlacz LCD 6
Ścieżka danych LCD_dp Clear 6 b Display on 6 b Entry mode 6 b Function set 6 b dec3 dec2 dec dec Stałe inicjalizacji 6 4 4 4 4 6 6 6 2 3 2 3 2 2 init_reset_mux 4 6 {2 b,init_reset_mux} 8 8 {4 b,counter_mux} counter_mux Set DD RAM address 8 hcc 8 8 data_outx Wyjście z FPGA do wyświetlacza DB_out init_sel [nc-:] mux_sel [n-:] Wyświetlacz LCD data_sel DB_sel 7
Przydatne makra dla modułu lcd_dp: `define Clear 6 b `define DisplayOn 6 b `define EntryMode 6 b `define FunctionSet 6 b `define InitAddr 8 hcc Wyświetlacz LCD 8
data_sel DB_sel init_sel mux_sel E_out RW_out RS_out Sterowanie LCD_controller Do modułu ścieżki danych LCD_dp Wyjście z FPGA do wyswietlacza nc n lcd_enable wr_enable adr wr_finish main_controller mode lcd_init_refresh write_cycle lcd_finish reg_sel b reset clk en co ok. ms Wyświetlacz LCD 9
Diagram automatu write_cycle assign RS_out=reg_sel; assign RW_out= b; wr_finish= idle wr_enable? E_out= init Eout E_out= endwr wr_finish= Wyświetlacz LCD
Diagram automatu LCD_init_refresh lcd_finish= idle lcd_enable? mode? lcd_finish= mux_sel<=ndec- init_sel<=`ncmd- wr_enable= data mux_sel<= mux_sel- wr_enable= wr_finish? data init_sel<= init_sel- endlcd adr? mode? mux_sel? init_sel? Wyświetlacz LCD
Diagram automatu main_controller lcd_enable= b adr= b DB_sel= b data_sel= b reg_sel= b mode=lcd_init lcd_enable= idle init localparam LCD_INIT=, LCD_REF=; lcd_enable= b adr= b DB_sel= b addr lcd_finish? lcd_enable= b addr lcd_finish? reg_sel= b lcd_enable= b adr= b DB_sel= b data_sel= b reg_sel= b mode=lcd_ref ref lcd_enable= b ref lcd_finish? Wyświetlacz LCD 2
Graf automatu main_controller idle lcd_enable= b adr= b DB_sel= b data_sel= b reg_sel= b mode=lcd_init init lcd_enable= b adr= b DB_sel= b data_sel= b reg_sel= b mode=lcd_init ref lcd_enable= b adr= b DB_sel= b data_sel= b reg_sel= b mode=lcd_ref lcd_finish == b / reg_sel= b addr lcd_enable= b adr= b DB_sel= b data_sel= b reg_sel= b mode=lcd_init ref lcd_enable= b adr= b DB_sel= b data_sel= b reg_sel= b mode=lcd_ref addr lcd_enable= b adr= b DB_sel= b data_sel= b reg_sel= b mode=lcd_init Wyświetlacz LCD 3
Sygnały main_controller sygnał znaczenie lcd_enable output Uruchomienie automatu podrzędnego lcd_init_refresh adr output Znacznik trybu adresowania dla automatu podrzędnego lcd_init_refresh DB_sel output Sterowanie wyjściowego multipleksera adres-(dane i komendy) w ścieżce danych lcd_dp data_sel output Sterowanie pośredniego multipleksera dane-komendy w ścieżce danych lcd_dp reg_sel output Sygnał RS dla wyświetlacza służący do rozróżnienia danych i komend mode output Rozróznienie trybu pracy LCD_INIT= (inicjalizacja + adresowanie) od trybu LCD_REF= (odświeżanie danych) lcd_finish input Status zakończenia pracy przez automat podrzędny lcd_init_refresh Wyświetlacz LCD 4