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

Subversion Repositories lcd_block

[/] [lcd_block/] [trunk/] [hdl/] [iseProject/] [lcd_controller.v] - Blame information for rev 5

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 leonardoar
`timescale 1ns / 1ps
2
 
3
module lcd_controller(
4
    input rst,
5
    input clk,
6
    input [7:0] data_in,
7
    input strobe_in,
8
    input [7:0] period_clk_ns,
9
    output lcd_e,
10
    output [3:0] lcd_nibble,
11
    output lcd_rs,
12
    output lcd_rw,
13
    output disable_flash,
14
    output done
15
    );
16
 
17
        // States for FSM that initialize the LCD
18
        localparam lcd_init_rst = 1;
19
        localparam lcd_init_wait = 2;
20
        localparam lcd_init_write_03_01 = 3;
21
        localparam lcd_init_wait_4ms = 4;
22
        localparam lcd_init_write_03_02 = 5;
23
        localparam lcd_init_wait_100us = 6;
24
        localparam lcd_init_write_03_03 = 7;
25
        localparam lcd_init_wait_40us = 8;
26
        localparam lcd_init_write_02 = 9;
27
        localparam lcd_init_wait_50us = 10;
28
        localparam lcd_init_strobe = 11;
29
        reg [3:0] lcd_init_states, lcd_init_state_next;
30
        reg [19:0] counter_wait_lcd_init;
31
        reg [3:0] counter_wait_strobe_lcd_init;
32
        reg [19:0] time_wait_lcd_init;
33
        reg [3:0] lcd_init_data_out;
34
        reg lcd_init_e_out;
35
 
36
 
37
        /*
38
                Initialize LCD...
39
        */
40
        always @ (posedge clk)
41
        begin
42
                if (rst)        // Reset synchronous
43
                        begin
44
                                lcd_init_states <= lcd_init_rst;
45
                                counter_wait_lcd_init <= 0;
46
                                counter_wait_strobe_lcd_init <= 0;
47
                        end
48
                else
49
                        begin
50
                                case (lcd_init_states)
51
                                        lcd_init_rst:
52
                                                begin
53
                                                        // Wait for 15ms to power-up LCD
54
                                                        time_wait_lcd_init <= 15000000;
55
                                                        lcd_init_states <= lcd_init_wait;
56
                                                        lcd_init_state_next <= lcd_init_write_03_01;
57
                                                end
58
 
59
                                        // Wait for a configured time in (ns) and go to other state in (lcd_init_state_next)
60
                                        lcd_init_wait:
61
                                                begin
62
                                                        counter_wait_lcd_init <= counter_wait_lcd_init + period_clk_ns;
63
                                                        if (counter_wait_lcd_init > time_wait_lcd_init)
64
                                                                lcd_init_states <= lcd_init_state_next;
65
                                                end
66
 
67
                                        // Strobe the LCD for at least 240 ns
68
                                        lcd_init_strobe:
69
                                                begin
70
                                                        lcd_init_e_out = 1;
71
                                                        counter_wait_strobe_lcd_init <= counter_wait_strobe_lcd_init + period_clk_ns;
72
                                                        if (counter_wait_strobe_lcd_init > 240)
73
                                                                begin
74
                                                                        lcd_init_states <= lcd_init_state_next;
75
                                                                        lcd_init_e_out <= 0;
76
                                                                end
77
                                                end
78
 
79
                                        lcd_init_write_03_01:
80
                                                // Send 0x3 and pulse LCD_E for 240ns 
81
                                                begin
82
                                                        lcd_init_data_out <= 4'h3;
83
                                                        lcd_init_states <= lcd_init_strobe;     // Strobe for at least 230 ns                                           
84
                                                        lcd_init_state_next <= lcd_init_wait_4ms;
85
                                                end
86
 
87
                                        lcd_init_wait_4ms:
88
                                                begin
89
                                                        time_wait_lcd_init <= 4100000;  // Wait for 4.1ms
90
                                                        lcd_init_states <= lcd_init_wait;
91
                                                        lcd_init_state_next <= lcd_init_write_03_02;
92
                                                end
93
 
94
                                        lcd_init_write_03_02:
95
                                                // Send 0x3 and pulse LCD_E for 240ns 
96
                                                begin
97
                                                        lcd_init_data_out <= 4'h3;
98
                                                        lcd_init_states <= lcd_init_strobe;     // Strobe for at least 230 ns                                           
99
                                                        lcd_init_state_next <= lcd_init_wait_100us;
100
                                                end
101
 
102
                                        lcd_init_wait_100us:
103
                                                begin
104
                                                        time_wait_lcd_init <= 100000;   // Wait for 100us
105
                                                        lcd_init_states <= lcd_init_wait;
106
                                                        lcd_init_state_next <= lcd_init_write_03_03;
107
                                                end
108
 
109
                                        lcd_init_write_03_03:
110
                                                // Send 0x3 and pulse LCD_E for 240ns 
111
                                                begin
112
                                                        lcd_init_data_out <= 4'h3;
113
                                                        lcd_init_states <= lcd_init_strobe;     // Strobe for at least 230 ns                                           
114
                                                        lcd_init_state_next <= lcd_init_wait_40us;
115
                                                end
116
 
117
                                        lcd_init_wait_40us:
118
                                                begin
119
                                                        time_wait_lcd_init <= 100000;   // Wait for 100us
120
                                                        lcd_init_states <= lcd_init_wait;
121
                                                        lcd_init_state_next <= lcd_init_write_02;
122
                                                end
123
 
124
                                        lcd_init_write_02:
125
                                                // Send 0x3 and pulse LCD_E for 240ns 
126
                                                begin
127
                                                        lcd_init_data_out <= 4'h2;
128
                                                        lcd_init_states <= lcd_init_strobe;     // Strobe for at least 230 ns                                           
129
                                                        lcd_init_state_next <= lcd_init_wait_50us;
130
                                                end
131
 
132
                                        lcd_init_wait_50us:
133
                                                begin
134
                                                        time_wait_lcd_init <= 100000;   // Wait for 100us
135
                                                        lcd_init_states <= lcd_init_wait;
136
                                                        lcd_init_state_next <= lcd_init_write_02;
137
                                                end
138
                                endcase;
139
                        end;
140
        end;
141
 
142
        assign lcd_e = lcd_init_e_out;
143
        assign lcd_nibble = lcd_init_data_out;
144
 
145
endmodule

powered by: WebSVN 2.1.0

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