SlideShare a Scribd company logo
1 of 38
โปรแกรมย่อยและฟังก์ชัน มาตรฐาน
โปรแกรมย่อย (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 เป็นดังนี้
FUNCTIONname [(formal_parameter_list)]RETURNTYPE IS
declaration statement
BEGIN
[sequentialstatements]
[includeRETURNexpressito]
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_statements
END 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_STDLOGICVECTO
R
TO_STDULOGICVECT
OR
TO_STDULOGICVECT
OR
STD_ULOGIC
STD_LOGIC_VECTOR
STD_ULOGIC_VECTO
R
BIT
BIT_VECTOR
STD_ULOGIC_VECTO
R BIT_VECTOR
STD_LOGIC_VECTOR
BIT
BIT_VECTOR
BIT_VECTOR
STD_ULOGIC
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_ULOGIC_VECTO
R
STD_ULOGIC_VECTO
R
ตัวอย่างฟังก์ชันที่อยู่ใน Std_Logic_Arith
ฟังก์ชัน จาก(ประเภท, ขนาด) เป็น
CONV_INTEGER
CONV_INTEGER
CONV_INTEGERCONV_INTEGER
CONV_UNSIGNED
CONV_UNSIGNED
CONV_UNSIGNED
CONV_UNSIGNEDCONV_SIGNED
CONV_SIGNEDCONV_SIGNED
CONV_SIGNED
CONV_STD_LOGIC_VECTOR
CONV_STD_LOGIC_VECTOR
CONV_STD_LOGIC_VECTOR
CONV_STD_LOGIC_VECTOR
INTEGER
UNSIGNED
SIGNED
STD_ULOGIC
INTEGER,INTEGERUNSIGNED,
INTEGERSIGNED,INTEGER
STD_ULOGIC,INTEGERINTEGER,
INTEGERUNSIGNED,INTEGER
SIGNED,INTEGERSTD_ULOGIC,
INTEGERINTEGER,INTEGER
UNSIGNED,INTEGERSIGNED,
INTEGERSTD_ULOGIC,INTEGER
INTEGER
INTEGER
INTEGER
SMALL_INT
UNSIGNED
UNSIGNED
UNSIGNED
UNSIGNED
SIGNED
SIGNED
SIGNED
SIGNEDSTD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_LOGIC_VECTOR
STD_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(3downto 0);
c : OUT std_logic_vector(7 downto 0));
END ex_conversion;
ARCHITECTURE behav OF ex_conversion IS
SIGNAL a_i, b_i, c_i : integer range 0 to 255;
BEGIN
-- convert from std_logic_vector to integer
a_i <= (conv_integer(a));
b_i <= (conv_integer(b));
c_i <= a_i * b_i;
-- convert from integer to a 8 bit std_logic_vector
c <= (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 Real
Trunc(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 ไว้ที่ A
3. กาหนดให้เก็บค่า 5 ไว้ที่ B
4. กาหนดให้เก็บค่า 8 ไว้ที่ C
5. กาหนดให้เก็บค่า 2.0 ไว้ที่ X
6. กาหนดให้เก็บค่า 3.0 ไว้ที่ Y
7. แสดงค่าของ A, B, C, X, Y
8. คานวณค่า Sqr(A) + Sqr(B) เก็บผลลัพธ์ไว้ที่ P
9. แสดงข้อความ ‘Sqr(A)+Sqr(B) = ’ และค่าของ P
10. คานวณค่า Sqrt(X + Y + A) เก็บผลลัพธ์ไว้ที่ R
11. แสดงข้อความ ‘Sqrt(X+Y+A) = ’ และค่าของR
12. คานวณค่า Trunc(C / B) + Round(C / B) เก็บผลลัพธ์ไว้ที่
D
13. แสดงข้อความ ‘Trunc(C / B) + Round(C / B) = ’ และค่า
ของ D
14. หยุดรอให้กดปุ่มใด ๆ
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.00
Trunc(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. นาย เสฏฐวุฒิ ปิตะโพธิ์ เลขที่ 9
2. นางสาว ธัญญารัตน์ แต้นุเคราะห์ เลขที่14
3. นางสาว นิตตา บุญเชิด เลขที่ 15
4. นางสาว พิชามญชุ์ สังข์ฉิมพลี เลขที่ 24
5. นางสาวมนสิณีย์พลอยแสงสาย เลขที่ 29
6. นางสาว ณิชาภัทร ปฏิมาประกร เลขที่ 30
ชั้นมัธยมศึกษา 6 / 2

More Related Content

What's hot

59170259 ผลคุณี
59170259 ผลคุณี59170259 ผลคุณี
59170259 ผลคุณีBeam Suna
 
ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม.6.1
ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม.6.1ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม.6.1
ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม.6.1Little Tukta Lita
 
capture 59170107 group 2
capture 59170107 group 2capture 59170107 group 2
capture 59170107 group 2Thamon Monwan
 
แคปเจอร์ คอม 59170031 group1
แคปเจอร์ คอม 59170031 group1แคปเจอร์ คอม 59170031 group1
แคปเจอร์ คอม 59170031 group1Thamon Monwan
 
capture แต่ล่ะ week 59170060 group1
capture แต่ล่ะ week  59170060 group1capture แต่ล่ะ week  59170060 group1
capture แต่ล่ะ week 59170060 group1Thamon Monwan
 
พื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาพื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาAeew Autaporn
 
Java Programming [12/12] : Thread
Java Programming [12/12] : ThreadJava Programming [12/12] : Thread
Java Programming [12/12] : ThreadIMC Institute
 
PHP Tutorial (introduction)
PHP Tutorial (introduction)PHP Tutorial (introduction)
PHP Tutorial (introduction)Tinnakorn Puttha
 
คำสั่งควบคุมของโปรแกรม
คำสั่งควบคุมของโปรแกรมคำสั่งควบคุมของโปรแกรม
คำสั่งควบคุมของโปรแกรมParn Nichakorn
 

What's hot (20)

59170259 ผลคุณี
59170259 ผลคุณี59170259 ผลคุณี
59170259 ผลคุณี
 
Lesson5
Lesson5Lesson5
Lesson5
 
Python101
Python101Python101
Python101
 
ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม.6.1
ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม.6.1ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม.6.1
ฟังก์ชั่นย่อยและโปรแกรมมาตรฐาน ม.6.1
 
กลุ่ม 6
กลุ่ม 6กลุ่ม 6
กลุ่ม 6
 
Chapter1
Chapter1Chapter1
Chapter1
 
Methods
MethodsMethods
Methods
 
capture 59170107 group 2
capture 59170107 group 2capture 59170107 group 2
capture 59170107 group 2
 
แคปเจอร์ คอม 59170031 group1
แคปเจอร์ คอม 59170031 group1แคปเจอร์ คอม 59170031 group1
แคปเจอร์ คอม 59170031 group1
 
capture แต่ล่ะ week 59170060 group1
capture แต่ล่ะ week  59170060 group1capture แต่ล่ะ week  59170060 group1
capture แต่ล่ะ week 59170060 group1
 
โครงสร้างโปรแกรมภาษาซี
โครงสร้างโปรแกรมภาษาซีโครงสร้างโปรแกรมภาษาซี
โครงสร้างโปรแกรมภาษาซี
 
3.2 ตัวแปรและคำสงวน
3.2 ตัวแปรและคำสงวน3.2 ตัวแปรและคำสงวน
3.2 ตัวแปรและคำสงวน
 
พื้นฐานภาษาจาวา
พื้นฐานภาษาจาวาพื้นฐานภาษาจาวา
พื้นฐานภาษาจาวา
 
Java Programming [12/12] : Thread
Java Programming [12/12] : ThreadJava Programming [12/12] : Thread
Java Programming [12/12] : Thread
 
โปรแกรมย่อยและฟังก์ชันมาตรฐาน
โปรแกรมย่อยและฟังก์ชันมาตรฐานโปรแกรมย่อยและฟังก์ชันมาตรฐาน
โปรแกรมย่อยและฟังก์ชันมาตรฐาน
 
3.8 การทำงานแบบลำดับ
3.8 การทำงานแบบลำดับ3.8 การทำงานแบบลำดับ
3.8 การทำงานแบบลำดับ
 
โปรแกรมย่อยและฟังก์ชันมาตรฐาน 1
โปรแกรมย่อยและฟังก์ชันมาตรฐาน 1โปรแกรมย่อยและฟังก์ชันมาตรฐาน 1
โปรแกรมย่อยและฟังก์ชันมาตรฐาน 1
 
PHP Tutorial (introduction)
PHP Tutorial (introduction)PHP Tutorial (introduction)
PHP Tutorial (introduction)
 
คำสั่งควบคุมของโปรแกรม
คำสั่งควบคุมของโปรแกรมคำสั่งควบคุมของโปรแกรม
คำสั่งควบคุมของโปรแกรม
 
โปรแกรมย่อยและฟังก์ชัน
โปรแกรมย่อยและฟังก์ชันโปรแกรมย่อยและฟังก์ชัน
โปรแกรมย่อยและฟังก์ชัน
 

Viewers also liked

Lighting
LightingLighting
LightingPloy
 
ภาษา Java ทำไรได้
ภาษา Java ทำไรได้ภาษา Java ทำไรได้
ภาษา Java ทำไรได้Ploy StopDark
 
Powerpoint communicatiebedrijf
Powerpoint communicatiebedrijfPowerpoint communicatiebedrijf
Powerpoint communicatiebedrijfNenaKoolen
 
New Bhaya Boat Factsheet
New Bhaya Boat FactsheetNew Bhaya Boat Factsheet
New Bhaya Boat FactsheetBhaya Cruises
 
Under the mistletoe
Under the mistletoeUnder the mistletoe
Under the mistletoeDaamariiis
 
Company Introduction Hasegawa
Company Introduction HasegawaCompany Introduction Hasegawa
Company Introduction HasegawaHaryadi Kurniawan
 
Bomb work shop
Bomb work shopBomb work shop
Bomb work shopLee Beomho
 
งานนำเสนอ1
งานนำเสนอ1งานนำเสนอ1
งานนำเสนอ1Ploy StopDark
 
Bhaya cruises Presentation update Dec.2013
Bhaya cruises Presentation  update Dec.2013Bhaya cruises Presentation  update Dec.2013
Bhaya cruises Presentation update Dec.2013Bhaya Cruises
 
Helicopter Presentation Halong Bay
Helicopter Presentation Halong BayHelicopter Presentation Halong Bay
Helicopter Presentation Halong BayBhaya Cruises
 
Titanic kuakata brochure
Titanic kuakata brochureTitanic kuakata brochure
Titanic kuakata brochurearchhasan69
 
Sales manual final bhaya cruise halong bay
Sales manual final bhaya cruise halong baySales manual final bhaya cruise halong bay
Sales manual final bhaya cruise halong bayBhaya Cruises
 
Wallpaper Magazine
Wallpaper MagazineWallpaper Magazine
Wallpaper Magazineteopetz
 

Viewers also liked (20)

Lighting
LightingLighting
Lighting
 
ภาษา Java ทำไรได้
ภาษา Java ทำไรได้ภาษา Java ทำไรได้
ภาษา Java ทำไรได้
 
Kingdom monera
Kingdom moneraKingdom monera
Kingdom monera
 
Powerpoint communicatiebedrijf
Powerpoint communicatiebedrijfPowerpoint communicatiebedrijf
Powerpoint communicatiebedrijf
 
Resume
ResumeResume
Resume
 
Presentation1
Presentation1Presentation1
Presentation1
 
Otowa Profile_compact
Otowa Profile_compactOtowa Profile_compact
Otowa Profile_compact
 
New Bhaya Boat Factsheet
New Bhaya Boat FactsheetNew Bhaya Boat Factsheet
New Bhaya Boat Factsheet
 
Under the mistletoe
Under the mistletoeUnder the mistletoe
Under the mistletoe
 
Company Introduction Hasegawa
Company Introduction HasegawaCompany Introduction Hasegawa
Company Introduction Hasegawa
 
Bomb work shop
Bomb work shopBomb work shop
Bomb work shop
 
งานนำเสนอ1
งานนำเสนอ1งานนำเสนอ1
งานนำเสนอ1
 
Bhaya cruises Presentation update Dec.2013
Bhaya cruises Presentation  update Dec.2013Bhaya cruises Presentation  update Dec.2013
Bhaya cruises Presentation update Dec.2013
 
Helicopter Presentation Halong Bay
Helicopter Presentation Halong BayHelicopter Presentation Halong Bay
Helicopter Presentation Halong Bay
 
Titanic kuakata brochure
Titanic kuakata brochureTitanic kuakata brochure
Titanic kuakata brochure
 
Sales manual final bhaya cruise halong bay
Sales manual final bhaya cruise halong baySales manual final bhaya cruise halong bay
Sales manual final bhaya cruise halong bay
 
Are you a host to malware
Are you a host to malwareAre you a host to malware
Are you a host to malware
 
Wallpaper Magazine
Wallpaper MagazineWallpaper Magazine
Wallpaper Magazine
 
Qcc facilitator
Qcc facilitatorQcc facilitator
Qcc facilitator
 
Schistosomiasis
SchistosomiasisSchistosomiasis
Schistosomiasis
 

Similar to โปรแกรมย่อยและฟังก์ชัน มาตรฐาน 6

โปรแกรมย่อยและฟังก์ชันมาตรฐาน
โปรแกรมย่อยและฟังก์ชันมาตรฐานโปรแกรมย่อยและฟังก์ชันมาตรฐาน
โปรแกรมย่อยและฟังก์ชันมาตรฐานPrapatsorn Keawnoun
 
Multi threaded programming in c and c++ 2021-09-03
Multi threaded programming in c and c++ 2021-09-03Multi threaded programming in c and c++ 2021-09-03
Multi threaded programming in c and c++ 2021-09-03KIMVR1
 
บทที่6 งานคอม
บทที่6 งานคอมบทที่6 งานคอม
บทที่6 งานคอมIce Ice
 
ฟังก์ชันในภาษา
ฟังก์ชันในภาษาฟังก์ชันในภาษา
ฟังก์ชันในภาษาSedthawoot Pitapo
 
4121103 การเขียนโปรแกรมและอัลกอริทึ่ม SLIDE 5/7
4121103 การเขียนโปรแกรมและอัลกอริทึ่ม SLIDE 5/74121103 การเขียนโปรแกรมและอัลกอริทึ่ม SLIDE 5/7
4121103 การเขียนโปรแกรมและอัลกอริทึ่ม SLIDE 5/7Know Mastikate
 
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซี
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซีใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซี
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซีNattapon
 
โปรแกรมย่อยและฟังก์ชันมาตรฐาน1
โปรแกรมย่อยและฟังก์ชันมาตรฐาน1โปรแกรมย่อยและฟังก์ชันมาตรฐาน1
โปรแกรมย่อยและฟังก์ชันมาตรฐาน1nitchakan
 
โครงสร้างของโปรแกรมภาษาซี
โครงสร้างของโปรแกรมภาษาซีโครงสร้างของโปรแกรมภาษาซี
โครงสร้างของโปรแกรมภาษาซีณัฐพล บัวพันธ์
 
กลุ่มที่ 6 โปรแกรมย่อยและฟังก์ชันมาตรฐาน
กลุ่มที่ 6 โปรแกรมย่อยและฟังก์ชันมาตรฐาน กลุ่มที่ 6 โปรแกรมย่อยและฟังก์ชันมาตรฐาน
กลุ่มที่ 6 โปรแกรมย่อยและฟังก์ชันมาตรฐาน Kanchana Theugcharoon
 
โปรแกรมย่อยและฟังก์ชันมาตรฐาน1
โปรแกรมย่อยและฟังก์ชันมาตรฐาน1โปรแกรมย่อยและฟังก์ชันมาตรฐาน1
โปรแกรมย่อยและฟังก์ชันมาตรฐาน1Latcha MaMiew
 
เมธอด กลุ่ม3
เมธอด กลุ่ม3 เมธอด กลุ่ม3
เมธอด กลุ่ม3 Piyada Petchalee
 
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นคลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นFinian Nian
 

Similar to โปรแกรมย่อยและฟังก์ชัน มาตรฐาน 6 (20)

โปรแกรมย่อยและฟังก์ชันมาตรฐาน
โปรแกรมย่อยและฟังก์ชันมาตรฐานโปรแกรมย่อยและฟังก์ชันมาตรฐาน
โปรแกรมย่อยและฟังก์ชันมาตรฐาน
 
Multi threaded programming in c and c++ 2021-09-03
Multi threaded programming in c and c++ 2021-09-03Multi threaded programming in c and c++ 2021-09-03
Multi threaded programming in c and c++ 2021-09-03
 
Chapter3
Chapter3Chapter3
Chapter3
 
66
6666
66
 
บทที่6 งานคอม
บทที่6 งานคอมบทที่6 งานคอม
บทที่6 งานคอม
 
ฟังก์ชันในภาษา
ฟังก์ชันในภาษาฟังก์ชันในภาษา
ฟังก์ชันในภาษา
 
4121103 การเขียนโปรแกรมและอัลกอริทึ่ม SLIDE 5/7
4121103 การเขียนโปรแกรมและอัลกอริทึ่ม SLIDE 5/74121103 การเขียนโปรแกรมและอัลกอริทึ่ม SLIDE 5/7
4121103 การเขียนโปรแกรมและอัลกอริทึ่ม SLIDE 5/7
 
โครงสร้างของโปรแกรมภาษา C
โครงสร้างของโปรแกรมภาษา Cโครงสร้างของโปรแกรมภาษา C
โครงสร้างของโปรแกรมภาษา C
 
3.Expression
3.Expression3.Expression
3.Expression
 
5.Methods cs
5.Methods cs5.Methods cs
5.Methods cs
 
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซี
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซีใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซี
ใบความรู้ที่ 1 ความรู้พื้นฐานโปรแกรมภาษาซี
 
โปรแกรมย่อยและฟังก์ชันมาตรฐาน1
โปรแกรมย่อยและฟังก์ชันมาตรฐาน1โปรแกรมย่อยและฟังก์ชันมาตรฐาน1
โปรแกรมย่อยและฟังก์ชันมาตรฐาน1
 
โครงสร้างของโปรแกรมภาษาซี
โครงสร้างของโปรแกรมภาษาซีโครงสร้างของโปรแกรมภาษาซี
โครงสร้างของโปรแกรมภาษาซี
 
Pbl2
Pbl2Pbl2
Pbl2
 
กลุ่มที่ 6 โปรแกรมย่อยและฟังก์ชันมาตรฐาน
กลุ่มที่ 6 โปรแกรมย่อยและฟังก์ชันมาตรฐาน กลุ่มที่ 6 โปรแกรมย่อยและฟังก์ชันมาตรฐาน
กลุ่มที่ 6 โปรแกรมย่อยและฟังก์ชันมาตรฐาน
 
โปรแกรมย่อยและฟังก์ชันมาตรฐาน1
โปรแกรมย่อยและฟังก์ชันมาตรฐาน1โปรแกรมย่อยและฟังก์ชันมาตรฐาน1
โปรแกรมย่อยและฟังก์ชันมาตรฐาน1
 
เมธอด กลุ่ม3
เมธอด กลุ่ม3 เมธอด กลุ่ม3
เมธอด กลุ่ม3
 
3.8 การทำงานตามลำดับ
3.8 การทำงานตามลำดับ3.8 การทำงานตามลำดับ
3.8 การทำงานตามลำดับ
 
เมธอด
เมธอดเมธอด
เมธอด
 
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นคลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
 

โปรแกรมย่อยและฟังก์ชัน มาตรฐาน 6

  • 2. โปรแกรมย่อย (Subprogram) โปรแกรมย่อยคือกลุ่มของคาสั่งลาดับที่สามารถเรียกใช้งานได้โปรแกรมย่อยนี้ สามารถเขียนไว้ในส่วนของ Package หรือ Architecture หรือ Process ก็ได้ แต่การเรียกใช้งานจะขึ้นอยู่กับตาแหน่งที่ประกาศโปรแกรมย่อยไว้ดังนี้ - ประกาศไว้ใน Package สามารถเรียกใช้ได้จากทุกๆที่ของโมเดล - ประกาศไว้ใน Architecture ของโมเดลใดก็สามารถเรียกใช้ได้จากภายในโมเดลนั้นเท่านั้น - ประกาศไว้ใน Process ใดก็สามารถเรียกใช้ได้จากภายใน Process นั้นเท่านั้น ดังนั้นจะเห็นได้ว่า ถ้าต้องการให้สามารถเรียกใช้งานได้ง่ายและทุกๆที่ ก็ควรประกาศไว้ภายใน Package จะดีกว่าการประกาศไว้ที่อื่นๆ ภาษา VHDL แบ่งโปรแกรมย่อยออกเป็น 2 ประเภท คือ ฟังก์ชัน (Function) และ โปรซีเยอร์ (Procedure)
  • 3. ฟังก์ชัน (Function) ฟังก์ชันเป็นโปรแกรมย่อยชนิดหนึ่ง เมื่อเรียกใช้จะส่งค่ากลับคืนเพียงหนึ่งค่า ทั้งนี้การเรียกใช้อาจมีการส่งค่าพารามิเตอร์ (Passing parameter) ให้กับฟังก์ชันหรือไม่ก็ได้ แต่ถ้ามีการส่งค่าเข้าสู่ฟังก์ชันพารามิเตอร์นั้นต้องไม่มีการเปลี่ยนแปลงค่า แต่ค่าของพารามิเตอร์จะถูกนาไปใช้ เพื่อคานวณหาผลลัพธ์โดยผลลัพธ์นี้จะถูกส่งกลับไปยังโมเดลที่เรียกใช้ตรงตาแหน่งที่ฟังก์ชันนั้น ถูกเรียกใช้ ลักษณะของฟังก์ชันมีคุณสมบัติดังนี้  การทางานเป็น นิพจน์(expression) ไม่ใช่ statement  ฟังก์ชันจะคานวณให้ผลลัพธ์เพียงค่าเดียวและส่งค่ากลับคืนให้โมเดล  ภายในฟังก์ชันต้องมีคาสั่ง RETURN เสมอ  การทางานของฟังก์ชันต้องไม่เปลี่ยนแปลงค่าออบเจ็กต์(Object) ที่ถูกส่งผ่าน  ฟังก์ชันต้องประกอบด้วย function body และอาจจะมี function declaration ด้วยก็ได้
  • 4. FUNCTION name [(formal_parameter_list)] RETURN TYPE; Function declaration เป็นส่วนที่อาจจะมีหรือไม่ก็ได้ มีรูปแบบดังนี้ - name เป็นชื่อของฟังก์ชัน - formal parameter list เป็นรายชื่อของพารามิเตอร์ที่ฟังก์ชันต้องการให้ส่งผ่าน สามารถกาหนดคุณสมบัติเพิ่มเติมให้พารามิเตอร์ได้ เช่น CLASS, MODE และ TYPE - RETURN ใช้กาหนด TYPE ของค่าที่จะส่งกลับ เช่น FUNCTION bl2bit (a : boolean) RETURN BIT;
  • 5. Function body เป็นส่วนที่บรรยายพฤติกรรมของฟังก์ชัน ถ้าจะให้ฟังก์ชันทาอะไรส่วนนี้จะต้องมี ภายใน body เป็น คาสั่งลาดับ ห้ามมีคาสั่ง concurrent และต้องมีคาสั่ง RETURN ซึ่งเป็นคาสั่งให้ส่งค่ากลับและเป็นคา สั่งสิ้นสุดการทางานด้วย รูปแบบของ function body เป็นดังนี้ FUNCTIONname [(formal_parameter_list)]RETURNTYPE IS declaration statement BEGIN [sequentialstatements] [includeRETURNexpressito] END name;
  • 6. ตัวอย่างเช่น FUNCTION bl2bit (a : BOOLEAN) RETURN BIT IS BEGIN IF a then RETURN '1'; ELSE RETURN '0'; END IF; END bl2bit;
  • 7. ตัวอย่าง ฟังก์ชัน 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;
  • 8. เมื่อต้องการเรียกใช้ฟังก์ชัน 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;
  • 9. ตัวอย่างฟังก์ชันสาหรับวงจร 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 ;
  • 10. เมื่อต้องการเรียกใช้ฟังก์ชัน 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;
  • 11. 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;
  • 12. หมายถึง ฟังก์ชันที่สามารถเรียกใช้ตัวเองได้ เช่น ตัวอย่างฟังก์ชันการหาค่า 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 ;
  • 13. เมื่อต้องการเรียกใช้ฟังก์ชัน 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;
  • 14. โปรซีเยอร์ (Procedure) ทั้ง ฟังก์ชัน และโปรซีเยอร์ ต่างก็เป็นโปรแกรมย่อย (Subprogram) ที่มีวัตถุประสงค์ของการเขียนเหมือนกัน คือ ต้องการรวบรวมคาสั่งแบบลาดับที่มีการเรียกใช้บ่อยๆเอาไว้ให้เรียกใช้ได้สะดวก โดยไม่ต้องเขียนคาสั่งนั้นทุกๆครั้งที่ต้องการใช้งาน โครงสร้างของโปรซีเยอร์ก็คล้ายกับของฟังก์ชัน แต่มีข้อแตกต่างกันคือ 69 o ฟังก์ชัน ไม่สามารถเปลี่ยนแปลงค่าที่ส่งเข้าไปได้แต่โปรซีเยอร์ทาได้ o ฟังก์ชันมี RETURN เพื่อส่งค่าคืน แต่โปรซีเยอร์มีหรือไม่ก็ได้ถ้ามีอาจเพียงเป็นการหยุดการทางานของโปรซีเยอร์ o ฟังก์ชันคืนค่ากลับเพียงค่าเดียว แต่โปรซีเยอร์สามารถส่งคืนได้หลายค่า o ทิศทางหรือ Mode ของพารามิเตอร์ที่ส่งผ่าน (formal parameter list) เข้าสู่ฟังก์ชันเป็นประเภท IN เท่านั้น แต่ของโปรซีเยอร์เป็นได้ทั้ง IN, OUT และ INOUT o การเรียกฟังก์ชันเป็นการเรียกแบบ Expression แต่ในโปรซีเยอร์เป็นการเรียกแบบ Statement o เช่นเดียวกับฟังก์ชัน โปรซีเยอร์ประกอบด้วย Procedure declaration และ Procedure body
  • 15. Procedure Declaration PROCEDURE name (formal_parameter_list);  name ชื่อของ โปรซีเยอร์  formal_parameter_list รายชื่อพารามิเตอร์ที่ ใช้ในโปรซีเยอร์ มีหน้าที่ เป็นตัวบอก CLASS, NAME, MODE และ TYPE ของ object รูปแบบการเขียนเป็นดังนี้ (CLASS object_name : MODE TYPE)
  • 16. - 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 สามารถมีได้
  • 17. ตัวอย่างของโปรซีเยอร์ 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
  • 18. 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_statements END name;
  • 19. 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;
  • 20. 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
  • 21.  สัมพันธ์โดยชื่อ (Named Association) เป็นการบอกความสัมพันธ์ระหว่างชื่อกับชื่อ ด้วยการกาหนดว่าพารามิเตอร์ตัวส่งชื่ออะไร ต้องการส่งให้พารามิเตอร์ตัวรับชื่อว่าอะไร โดยใช้เครื่องหมาย " => " เช่น FULLADD(A => X1, B => X2, CIN => X3, C => Y);
  • 22. ตัวอย่าง โปรซีเยอร์สาหรับวงจร 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;
  • 23. เมื่อต้องการเรียกโปรซีเยอร์ 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;
  • 24. การแปลงประเภทของข้อมูล (Type conversion) เนื่องจากภาษา VHDL ค่อนข้างเข้มงวดเกี่ยวกับประเภทของข้อมูล กล่าวคือการส่งข้อมูลระหว่างออบเจ็กต์นั้น ออบเจ็กต์ต้องเป็นประเภทเดียวกัน เช่น BIT กับ BIT หรือ BIT_VECTOR กับ BIT_VECTOR จะเป็นคนละชนิดไม่ได้เช่น BIT กับ STD_LOGIC หรือ STD_LOGIC_VECTOR กับ BIT_VECTOR ก็ไม่ได้ ดังนั้นใน LIBRARY IEEE จึงมี Package ที่ได้บรรจุฟังก์ชัน เพื่อการแปลงข้อมูลบางประเภทไว้ดังตัวอย่างต่อไปนี้
  • 25. ตัวอย่างฟังก์ชันที่อยู่ใน std_logic_1164 ฟังก์ชัน แปลงจาก เป็น TO_BIT TO_BITVECTOR TO_BITVECTOR TO_STDULOGIC TO_STDLOGICVECTO R TO_STDLOGICVECTO R TO_STDULOGICVECT OR TO_STDULOGICVECT OR STD_ULOGIC STD_LOGIC_VECTOR STD_ULOGIC_VECTO R BIT BIT_VECTOR STD_ULOGIC_VECTO R BIT_VECTOR STD_LOGIC_VECTOR BIT BIT_VECTOR BIT_VECTOR STD_ULOGIC STD_LOGIC_VECTOR STD_LOGIC_VECTOR STD_ULOGIC_VECTO R STD_ULOGIC_VECTO R
  • 26. ตัวอย่างฟังก์ชันที่อยู่ใน Std_Logic_Arith ฟังก์ชัน จาก(ประเภท, ขนาด) เป็น CONV_INTEGER CONV_INTEGER CONV_INTEGERCONV_INTEGER CONV_UNSIGNED CONV_UNSIGNED CONV_UNSIGNED CONV_UNSIGNEDCONV_SIGNED CONV_SIGNEDCONV_SIGNED CONV_SIGNED CONV_STD_LOGIC_VECTOR CONV_STD_LOGIC_VECTOR CONV_STD_LOGIC_VECTOR CONV_STD_LOGIC_VECTOR INTEGER UNSIGNED SIGNED STD_ULOGIC INTEGER,INTEGERUNSIGNED, INTEGERSIGNED,INTEGER STD_ULOGIC,INTEGERINTEGER, INTEGERUNSIGNED,INTEGER SIGNED,INTEGERSTD_ULOGIC, INTEGERINTEGER,INTEGER UNSIGNED,INTEGERSIGNED, INTEGERSTD_ULOGIC,INTEGER INTEGER INTEGER INTEGER SMALL_INT UNSIGNED UNSIGNED UNSIGNED UNSIGNED SIGNED SIGNED SIGNED SIGNEDSTD_LOGIC_VECTOR STD_LOGIC_VECTOR STD_LOGIC_VECTOR STD_LOGIC_VECTOR
  • 27. ฟังก์ชันที่อยู่ 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;
  • 28. ตัวอย่างการใช้งานมีดังนี้ 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(3downto 0); c : OUT std_logic_vector(7 downto 0)); END ex_conversion; ARCHITECTURE behav OF ex_conversion IS SIGNAL a_i, b_i, c_i : integer range 0 to 255; BEGIN -- convert from std_logic_vector to integer a_i <= (conv_integer(a)); b_i <= (conv_integer(b)); c_i <= a_i * b_i; -- convert from integer to a 8 bit std_logic_vector c <= (conv_std_logic_vector(c_i,8)); END behav;
  • 29. ฟังก์ชันมาตรฐาน ฟังก์ชันมาตรฐานเป็นฟังก์ชันที่มีอยู่แล้วในปาสคาล เมื่อผู้เขียนโปรแกรมต้องการเรียกใช้การทางานของฟังก์ชัน ผู้เขียนโปรแกรมสามารถอ้างถึงชื่อฟังก์ชันได้ในทันที โดยไม่ต้องเขียนโปรแกรมย่อยขึ้นเอง ตารางข้างล่างแสดงฟังก์ชันมาตรฐาน รูปแบบการเรียกใช้ การทางาน ชนิดของพารามิเตอร์และผลลัพธ์ที่ส่งกลับมาภายใต้ชื่อของฟังก์ชันเมื่อมีการเรียกใช้ฟังก์ชัน
  • 30. ฟังก์ชัน การทางาน ชนิดของพารามิเตอร์ 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
  • 31. ฟังก์ชัน การทางาน ชนิดของพารามิเตอร์ X ชนิดของผลลัพธ์ Sqr(X) คานวณค่ายกกาลังที่สอง ของ X Integer / Real เหมือน X Sqrt(X) คานวณค่ารากที่สองของ X Integer / Real Real Trunc(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
  • 32. ฟังก์ชัน การทางาน ชนิดของ พารามิเตอร์ X ชนิดของผลลัพธ์ Upcase(X) ให้ค่าตัวอักขระใหญ่ของ X ในกรณีที่ X เป็นตัว อักขระเล็ก มิฉะนั้นให้ ค่าเป็นตัวอักขระ X ตามเดิม Char Char Floor(X) ให้ค่าจานวนเต็มที่มาก ที่สุดที่น้อยกว่า X Integer / Real Integer Ceiling(X) ให้ค่าจานวนเต็มที่น้อย ที่สุดที่มากกว่า X Integer / Real Integer Pi ให้ค่าคงตัวของ  = 3.1417… - Real
  • 34. การเขียนโปรแกรม ลาดับการประมวลผล ตัวอย่าง การทางาน 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 ไว้ที่ A 3. กาหนดให้เก็บค่า 5 ไว้ที่ B 4. กาหนดให้เก็บค่า 8 ไว้ที่ C 5. กาหนดให้เก็บค่า 2.0 ไว้ที่ X 6. กาหนดให้เก็บค่า 3.0 ไว้ที่ Y 7. แสดงค่าของ A, B, C, X, Y 8. คานวณค่า Sqr(A) + Sqr(B) เก็บผลลัพธ์ไว้ที่ P 9. แสดงข้อความ ‘Sqr(A)+Sqr(B) = ’ และค่าของ P 10. คานวณค่า Sqrt(X + Y + A) เก็บผลลัพธ์ไว้ที่ R 11. แสดงข้อความ ‘Sqrt(X+Y+A) = ’ และค่าของR 12. คานวณค่า Trunc(C / B) + Round(C / B) เก็บผลลัพธ์ไว้ที่ D 13. แสดงข้อความ ‘Trunc(C / B) + Round(C / B) = ’ และค่า ของ D 14. หยุดรอให้กดปุ่มใด ๆ 15. จบ
  • 35. ผลการ Run โปรแกรม A = 4 B = 5 C = 8 X = 2.0 Y = 3.0 Sqr(A) + Sqr(B) = 41.00 Sqrt(X + Y + A) = 3.00 Trunc(C / B) + Round(C / B) = 3
  • 36. โปรแกรมย่อยและ ฟังก์ชัน มาตรฐาน โปรแกรมย่อย (Subprogram) สามารถเรียกใช้งานได้ง่ายและทุกๆที่ ก็ควรประกาศไว้ภายใน Package จะดีกว่าการประกาศไว้ที่อื่นๆภาษา VHDL แบ่งโปรแกรมย่อยออกเป็น 2 ประเภท คือ ฟังก์ชัน (Function) และ โปรซีเยอร์ (Procedure) ฟังก์ชัน (Function) - Function declaration -Function body -Recursive Function -Procedure Body ฟังก์ชันมาตรฐาน สามารถอ้างถึงชื่อฟังก์ชันได้ในทันที โดยไม่ต้องเขียนโปรแกรมย่อยขึ้น เอง
  • 37. ครูเนาวรัตน์ ใจการุณ. 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. อ้างอิง
  • 38. รายชื่อสมาชิก 1. นาย เสฏฐวุฒิ ปิตะโพธิ์ เลขที่ 9 2. นางสาว ธัญญารัตน์ แต้นุเคราะห์ เลขที่14 3. นางสาว นิตตา บุญเชิด เลขที่ 15 4. นางสาว พิชามญชุ์ สังข์ฉิมพลี เลขที่ 24 5. นางสาวมนสิณีย์พลอยแสงสาย เลขที่ 29 6. นางสาว ณิชาภัทร ปฏิมาประกร เลขที่ 30 ชั้นมัธยมศึกษา 6 / 2