Upload
ploy-stopdark
View
79
Download
2
Embed Size (px)
Citation preview
โปรแกรมยอยและฟงกชน มาตรฐาน
โปรแกรมยอย (Subprogram)
โปรแกรมยอยคอกลมของค าสงล าดบทสามารถเรยกใชงานได โปรแกรมยอยนสามารถเขยนไวในสวนของ Package หรอ Architecture หรอ Process กได แตการเรยกใชงานจะขนอยกบต าแหนงทประกาศโปรแกรมยอยไวดงน - ประกาศไวใน Package สามารถเรยกใชไดจากทกๆทของโมเดล - ประกาศไวใน Architecture ของโมเดลใดกสามารถเรยกใชไดจากภายในโมเดลนนเทานน - ประกาศไวใน Process ใดกสามารถเรยกใชไดจากภายใน Process นนเทานน ดงนนจะเหนไดวา ถาตองการใหสามารถเรยกใชงานไดงายและทกๆท กควรประกาศไวภายใน Package จะดกวาการประกาศไวทอนๆ ภาษา VHDL แบงโปรแกรมยอยออกเปน 2 ประเภท คอ ฟงกชน (Function) และ โปรซเยอร (Procedure)
ฟงกชน (Function)
ฟงกชนเปนโปรแกรมยอยชนดหนง เมอเรยกใชจะสงคากลบคนเพยงหนงคา ทงนการเรยกใชอาจมการสงคาพารามเตอร (Passing parameter) ใหกบฟงกชนหรอไมกได แตถามการสงคาเขาสฟงกชน พารามเตอรนน ตองไมมการเปลยนแปลงคา แตคาของพารามเตอรจะถกน าไปใชเพอค านวณหาผลลพธ โดยผลลพธนจะถกสงกลบไปยงโมเดลทเรยกใช ตรงต าแหนงทฟงกชนนน ถกเรยกใช
ลกษณะของฟงกชนมคณสมบตดงน การท างานเปน นพจน(expression) ไมใช statement ฟงกชนจะค านวณใหผลลพธเพยงคาเดยว และสงคากลบคนใหโมเดล ภายในฟงกชนตองมค าสง RETURN เสมอ การท างานของฟงกชนตองไมเปลยนแปลงคาออบเจกต (Object) ทถกสงผาน ฟงกชนตองประกอบดวย function body และอาจจะม function declaration ดวยกได
FUNCTION name [(formal_parameter_list)] RETURN TYPE;
Function declaration เปนสวนทอาจจะมหรอไมกได มรปแบบดงน
- name เปนชอของฟงกชน- formal parameter list เปนรายชอของพารามเตอรทฟงกชนตองการใหสงผาน
สามารถก าหนดคณสมบตเพมเตมใหพารามเตอรได เชน CLASS, MODE และ TYPE- RETURN ใชก าหนด TYPE ของคาทจะสงกลบเชน FUNCTION bl2bit (a : boolean) RETURN BIT;
Function body
เปนสวนทบรรยายพฤตกรรมของฟงกชน ถาจะใหฟงกชนท าอะไรสวนนจะตองม ภายใน body
เปน ค าสงล าดบ หามมค าสง concurrent และตองมค าสง RETURNซงเปนค าสงใหสงคากลบและเปนค า สงสนสดการท างานดวย รปแบบของ function body เปนดงน
FUNCTION name [(formal_parameter_list)] RETURN TYPE IS declaration statement
BEGIN [sequential statements] [include RETURN expressito]
END name;
ตวอยางเชน
FUNCTION bl2bit (a : BOOLEAN) RETURN BIT IS BEGIN
IF a then RETURN '1';
ELSE RETURN '0';
END IF; END bl2bit;
ตวอยาง ฟงกชน bl2bit ขางตนเมอนามาเขยนใหสมบรณและเกบไวใน Package จะเขยนไดดงน
-- i2bv : Integer to Bit_vector. -- In : Integer, Value and width. -- Return : Bit_vector, with left bit is the most significant bit. package my_package is
function i2bv (val, width : integer) return bit_vector; end my_package; package body my_package is
function i2bv (val, width : integer) return bit_vector is variable result : bit_vector( width-1 downto 0) :=
(others => '0'); variable bits : integer := width; begin
for i in 0 to bits-1 loop if ( (val/(2**i) ) mod 2 = 1) then
result(i) := '1';
end if; end loop; return (result); end i2bv;
end my_package;
เมอตองการเรยกใชฟงกชน bl2bit ใน package สามารถท าได ดงน
-- cnt4 : 4-bit binary counter .
-- model : behavioral
use work.my_package.all;
entity cnt4 is
port(dout : out bit_vector(3 downto 0);
clk, reset : in bit);
end cnt4;
architecture beh of cnt4 is
begin
counter: process(clk, reset)
variable cnum : integer;
begin
if reset = '1' then
cnum := 0;
elsif (clk = '1') then
cnum := cnum + 1;
end if;
dout <= i2bv(cnum,4);
end process; end beh;
ตวอยางฟงกชนส าหรบวงจร Full adder เมอเขยนอยใน Package library ieee; use ieee.std_logic_1164.all; package my_package is
function FULLADD (A,B, CIN : std_logic ) return std_logic_vector; end my_package ; package body my_package is
function FULLADD (A,B, CIN : std_logic ) return std_logic_vector is variable SUM, COUT : std_logic; variable RESULT : std_logic_vector (1 downto 0);
begin SUM := A xor B xor CIN; COUT := (A and B) or (A and CIN) or (B and CIN); RESULT := COUT & SUM; return RESULT;
end FULLADD; end my_package ;
เมอตองการเรยกใชฟงกชน FULLADD ใน package สามารถท าไดดงน
library ieee; use ieee.std_logic_1164.all; use work. my_package.all; entity EXAMPLE is
port ( A,B : in std_logic_vector (3 downto 0); CIN : in std_logic; S : out std_logic_vector (3 downto 0); COUT : out std_logic );
end EXAMPLE;
architecture ARCHI of EXAMPLE is signal S0, S1, S2, S3 : std_logic_vector (1 downto 0); begin
S0 <= FULLADD (A(0), B(0), CIN); S1 <= FULLADD (A(1), B(1), S0(1)); S2 <= FULLADD (A(2), B(2), S1(1)); S3 <= FULLADD (A(3), B(3), S2(1)); S <= S3(0) & S2(0) & S1(0) & S0(0); COUT <= S3(1);
end ARCHI;
หมายถง ฟงกชนทสามารถเรยกใชตวเองได เชน ตวอยางฟงกชนการหาคา factorial ของจานวน n ใดๆ สามารถเขยนเปนฟงกชนไดดงน
Recursive Function
package my_package is
function my_factorial(x : integer) return integer;
end my_package ;
package body my_package is
function my_factorial(x : integer) return integer is
begin
if x = 1 then
return x;
else
return (x*my_factorial(x-1));
end if;
end function my_factorial; end my_package ;
เมอตองการเรยกใชฟงกชน my_factorial ใน package สามารถท าไดดงน
use work. my_package.all; entity EXAMPLE_3 is
port (A : in integer range 0 to 255; Y : out integer range 0 to 255);
end EXAMPLE_3; architecture ARC of EXAMPLE_3 is begin
S <= my_factorial(A); end ARC;
โปรซเยอร (Procedure)
ทง ฟงกชน และโปรซเยอร ตางกเปนโปรแกรมยอย (Subprogram) ทมวตถประสงคของการเขยนเหมอนกน คอ ตองการรวบรวมคาสงแบบลาดบทมการเรยกใชบอยๆ เอาไวใหเรยกใชไดสะดวกโดยไมตองเขยนค าสงนนทกๆครงทตองการใชงาน โครงสรางของโปรซเยอรกคลายกบของฟงกชน แตมขอแตกตางกนคอ 69
o ฟงกชน ไมสามารถเปลยนแปลงคาทสงเขาไปได แตโปรซเยอรทาได o ฟงกชนม RETURN เพอสงคาคน แตโปรซเยอรมหรอไมกได ถามอาจเพยงเปนการหยดการทางานของโปรซเยอร o ฟงกชนคนคากลบเพยงคาเดยว แตโปรซเยอรสามารถสงคนไดหลายคา o ทศทางหรอ Mode ของพารามเตอรทสงผาน (formal parameter list) เขาสฟงกชนเปนประเภท IN เทานน แตของโปรซเยอรเปนไดทง IN, OUT และ INOUT o การเรยกฟงกชนเปนการเรยกแบบ Expression แตในโปรซเยอรเปนการเรยกแบบ Statement o เชนเดยวกบฟงกชน โปรซเยอรประกอบดวย Procedure declaration และ Procedure body
Procedure Declaration
PROCEDURE name (formal_parameter_list);
name ชอของ โปรซเยอร formal_parameter_list รายชอพารามเตอรท ใชในโปรซเยอร มหนาท
เปนตวบอก CLASS, NAME, MODE และ TYPE ของ object รปแบบการเขยนเปนดงน
(CLASS object_name : MODE TYPE)
- CLASS หมายถงชนของ object ซงอาจจะเปน SIGNAL, VARIABLE หรอ CONSTANT ถาไมมการกาหนด CLASS และ MODE ภาษา VHDL จะถอวาเปน CONSTANT MODE IN แตถาไมกาหนด CLASS แตกาหนด MODE เปน IN จะถอวาเปน VARIABLE - Object_name ชอของ object - MODE ทศทางการไหลของขอมล มสามชนดคอ o IN คาของพารามเตอรทสงเขาโปรซเยอร แกไขหรอเปลยนแปลงไมได o OUT คาของพารามเตอรทสงออกจากโปรซเยอรo INOUT คาของพารามเตอรทสงเขาไดรบคนจากโปรซเยอร แกไขหรอเปลยนแปลงได - TYPE เปนตวกาหนดกลมของคาตางๆท object สามารถมได
ตวอยางของโปรซเยอรdeclaration ทอยใน Package declaration
PACKAGE util IS PROCEDURE add_element(element : IN REAL;
VARIABLE filter_data : INOUT filter_data_type); PROCEDURE zero_out( x : x_data_type); PROCEDURE still_busy;
END util
Procedure Body ในสวนของ body น ประกอบดวยล าดบของ Sequential statement
ทบรรยายความสมพนธระหวางคาของ input parameter กบคาทจะสงกลบในสวนนหามม Concurrent statement ในโปรซเยอรไมจ าเปนตองม
ค าสง RETURN ค าสง RETURN มหนาทหยดการท างานของโปรซเยอร สาหรบโครงสรางทไมมคาสง RETURN การท างานของโปรซเยอรจะหยดไดดวยค าสง END ในบรรทดสดทายของโปรซเยอร รปแบบโครงสราง procedure bodyเปนดงน
PROCEDURE name (formal_parameter_list) IS
-- declarative_statments
BEGIN
--sequential_statementsEND name;
PACKAGE BODY util IS
PROCEDURE add_element(element : IN REAL;
VARIABLE filter_data : INOUT filter_data_type ) IS
BEGIN
FOR IN filter_data'HIGH DOWNTO filter_data' LOW+1 LOOP
filter_data(i) := filter_data (i-1);
END LOOP;
filter_data(filter_data'LOW) := element;
END add_element;
PROCEDURE zero_out(input : INOUT filter_data_type) IS
BEGIN
FOR i IN input'RANGE LOOP
input(i) := 0.0;
END LOOP;
END zero_out;
PROCEDURE still_busy IS
BEGIN
ASSERT FALSE REPORT "Still Busy!" SEVERITY NOTE;
END stil_busy;
END util;
Procedure Callsการเรยกโปรซเยอรมาใช ท าไดโดยการเขยนชอ (name) ของ โปรซเยอร นน
ตามดวยรายชอของ พารามเตอรตองการสงคาผานใหกบโปรซเยอร ตามรปแบบการเขยนดงน
procedure_name (passing_parameter_list);
Passing Parameter list
สมพนธโดยต าแหนง (Position Association) แบบนใหเขยนชอพารามเตอรทตองการสงผานใหตรงกบต าแหนงพารามเตอรทเปนตวรบ เชนถาโปรซเยอรชอ FULLADD PROCEDURE FULLADD (A,B, CIN : in BIT; C : out BIT_VECTOR (1 downto 0) ); เมอเรยกใช ดวย FULLADD(X1,X2,X3,Y); จงมความหมายวา คาของ X1 สงให A X2 สงให B X3 สงให CIN และ Y ไดจาก C
สมพนธโดยชอ (Named Association)
เปนการบอกความสมพนธระหวางชอกบชอ ดวยการก าหนดวาพารามเตอรตวสงชออะไรตองการสงใหพารามเตอรตวรบชอวาอะไร โดยใชเครองหมาย " => " เชน
FULLADD(A => X1, B => X2, CIN => X3, C => Y);
ตวอยางโปรซเยอรสาหรบวงจร Full adder เมอเขยนอยใน Package
ibrary ieee;
use ieee.std_logic_1164.all;
package my_package is
procedure fulladd(A,B, CIN : in std_logic;
C : out std_logic_vector(1 downto 0) );
end my_package;
package body my_package is
procedure fulladd (A,B, CIN : in std_logic;
C : out std_logic_VECTOR (1 downto 0)) is
variable S, COUT : std_logic;
begin
S := A xor B xor CIN;
COUT := (A and B) or (A and CIN) or (B and CIN);
C := COUT & S;
end fulladd;end my_package;
เมอตองการเรยกโปรซเยอร FULLADD ใน package สามารถท าไดดงน
library ieee;
use ieee.std_logic_1164.all;
use work.my_package.all;
entity EXAMPLE is
port ( A,B : in std_logic_vector (3 downto 0);
CIN : in std_logic;
SUM : out std_logic_vector (3 downto 0);
COUT : out std_logic );
end EXAMPLE;
architecture ARCHI of EXAMPLE is
begin
process (A,B,CIN)
variable S0, S1, S2, S3 : std_logic_vector (1 downto 0);
begin
fulladd (A(0), B(0), CIN, S0);
fulladd (A(1), B(1), S0(1), S1);
fulladd (A(2), B(2), S1(1), S2);
fulladd (A(3), B(3), S2(1), S3);
SUM <= S3(0) & S2(0) & S1(0) & S0(0);
COUT <= S3(1);
end process; end ARCHI;
การแปลงประเภทของขอมล (Type conversion)
เนองจากภาษา VHDL คอนขางเขมงวดเกยวกบประเภทของขอมล กลาวคอการสงขอมลระหวางออบเจกตนน ออบเจกตตองเปนประเภทเดยวกน เชน BIT กบ BIT หรอ BIT_VECTOR กบ BIT_VECTOR จะเปนคนละชนดไมได เชน BIT กบ STD_LOGIC หรอ STD_LOGIC_VECTOR กบ BIT_VECTOR กไมได ดงนนใน LIBRARY IEEE จงม Package ทไดบรรจฟงกชนเพอการแปลงขอมลบางประเภทไวดงตวอยางตอไปน
ตวอยางฟงกชนทอยใน std_logic_1164
ฟงกชน แปลงจาก เปน TO_BIT
TO_BITVECTOR
TO_BITVECTOR
TO_STDULOGIC
TO_STDLOGICVECTO
R
TO_STDLOGICVECTOR
TO_STDULOGICVECT
OR
TO_STDULOGICVECTOR
STD_ULOGIC
STD_LOGIC_VECTOR
STD_ULOGIC_VECTO
R
BIT
BIT_VECTOR
STD_ULOGIC_VECTOR BIT_VECTOR STD_LOGIC_VECTOR
BIT
BIT_VECTOR
BIT_VECTOR
STD_ULOGIC
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_ULOGIC_VECTOR
STD_ULOGIC_VECTOR
ตวอยางฟงกชนทอยใน Std_Logic_Arith
ฟงกชน จาก(ประเภท, ขนาด) เปน CONV_INTEGER CONV_INTEGER CONV_INTEGER CONV_INTEGERCONV_UNSIGNED CONV_UNSIGNEDCONV_UNSIGNEDCONV_UNSIGNED CONV_SIGNED CONV_SIGNED CONV_SIGNEDCONV_SIGNEDCONV_STD_LOGIC_VECTOR CONV_STD_LOGIC_VECTORCONV_STD_LOGIC_VECTORCONV_STD_LOGIC_VECTOR
INTEGER UNSIGNED SIGNED STD_ULOGIC INTEGER, INTEGER UNSIGNED, INTEGER SIGNED, INTEGER STD_ULOGIC, INTEGER INTEGER, INTEGER UNSIGNED, INTEGER SIGNED, INTEGER STD_ULOGIC, INTEGER INTEGER, INTEGER UNSIGNED, INTEGER SIGNED, INTEGER STD_ULOGIC, INTEGER
INTEGER INTEGER INTEGER SMALL_INT UNSIGNED UNSIGNED UNSIGNED UNSIGNED SIGNED SIGNED SIGNED SIGNED STD_LOGIC_VECTOR STD_LOGIC_VECTORSTD_LOGIC_VECTORSTD_LOGIC_VECTOR
ฟงกชนทอย Std_Logic_Unsignedแปลงจาก STD_LOGIC_VECTOR ไปเปน UNSIGNED INTEGER
CONV_INTEGER(arg: STD_LOGIC_VECTOR) return INTEGER;
ฟงกชนทอย Std_Logic_Signedแปลงจาก STD_LOGIC_VECTOR ไปเปน SIGNED INTEGER
CONV_INTEGER(arg: STD_LOGIC_VECTOR) return INTEGER;
ตวอยางการใชงานมดงน LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_arith.ALL;USE ieee.std_logic_unsigned.ALL;ENTITY ex_conversion IS
PORT ( a, b : IN std_logic_vector(3 downto 0);c : OUT std_logic_vector(7 downto 0));
END ex_conversion;ARCHITECTURE behav OF ex_conversion ISSIGNAL a_i, b_i, c_i : integer range 0 to 255;BEGIN
-- convert from std_logic_vector to integera_i <= (conv_integer(a));b_i <= (conv_integer(b));c_i <= a_i * b_i;-- convert from integer to a 8 bit std_logic_vectorc <= (conv_std_logic_vector(c_i,8));
END behav;
ฟงกชนมาตรฐาน
ฟงกชนมาตรฐานเปนฟงกชนทมอยแลวในปาสคาลเมอผเขยนโปรแกรมตองการเรยกใชการท างานของฟงกชนผเขยนโปรแกรมสามารถอางถงชอฟงกชนไดในทนท โดยไมตองเขยนโปรแกรมยอยขนเอง
ตารางขางลางแสดงฟงกชนมาตรฐาน รปแบบการเรยกใช การท างาน ชนดของพารามเตอรและผลลพธทสงกลบมาภายใตชอของฟงกชนเมอมการเรยกใชฟงกชน
ฟงกชน การท างาน ชนดของพารามเตอร X ชนดของผลลพธAbs(X) ค านวณคาสมบรณของ X Integer / Real เหมอน X
Arctan(X) ค านวณคา arctan ของ X Integer / Real Real
Cos(X) ค านวณคา cosine ของ X Integer / Real Real
Exp(X) ค านวณคา ex โดย e = 2.71828 เปนเลขฐานของลอการธมธรรมชาต
Integer / Real Real
Ln(X) ค านวณคาลอการธมธรรมชาตของ X โดย X > 0
Integer / Real Real
Odd(X) ทดสอบวา X เปนเลขจ านวนคหรอไมโดยใหคาเปนจรง ถา X เปนเลขจ านวนคมฉะนนใหคาเปนเทจ
Integer Boolean
Sin(X) ค านวณคา sine ของ X Integer / Real Real
Round(X) ใหคาเลขจ านวนเตมทใกลX ทสด โดยเศษตงแต 0.5 ขนไปปดขน
Real Integer
ฟงกชน การท างาน ชนดของพารามเตอร X ชนดของผลลพธ
Sqr(X) ค านวณคายกก าลงทสองของ X
Integer / Real เหมอน X
Sqrt(X) ค านวณคารากทสองของ X Integer / Real RealTrunc(X) ใหคาเลขจ านวนเตมทปด
เศษทศนยมของเลขจ านวนจรง X ทง
Real Integer
Chr(X) ใหคาตวอกขระทมรหสแอสกเปน X
Integer Char
Ord(X) ใหคารหสแอสกทตรงกบตวอกขระ X
Char Integer
Pred(X) ใหคาขอมลล าดบกอนหนา X ตามล าดบในตารางรหสแอสก
Integer / Real / Char เหมอน X
Succ(X) ใหคาขอมลล าดบถดจาก X ตามล าดบในตารางรหสแอสก
Integer / Real / Char เหมอน X
ฟงกชน การท างาน ชนดของพารามเตอร X
ชนดของผลลพธ
Upcase(X) ใหคาตวอกขระใหญของ X ในกรณท X เปนตวอกขระเลก มฉะนนใหคาเปนตวอกขระ X ตามเดม
Char Char
Floor(X) ใหคาจ านวนเตมทมากทสดทนอยกวา X
Integer / Real Integer
Ceiling(X) ใหคาจ านวนเตมทนอยทสดทมากกวา X
Integer / Real Integer
Pi ใหคาคงตวของ = 3.1417…
- Real
ตวอยาง การเรยกใชฟงกชนมาตรฐานการออกแบบโปรแกรม
การเขยนโปรแกรม ล าดบการประมวลผล
ตวอยาง การท างานProgram XFunctions;
Uses Crt;
Var A, B, C, D : integer;
X, Y, P, R : Real;
Begin
CLrscr;
A := 4;
B := 5;
C := 8;
X := 2.0;
Y := 3.0;
WriteLn(‘A = ’,A);
WriteLn(‘B = ’,B);
WriteLn(‘C = ’,C);
WriteLn(‘X = ’,X:4:2);
WriteLn(‘Y = ’,Y:4:2);
P := Sqr(A) + Sqr(B);
WriteLn(‘Sqr(a) + Sqr(b) = ’,P:5:2);
R := Sqrt(X + Y + A);
WriteLn(‘Sqrt(X + Y + A) = ’,R:5:2);
D := Trunc(C / B) + Round(C / B);
WriteLn(‘Trunc(C / B) + Round(C / B) = ’,D);
ReadLn;End.
1. ลบหนาจอ2. ก าหนดใหเกบคา 4 ไวท A3. ก าหนดใหเกบคา 5 ไวท B4. ก าหนดใหเกบคา 8 ไวท C5. ก าหนดใหเกบคา 2.0 ไวท X6. ก าหนดใหเกบคา 3.0 ไวท Y7. แสดงคาของ A, B, C, X, Y8. ค านวณคา Sqr(A) + Sqr(B) เกบผลลพธไวท P9. แสดงขอความ ‘Sqr(A)+Sqr(B) = ’ และคาของ P10. ค านวณคา Sqrt(X + Y + A) เกบผลลพธไวท R11. แสดงขอความ ‘Sqrt(X+Y+A) = ’ และคาของ R12. ค านวณคา Trunc(C / B) + Round(C / B) เกบผลลพธไวทD13. แสดงขอความ ‘Trunc(C / B) + Round(C / B) = ’ และคาของ D14. หยดรอใหกดปมใด ๆ15. จบ
ผลการ Run โปรแกรม
A = 4
B = 5
C = 8
X = 2.0
Y = 3.0
Sqr(A) + Sqr(B) = 41.00
Sqrt(X + Y + A) = 3.00Trunc(C / B) + Round(C / B) = 3
โปรแกรมยอยและฟงกชน มาตรฐาน
โปรแกรมยอย (Subprogram)
สามารถเรยกใชงานไดงายและทกๆท กควรประกาศไวภายใน Package
จะดกวาการประกาศไวทอนๆ ภาษา VHDL
แบงโปรแกรมยอยออกเปน 2 ประเภท คอ ฟงกชน (Function) และ โปรซเยอร (Procedure)
ฟงกชน (Function)
- Function declaration -Function body
-Recursive Function
-Procedure Body
ฟงกชนมาตรฐาน
สามารถอางถงชอฟงกชนไดในทนท โดยไมตองเขยนโปรแกรมยอยขน
เอง
ครเนาวรตน ใจการณ. 2550. ฟงกชนมาตรฐาน.แหลงทมา :http://www.thaigoodview.com/library/teachershow/lopburi/naowarta_s/programming/sec06p05.html. 22 มถนายน 2557.
โปรแกรมยอย (Subprogram) . แหลงทมา http://narong.ece.engr.tu.ac.th/vhdl/document/04-ch4.pdf. 22 มถนายน 2557.
อางอง
รายชอสมาชก1. นาย เสฏฐวฒ ปตะโพธ เลขท 92. นางสาว ธญญารตน แตนเคราะห เลขท143. นางสาว นตตา บญเชด เลขท 154. นางสาว พชามญช สงขฉมพล เลขท 245. นางสาวมนสณย พลอยแสงสาย เลขท 296. นางสาว ณชาภทร ปฏมาประกร เลขท 30
ชนมธยมศกษา 6 / 2