|
안녕하세요~~ 카페지기님.
오래만에 질문 올려드립니다.
Character LCD VHDL에서 Verilog로 컨버팅해서 작업 동작까지 되었는데..
문제는... 하기 코드중.. 빨간색 부분이 왜 그렇게 하는지 이해가 안되서요~~^^;
데이터 시트에서
{ wait time > 15ms -> wait time > 4.1ms -> wait time > 100us} 하는 표현 어떻게 하는지 이해가 잘 안되서요~
답변 가능하시면 댓글 부탁드립니다.
`timescale 1ns / 1ps
module character_LCD( clk20m,
rst,
lcd_en,
lcd_rs,
lcd_rw,
lcd_data
);
input clk20m, rst;
output lcd_en, lcd_rs, lcd_rw;
output [7:0] lcd_data;
integer cnt_1khz;
reg clk_1khz;
reg [8:0] lcd_cnt;
wire [7:0] lcd_state;
reg [7:0] lcd_db;
always @(posedge clk20m or negedge rst)
begin
if(!rst)
clk_1khz <= 0;
else
begin
if(cnt_1khz >= 9999)
begin
cnt_1khz <= 0;
clk_1khz <= !clk_1khz;
end
else
begin
cnt_1khz <= cnt_1khz +1;
end
end
end
always @(posedge clk_1khz or negedge rst)
begin
if(!rst)
lcd_cnt <= 1'b0;
else if (lcd_cnt == 9'b001111010)
lcd_cnt <= 9'b000110100;
else
lcd_cnt <= lcd_cnt + 1;
end
assign lcd_state = lcd_cnt [8:1];
parameter [7:0] LCD_BLANK = 8'b00100000;
parameter [7:0] LCD_DASH = 8'b00101101;
parameter [7:0] LCD_COLON = 8'b00111010;
parameter [7:0] LCD_PERIODE = 8'b00101110;
parameter [7:0] LCD_EQUAL = 8'b00111101;
parameter [7:0] LCD_0 = 8'b00110000;
parameter [7:0] LCD_1 = 8'b00110001;
parameter [7:0] LCD_2 = 8'b00110010;
parameter [7:0] LCD_3 = 8'b00110011;
parameter [7:0] LCD_4 = 8'b00110100;
parameter [7:0] LCD_5 = 8'b00110101;
parameter [7:0] LCD_6 = 8'b00110110;
parameter [7:0] LCD_7 = 8'b00110111;
parameter [7:0] LCD_8 = 8'b00111000;
parameter [7:0] LCD_9 = 8'b00111001;
parameter [7:0] LCD_A = 8'b01000001;
parameter [7:0] LCD_B = 8'b01000010;
parameter [7:0] LCD_C = 8'b01000011;
parameter [7:0] LCD_D = 8'b01000100;
parameter [7:0] LCD_E = 8'b01000101;
parameter [7:0] LCD_F = 8'b01000110;
parameter [7:0] LCD_G = 8'b01000111;
parameter [7:0] LCD_H = 8'b01001000;
parameter [7:0] LCD_I = 8'b01001001;
parameter [7:0] LCD_J = 8'b01001010;
parameter [7:0] LCD_K = 8'b01001011;
parameter [7:0] LCD_L = 8'b01001100;
parameter [7:0] LCD_M = 8'b01001101;
parameter [7:0] LCD_N = 8'b01001110;
parameter [7:0] LCD_O = 8'b01001111;
parameter [7:0] LCD_P = 8'b01010000;
parameter [7:0] LCD_Q = 8'b01010001;
parameter [7:0] LCD_R = 8'b01010010;
parameter [7:0] LCD_S = 8'b01010011;
parameter [7:0] LCD_T = 8'b01010100;
parameter [7:0] LCD_U = 8'b01010101;
parameter [7:0] LCD_V = 8'b01010110;
parameter [7:0] LCD_W = 8'b01010111;
parameter [7:0] LCD_X = 8'b01011000;
parameter [7:0] LCD_Y = 8'b01011001;
parameter [7:0] LCD_Z = 8'b01011010;
parameter [7:0] LCD_UNDER = 8'b01011111;
parameter [7:0] LCD_S_a = 8'b01100001;
parameter [7:0] LCD_S_b = 8'b01100010;
parameter [7:0] LCD_S_c = 8'b01100011;
parameter [7:0] LCD_S_d = 8'b01100100;
parameter [7:0] LCD_S_e = 8'b01100101;
parameter [7:0] LCD_S_f = 8'b01100110;
parameter [7:0] LCD_S_g = 8'b01100111;
parameter [7:0] LCD_S_h = 8'b01101000;
parameter [7:0] LCD_S_i = 8'b01101001;
parameter [7:0] LCD_S_j = 8'b01101010;
parameter [7:0] LCD_S_k = 8'b01101011;
parameter [7:0] LCD_S_l = 8'b01101100;
parameter [7:0] LCD_S_m = 8'b01101101;
parameter [7:0] LCD_S_n = 8'b01101110;
parameter [7:0] LCD_S_o = 8'b01101111;
parameter [7:0] LCD_S_p = 8'b01110000;
parameter [7:0] LCD_S_q = 8'b01110001;
parameter [7:0] LCD_S_r = 8'b01110010;
parameter [7:0] LCD_S_s = 8'b01110011;
parameter [7:0] LCD_S_t = 8'b01110100;
parameter [7:0] LCD_S_u = 8'b01110101;
parameter [7:0] LCD_S_v = 8'b01110110;
parameter [7:0] LCD_S_w = 8'b01110111;
parameter [7:0] LCD_S_x = 8'b01111000;
parameter [7:0] LCD_S_y = 8'b01111001;
parameter [7:0] LCD_S_z = 8'b01111010;
always @ *
begin
case(lcd_state)
// rw=0, rs=0
8'h00 : lcd_db = 8'b00111000; // function set(8bit interface, 5*7 dot) -15ms delay
8'h0A : lcd_db = 8'b00111000; // function set(8bit interface, 5*7 dot) -4.1ms delay
8'h12 : lcd_db = 8'b00111000; // function set(8bit interface, 5*7 dot) -100us delay
8'h16 : lcd_db = 8'b00111000; // function set(8bit interface, 5*7 dot)
8'h17 : lcd_db = 8'b00001100; // display on
8'h18 : lcd_db = 8'b00000001; // clear display
8'h19 : lcd_db = 8'b00000110; // entry mode set(increment address, no shift)
// rw=0, rs=0
8'h1A : lcd_db = 8'b10000000;
// rw=0, rs=1
8'h1B : lcd_db = LCD_S;
8'h1C : lcd_db = LCD_E;
8'h1D : lcd_db = LCD_O;
8'h1E : lcd_db = LCD_N;
8'h1F : lcd_db = LCD_G;
8'h20 : lcd_db = LCD_BLANK;
8'h21 : lcd_db = LCD_T;
8'h22 : lcd_db = LCD_A;
8'h23 : lcd_db = LCD_E;
8'h24 : lcd_db = LCD_K;
8'h25 : lcd_db = LCD_PERIODE;
8'h26 : lcd_db = LCD_K;
8'h27 : lcd_db = LCD_I;
8'h28 : lcd_db = LCD_M;
8'h29 : lcd_db = LCD_BLANK;
8'h2A : lcd_db = LCD_BLANK;
// rw=0, rs=0
8'h2B : lcd_db = 8'b11000000;
// rw=0, rs=1
8'h2C : lcd_db = LCD_BLANK;
8'h2D : lcd_db = LCD_BLANK;
8'h2E : lcd_db = LCD_BLANK;
8'h2F : lcd_db = LCD_C;
8'h30 : lcd_db = LCD_L;
8'h31 : lcd_db = LCD_C;
8'h32 : lcd_db = LCD_D;
8'h33 : lcd_db = LCD_BLANK;
8'h34 : lcd_db = LCD_T;
8'h35 : lcd_db = LCD_E;
8'h36 : lcd_db = LCD_S;
8'h37 : lcd_db = LCD_T;
8'h38 : lcd_db = LCD_BLANK;
8'h39 : lcd_db = LCD_BLANK;
8'h3A : lcd_db = LCD_BLANK;
8'h3B : lcd_db = LCD_BLANK;
default : lcd_db = 0;
endcase
end
assign lcd_rw = 0;
assign lcd_rs = ((lcd_state >= 8'h00 & lcd_state < 8'h1B) | lcd_state == 8'h2B) ? 0 : 1;
assign lcd_en = !lcd_cnt[0];
assign lcd_data = lcd_db;
endmodule
|
첫댓글 그부분은 vlcd칩설명서에 설명되어있습니다~~ 칩설명서의 칩내부동작까지는 이해못합니다ㅠㅠ~~~~
사용법되로 이용해야 오류내지 오동작이 없습니다~
네~~~ 답변 감사합니다.^^
칩데이터파일있으시면 공유부탁드려요
100usec 단위 즉 0.1msec 단위로 지연을 줄려면 1KHz가 아닌 100MHz인 100usec 클럭을 만들어서 카운터를 동작시켜야 합니다.
제가 어제까지 외부에 있어서.. 바로 답변이 늦었네요~~ 신경써주셔서 감사합니다. 데이터시트 새글로 공유드릴께요~^^