CONTACT | TEL : 02-728-3440, EMAIL : SALES@ASTRONLOGIC.COM
การใช้งานบอร์ด WIZARD FLEX-A01 เพื่อควบคุมโมดูล LCD ตอนที่ 2

» การใช้งานบอร์ด WIZARD FLEX-A01 เพื่อควบคุมโมดูล LCD ตอนที่ 2

ในตอนที่ 2 นี้จะนำคุณเข้าสู่การเชื่อมต่อโมดูล LCD เข้ากับบอร์ด WIZARD FLEX-A01 และการเขียนโปรแกรมภาษา VHDL เพื่อใช้ในการควบคุมการแสดงผลของโมดูล LCD

การใช้เอฟพีจีเอเพื่อเชื่อมต่อกับโมดูล LCD
สำหรับการเชื่อมต่อจอ LCD เข้ากับชิฟ FPGA นั้น ภายในบอร์ด WIZARD FLEX-A01 เราจะใช้พอร์ตขยายช่องสัญญาณ EXT A เชื่อมต่อกับ LCD ดังรูปที่ 1 ส่วนตำแหน่งขาของ FPGA ที่เชื่อมต่อกับ EXT A สามารถดูได้ที่คู่มือของบอร์ด WIZARD FLEX-A01

รูปที่ 1 การเชื่อมต่อ LCD เข้ากับบอร์ด WIZARD FLEX-A01 ผ่านทางพอร์ตขยายช่องสัญญาณ EXT A

ในการควบคุมโมดูล LCD นั้นเริ่มต้นจะต้องทำการกำหนดค่าต่างๆให้แก่โมดูล LCD ก่อนซึ่งข้อมูลที่ส่งไปให้โมดูล LCD ในขณะนี้จะเป็นข้อมูลของรหัสคำสั่งและก่อนที่จะส่งคำสั่งต่อไปจะต้องทำการหน่วงเวลาไว้เพื่อให้คอนโทรลเลอร์ในโมดูล LCD ตอบสนองกับคำสั่งนั้น
ในการออกแบบสำหรับเอฟพีจีเอนั้นจะใช้ Clock เป็นตัวกระตุ้นให้ส่งคำสั่งแต่ละตัวออกไป ซึ่งค่าเวลาที่จะใช้ในการหน่วงเวลาสำหรับแต่ละคำสั่งจะเท่ากับค่า Time ของสัญญาณ Clock ที่ใช้เป็นตัวกระตุ้น โดยมีลำดับขั้นตอนดังนี้
1.ส่งค่า 00H ออกมาที่บัสข้อมูลก่อน

2.ส่งสัญญาณ Enable ออกไป 1 พัลซ์เพื่อให้คอนโทรลเลอร์ภายในโมดูล LCD ตอบสนองกับข้อมูล 00H

3.กำหนดโหมดการทำงานเป็นแบบ 8 บิต

4.ส่งสัญญาณ Enable ออกไป 1 พัลซ์เพื่อให้คอนโทรลเลอร์ภายในโมดูล LCD ตอบสนองกับคำสั่งกำหนดโหมดการทำงาน

5.กำหนดโหมดการป้อนข้อมูลเป็นแบบ เมื่อเกิดข้อมูลใหม่เคอร์เซอร์จะเลื่อนไปทางขวามือและแอดแดรสของ DDRAM เพิ่มขึ้น

6.ส่งสัญญาณ Enable ออกไป 1 พัลซ์เพื่อให้คอนโทรลเลอร์ภายในโมดูล LCD ตอบสนองกับคำสั่งกำหนดโหมดการป้อนข้อมูล

7.กำหนดรูปแบบของเคอร์เซอร์และการแสดงผลซึ่งจะเป็นการกำหนดให้เปิดจอแสดงผลแสดงเคอร์เซอร์และให้เคอร์เซอร์กระพริบ

8.ส่งสัญญาณ Enable ออกไป 1 พัลซ์เพื่อให้คอนโทรลเลอร์ภายในโมดูล LCD ตอบสนองกับคำสั่งกำหนดรูปแบบของเคอร์เซอร์และการแสดงผล

9.กำหนดให้เคอร์เซอร์เลื่อนไปทางขวาไม่เลื่อนตัวอักษร

10.ส่งสัญญาณ Enable ออกไป 1 พัลซ์เพื่อให้คอนโทรลเลอร์ภายในโมดูล LCD ตอบสนองกับคำสั่งกำหนดเคอร์เซอร์

11.ทำการเคลียร์จอแสดงผล

12.ส่งสัญญาณ Enable ออกไป 1 พัลซ์เพื่อให้คอนโทรลเลอร์ภายในโมดูล LCD ตอบสนองกับคำสั่งเคลียร์จอแสดงผล

หลังจากนั้นจึงส่งข้อมูลที่ต้องการจะแสดงผลออกไป หลักการก็คล้ายๆกับการส่งข้อมูลคำสั่ง แต่ข้อมูลที่ส่งไปจะเป็นข้อมูลของการแสดงผล ในตัวอย่างนี้จะให้แสดงข้อความ "ASTRON" ที่จอ LCD ข้อมูลที่จะส่งไปยังโมดูล LCD จะต้องเป็นรหัสแอสกี (ASCII Code) ของแต่ละตัวอักษร สำหรับข้อความที่จะแสดงจะมีรหัสแอสกี (ASCII Code) ดังรูปที่ 2

รูปที่ 2 รหัสแอสกีของคำว่า ASTRON

ขั้นตอนการส่งข้อมูลสำหรับแสดงผลจะมีดังนี้

1.กำหนดให้สัญญาณ RS เป็นลอจิก "1" เพื่อบอกให้คอนโทรลเลอร์ในโมดูล LCD รู้ว่าข้อมูลที่จะส่งไปเป็นข้อมูลสำหรับแสดงผลและส่งข้อมูลของตัวอักษร "A" ออกมาที่บัสข้อมูล

2.ส่งสัญญาณ Enable ออกไป 1 พัลซ์เพื่อให้คอนโทรลเลอร์ภายในโมดูล LCD ตอบสนองกับข้อมูลของตัวอักษร "A"

3.ส่งข้อมูลสำหรับตัวอักษร "S" ออกไปที่บัสข้อมูลและกำหนดให้สัญญาณ RS เป็นลอจิก "1"

4.ส่งสัญญาณ Enable ออกไป 1 พัลซ์เพื่อให้คอนโทรลเลอร์ภายในโมดูล LCD ตอบสนองกับข้อมูลของตัวอักษร "S"

5.ส่งข้อมูลสำหรับตัวอักษร "T" ออกไปที่บัสข้อมูลและกำหนดให้สัญญาณ RS เป็นลอจิก "1"

6.ส่งสัญญาณ Enable ออกไป 1 พัลซ์เพื่อให้คอนโทรลเลอร์ภายในโมดูล LCD ตอบสนองกับข้อมูลของตัวอักษร "T"

7.ส่งข้อมูลสำหรับตัวอักษร "R" ออกไปที่บัสข้อมูลและกำหนดให้สัญญาณ RS เป็นลอจิก "1"

8.ส่งสัญญาณ Enable ออกไป 1 พัลซ์เพื่อให้คอนโทรลเลอร์ภายในโมดูล LCD ตอบสนองกับข้อมูลของตัวอักษร "R"

9.ส่งข้อมูลสำหรับตัวอักษร "O" ออกไปที่บัสข้อมูลและกำหนดให้สัญญาณ RS เป็นลอจิก "1"

10.ส่งสัญญาณ Enable ออกไป 1 พัลซ์เพื่อให้คอนโทรลเลอร์ภายในโมดูล LCD ตอบสนองกับข้อมูลของตัวอักษร "O"

11.ส่งข้อมูลสำหรับตัวอักษร "N" ออกไปที่บัสข้อมูลและกำหนดให้สัญญาณ RS เป็นลอจิก "1"

12.ส่งสัญญาณ Enable ออกไป 1 พัลซ์เพื่อให้คอนโทรลเลอร์ภายในโมดูล LCD ตอบสนองกับข้อมูลของตัวอักษร "N"

สำหรับสัญญาณ Clock ที่จะนำมาเป็นตัวกระตุ้นให้มีการส่งข้อมูลออกมาที่โมดูล LCD และหน่วงเวลาระหว่างคำสั่งแต่ละคำสั่งจะใช้สัญญาณ Clock ความถี่ 9.600 MHz จากโมดูลออสซิเลเตอร์ที่อยู่บนบอร์ด WIZARD FLEX-A01 หากใช้สัญญาณ Clock ความถี่ 9.600 MHz โดยตรงค่าเวลาของ Clock จะน้อยมากทำให้ค่าเวลาที่โดนหน่วงมีค่าน้อยไปด้วย ซึ่งจะทำให้คอนโทรลเลอร์ในโมดูล LCD ไม่ทันตอบสนองกับคำสั่งที่ส่งมา เพราะฉนั้นจะต้องทำการหารความถี่ของสัญญาณ 9.600 MHz ลงมาเพื่อเพิ่มค่าเวลาหน่วงให้มีค่าใกล้เคียงกับค่าเวลาหน่วงที่จะใช้กับโมดูล LCD ในส่วนของการหารความถี่นั้นจะใช้ 74393 มาต่อเป็นวงจรหารความถี่ ดังรูปที่ 3

รูปที่ 3 วงจรหารความถี่

จากรูปที่ 3 เป็นการใช้วงจร Decade Counter 6 ชุด (ภายใน 74393 จะมี Decade Counter 2 ชุด) มาต่ออนุกรมกัน เพื่อให้ทำหน้าเป็นวงจรหารแบบ 24 บิต ค่าความถี่ที่เอาท์พุท Q1A ของ 74393 ตัวที่ 1 จะโดนหารด้วย 2 ความถี่ที่เอาท์พุท Q1B ของ 74393 ตัวที่ 1 ก็จะโดนหารด้วย 4 ความถี่ที่เอาท์พุทต่างๆ จะโดนหารด้วย 2 กำลัง N โดยที่ N เป็นบิตของเอาท์พุท เพราะฉนั้น
- เอาท์พุท A ของวงจรหารความถี่จะโดนหารด้วย 2048 (2 ยกกำลัง 11)
- เอาท์พุท B ของวงจรหารความถี่จะโดนหารด้วย 1048576 (2 ยกกำลัง 20)
- เอาท์พุท C ของวงจรหารความถี่จะโดนหารด้วย 4194304 (2 ยกกำลัง 22)
- เอาท์พุท D ของวงจรหารความถี่จะโดนหารด้วย 16777216 (2 ยกกำลัง 24)

โปรแกรมสำหรับการติดต่อและควบคุมการแสดงผลของโมดูล LCD จะเป็นดังโปรแกรมที่ 1 หลังจากพิมพ์โปรแกรมและ Compiler แล้วจะได้โมดูลของโปรแกรมควบคุมการทำงานของโมดูล LCD ดังรูปที่ 4


โปรแกรมที่ 1

 


library ieee;
use ieee.std_logic_1164.all;
entity LCD_Function is
port( clk : in std_logic;
e : out std_logic;
r_w : out std_logic;
rs : out std_logic;
data : out std_logic_vector(7 downto 0)
);
end LCD_Function;
architecture a of LCD_Function is
begin
process(clk)
variable count : integer range 0 to 31 := 0;
variable initial : std_logic := '0';
variable t_rs : std_logic := '0';
variable t_r_w : std_logic := '0';
variable t_e : std_logic := '0';
variable t_data : std_logic_vector(7 downto 0) := "00000000";
begin
if (clk'EVENT) and (clk = '1') then
if initial = '0' then
count:=count+1;
if count < 23 then initial := '0'; else initial := '1'; end if;
else
initial := '1';
end if;
end if;
case count is
--INITIAL SETTING
when 0 =>
initial := '0';t_rs := '0';t_r_w := '0';t_e := '0';t_data := "00000000";
when 1 =>
initial := '0';t_rs := '0';t_r_w := '0';t_e := '1';t_data := "00000000";
when 2 =>
initial := '0';t_rs := '0';t_r_w := '0';t_e := '0';t_data := "00111000";
when 3 =>
initial := '0';t_rs := '0';t_r_w := '0';t_e := '1';t_data := "00111000";
when 4 =>
initial := '0';t_rs := '0';t_r_w := '0';t_e := '0';t_data := "00000110";
when 5 =>
initial := '0';t_rs := '0';t_r_w := '0';t_e := '1';t_data := "00000110";
when 6 =>
initial := '0';t_rs := '0';t_r_w := '0';t_e := '0';t_data := "00001111";
when 7 =>
initial := '0';t_rs := '0';t_r_w := '0';t_e := '1';t_data := "00001111";
when 8 =>
initial := '0';t_rs := '0';t_r_w := '0';t_e := '0';t_data := "00010100";
when 9 =>
initial := '0';t_rs := '0';t_r_w := '0';t_e := '1';t_data := "00010100";
when 10 =>
initial := '0';t_rs := '0';t_r_w := '0';t_e := '0';t_data := "00000001";
when 11 =>
initial := '0';t_rs := '0';t_r_w := '0';t_e := '1';t_data := "00000001";

--SEND Data TO DISPLAY "ASTRON LOGIC R&D"
when 12 => --A
initial := '0';t_rs := '1';t_r_w := '0';t_e := '0';t_data := "01000001";
when 13 => --Enable A
initial := '0';t_rs := '1';t_r_w := '0';t_e := '1';t_data := "01000001";
when 14 => --S
initial := '0';t_rs := '1';t_r_w := '0';t_e := '0';t_data := "01010011";
when 15 => --Enable S
initial := '0';t_rs := '1';t_r_w := '0';t_e := '1';t_data := "01010011";
when 16 => --T
initial := '0';t_rs := '1';t_r_w := '0';t_e := '0';t_data := "01010100";
when 17 => --Enable T
initial := '0';t_rs := '1';t_r_w := '0';t_e := '1';t_data := "01010100";
when 18 => --R
initial := '0';t_rs := '1';t_r_w := '0';t_e := '0';t_data := "01010010";
when 19 => --Enable R
initial := '0';t_rs := '1';t_r_w := '0';t_e := '1';t_data := "01010010";
when 20 => --O
initial := '0';t_rs := '1';t_r_w := '0';t_e := '0';t_data := "01001111";
when 21 => --Enable O
initial := '0';t_rs := '1';t_r_w := '0';t_e := '1';t_data := "01001111";
when 22 => --N
initial := '0';t_rs := '1';t_r_w := '0';t_e := '0';t_data := "01001110";
when 23 => --Enable N
initial := '0';t_rs := '1';t_r_w := '0';t_e := '1';t_data := "01001110";
when others =>
initial := '1';t_e := '0';
end case;
rs <= t_rs; r_w <= t_r_w; e <= t_e; data <= t_data;
end process;
end a;

รูปที่ 4 สัญลักษณ์ของโมดูลวงจรติดต่อและควบคุมการแสดงผลของโมดูล LCD

หลังจากนั้นจะต้องนำวงจรหารความถี่ และโมดูลของวงจรติดต่อและควบคุมการแสดงผลของโมดูล LCD มาเชื่อมต่อกันดังรูปที่ 5

รูปที่ 5 วงจรควบคุมการแสดงผลของโมดูล LCD


ในขั้นตอนของการทำ Floorplan Editor ให้กำหนดขาของ FPGA ดังนี้


ขาสัญญาณ CLK ต่อกับขา 43 ของ EPF10K10LC84
ขาสัญญาณ RS ต่อกับขา 83 ของ EPF10K10LC84
ขาสัญญาณ R_W ต่อกับขา 81 ของ EPF10K10LC84
ขาสัญญาณ E ต่อกับขา 78 ของ EPF10K10LC84
ขาสัญญาณ Data0 ต่อกับขา 73 ของ EPF10K10LC84
ขาสัญญาณ Data1 ต่อกับขา 72 ของ EPF10K10LC84
ขาสัญญาณ Data2 ต่อกับขา 71 ของ EPF10K10LC84
ขาสัญญาณ Data3 ต่อกับขา 70 ของ EPF10K10LC84
ขาสัญญาณ Data4 ต่อกับขา 69 ของ EPF10K10LC84
ขาสัญญาณ Data5 ต่อกับขา 67 ของ EPF10K10LC84
ขาสัญญาณ Data6 ต่อกับขา 66 ของ EPF10K10LC84
ขาสัญญาณ Data7 ต่อกับขา 65 ของ EPF10K10LC84