Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
โปรแกรมย่อยและฟังก์ชัน มาตรฐาน
โปรแกรมย่อย (Subprogram)
โปรแกรมย่อยคือกลุ่มของคาสั่งลาดับที่สามารถเรียกใช้งานได้โปรแกรมย่อยนี้
สามารถเขียนไว้ในส่วนของ Pa...
ฟังก์ชัน (Function)
ฟังก์ชันเป็นโปรแกรมย่อยชนิดหนึ่ง เมื่อเรียกใช้จะส่งค่ากลับคืนเพียงหนึ่งค่า
ทั้งนี้การเรียกใช้อาจมีการส...
FUNCTION name [(formal_parameter_list)] RETURN TYPE;
Function declaration
เป็นส่วนที่อาจจะมีหรือไม่ก็ได้ มีรูปแบบดังนี้
- ...
Function body
เป็นส่วนที่บรรยายพฤติกรรมของฟังก์ชัน ถ้าจะให้ฟังก์ชันทาอะไรส่วนนี้จะต้องมี
ภายใน body
เป็น คาสั่งลาดับ ห้ามม...
ตัวอย่างเช่น
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_vec...
เมื่อต้องการเรียกใช้ฟังก์ชัน bl2bit ใน package สามารถทาได้ดังนี้
-- cnt4 : 4-bit binary counter .
-- model : behavioral
us...
ตัวอย่างฟังก์ชันสาหรับวงจร Full adder เมื่อเขียนอยู่ใน Package
library ieee;
use ieee.std_logic_1164.all;
package my_packa...
เมื่อต้องการเรียกใช้ฟังก์ชัน FULLADD ใน package สามารถทาได้ดังนี้
library ieee;
use ieee.std_logic_1164.all;
use work. my_...
architecture ARCHI of EXAMPLE is
signal S0, S1, S2, S3 : std_logic_vector (1 downto 0);
begin
S0 <= FULLADD (A(0), B(0), C...
หมายถึง ฟังก์ชันที่สามารถเรียกใช้ตัวเองได้
เช่น ตัวอย่างฟังก์ชันการหาค่า factorial ของจานวนn ใดๆ สามารถเขียนเป็นฟังก์ชันได...
เมื่อต้องการเรียกใช้ฟังก์ชัน my_factorial ใน package สามารถทาได้ดังนี้
use work. my_package.all;
entity EXAMPLE_3 is
port ...
โปรซีเยอร์ (Procedure)
ทั้ง ฟังก์ชัน และโปรซีเยอร์ ต่างก็เป็นโปรแกรมย่อย (Subprogram) ที่มีวัตถุประสงค์ของการเขียนเหมือนกั...
Procedure Declaration
PROCEDURE name (formal_parameter_list);
 name ชื่อของ โปรซีเยอร์
 formal_parameter_list รายชื่อพาร...
- CLASS หมายถึงชั้นของ object ซึ่งอาจจะเป็น SIGNAL, VARIABLE หรือ
CONSTANT ถ้าไม่มีการกาหนด CLASS และ MODE ภาษา VHDL จะถือ...
ตัวอย่างของโปรซีเยอร์
declaration ที่อยู่ใน Package declaration
PACKAGE util IS
PROCEDURE add_element(element : IN REAL;
V...
Procedure Body
ในส่วนของ body นี้ ประกอบด้วยลาดับของ Sequential statement
ที่บรรยายความสัมพันธ์ระหว่างค่าของ input paramet...
PACKAGE BODY util IS
PROCEDURE add_element(element : IN REAL;
VARIABLE filter_data : INOUT filter_data_type ) IS
BEGIN
FOR...
Procedure Calls
การเรียกโปรซีเยอร์มาใช้ ทาได้โดยการเขียนชื่อ (name) ของ โปรซีเยอร์ นั้น
ตามด้วยรายชื่อของ พารามิเตอร์ต้องก...
 สัมพันธ์โดยชื่อ (Named Association)
เป็นการบอกความสัมพันธ์ระหว่างชื่อกับชื่อ ด้วยการกาหนดว่าพารามิเตอร์ตัวส่งชื่ออะไร
ต้...
ตัวอย่าง
โปรซีเยอร์สาหรับวงจร Full adder เมื่อเขียนอยู่ใน Package
ibrary ieee;
use ieee.std_logic_1164.all;
package my_pac...
เมื่อต้องการเรียกโปรซีเยอร์ FULLADD ใน package สามารถทาได้ดังนี้
library ieee;
use ieee.std_logic_1164.all;
use work.my_pa...
การแปลงประเภทของข้อมูล (Type conversion)
เนื่องจากภาษา VHDL ค่อนข้างเข้มงวดเกี่ยวกับประเภทของข้อมูล
กล่าวคือการส่งข้อมูลระ...
ตัวอย่างฟังก์ชันที่อยู่ใน std_logic_1164
ฟังก์ชัน แปลงจาก เป็น
TO_BIT
TO_BITVECTOR
TO_BITVECTOR
TO_STDULOGIC
TO_STDLOGICVE...
ตัวอย่างฟังก์ชันที่อยู่ใน Std_Logic_Arith
ฟังก์ชัน จาก(ประเภท, ขนาด) เป็น
CONV_INTEGER
CONV_INTEGER
CONV_INTEGERCONV_INTEG...
ฟังก์ชันที่อยู่ Std_Logic_Unsigned
แปลงจาก STD_LOGIC_VECTOR ไปเป็น UNSIGNED INTEGER
CONV_INTEGER(arg: STD_LOGIC_VECTOR) re...
ตัวอย่างการใช้งานมีดังนี้ LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsi...
ฟังก์ชันมาตรฐาน
ฟังก์ชันมาตรฐานเป็นฟังก์ชันที่มีอยู่แล้วในปาสคาล
เมื่อผู้เขียนโปรแกรมต้องการเรียกใช้การทางานของฟังก์ชัน
ผู...
ฟังก์ชัน การทางาน ชนิดของพารามิเตอร์ X ชนิดของผลลัพธ์
Abs(X) คานวณค่าสัมบูรณ์ของ X Integer / Real เหมือน X
Arctan(X) คานวณ...
ฟังก์ชัน การทางาน ชนิดของพารามิเตอร์ X ชนิดของผลลัพธ์
Sqr(X) คานวณค่ายกกาลังที่สอง
ของ X
Integer / Real เหมือน X
Sqrt(X) ค...
ฟังก์ชัน การทางาน ชนิดของ
พารามิเตอร์ X
ชนิดของผลลัพธ์
Upcase(X) ให้ค่าตัวอักขระใหญ่ของ
X ในกรณีที่ X เป็นตัว
อักขระเล็ก ม...
ตัวอย่าง
การเรียกใช้ฟังก์ชันมาตรฐาน
การออกแบบโปรแกรม
การเขียนโปรแกรม ลาดับการประมวลผล
ตัวอย่าง การทางาน
Program XFunctions;
Uses Crt;
Var A, B, C, D : integer;
X, Y, P, R : Re...
ผลการ 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 ...
โปรแกรมย่อยและ
ฟังก์ชัน มาตรฐาน
โปรแกรมย่อย (Subprogram)
สามารถเรียกใช้งานได้ง่ายและทุกๆที่ ก็ควรประกาศไว้ภายใน
Package
จะ...
ครูเนาวรัตน์ ใจการุณ. 2550. ฟังก์ชันมาตรฐาน.แหล่งที่มา :
http://www.thaigoodview.com/library/teachershow/lopburi
/naowarta...
รายชื่อสมาชิก
1. นาย เสฏฐวุฒิ ปิตะโพธิ์ เลขที่ 9
2. นางสาว ธัญญารัตน์ แต้นุเคราะห์ เลขที่14
3. นางสาว นิตตา บุญเชิด เลขที่...
Upcoming SlideShare
Loading in …5
×

การเขียนโปรแกรมเพื่องานอาชีพ 6.

338 views

Published on

Published in: Lifestyle
  • Be the first to comment

  • Be the first to like this

การเขียนโปรแกรมเพื่องานอาชีพ 6.

  1. 1. โปรแกรมย่อยและฟังก์ชัน มาตรฐาน
  2. 2. โปรแกรมย่อย (Subprogram) โปรแกรมย่อยคือกลุ่มของคาสั่งลาดับที่สามารถเรียกใช้งานได้โปรแกรมย่อยนี้ สามารถเขียนไว้ในส่วนของ Package หรือ Architecture หรือ Process ก็ได้ แต่การเรียกใช้งานจะขึ้นอยู่กับตาแหน่งที่ประกาศโปรแกรมย่อยไว้ดังนี้ - ประกาศไว้ใน Package สามารถเรียกใช้ได้จากทุกๆที่ของโมเดล - ประกาศไว้ใน Architecture ของโมเดลใดก็สามารถเรียกใช้ได้จากภายในโมเดลนั้นเท่านั้น - ประกาศไว้ใน Process ใดก็สามารถเรียกใช้ได้จากภายใน Process นั้นเท่านั้น ดังนั้นจะเห็นได้ว่า ถ้าต้องการให้สามารถเรียกใช้งานได้ง่ายและทุกๆที่ ก็ควรประกาศไว้ภายใน Package จะดีกว่าการประกาศไว้ที่อื่นๆ ภาษา VHDL แบ่งโปรแกรมย่อยออกเป็น 2 ประเภท คือ ฟังก์ชัน (Function) และ โปรซีเยอร์ (Procedure)
  3. 3. ฟังก์ชัน (Function) ฟังก์ชันเป็นโปรแกรมย่อยชนิดหนึ่ง เมื่อเรียกใช้จะส่งค่ากลับคืนเพียงหนึ่งค่า ทั้งนี้การเรียกใช้อาจมีการส่งค่าพารามิเตอร์ (Passing parameter) ให้กับฟังก์ชันหรือไม่ก็ได้ แต่ถ้ามีการส่งค่าเข้าสู่ฟังก์ชันพารามิเตอร์นั้นต้องไม่มีการเปลี่ยนแปลงค่า แต่ค่าของพารามิเตอร์จะถูกนาไปใช้ เพื่อคานวณหาผลลัพธ์โดยผลลัพธ์นี้จะถูกส่งกลับไปยังโมเดลที่เรียกใช้ตรงตาแหน่งที่ฟังก์ชันนั้น ถูกเรียกใช้ ลักษณะของฟังก์ชันมีคุณสมบัติดังนี้  การทางานเป็น นิพจน์(expression) ไม่ใช่ statement  ฟังก์ชันจะคานวณให้ผลลัพธ์เพียงค่าเดียวและส่งค่ากลับคืนให้โมเดล  ภายในฟังก์ชันต้องมีคาสั่ง RETURN เสมอ  การทางานของฟังก์ชันต้องไม่เปลี่ยนแปลงค่าออบเจ็กต์(Object) ที่ถูกส่งผ่าน  ฟังก์ชันต้องประกอบด้วย function body และอาจจะมี function declaration ด้วยก็ได้
  4. 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. 5. Function body เป็นส่วนที่บรรยายพฤติกรรมของฟังก์ชัน ถ้าจะให้ฟังก์ชันทาอะไรส่วนนี้จะต้องมี ภายใน body เป็น คาสั่งลาดับ ห้ามมีคาสั่ง concurrent และต้องมีคาสั่ง RETURN ซึ่งเป็นคาสั่งให้ส่งค่ากลับและเป็นคา สั่งสิ้นสุดการทางานด้วย รูปแบบของ function body เป็นดังนี้ FUNCTIONname [(formal_parameter_list)]RETURNTYPE IS declaration statement BEGIN [sequentialstatements] [includeRETURNexpressito] END name;
  6. 6. ตัวอย่างเช่น FUNCTION bl2bit (a : BOOLEAN) RETURN BIT IS BEGIN IF a then RETURN '1'; ELSE RETURN '0'; END IF; END bl2bit;
  7. 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. 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. 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. 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. 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. 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. 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. 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. 15. Procedure Declaration PROCEDURE name (formal_parameter_list);  name ชื่อของ โปรซีเยอร์  formal_parameter_list รายชื่อพารามิเตอร์ที่ ใช้ในโปรซีเยอร์ มีหน้าที่ เป็นตัวบอก CLASS, NAME, MODE และ TYPE ของ object รูปแบบการเขียนเป็นดังนี้ (CLASS object_name : MODE TYPE)
  16. 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. 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. 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. 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. 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. 21.  สัมพันธ์โดยชื่อ (Named Association) เป็นการบอกความสัมพันธ์ระหว่างชื่อกับชื่อ ด้วยการกาหนดว่าพารามิเตอร์ตัวส่งชื่ออะไร ต้องการส่งให้พารามิเตอร์ตัวรับชื่อว่าอะไร โดยใช้เครื่องหมาย " => " เช่น FULLADD(A => X1, B => X2, CIN => X3, C => Y);
  22. 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. 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. 24. การแปลงประเภทของข้อมูล (Type conversion) เนื่องจากภาษา VHDL ค่อนข้างเข้มงวดเกี่ยวกับประเภทของข้อมูล กล่าวคือการส่งข้อมูลระหว่างออบเจ็กต์นั้น ออบเจ็กต์ต้องเป็นประเภทเดียวกัน เช่น BIT กับ BIT หรือ BIT_VECTOR กับ BIT_VECTOR จะเป็นคนละชนิดไม่ได้เช่น BIT กับ STD_LOGIC หรือ STD_LOGIC_VECTOR กับ BIT_VECTOR ก็ไม่ได้ ดังนั้นใน LIBRARY IEEE จึงมี Package ที่ได้บรรจุฟังก์ชัน เพื่อการแปลงข้อมูลบางประเภทไว้ดังตัวอย่างต่อไปนี้
  25. 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. 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. 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. 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. 29. ฟังก์ชันมาตรฐาน ฟังก์ชันมาตรฐานเป็นฟังก์ชันที่มีอยู่แล้วในปาสคาล เมื่อผู้เขียนโปรแกรมต้องการเรียกใช้การทางานของฟังก์ชัน ผู้เขียนโปรแกรมสามารถอ้างถึงชื่อฟังก์ชันได้ในทันที โดยไม่ต้องเขียนโปรแกรมย่อยขึ้นเอง ตารางข้างล่างแสดงฟังก์ชันมาตรฐาน รูปแบบการเรียกใช้ การทางาน ชนิดของพารามิเตอร์และผลลัพธ์ที่ส่งกลับมาภายใต้ชื่อของฟังก์ชันเมื่อมีการเรียกใช้ฟังก์ชัน
  30. 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. 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. 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
  33. 33. ตัวอย่าง การเรียกใช้ฟังก์ชันมาตรฐาน การออกแบบโปรแกรม
  34. 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. 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. 36. โปรแกรมย่อยและ ฟังก์ชัน มาตรฐาน โปรแกรมย่อย (Subprogram) สามารถเรียกใช้งานได้ง่ายและทุกๆที่ ก็ควรประกาศไว้ภายใน Package จะดีกว่าการประกาศไว้ที่อื่นๆภาษา VHDL แบ่งโปรแกรมย่อยออกเป็น 2 ประเภท คือ ฟังก์ชัน (Function) และ โปรซีเยอร์ (Procedure) ฟังก์ชัน (Function) - Function declaration -Function body -Recursive Function -Procedure Body ฟังก์ชันมาตรฐาน สามารถอ้างถึงชื่อฟังก์ชันได้ในทันที โดยไม่ต้องเขียนโปรแกรมย่อยขึ้น เอง
  37. 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. 38. รายชื่อสมาชิก 1. นาย เสฏฐวุฒิ ปิตะโพธิ์ เลขที่ 9 2. นางสาว ธัญญารัตน์ แต้นุเคราะห์ เลขที่14 3. นางสาว นิตตา บุญเชิด เลขที่ 15 4. นางสาว พิชามญชุ์ สังข์ฉิมพลี เลขที่ 24 5. นางสาวมนสิณีย์พลอยแสงสาย เลขที่ 29 6. นางสาว ณิชาภัทร ปฏิมาประกร เลขที่ 30 ชั้นมัธยมศึกษา 6 / 2

×