OpenCores
URL https://opencores.org/ocsvn/wb_lcd/wb_lcd/trunk

Subversion Repositories wb_lcd

[/] [wb_lcd/] [trunk/] [myhdl/] [wb_lcd_workspace_ramless/] [workspace/] [lcd_display/] [src/] [wb_lcd.vhd] - Rev 2

Compare with Previous | Blame | View Log

-- File: wb_lcd.vhd
-- Generated by MyHDL 0.6
-- Date: Mon Apr 20 03:13:35 2009
 
 
package pck_wb_lcd is
 
    type t_enum_t_TxState_2 is (
    tx_high_setup,
    tx_high_hold,
    tx_oneus,
    tx_low_setup,
    tx_low_hold,
    tx_fortyus,
    tx_done
);
    type t_enum_t_State_1 is (
    display_init,
    init_fifteenms,
    init_one,
    init_two,
    init_three,
    init_four,
    init_five,
    init_six,
    init_seven,
    init_eight,
    display_function_set,
    display_entry_set,
    display_set_display,
    display_clr_display,
    display_pause_setup,
    display_pause,
    display_done,
    display_set_addr,
    display_char_write
);
 
end package pck_wb_lcd;
 
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use std.textio.all;
 
use work.pck_myhdl_06.all;
 
use work.pck_wb_lcd.all;
 
entity wb_lcd is
    port (
        wb_clk_i: in std_logic;
        wb_rst_i: in std_logic;
        wb_dat_i: in unsigned(31 downto 0);
        wb_dat_o: out unsigned(31 downto 0);
        wb_adr_i: in unsigned(31 downto 0);
        wb_sel_i: in unsigned(3 downto 0);
        wb_we_i: in std_logic;
        wb_cyc_i: in std_logic;
        wb_stb_i: in std_logic;
        wb_ack_o: out std_logic;
        SF_D: out unsigned(3 downto 0);
        LCD_E: out std_logic;
        LCD_RS: out std_logic;
        LCD_RW: out std_logic
    );
end entity wb_lcd;
 
architecture MyHDL of wb_lcd is
 
signal busy: std_logic;
signal lcd_we: std_logic;
signal mylcd_tx_init: std_logic;
signal mylcd_delay_load: std_logic;
signal mylcd_tx_done: std_logic;
signal mylcd_SF_D1: unsigned(3 downto 0);
signal mylcd_SF_D0: unsigned(3 downto 0);
signal mylcd_LCD_E1: std_logic;
signal mylcd_LCD_E0: std_logic;
signal mylcd_delay_done: std_logic;
signal mylcd_tx_byte: unsigned(7 downto 0);
signal mylcd_wr_addr: unsigned(6 downto 0);
signal mylcd_output_selector: std_logic;
signal mylcd_state: t_enum_t_State_1;
signal mylcd_tx_delay_value: unsigned(19 downto 0);
signal mylcd_main_delay_value: unsigned(19 downto 0);
signal mylcd_tx_delay_load: std_logic;
signal mylcd_delay_value: unsigned(19 downto 0);
signal mylcd_wr_dat: unsigned(6 downto 0);
signal mylcd_main_delay_load: std_logic;
signal mylcd_tx_state: t_enum_t_TxState_2;
signal mylcd_counter_counter: unsigned(20 downto 0);
 
begin
 
 
WB_LCD_WISHBONE_LOGIC: process (busy, wb_we_i, wb_stb_i, wb_cyc_i, wb_adr_i) is
begin
    wb_ack_o <= (wb_cyc_i and wb_stb_i);
 
    lcd_we <= (wb_cyc_i and wb_stb_i and wb_we_i and to_std_logic(wb_adr_i /= 128));
    if to_boolean(busy) then
        wb_dat_o <= "00000000000000000000000000000001";
    else
        wb_dat_o <= "00000000000000000000000000000000";
    end if;
end process WB_LCD_WISHBONE_LOGIC;
 
 
mylcd_output_selector <= ((mylcd_state = display_init) or (mylcd_state = init_fifteenms) or (mylcd_state = init_one) or (mylcd_state = init_two) or (mylcd_state = init_three) or (mylcd_state = init_four) or (mylcd_state = init_five) or (mylcd_state = init_six) or (mylcd_state = init_seven) or (mylcd_state = init_eight));
 
WB_LCD_MYLCD_CONUNTER_SHARING_VALUE: process (mylcd_main_delay_value, mylcd_tx_delay_load, mylcd_tx_delay_value) is
begin
    if to_boolean(mylcd_tx_delay_load) then
        mylcd_delay_value <= mylcd_tx_delay_value;
    else
        mylcd_delay_value <= mylcd_main_delay_value;
    end if;
end process WB_LCD_MYLCD_CONUNTER_SHARING_VALUE;
 
WB_LCD_MYLCD_DISPLAYFSM: process (wb_clk_i, wb_rst_i) is
begin
    if (wb_rst_i = '1') then
        mylcd_state <= display_init;
        mylcd_main_delay_load <= '0';
        mylcd_main_delay_value <= "00000000000000000000";
        mylcd_SF_D1 <= "0000";
        mylcd_LCD_E1 <= '0';
        mylcd_tx_byte <= "00000000";
    elsif rising_edge(wb_clk_i) then
        mylcd_main_delay_load <= '0';
 
        mylcd_main_delay_value <= "00000000000000000000";
 
        case mylcd_state is
            when display_init =>
                mylcd_tx_byte <= "00000000";
                mylcd_state <= init_fifteenms;
                mylcd_main_delay_load <= '1';
                mylcd_main_delay_value <= "10110111000110110000";
            when init_fifteenms =>
                mylcd_main_delay_load <= '0';
                if to_boolean(mylcd_delay_done) then
                    mylcd_state <= init_one;
 
                    mylcd_main_delay_load <= '1';
                    mylcd_main_delay_value <= "00000000000000001011";
                end if;
            when init_one =>
                mylcd_main_delay_load <= '0';
                mylcd_SF_D1 <= "0011";
                mylcd_LCD_E1 <= '1';
                if to_boolean(mylcd_delay_done) then
                    mylcd_state <= init_two;
 
                    mylcd_main_delay_load <= '1';
                    mylcd_main_delay_value <= "00110010000011001000";
                end if;
            when init_two =>
                mylcd_main_delay_load <= '0';
                mylcd_LCD_E1 <= '0';
                if to_boolean(mylcd_delay_done) then
                    mylcd_state <= init_three;
 
                    mylcd_main_delay_load <= '1';
                    mylcd_main_delay_value <= "00000000000000001011";
                end if;
            when init_three =>
                mylcd_main_delay_load <= '0';
                mylcd_SF_D1 <= "0011";
                mylcd_LCD_E1 <= '1';
                if to_boolean(mylcd_delay_done) then
                    mylcd_state <= init_four;
 
                    mylcd_main_delay_load <= '1';
                    mylcd_main_delay_value <= "00000001001110001000";
                end if;
            when init_four =>
                mylcd_main_delay_load <= '0';
                mylcd_LCD_E1 <= '0';
                if to_boolean(mylcd_delay_done) then
                    mylcd_state <= init_five;
 
                    mylcd_main_delay_load <= '1';
                    mylcd_main_delay_value <= "00000000000000001011";
                end if;
            when init_five =>
                mylcd_main_delay_load <= '0';
                mylcd_SF_D1 <= "0011";
                mylcd_LCD_E1 <= '1';
                if to_boolean(mylcd_delay_done) then
                    mylcd_state <= init_six;
 
                    mylcd_main_delay_load <= '1';
                    mylcd_main_delay_value <= "00000000011111010000";
                end if;
            when init_six =>
                mylcd_main_delay_load <= '0';
                mylcd_LCD_E1 <= '0';
                if to_boolean(mylcd_delay_done) then
                    mylcd_state <= init_seven;
 
                    mylcd_main_delay_load <= '1';
                    mylcd_main_delay_value <= "00000000000000001011";
                end if;
            when init_seven =>
                mylcd_main_delay_load <= '0';
                mylcd_SF_D1 <= "0010";
                mylcd_LCD_E1 <= '1';
                if to_boolean(mylcd_delay_done) then
                    mylcd_state <= init_eight;
 
                    mylcd_main_delay_load <= '1';
                    mylcd_main_delay_value <= "00000000011111010000";
                end if;
            when init_eight =>
                mylcd_main_delay_load <= '0';
                mylcd_LCD_E1 <= '0';
                if to_boolean(mylcd_delay_done) then
                    mylcd_state <= display_function_set;
 
                end if;
            when display_function_set =>
                mylcd_tx_byte <= "00101000";
                if to_boolean(mylcd_tx_done) then
                    mylcd_state <= display_entry_set;
                end if;
            when display_entry_set =>
                mylcd_tx_byte <= "00000110";
                if to_boolean(mylcd_tx_done) then
                    mylcd_state <= display_set_display;
                end if;
            when display_set_display =>
                mylcd_tx_byte <= "00001100";
                if to_boolean(mylcd_tx_done) then
                    mylcd_state <= display_clr_display;
                end if;
            when display_clr_display =>
                mylcd_tx_byte <= "00000001";
                if to_boolean(mylcd_tx_done) then
                    mylcd_state <= display_pause;
                    mylcd_main_delay_load <= '1';
                    mylcd_main_delay_value <= "00010100000001010000";
                end if;
            when display_pause_setup =>
                mylcd_state <= display_pause;
            when display_pause =>
                mylcd_tx_byte <= "00000000";
                if to_boolean(mylcd_delay_done) then
                    mylcd_state <= display_done;
 
                end if;
            when display_done =>
                mylcd_tx_byte <= "00000000";
                if to_boolean(lcd_we) then
                    mylcd_state <= display_set_addr;
                    mylcd_wr_addr <= resize(wb_adr_i, 7);
                    mylcd_wr_dat <= resize(wb_dat_i, 7);
                else
                    mylcd_state <= display_done;
                end if;
            when display_set_addr =>
                mylcd_tx_byte <= ("10000000" or mylcd_wr_addr);
                if to_boolean(mylcd_tx_done) then
                    mylcd_state <= display_char_write;
                end if;
            when display_char_write =>
                mylcd_tx_byte <= resize(mylcd_wr_dat, 8);
                if to_boolean(mylcd_tx_done) then
                    mylcd_state <= display_done;
 
                end if;
        end case;
    end if;
end process WB_LCD_MYLCD_DISPLAYFSM;
 
WB_LCD_MYLCD_TXFSM: process (wb_clk_i, wb_rst_i) is
begin
    if (wb_rst_i = '1') then
        mylcd_tx_state <= tx_done;
        mylcd_SF_D0 <= "0000";
        mylcd_LCD_E0 <= '0';
    elsif rising_edge(wb_clk_i) then
        mylcd_tx_delay_load <= '0';
 
        mylcd_tx_delay_value <= "00000000000000000000";
 
        case mylcd_tx_state is
            when tx_high_setup =>
                mylcd_LCD_E0 <= '0';
                mylcd_SF_D0 <= mylcd_tx_byte(8-1 downto 4);
                mylcd_tx_delay_load <= '0';
                if to_boolean(mylcd_delay_done) then
                    mylcd_tx_state <= tx_high_hold;
                    mylcd_tx_delay_load <= '1';
                    mylcd_tx_delay_value <= "00000000000000001100";
                end if;
            when tx_high_hold =>
                mylcd_LCD_E0 <= '1';
                mylcd_SF_D0 <= mylcd_tx_byte(8-1 downto 4);
                mylcd_tx_delay_load <= '0';
                if to_boolean(mylcd_delay_done) then
                    mylcd_tx_state <= tx_oneus;
                    mylcd_tx_delay_load <= '1';
                    mylcd_tx_delay_value <= "00000000000000110010";
                end if;
            when tx_oneus =>
                mylcd_LCD_E0 <= '0';
                mylcd_tx_delay_load <= '0';
                if to_boolean(mylcd_delay_done) then
                    mylcd_tx_state <= tx_low_setup;
                    mylcd_tx_delay_load <= '1';
                    mylcd_tx_delay_value <= "00000000000000000010";
                end if;
            when tx_low_setup =>
                mylcd_LCD_E0 <= '0';
                mylcd_SF_D0 <= mylcd_tx_byte(4-1 downto 0);
                mylcd_tx_delay_load <= '0';
                if to_boolean(mylcd_delay_done) then
                    mylcd_tx_state <= tx_low_hold;
                    mylcd_tx_delay_load <= '1';
                    mylcd_tx_delay_value <= "00000000000000001100";
                end if;
            when tx_low_hold =>
                mylcd_LCD_E0 <= '1';
                mylcd_SF_D0 <= mylcd_tx_byte(4-1 downto 0);
                mylcd_tx_delay_load <= '0';
                if to_boolean(mylcd_delay_done) then
                    mylcd_tx_state <= tx_fortyus;
                    mylcd_tx_delay_load <= '1';
                    mylcd_tx_delay_value <= "00000000011111010000";
                end if;
            when tx_fortyus =>
                mylcd_LCD_E0 <= '0';
                mylcd_tx_delay_load <= '0';
                if to_boolean(mylcd_delay_done) then
                    mylcd_tx_state <= tx_done;
                    mylcd_tx_done <= '1';
                end if;
            when tx_done =>
                mylcd_LCD_E0 <= '0';
                mylcd_tx_done <= '0';
                mylcd_tx_delay_load <= '0';
                if to_boolean(mylcd_tx_init) then
                    mylcd_tx_state <= tx_high_setup;
                    mylcd_tx_delay_load <= '1';
                    mylcd_tx_delay_value <= "00000000000000000010";
                end if;
        end case;
    end if;
end process WB_LCD_MYLCD_TXFSM;
 
 
mylcd_delay_load <= to_std_logic(to_boolean(mylcd_tx_delay_load) or to_boolean(mylcd_main_delay_load));
 
 
busy <= to_std_logic(mylcd_state /= display_done);
LCD_RW <= '0';
 
WB_LCD_MYLCD_OUTPUT_TX_OR_INIT_MUX: process (mylcd_SF_D1, mylcd_SF_D0, mylcd_LCD_E1, mylcd_LCD_E0, mylcd_output_selector) is
begin
    if to_boolean(mylcd_output_selector) then
        SF_D <= mylcd_SF_D1;
        LCD_E <= mylcd_LCD_E1;
    else
        SF_D <= mylcd_SF_D0;
        LCD_E <= mylcd_LCD_E0;
    end if;
end process WB_LCD_MYLCD_OUTPUT_TX_OR_INIT_MUX;
 
 
mylcd_tx_init <= ((not mylcd_tx_done) and ((mylcd_state = display_function_set) or (mylcd_state = display_entry_set) or (mylcd_state = display_set_display) or (mylcd_state = display_clr_display) or (mylcd_state = display_set_addr) or (mylcd_state = display_char_write)));
LCD_RS <= (not ((mylcd_state = display_function_set) or (mylcd_state = display_entry_set) or (mylcd_state = display_set_display) or (mylcd_state = display_clr_display) or (mylcd_state = display_set_addr)));
 
 
mylcd_delay_done <= to_std_logic(mylcd_counter_counter = 0);
 
WB_LCD_MYLCD_COUNTER_COUNTDOWN_LOGIC: process (wb_clk_i) is
begin
    if rising_edge(wb_clk_i) then
        if to_boolean(mylcd_delay_load) then
            mylcd_counter_counter <= resize(mylcd_delay_value, 21);
        else
            mylcd_counter_counter <= (mylcd_counter_counter - 1);
        end if;
    end if;
end process WB_LCD_MYLCD_COUNTER_COUNTDOWN_LOGIC;
 
end architecture MyHDL;
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.