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 6

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 6 leonardoar
        reg [3:0] lcd_init_states, lcd_init_state_next; // Declare two variables of 4 bits to hold the FSM states
30 5 leonardoar
        reg [19:0] counter_wait_lcd_init;
31 6 leonardoar
        reg [7:0] counter_wait_strobe_lcd_init;
32 5 leonardoar
        reg [19:0] time_wait_lcd_init;
33 6 leonardoar
        reg [3:0] lcd_init_data_out;  // FSM output LCD_DATA
34
        reg lcd_init_e_out;           // FSM output LCD_E
35
        reg lcd_init_done;
36 5 leonardoar
 
37 6 leonardoar
        // States for FSM that send data to LCD
38
        localparam lcd_data_rst = 1;
39
        localparam lcd_data_wait = 2;
40
        localparam lcd_data_wr_nibble_high = 3;
41
        localparam lcd_data_wr_nibble_low = 4;
42
        localparam lcd_data_strobe = 5;
43
        reg [3:0] lcd_data_states, lcd_data_state_next;  // Declare two variables of 4 bits to hold the FSM states
44
        reg [3:0] lcd_data_data_out;     // FSM output LCD_DATA
45
        reg lcd_data_e_out;                             // FSM output LCD_E
46 5 leonardoar
 
47 6 leonardoar
 
48 5 leonardoar
        /*
49
                Initialize LCD...
50
        */
51
        always @ (posedge clk)
52
        begin
53
                if (rst)        // Reset synchronous
54
                        begin
55
                                lcd_init_states <= lcd_init_rst;
56
                                counter_wait_lcd_init <= 0;
57
                                counter_wait_strobe_lcd_init <= 0;
58 6 leonardoar
                                lcd_init_e_out <= 0;
59
                                lcd_init_done <= 0;
60 5 leonardoar
                        end
61
                else
62
                        begin
63
                                case (lcd_init_states)
64
                                        lcd_init_rst:
65
                                                begin
66
                                                        // Wait for 15ms to power-up LCD
67
                                                        time_wait_lcd_init <= 15000000;
68
                                                        lcd_init_states <= lcd_init_wait;
69
                                                        lcd_init_state_next <= lcd_init_write_03_01;
70
                                                end
71
 
72
                                        // Wait for a configured time in (ns) and go to other state in (lcd_init_state_next)
73
                                        lcd_init_wait:
74
                                                begin
75
                                                        counter_wait_lcd_init <= counter_wait_lcd_init + period_clk_ns;
76
                                                        if (counter_wait_lcd_init > time_wait_lcd_init)
77
                                                                lcd_init_states <= lcd_init_state_next;
78
                                                end
79
 
80
                                        // Strobe the LCD for at least 240 ns
81
                                        lcd_init_strobe:
82
                                                begin
83
                                                        lcd_init_e_out = 1;
84
                                                        counter_wait_strobe_lcd_init <= counter_wait_strobe_lcd_init + period_clk_ns;
85
                                                        if (counter_wait_strobe_lcd_init > 240)
86
                                                                begin
87
                                                                        lcd_init_states <= lcd_init_state_next;
88
                                                                        lcd_init_e_out <= 0;
89
                                                                end
90
                                                end
91
 
92
                                        lcd_init_write_03_01:
93
                                                // Send 0x3 and pulse LCD_E for 240ns 
94
                                                begin
95
                                                        lcd_init_data_out <= 4'h3;
96
                                                        lcd_init_states <= lcd_init_strobe;     // Strobe for at least 230 ns                                           
97
                                                        lcd_init_state_next <= lcd_init_wait_4ms;
98
                                                end
99
 
100
                                        lcd_init_wait_4ms:
101
                                                begin
102
                                                        time_wait_lcd_init <= 4100000;  // Wait for 4.1ms
103
                                                        lcd_init_states <= lcd_init_wait;
104
                                                        lcd_init_state_next <= lcd_init_write_03_02;
105
                                                end
106
 
107
                                        lcd_init_write_03_02:
108
                                                // Send 0x3 and pulse LCD_E for 240ns 
109
                                                begin
110
                                                        lcd_init_data_out <= 4'h3;
111
                                                        lcd_init_states <= lcd_init_strobe;     // Strobe for at least 230 ns                                           
112
                                                        lcd_init_state_next <= lcd_init_wait_100us;
113
                                                end
114
 
115
                                        lcd_init_wait_100us:
116
                                                begin
117
                                                        time_wait_lcd_init <= 100000;   // Wait for 100us
118
                                                        lcd_init_states <= lcd_init_wait;
119
                                                        lcd_init_state_next <= lcd_init_write_03_03;
120
                                                end
121
 
122
                                        lcd_init_write_03_03:
123
                                                // Send 0x3 and pulse LCD_E for 240ns 
124
                                                begin
125
                                                        lcd_init_data_out <= 4'h3;
126
                                                        lcd_init_states <= lcd_init_strobe;     // Strobe for at least 230 ns                                           
127
                                                        lcd_init_state_next <= lcd_init_wait_40us;
128
                                                end
129
 
130
                                        lcd_init_wait_40us:
131
                                                begin
132
                                                        time_wait_lcd_init <= 100000;   // Wait for 100us
133
                                                        lcd_init_states <= lcd_init_wait;
134
                                                        lcd_init_state_next <= lcd_init_write_02;
135
                                                end
136
 
137
                                        lcd_init_write_02:
138
                                                // Send 0x3 and pulse LCD_E for 240ns 
139
                                                begin
140
                                                        lcd_init_data_out <= 4'h2;
141
                                                        lcd_init_states <= lcd_init_strobe;     // Strobe for at least 230 ns                                           
142
                                                        lcd_init_state_next <= lcd_init_wait_50us;
143
                                                end
144
 
145
                                        lcd_init_wait_50us:
146
                                                begin
147
                                                        time_wait_lcd_init <= 100000;   // Wait for 100us
148
                                                        lcd_init_states <= lcd_init_wait;
149 6 leonardoar
                                                        lcd_init_state_next <= lcd_init_wait_50us;
150
                                                        lcd_init_done <= 1;
151 5 leonardoar
                                                end
152
                                endcase;
153
                        end;
154
        end;
155
 
156
        assign lcd_e = lcd_init_e_out;
157
        assign lcd_nibble = lcd_init_data_out;
158 6 leonardoar
 
159
        /*
160
                FSM that deals to send data to the LCD (nibble High + nibble Low)
161
        */
162
        always @ (posedge clk)
163
        begin
164
                if (~lcd_init_done)
165
                        begin
166
 
167
                        end
168
        end;
169 5 leonardoar
 
170
endmodule

powered by: WebSVN 2.1.0

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