No Slide Title

Download Report

Transcript No Slide Title

VHDL
Workshop on Digital System Designs for CPLD/FPGA
19-20-21 Nov 2004
1
HDL: Hardware Description Language
อะไรคือ Hardware?
 อะไรคือ Software?

2
การออกแบบด้ วยภาษา VHDL
3
อะไรคือ VHDL

VHDL ย่ อมาจาก
VHSIC : Very High Speed IC
HDL
: Hardware Description Language
 เริ่มต้ นจากกระทรวงกลาโหมสหรัฐอเมริกา (US:DOD) ประมาณปี
ค.ศ. 1981 ทาการพัฒนาโครงการที่มีชื่อว่ า VHSIC ทาการพัฒนา
โปรแกรมซึ่งจะจัดเป็ นภาษาระดับสู งเช่ นเดียวกับภาษา C หรือ
PASCAL แต่ สามารถบรรยายพฤติกรรมของ วงจรดิจิตอล หรือ
โครงสร้ างของวงจรได้ ทั้งนีเ้ พือ่ ให้ สามารถออกแบบ และสร้ าง
วงจรดิจิตอลได้ เร็วขึน้
4
VHDL เกิดขึน้ ได้ อย่ างไร

เริ่มต้ น โดย US :DOD ได้ มอบหมายให้ บริษัท IBM , Teaxas
Instruments และ Intermetrics เป็ นผู้ศึกษาและพัฒนาภาษาทีใ่ ช้
ออกแบบวงจรดิจิตอลและได้ ผลเป็ นทีน่ ่ าพอใจ จนกระทั่งปี ค.ศ.
1985 ทาง ITAR ได้ ยกเลิกข้ อจากัดในการถ่ ายทอดเทคโนโลยี
ทางการทหาร ออกจากโครงการนีด้ ังนั้น VHDL จึงเริ่มรู้จักกัน
โดยทัว่ ไป จนกระทั่งทาง IEEE(Institute of Electrical and
Electronic Engineering) ได้ รับภาษานีเ้ ข้ ามาศึกษาและประมาณปี
ค.ศ. 1987 ได้ ยอมรับกาหนดมาตรฐานของภาษา โดยให้ ชื่อว่ า IEEE
1976-1987 และมีชื่อเรียกว่ า VHDL มาตรฐานนีไ้ ด้ รับการปรับปรุง
จนปัจจุบันได้ ชื่อว่ า IEEE 1076-1993 หรือ VHDL 1993
5
VHDL เกิดขึน้ ได้ อย่ างไร
 การที่ทาง DOD ตอนนั้น
เป็ นลูกค้ ารายใหญ่ ของอุสาหกรรม
อิเล็กทรอนิกส์ และคอมพิวเตอร์ จึงมีผู้รับโครงการต่ างๆ จาก
DOD ไปวิจยั และพัฒนามากเพือ่ ให้ เป็ นมาตรฐานเดียวกันหมด
ทาง DOD จึงกาหนดว่ า ในการส่ งโครงการนั้นจะต้ องเขียน
อยู่ในรู ปของภาษา VHDL เท่ านั้น ซึ่งทาให้ เกิดข้ อดีต่อ DOD
เอง ทีเ่ ป็ นมาตรฐานเดียวกัน สามารถนาไปจาลองกับ Tools
ได้ หลายๆ ตัว
6
VHDL ทาอะไรได้ บ้าง
เป็ นภาษาทีน่ าไปเขียนรู ปแบบระบบดิจติ อล และมีคุณสมบัติ
ที่คน และเครื่อง สามารถเข้ าใจได้ โดยไม่ ต้องแปลอีก
 เป็ นภาษาทีส
่ ามารถเขียนขึน้ เพือ่ จาลองการทางานได้
 สามารถนาไปเป็ นเอกสารประกอบโครงการได้

ในรายละเอียดต่ อจากนีจ้ ะเน้ นถึงการใช้ ภาษา VHDL
ในการสั งเคราะห์ วงจร โดยเขียนเป็ นรู ปแบบภาษาที่
สามารถอธิบายพฤติกรรม หรือโครงสร้ างของระบบ
ดิจติ อล
7
Top-Down Design in Digital System
 การเริ่ มต้ นด้ วยวิธีการเขียนรู ปแบบจากแนวความคิดอย่ างสั งเขป
พร้ อมทั้งจาลองการทางานของรู ปแบบที่เขียนขึน้ เพือ่ ตรวจสอบ
ความถูกต้ อง ประกอบกับการกลัน่ กรองเพิม่ รายละเอียด ลงสู่
ระบบดิจิตอลที่สมบูรณ์ ในรู ปแบบของวงจรไฟฟ้าทีละขั้น นั้นคือ
กระบวนการของ Top-Down Design ซึ่งมีข้อดีคอื


เป็ นการเขียนรู ปแบบในระดับบนของแนวความคิด
ผู้ออกแบบสามารถตรวจสอบการการทางานของวงจรได้ ต้งั แต่ ใน
ระยะแรกของการออกแบบ เพือ่ ตรวจสอบความถูกต้ องของ
แนวความคิดกับสิ่ งทีต่ ้ องการจริง
8
ขั้นตอนการออกแบบแบบ Top -Down Design
 การสร้ างข้ อกาหนดความต้ องการ
วิเคราะห์ ระบบ เพือ่ หา
แนวความคิดและหลักการในการแก้ ปัญหา
 เขียนระบบที่ต้องการโดยภาษา VHDL จากแนวความคิด
อย่ างสั งเขป สาหรับบรรยายการทางาน พร้ อมทั้งจาลอง
การทางานเพือ่ เปรียบเทียบและตรวจสอบความถูกต้ องกับ
ข้ อกาหนด
 เพิม
่ เติมรายละเอียดลงมาเป็ นลาดับขั้นจนกระทั้งอยู่ในระดับ
ที่จะไปผลิตวงจร หรือ ทาการสั งเคราะห์
9
VHDL Language Structure
10
มีศัพท์ เทคนิคเฉพาะบางคาในภาษา VHDL ทีจ่ ะแนะนา
 Concurrency:
ในภาษา VHDL นั้นชุดคาสั่ งแต่ ละชุดจะ
ทางานในเวลาเดียวกันและอิสระต่ อกัน และจะทางานก็
ต่ อเมื่อมีการเปลีย่ นแปลงค่ าของสั ญญาณ
 Sequential: เป็ นชุ ดคาสั่ งทีท
่ างานเป็ นลาดับขั้นจากบนลง
ล่ าง ซึ่งในการทางานของวงจรที่ออกแบบต้ องทาเป็ นลาดับ
ขั้น เช่ น ลักษณะการบรรยายพฤติกรรมของวงจรเป็ นต้ น
11
มีศัพท์ เทคนิคเฉพาะบางคาในภาษา VHDL ทีจ่ ะแนะนา
 Transaction: การเกิด transaction กับ signal
นั้นจะเกิดขึน้
เมื่อกาหนดค่ าค่ าหนึ่งให้ กบั signal นั้นค่ าใหม่ ที่ signal ได้ รับ
อาจจะมีผลหรือไม่ มีผลทาให้ เกิดการเปลีย่ นแปลงของระดับ
สั ญญาณ (event) เช่ นการเปลีย่ นค่ าจาก Logic 0 เป็ น Logic
1 เป็ นต้ น
 Event: คือการเปลีย
่ นระดับค่ าของ signal จากระดับหนึ่ง
ไปสู่ ระดับอืน่ เช่ น 0 เป็ น 1 หรือ 1 เป็ น 0 เป็ นต้ น การเกิด
even ได้ จะต้ องเกิด transaction ด้ วย
12
มีศัพท์ เทคนิคเฉพาะบางคาในภาษา VHDL ทีจ่ ะแนะนา
 Sensitivity List:
คือรายชื่อของ signal ต่ างๆ ที่มีผลให้ เกิด
การทางานของ concurrent statement เมื่อเกิด event
ขึน้ กับ signal ตัวใดตัวหนึ่งหรือหลายตัวพร้ อมกันในรายชื่อ
นั้น
 Objects: ในภาษา VHDL นั้นคาว่ า object ใช้ เขียนเพือ
่ บ่ ง
บอกถึงองค์ ประกอบส่ วนหนึ่งของรู ปแบบ เหมือนกับ
ภาชนะทีม่ ีไว้ สาหรับบรรจุค่าต่ างๆ สามารถแบ่ งออกได้ เป็ น
3 ชั้น ด้ วยกันคือ
13
Object of VHDL
 CONSTANT: เมื่อกาหนดค่ าเริ่มต้ นให้ แล้ ว
จะคงค่ านั้นไว้ ตลอด
ไม่ สามารถดัดแปลงหรือแก้ ไขได้ สามารถประกาศใช้ ได้ ในส่ วนที่
เป็ นส่ วนประกอบต่ างของรู ปแบบ (model)
 SIGNAL: สามารถกาหนดค่ าทีส
่ ั มพันธ์ กบั เวลาให้ ได้ นั้น
หมายความว่ า SIGNAL สามารถรับค่ าได้ ค่าเดียวเท่ านั้นในขณะ
เวลาหนึ่ง SIGNAL จะรับค่ าๆ หนึ่งจากตัวขับสั ญญาณซึ่งตัวขับนี้
อาจจะเก็บค่ าในอนาคตสาหรับ SIGNAL ไว้ ด้วย SIGNAL
สามารถประกาศใช้ ได้ ในส่ วนทีเ่ ป็ นเนือ้ ทีข่ อง concurrent body
เท่ านั้น ดังนั้น SIGNAL จึงสามารถนาไปใช้ ได้ ตลอดโครงสร้ างของ
รู ปแบบ (model)
14
Object of VHDL
 VARIABLE: ตัวแปร ได้ แก่ object ทีส
่ ามารถกาหนดค่ าใดๆ ให้ ได้
และสามารถทีจ่ ะเปลีย่ นแปลงค่ าได้ ตลอดการจาลองการทางาน แต่
จะเก็บค่ าเพียงค่ าเดียวเท่ านั้นในขณะเวลาหนึ่ง เนื่องจาก
VARIABLE สามารถประกาศใช้ ได้ ในส่ วนทีเ่ ป็ น sequential body
เท่ านั้น อันได้ แก่ ส่วนประกาศของ PROCESS , FUNCTION หรือ
VARIABLE จึงสามารถใช้ ได้ เฉพาะในขอบเขตทีถ่ ูกประกาศใช้
เท่ านั้น
15
ส่ วนประกอบที่สาคัญของไฟล์ VHDL
 ส่ วนที่แสดงถึง Library และ Package ที่จะเรียกใช้
 Entity
สาหรับกาหนดพอร์ ตของวงจร ซึ่งเป็ นได้ ท้ัง input,
output หรือ inout
 Architecture สาหรับอธิบายการทางานในลักษณะของทั้ง
Behavioral Level หรือ Structural Level
16
ส่ วนประกอบที่สาคัญของไฟล์ VHDL
1
2
3
Library...
Use...
------------------Entity
------------------------------------Architecture
----------Begin
----------------------------------End
17
Library และ Package
 Library ทาหน้ าทีเ่ ก็บ Package ต่ าง ๆ ไว้ ซึ่งใน Package จะเป็ น
ทรัพยากรต่ าง ๆ ทีใ่ ช้ งานร่ วมกัน ดังนั้นก่ อนใช้ งานจะต้ องกาหนดไว้ ใน
ตอนต้ นของ VHDL ไฟล์ ไว้ ด้วย
18
Library
 ชุ ดคาสั่ ง Library ดังในตัวอย่ าง เป็ นชุ ดคาสั่ งทาให้ Library ที่มี
ชื่อสั ญลักษณ์ ว่า IEEE สามารถนามาใช้ ในส่ วนที่เป็ น entity ชื่อ
test ได้ นั่นคือ library ชื่อ IEEE จะมองเห็นได้ สาหรับ entity
ชื่อ test รวมทั้งส่ วนที่เป็ นหน่ วยรองด้ วย
Library IEEE;
___
entity test is
end test ;
19
ชุดคาสั่ ง USE
 ใน library(กาหนดชื่ อสั ญลักษณ์ ) อาจจะประกอบด้ วย package
หลายๆ ชุ ด ดังนั้นจะต้ องกาหนด package เฉพาะที่ต้องการใช้
งาน ด้ วยคาสั่ ง USE ซึ่งมีรูปแบบดังนี้
USE
library_name.package_name.element_of_package;
Library IEEE;
USE IEEE.std_logic_1164.and;
entity test is
___
20
การเขียน Comments ในภาษา VHDL
----------------------------------------------------------- this is a comments
-- each line must begin with --- comment end with a new line
---------------------------------------------------------Library IEEE;
USE IEEE.std_logic_1164.all;
entity test is
___
21
Entity
 Entity ใน VHDL จะบอกถึงพอร์ ตที่จะใช้ เชื่อมต่ อกับส่ วน
อืน่ ๆ ของวงจรภายในวงเล็บ โดยจะยังไม่ มีการพูดถึง
พฤติกรรมของวงจร เป็ นส่ วนที่ใช้ สาหรับติดต่ อระหว่ าง
โลกภายนอกกับรู ปแบบ (model) ที่จะเขียนขึน้ เป็ นส่ วนที่ใช้
กาหนดจุดต่ อ (connection point)ของรู ปแบบ กาหนดทิศ
ทางการไหลของสั ญญาณ (mode) และประเภทของค่ า(type
of value) ทีส่ ามารถกาหนดให้ กบั สั ญญาณตามจุดต่ างๆ
(port) ของข้ อมูลทีไ่ หลผ่ านจุดต่ อเหล่ านั้น
22
Entity Design Unit
กาหนด
ทางเข้ าออก
ของข้ อมูล
ชื่อของรูปแบบทีต่ ้ องการจะเขียน
Syntax:
entity entity_name is
port (port_name :<mode> port_type);
end entity_name;
จะต้ องปิ ดท้ ายด้ วย end ตามด้ วย
“entity_name” และ ;
ประเภทค่ าของสั ญญาณ หรือ
ข้ อมูลก็คอื กลุ่มของค่ า
กาหนดทิศทางที่ติดต่ อกับ
ภายนอก I/O
23
ตัวอย่ างการเขียน Entity
สั งเกตว่ าจะไม่ มี Semi-Colon ที่บรรทัด
สุ ดท้ าย ก่อนทีจ่ ะปิ ดด้ วยวงเล็บปิ ด
24
การเขียนโดยมีข้อมูลทางฟิ สิ กส์
Syntax:
entity entity_name is
generic(generic_list);
port (port_name :<mode> port_type);
end entity_name;
Generic (tplh : Time:=3ns,
tphl : Time:=5ns);
25
Architecture Design Unit
 เป็ นส่ วนที่เขียนบรรยายพฤติกรรม ของรู ปแบบ ( model) ใน
มุมมองของการจาลองการทางาน (simulation)
 พฤติกรรมต่ างทีบ
่ รรยายในส่ วนนีจ้ ะขึน้ อยู่กบั ข้ อมูลทีผ่ ่ าน
เข้ าออกตรงช่ องทาง ตลอดจนพารามิเตอร์ ต่างๆ (port and
generics) ที่กาหนดใน entity design unit
 Syntax : เริ่ มต้ นด้ วยคา Architecture ตามด้ วยชื่อ และจบ
ด้ วย End ตามด้ วยชื่อ ดังหน้ าถัดไปนี้
26
Architecture Syntax
ชื่อ
architecture นั้นบรรยาย entity ใด
Syntax:
architecture architecture _name of entity_name is
declarations
อยู่ระหว่ าง arc และ begin ส่ วนนี้
begin
ใช้ ในการเขียนประกาศกาหนดค่ า
concurrent_statements
ต่ างๆ ที่จะนาไปใช้ ใน arc นั้นอาทิ
end architecture _name ;
เช่ น ประเภทของ type, signal,
constant, function, procedure,
component ที่จะใช้
27
Architecture
Syntax:
architecture architecture _name of entity_name is
declarations
begin
concurrent_statements
end architecture _name ;
การบรรยายความสั มพันธ์ ของข้ อมูลทีไ่ หลเข้ าออก model นั้นจะถูก
บรรยายระหว่ าง begin กับ end ชุ ดคาสั่ งทุกคาสั่ งทีอ่ ยู่ในบริเวณนี้
จะเป็ นชุ ดคาสั่ งแบบแข่ งขนาน (concurrent statement) เท่ านั้น
arc จะต้ องปิ ดท้ ายด้ วย end และชื่อของ arc นั้นๆ
28
Architecture
 Architecture จะเป็ นส่ วนที่จะใช้ ในการอธิบายการทางาน
หรือโครงสร้ างของวงจร
 ตัวอย่ าง เป็ น Architecture ของ Half Adder (HA) ที่มีชื่อ
ว่ า “BEHAVE” ของ Entity ที่มีชื่อว่ า “HALFADD” ซึ่ง
จะมีการอธิบายการทางานระหว่ าง Begin => End
29
Architecture Styles
Algorithmic description
Netlist representation
Behavioral + Structral
30
Behavioural
 เป็ นการเขียนรู ปแบบ VHDL ที่ใช้ บรรยายการทางานทีม
่ ี
ลักษณะคล้ ายกับการเขียนโปรแกรม ด้ วยภาษา C หรือ
PASCAL มากกว่ าจะเป็ นโครงสร้ างของ hardware เช่ นมี
การใช้ งานคาสั่ งประเภท if-then-else, for-loop เป็ นต้ น
รู ปแบบ VHDL เช่ นนีจ้ งึ จัดให้ อยู่ในประเภท behavioural
 ข้ อดีของการบรรยายแบบนีค
้ อื อะไร?
31
ตัวอย่ าง Behavioural Style
architecture behavioural of mux is
begin
process ( IN0,IN1,SEL)
begin
if (SEL=‘0’) then
OUTPUT <= IN0;
else
OUTPUT <= IN1;
end if;
end process;
end behavioural;
32
Structural
เป็ นการเขียนเพือ่ บรรยายลักษณะทางโครงสร้ างของวงจร หรือ
ระบบ ที่ประกอบด้ วยอุปกรณ์ หลาย ๆ ตัวต่ อกัน
 ในการเขียนเพือ
่ อธิบายนั้น จาเป็ นต้ องรู้ ว่าขาของอุปกรณ์ แต่ ละ
ตัวต่ อกันอย่ างไร ทาให้ เราสามารถมองเห็น หรือกาหนด
โครงสร้ างได้ เช่ นมีการทางานพร้ อม ๆ กัน (ขนาน) ของอุปกรณ์
ตัวใดบ้ าง
 ตัวอย่ างเช่ น การสร้ างวงจรแบบ Pipeline เราจาเป็ นต้ องเขียนใน
ลักษณะของ Structural

33
ตัวอย่ าง Structural Style
architecture structural of mux is
component INV
IN0
port( I1 : in bit; O1 : out bit );
end component;
INT0
IN1
component AND2
port( I1,I2 : in bit; O1 : out bit );
SEL I1 G0
end component;
O1
component OR2
port( I1,I2 : in bit; O1 : out bit );
end component;
signal INT0 ,INT1 ,INT2 :bit;
begin
G0 :INV :port map (I1 => SEL, O1=>INT0);
mux
I1
I2
I1
I2
G1
INT1
O1
I1
I2
G2
O1
G3
OUTPUT
O1
INT2
G1 :AND2 :port map (I1 => IN0, I2=>INT0, O1=>INT1);
G2 :AND2 :port map (I1 => SEL, I2=>IN1, O1=>INT2);
G3 :OR2 :port map (I1 => INT1, I2=>INT2, O1=>OUTPUT);
end structural;
34
Hierarchy Design
 Hierarchy เป็ นการออกแบบทีเ่ ป็ นลักษณะของลาดับชั้น ซึ่งจะทา
ให้ ง่ายในการทาความเข้ าใจ ตรวจสอบ และแก้ ไข
FA
HA
HA
OR
 ตัวอย่ าง เป็ นการออกแบบวงจร Full Adder (FA) ซึ่งประกอบด้ วย
HA สองตัว และ OR gate เป็ นลักษณะของ Hierarchy ดัง
แผนภาพด้ านบน
35
การเขียน VHDL ในลักษณะของ Hierarchy
36
การเขียน VHDL ในลักษณะของ Hierarchy
 เราสามารถแสดงโครงสร้ างการเชื่อมต่ อกันของ HA และ OR
ได้ โดย3 บรรทัดทีอ่ ยู่ระหว่ าง Begin และ End
 U1 และ U2 แทน HA และ U3 แทน OR โดยที่ท้งั U1, U2, U3
เราเรียกว่ า Instant Name
 มีจุดเชื่อมต่ อภายในวงจร 3 จุดด้ วยกันคือ I1, I2, I3 ซึ่งใน
VHDL ถือว่ าเป็ น Signal
37
การเขียน VHDL ในลักษณะของ Hierarchy

ตัวอย่ างการเชื่อมต่ อระหว่ าง HA กับจุดต่ าง ๆ โดยรอบ เราจะใช้ คาสั่ ง
Port map ซึ่งจะทาการเชื่อมต่ อให้ ตรงตามตาแหน่ งการเรียงกันของ
พอร์ ตทีก่ าหนดไว้ ใน Entity
38
Local Declaration


สาหรับการกาหนดว่ า เราต้ องการใช้ HA และ OR ในการสร้ าง จะต้ องกาหนด
ไว้ เป็ นลักษณะของ Component ในบริเวณของ Local Declaration
ชื่อของ Component และตาแหน่ งของพอร์ ต จะต้ องเหมือนกับที่กาหนดไว้ ใน
Entity
39
VHDL ทีส่ มบูรณ์ ของ Full Adder
40
Configuration Design Unit
 การจาลองการทางานของรู ปแบบ(model) นั้น simulator จะ
นา architecture อันไหนไปจาลอง ดังนั้นเราต้ องบอกให้
simulator ทราบ และในรู ปแบบ VHDL นั้นการบอกหรือ
กาหนดหรือการใช้ configuration ประกอบ entity กับ
architecture design unit ทีต่ ้ องการเข้ าด้ วยกัน
Syntax:
configuration configuration_name of entity_name is
for architecture_name
end configuration_name ;
41
Configuration Example
1
2
Entity and2 is
generic (ttl_delay : time := 3ns)
port (in1,in2 : IN bit;
output : OUT bit);
end and2;
architecture dataflow of and2 is
begin
output <= in1 AND in2 AFTER ttl_delay
end dataflow
architecture behave of and2 is
begin
process (in1,in2)
begin
if (in1 = ‘1’ AND in2 = ‘1’) then
output <= ‘1’ AFTER ttl_delay;
else
output <= ‘0’;
end process
end behave;
42
Configuration Example
 ก่ อนทีจ
่ ะนารู ปแบบไปจาลองการทางานจะต้ องประกอบ Arc.
ที่ต้องการเข้ ากับ enti. เสี ยก่ อน ถ้ าไม่ กาหนดการประกอบ
VHDL จะนา Arc. สุ ดท้ ายไปจาลองการทางาน
configuration dataflow_and of and2 is
for dataflow
end for;
end dataflow_and ;
 แสดงการประกอบ architecture ชื่อ dataflow เข้ ากับ entity
design unit
43
Package Design Unit
ข้ อมูลต่ างๆ ตลอดจนโปรแกรมย่ อย (Subprogram) ที่เป็ น
ประโยชน์ ต่อการเขียนรูปแบบบรรยายระบบดิจิตอลสามารถเก็บไว้
ในส่ วนที่เรียกว่ า Package ได้ และข้ อมูลเหล่านี้ สามารถถูกเรียกไป
ใช้ ได้ โดย Entity design unit, Architecture design unit หรือจาก
Package design unit อืน่ ด้ วยคาสั่ ง USE statement
 นอกจากนั้นสิ่ งทีน
่ ิยมทากันมากคือรูปแบบ (model)มาตรฐานต่ างๆ
เช่ น Standard components (model ของ IC ตระกูล 74xx) จะถูก
เก็บไว้ ใน package ทีท่ ุกคนนามาใช้ ได้

44
Package
45
Package
46
Standard Packages
IEEE
VHDL'87/VHDL'93
SYNOPSYS proprietary
std_logic_1164.vhd (ieee)
standard.vhd (std)
std_logic_arith.vhd
(ieee)
numeric_std.vhd
(ieee)
textio.vhd (std)
std_logic_misc.vhd
(ieee)
numeric_bit.vhd
(ieee)
std_logic_signed.vhd (ieee)
std_logic_unsigned.vhd (ieee)
std_logic_textio.vhd (ieee)
attributes.vhd
(synopsys)
47
Data Type
48
Type in VHDL
 Signal ใน VHDL ทีใ่ ช้ ในการส่ งผ่ านค่ าจากจุดหนึ่ง ไปยังอีกจุด
หนึ่งนั้น มีได้ หลายชนิด (Type) ซึ่งแต่ ละ Type นั้นจะกาหนดชุ ด
ของค่ าที่ Signal ถูกอนุญาตให้ ใช้ ได้
49
Type
 Type แบ่ งออกได้ เป็ นสองกลุ่มใหญ่ ๆ คือ
- Pre-Defined
- User-Defined
50
Pre-defined Type
 ใน Package ที่ชื่อว่ า standard จะถูกโหลดเข้ ามาใช้ งานโดย
อัตโนมัติ โดยไม่ ต้องกาหนดไว้ ที่บรรทัดต้ นไฟล์ ซึ่งมีชนิดต่ าง ๆ
ของ Type ดังนี้
51
Standard Pre-defined Type
Boolean : FALSE, TRUE
 Bit : ‘0’, ‘1’
 Bit_Vector : “00010”, “111”,...
 Character : ‘a’, ‘b’, ‘A’, ‘Z’, ‘1’, ’0’,...
 String : “Hello”, “VHDL”,...
 Integer : 0, 1, -45, 137, 256,...
 Real : 1.02, -37.4,...
 Time : 10 ns, 200 fs, 2.5 ps,...

52
แนวคิดของการกาหนด Type
 เมื่อเราต้ องการกาหนด (assign) ค่ าให้ กบ
ั Signal ชนิดของ
Type ทั้งด้ านซ้ าย และด้ านขวา ของตัวส่ งผ่ านค่ า (<=) จะต้ อง
เป็ นชนิดเดียวกัน ดังตัวอย่ าง
53
Pre-defined Type ชนิดอืน่

นอกจากนี้ เรายังมี Type ทีก่ าหนดอยู่ใน Package อืน่ ทีไ่ ม่ ใช่ Standard
package ดังตาราง ดังนั้นก่อนที่เราจะใช้ งานต้ องกาหนดการใช้ งาน Package
ไว้ ตอนต้ นด้ วย
Package
std_logic_1164
std_logic_arith
Type
std_logic, std_logic_vector
std_ulogic, std_ulogic_vector
signed, unsigned
‘U’ ‘X’ ‘0’ ‘1’ ‘Z’
‘W’ ‘L’ ‘H’ ‘-’
std_logic หรือ std_ulogic
“1010”
signed = -6
unsigned = 10
54
Standard Logic Type
‘U’
‘X’
‘0’
‘1’
‘Z’
‘L’
‘H’
‘-’
= un-initialized
= unknown
= logic 0
= logic 1
= high impedance
= logic 0
= logic1
= don’t care
Strong drive
Weak drive
(not often used)
55
การใช้ Standard Logic
56
Signed & Unsigned type
 ชนิดสั ญญาณ SIGNED และ UNSIGNED ต้ องกาหนดใช้ ใน
Package std_logic_arith.all ในไลบราลี่ IEEE
 UNSIGNED type จะแสดงค่ าตัวเลขหรือการกระทาทาง
ตัวเลขเป็ นค่ า บวก หรือ 0 เท่ านั้น และถ้ าเป็ นเลข binary
bitทางด้ านซ้ ายมือสุ ดจะเป็ น bit ทีม่ ีนัยสาคัญสู งสุ ด MSB
 “0110” = +6
 “1010” = +10
57
Signed & Unsigned type

SIGNED type จะแสดงค่ าตัวเลขหรือการกระทาทางตัวเลข
เป็ นค่ า บวก (0) หรือ ลบ (1) เท่ านั้น โดยที่การกระทา
ทางตัวเลขจะเป็ นแบบ 2’complement
 “0110” = +10
 “1010” = -6
58
Type Conversion

เนื่องจากทั้งด้ านซ้ าย และด้ านขวา ของตัวส่ งผ่ านค่ า (<=)
จะต้ องเป็ น Type ชนิดเดียวกัน ถ้ าต่ างชนิดกันจะทา
อย่ างไร? LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY adder IS
PORT (op1, op2 : IN UNSIGNED(3 downto 0);
result : OUT INTEGER);
END adder;
ARCHITECTURE maxpld OF adder IS
BEGIN
result <= CONV_INTEGER(op1 + op2);
END maxpld;
59
Type Conversion
60
User-defined Type
เราสามารถทีจ่ ะกาหนดค่ าต่ าง ๆ ทีเ่ ป็ นไปได้ สาหรับ Type ทีเ่ รากาหนดขึน้ มาเอง
 การใช้ งานจะต้ องเป็ นไปตามกฎ นั่นคือ ด้ านซ้ าย และด้ านขวาของตัวส่ งผ่ านค่ า
จะต้ องเป็ น Type ชนิดเดียวกัน

61
การใช้ งาน User-defined Type

User-defined type อาจจะใช้ ในการกาหนดชื่อของแต่ ละ State ทีอ่ ยู่ใน
State Machine ซึ่งเวลานาไปแปลด้ วยเครื่อง จะมีการเข้ าระหัส เป็ น
เลขฐานสอง เรียงตามลาดับทีก่ าหนดไว้ ดังรู ป
62
Array
63
Array



เป็ นกลุ่มของสั ญญาณ ซึ่งเราสามารถกาหนดช่ วง หรือขนาดของ Array โดยใช้ “to”
หรือ “down to”
ในการส่ งค่ า (assign) ขนาดของ Array จะต้ องเท่ ากัน และเป็ น Type ชนิดเดียวกัน
การส่ งผ่ านค่ า จะกระทาโดยอ้ างอิงถึงตาแหน่ งที่ตรงกัน มิใช่ อ้างอิงโดยเลขดัชนี
64
Slice of Array
 การแบ่ งอาร์ เรย์ เพือ่ นามาใช้ งานบางส่ วน เราสามารถกาหนดได้ ดังตัวอย่ าง
ผิดเพราะว่ า ทิศทางของอาร์ เรย์ (to หรือ down to )
จะต้ องสั มพันธ์ กบั ที่กาหนดไว้ ตอนเริ่มต้ น
65
Concatenation and Aggregate
 เราสามารถนาสั ญญาณย่ อย ๆ หรืออาร์ เรย์ ย่อย มาต่ อกัน หรือ
รวมกันได้ ซึ่งทาได้ สองวิธีคอื
 การใช้ เครื่องหมาย & (ampersand) ต่ อเชื่อมส่ วนย่ อย ๆ เข้ า
ด้ วยกัน เราเรียกว่ า concatenation
 การใช้ วงเล็บ ( ) และจุลภาค , เพือ่ รวมส่ วนย่ อย ๆ ต่ าง ๆ เข้ า
ด้ วยกันเราเรียกว่ า aggregate
66
ตัวอย่ างของ Concatenation
67
ตัวอย่ างของ Aggregate
68
ตัวอย่ างของ Aggregate
 ในบางกรณี เราอาจกาหนดได้ โดยอ้ างถึงดัชนี และกาหนดค่ า
ให้ กบั ตาแหน่ งทีเ่ หลือโดยใช้ คาว่ า others
69
Operators
70
VHDL Operators
 ตัวกระทา (operator) ใน VHDL ทาให้ เราสามารถกระทา
โอเปอร์ เรชั่น ต่ าง ๆ ระหว่ าง Signal ได้
 แบ่ งได้ เป็ น 3 ประเภทด้ วยกันคือ
- Logical Operators
- Relational Operators
- Arithmetic Operators
 Type ชนิดหนึ่ง อาจจะใช้ ตัวกระทาได้ เป็ นบางประเภท
71
Logical Operators


AND, OR, NAND, NOR, XOR ถือว่ าเป็ น Logical operators ที่มี
ความสาคัญเท่ ากัน
NOT ถือว่ ามีลาดับความสาคัญมากกว่ า นั่นคือจะกระทาก่ อน ยกเว้ นเราจะ
กาหนดให้ กระทาใน เครื่องหมายวงเล็บก่ อน
72
Logical Operators
 เราสามารถใช้ Logical Operator กระทากับตัวแปรประเภทอาร์ เรย์
ได้ ตราบใดทีต่ ัวกระทา และตัวถูกกระทาเป็ น Type ชนิดเดียวกัน
และมีขนาดเท่ ากัน
73
Relational Operators


ตัวกระทาประเภท Relational Operators นั้นจะใช้ ในการเปรียบเทียบค่ า ระหว่ าง
สองตัวแปรที่เป็ นชนิดเดียวกัน โดยที่จะให้ ผลลัพธ์ ออกมาเป็ นค่ า Boolean (TRUE,
FALSE)
ส่ วนใหญ่ จะใช้ ในคาสั่ งที่มีการตรวจสอบเงื่อนไขก่ อนเช่ น If Then
74
Arithmetic Operators
• จะใช้ ได้ กบั Pre-Defined Type ประเภท Integer, Real, Time, Signed
และ Unsigned เท่ านั้น
• สาหรับตัวคูณ และตัวหาร เช่ น A*B หรือ C/D
B และ D ต้ องเป็ นเลข 2^n เท่ านั้น
• A**X หมายถึง A ยกกาลัง X โดยที่ A มีค่าเป็ น 2^n เหมือนกัน
75
Arithmetic Operators

จากตัวอย่างการใช้ งาน จะเห็นว่ า เราสามารถกาหนดช่ วงของตัวตั้ง ตัว
กระทา และผลลัพธ์ ได้ โดยใช้ คาสั่ ง Range ซึ่งหลังจากนีถ้ ้ านาไปจาลองการ
ทางาน ตัว Simulator จะทาการตรวจสอบช่ วงของอินพุท และ เอาท์ พุท ว่ า
อยู่ในช่ วงหรือไม่ และจะแสดง error ออกมาเมือ่ ค่ าไม่ อยู่ในช่ วงที่กาหนด
76
Type and Operators
bit
bit_vector
boolean
Logical
Operators


Relational
Operators


Arithmetic
Operators
Integer
signed
unsigned




std_logic*
std_logic_vector*
std_ulogic*
std_ulogic_vector*
std_logic**
std_logic_vector**
std_ulogic**
std_ulogic_vector**





*ไม่ ใช้ std_logic_{signed,unsigned}
**ใช้ std_logic_{signed,unsigned}
77
Concurrent vs.
Sequential Statement
78
Concurrent and Sequential Statement
 Concurrent Statement จะทาการแปล หรือประมวลผลในเวลา
เดียวกัน หรือทุกบรรทัดพร้ อมกันเป็ นแบบขนาน เช่ นคาสั่ งWhen
Else, With Select
 Sequential Statement จะทาการแปล หรือประมวลผลเป็ นลาดับ
เรียงกันไปในแต่ ละบรรทัด เช่ นคาสั่ ง If Then, Case, For Loop
 เวลาจะใช้ งาน Sequential Statement จะต้ องใช้ ใน “Process”
เท่ านั้น
 ระวัง! Sequential Statement เมื่อนาไปสร้ างวงจร ไม่ จาเป็ นต้ อง
เป็ น Sequential Circuit
79
ตาแหน่ งของ Concurrent และ Sequential Statement
80
ตัวอย่ างของ Concurrent Statement
 จากตัวอย่ าง จะเห็นว่ าเราสามารถสลับบรรทัดได้ เนื่องจากเป็ นการ
ประมวลผลแบบขนาน
 วงจรทีไ่ ด้ จาก Concurrent Statement แสดงถึงลักษณะทางด้ านฮาร์ ดแวร์
ทีแ่ ต่ ละโหนด จะต้ องต่ อกันเป็ นลักษณะของ Concurrent โดยทีเ่ รา
สามารถวาดรู ปจากบรรทัดไหนก่ อนก็ได้
81
Concurrent Statement
 เป็ นคาสั่ งแบบแข่ งขนาน
สามารถทีจ่ ะเขียนลงในตาแหน่ งใดๆ
ภายใน Architecture ได้ จึงเป็ นข้ อดีที่จะค่ อยๆ แปลง การ
ออกแบบจาก behavioral model ไปสู่ structural model ได้
 Concurrent statement สามารถมองให้ เป็ นส่ วนย่ อยแบบ
(subdesign) ที่เป็ นอิสระในการทางาน และจากการที่
concurrent statement เป็ นอิสระต่ อกัน ฉะนั้นภายใน
Architecture เดียวกัน สามารถทีจ่ ะมี concurrent statement
ได้ หลายๆ Statement
82
Concurrent Statements in VHDL
 When - Else
statement
 With - Select statement
 Signal assignment statement
 Component instantiation statement
 Process statement
 Procedure statement
83
When - Else Statement
 คาสั่ ง When - Else มีลกั ษณะคล้ ายกับคาสั่ ง If - Then - Else แต่ มี
ความยืดหยุ่นน้ อยกว่ า
84
With - Select Statement
 คาสั่ ง With - Select จะมีความหมายคล้ ายกับ Case แต่ มีความ
ยืดหยุ่นในการใช้ งานได้ น้อยกว่ า
85
Signal Assignment Statement
Target <= [delay_options] straight_transforms or
conditional_ transforms or
selected_ transforms ;
Architecture arch1 of and2 is
begin
output <= in1 AND in2;
END arch1;
Architecture arch2 of and2 is
begin
process (in1,in2)
begin
output <= in1 ANDin2;
end process;
end arch2;
86
Process Statement: Case construct
Architecture simple_seq OF mux IS
begin
process (input,sel)
begin
CASE sel IS
WHEN “00” => output <= input (0)
WHEN “01” => output <= input (0)
WHEN “10” => output <= input (0)
WHEN “11” => output <= input (0)
end CASE;
end process;
end simple_seq;
AFTER 5 ns;
AFTER 5 ns;
AFTER 5 ns;
AFTER 5 ns;
87
Sequential Statement
VHDL นั้นเป็ นภาษาทีม่ ีคุณสมบัตแิ บบแข่ งขนาน นั่นคือ
ชุดคาสั่ งภายในตัวโครงสร้ าง จะเป็ นชุดคาสั่ งแบบแข่ งขนาน
 โครงสร้ างที่ประกอบด้ วย Sequential Statement เช่ น ifthen-else, case, for-loop, wait จะไปอยู่ส่วนไหนอย่ างไร
ภายใน architecture ของ model?
 คาตอบก็คอ
ื … อยู่ในชุดคาสั่ ง Process (ใน architecture
หนึ่ง สามารถมีได้ หลายๆ Process ที่ทางานขนานกัน)

88
Process
89
Process
 สาหรับบางคาสั่ งทีเ่ ป็ น Sequential Statement ต้ องกาหนดให้ อยู่ใน
Process ซึ่งจะทาการแปลความหมายลงมาทีละบรรทัดดังรูป
 ใน Architecture หนึ่ง ๆ อาจจะมีหลาย ๆ Process ซึ่งทางานพร้ อม ๆ
กันเป็ นลักษณะของ Concurrent
 แต่ ละ Process จะทางานเมื่อ Signal ที่กาหนดไว้ ใน Sensitivity List
มีการเปลีย่ นแปลง
90
ตัวอย่ างการใช้ งาน Process
 จากตัวอย่ าง label จะมีหรือ
ไม่ มีกไ็ ด้ ตามด้ วย Process
และชื่อ Sensitivity List
อยู่ในวงเล็บ
 Sequential Statement
จะอยู่ระหว่ าง Begin และ End Process
 จากตัวอย่ างนี้ เมื่อนาไปสั งเคราะห์ เป็ นวงจรจะได้ เป็ นวงจร
Combinational Logic ธรรมดา
91
การประมวลผลใน Process
 การประมวลผลใน Process จะเรียงลาดับกันเป็ นบรรทัดลงมา
(Sequential) ซึ่งต่ างกับ บริเวณทีอ่ ยู่ข้างนอก Process ซึ่งจะทา
พร้ อม ๆ กัน (Concurrent) ดังนั้นถ้ าเรากาหนดไว้ ทบี่ ริเวณต่ างกัน
ก็จะได้ ลอจิกทีต่ ่ างกันด้ วย ดังตัวอย่ างต่ อไปนี้
ตัวอย่างที่ 1
ตัวอย่างที่ 2
92
การประมวลผลใน Process


จากตัวอย่ างที่ 1 เนื่องจาก Z ถูกกาหนดค่ าพร้ อม ๆ กันเนื่องจากเป็ น Concurrent
ดังนั้นค่ าของ Z จะต้ องเลือกเอาค่ าใด ค่ าหนึ่งของเอาท์ พทุ ลอจิก ทั้งสองตัวที่เข้ ามา
สาหรับตัวอย่ างที่ 2 ค่ าของ Z จะมีการเปลีย่ นแปลงค่ า หรือถูก Update ด้ วยค่ าสุ ดท้ าย
ที่เกิดขึน้ ที่บรรทัดสุ ดท้ าย บรรทัดแรกจะถูกมองข้ ามไปเนื่องจากจะถูกแปลทับด้ วย
บรรทัดที่สอง เพราะว่ าเป็ นลักษณะการแปลความหมายเรียงกันลงมาทีละบรรทัด
ตัวอย่างที่ 2
ตัวอย่างที่ 1
93
Sensitivity List

Process จะทางานเมือ่ สั ญญาณใน Sensitivity List มีการเปลีย่ นแปลง ดังนั้นเรา
ควรจะกาหนดสั ญญาณทีเ่ ป็ นอินพุท ทีจ่ ะมีผลต่ อการทางานใน Process ทั้งหมด
อยู่ใน List
94
โครงสร้ าง และ กฎเกณฑ์ การเขียน Process
ตั้งชื่อ process (จะมีหรือไม่ มีกไ็ ด้ )
Label : Process (sensivity list)
process declarative part
Begin
process statement part
--Sequential statement-end process label;


ถ้ าตั้งชื่อ process จะต้ องมีชื่อหลัง
end process ด้ วย
เมือ่ มีสัญญาณตัวใดตัวหนึ่งใน Sensitivity List นีเ้ กิดารเปลีย่ นแปลงระดับค่ าสั ญญาณ
(event) ขึน้ จะเริ่มทางานคาสั่ งแรกของชุ ดคาสั่ ง Begin เรียงลาดับลงสู่ คาสั่ งสุ ดท้ ายคือ
END Process
เมือ่ คาสั่ ง END Process ถูกปฏิบตั ิแล้ วชุ ดคาสั่ ง Process จะหยุดทางานลงชั่วขณะ
(แต่ ยงั คง active อยู่ตลอดเวลา) จนกว่ าจะมีสัญญาณ อย่ างน้ อย ตัวใดตัวหนึ่งใน
Sensitivity List เกิด event ขึน้ อีก
95
ตัวอย่ างการใช้ งาน Process
Architecture behavioral of mux
MUT : Process (select)
--process declarative part
Begin
if (select =‘1’) then
data_out <= a;
else
data_out <= b;
end if
end process MUT;
end architecture behavioral;
96
Variable in Process
 สาหรับ Process ใน VHDL เราสามารถกาหนดตัวแปรเป็ น Variable
ได้ ซึ่งจะมีลกั ษณะเหมือนกับภาษาชั้นสู งโดยทัว่ ไป นั่นคือ จะมีการ
update ค่ าทันที ซึ่งต่ างกับ Signal ทีจ่ ะมีการ update ค่ าในตอนสิ้นสุ ด
Process เท่ านั้น
 ในการกาหนดค่ าให้ Variable จะใช้ เครื่องหมาย :=
 Variable จะรู้ จักเฉพาะใน Process ทีก่ าหนดขึน
้ มาเท่ านั้น ซึ่งต่ างกับ
Signal ทีจ่ ะรู้ จักตลอดทั้งใน Architecture
 Variable เป็ นเพียงตัวแปร ไม่ มีความเกีย่ วข้ องทาง Hardware แต่
อย่ างไร ส่ วน Signal นั้นเป็ นตัวทีท่ าหน้ าทีเ่ ป็ นพาหะ รับ-ส่ ง ค่ าของ
สั ญญาณจึงเป็ นส่ วนของ Hardware
97
ตัวอย่ างการใช้ งาน Variable & Signal
signal A, B, C, Y, Z : integer;
signal M, N
: integer;
begin
process (A, B, C, M, n)
begin
M := A;
N := B;
Z <= M + N;
M := C;
Take Effect Immediately...
Take Effect When Suspend...
Y <= M + N;
end process;
Z=
Y=
A+B
C+B
98
Quiz
 ลองดูตวั อย่ าง VHDL ไฟล์ นี้ แล้ วหาค่ าของ Y และ Z ตอนสิ้นสุ ด
Process
99
Sequential Statements in
Process
100
ชุดคาสั่ งทีใ่ ช้ ใน Process
เป็ นชุดคาสั่ งทีส่ าคัญทีส่ ุ ดสาหรับการเขียนรู ปแบบใน
ลักษณะของการบรรยายพฤติกรรมของระบบดิจติ อล
 ชุ ดคาสั่ งเหล่ านีจ
้ ะทางานเป็ นลาดับจากบนลงล่ างเมือ่
Process ถูกกระตุ้นให้ ทางาน
 จะเป็ นตัวกาหนดเขตในส่ วนของ Sequential statement
 การทางานภายใน Process จะไม่ ขน
ึ้ กับเวลา นั่นหมายความ
ว่ า ชุดคาสั่ ง Process จะทางานตลอดเวลา

101
If-Then-Else Statement
 กฎเกณฑ์ (Syntax) ในการเขียนภาษา VHDL มีดงั นี้
IF condition THEN
{sequential-statement(s)}
[{ ELSIF condition THEN}
{sequential-statement(s)}]
[ ELSE
END IF;
102
คาสั่ ง ELSIF มีกฎเกณฑ์ การใช้ ดังนี้
ELSE สามารถใช้ เป็ นคาสั่ งสุ ดท้ ายเท่ านั้น และใช้ แทน ELSIF เมื่อ
ต้ องการรวมความเป็ นไปได้ ท้งั หมดทีย่ งั เหลืออยู่เข้ าไว้ ในการสอบถาม
เดียวกัน
 ELSE ทีอ
่ ยู่สุดท้ ายนี้ จะสั มพันธ์ กบั ELSIF ทีอ่ ยู่ติดกันก่อนที่จะ
ตาแหน่ งที่ ELSE อยู่
 ข้ อแม้ ใน ELSIF จะต้ องไม่ สอบถามในคาถามที่ได้ ตรวจสอบมาก่ อน
แล้ว
 เพียงคาสั่ งแบบลาดับทีอ
่ ยู่ต่อจากการสอบถาม ELSIF ทีใ่ ห้ ผลลัพธ์
TURE เท่ านั้น ที่จะทางานส่ วนที่เหลือจากการสอบถามอืน่ ๆ จะถูก
103
ข้ ามไปหมดโดยไม่ สอบถามข้ อแม้ ต่อมาอีก

ELSIF Example
IF b=‘0’ THEN
b:=b+1;
ELSIF a=‘0’ THEN
c:=c+1;
END IF;
IF
FLASE
a= 0?
FLASE
b=0?
TRUE
TRUE
b:=b+1;
c:= c+1;
END IF
104
When Using IF Instead
IF b=‘0’ THEN
b:=b+1;
IF a=‘0’ THEN
c:=c+1;
END IF;
END IF;
IF
b=0?
FLASE
TRUE
b:=b+1;
FLASE
a= 0?
TRUE
c:= c+1;
END IF
END IF
105
Case Statement
 กฎเกณฑ์ (Syntax) ในการเขียนภาษา VHDL มีดงั นี้
CASE expression IS
WHEN choice => sequential-statement(s)
[ WHEN choice => sequential-statement(s)]
END CASE;
 คาสั่ ง WHEN ใช้ สาหรั บกาหนดตัวเลือกที่จะนามาเปรี ยบเทียบ
กับ expression ตัวเลือกใดเป็ นไปตาม expression ข้ างบน
PROCESS จะเริ่มต้ นทางานทีช่ ุดคาสั่ งลาดับทีต่ ามมาจนกระ
ทั้งคาสั่ งสุ ดท้ ายของตัวเลือกนั้นๆ และออกจาก CASE
statement โดยไม่ ทาหนทางอืน่ ๆทีย่ งั เหลืออยู่
106
Loop Statement
 คือการทางานในลักษณะทีเ่ ป็ นวงรอบ (loop) มีกฏเกณฑ์ ใน
การเขียนดังนี้
Label: interation_scheme loop
sequential-statement(s)
END loop label;
 เราสามารถสร้ าง loop ได้ 3 ลักษณะด้ วยกันคือ LOOP
ธรรมดา , FOR-LOOP และ WHILE-LOOP
107
For-Loop Statement
 กลุ่มคาสั่ ง for-loop จะทางานเป็ นวงรอบตราบเท่ าที่
ค่ าพารามิเตอร์ ยงั อยู่ในขอบข่ าย(range)ที่กาหนด
Label: FOR loop_parameter IN discrete_range loop
sequential-statement(s)
END loop label;
 ตัว loop_parameter เป็ นพารามิเตอร์ ทแ
ี่ ผงอยู่ในโครงสร้ างที่
ไม่ ต้องประกาศหรือกาหนดขึน้ ค่ าพารามิเตอร์ นีห้ ้ ามถูกแก้ ไข
ดัดแปลงด้ วยคาสั่ งใดๆ ทั้งจากภายในและจากภายนอก for
loop
108
ตัวอย่ าง For-Loop
b1: FOR index IN 0 to 7 loop
dout(index) <= din(index);
END loop b1;
 จากตัวอย่ างเป็ นการย้ ายข้ อมูลในรู ปของ array ชื่อ din ไปยัง
array ที่ชื่อ dout ตาแหน่ งต่ อตาแหน่ ง โดยอาศัย
loop_parameter ชื่อ index
 สิ่ งที่พงึ จาในการสร้ างคือ discrete range จะต้ องเป็ นค่ าที่ลงตัว
ตัวเลขจานวนเต็มสามารถใช้ ได้ หรือตัวอักษร เช่ น a to f
109
ตัวอย่ าง For-Loop
architecture for_loop_if of ex is
begin
process (A,B,C)
begin
for I in 0 to 4 loop
if A(I) = ‘1’ then
Q(I) <= B(I)
else
Q(I) <=C(I);
end if
end loop;
end process;
end;
110
While Loop Statement
Label: while boolean_expression loop
sequential-statement(s)
END loop label;
 กลุ่มคาสั่ งลาดับใน WHILE-LOOP จะทางานเป็ นวงรอบไป
เรือยๆ ตราบเท่ าที่ข้อแม้ ของ boolean_expression ใน whileloop ยังคงมีค่าเป็ น true จานวนครั้ง(รอบ) ที่ทาจะถูก
ควบคุมจากในตัวของ loop เอง นั้นคืออการที่จะออกจาก
วงรอบได้ กต็ ่ อเมื่อผลลัพธ์ ของ boolean_expression ได้ ค่า
เป็ น false ข้ อแม้ ที่ใช้ ควบคุมการทางานนีจ้ ะถูกตรวจสอบทุก
111
ครั้งก่อนการทางานต่ อไปในวงรอบ
ตัวอย่ าง While Loop
P1: process (A)
variable index : integer:=0;
begin
Loop1 : while index < 8 loop
dout(index <= din(index);
index := index+1;
end loop Loop1;
end process P1;
112
Wait Statement
จากการทีช่ ุ ดคาสั่ ง Process จะถูกกระตุ้นได้ จากการทีส่ ั ญญาณใดสั ญญาณหนึ่ง
ใน sensitivity list เกิด event ขึน้ เท่ านั้น หลังจากกระตุ้นแล้ วคาสั่ งภายในจะ
ทางานเป็ นลาดับลงมาจนกระทั่งหมด และชุ ดคาสั่ ง Process จะหยุดทางาน
ชั่วคราวจนกว่ าสั ญญาณใน list สั ญญาณใดสั ญญาณหนึ่งเกิด event ขึน้ อีก
 ถ้ าในกรณีทภ
ี่ ายในรายชื่อภายใน list ประกอบด้ วยสั ญญาณหลายๆ ตัว และ เกิด
event ขึน้ ในเวลาเดียวกัน จะมีสัญญาณตัวเดียวจากทั้งหมดเท่ านั้น ทีก่ ระตุ้น
การทางานของชุ ดคาสั่ ง process ซึ่งไม่ สามารถทีจ่ ะบอกได้ ว่าเป็ นสั ญญาณใด
ดังนั้นการใช้ คาสั่ ง process ร่ วมกับ sensitivity list จึงมีขีดจากัด
 ใน VHDL จึงหลีกเลีย่ งปัญหานีโ้ ดยใช้ คาสั่ งทีม
่ ีความอ่ อนตัวมากกว่ า ได้ แก่
ชุ ดคาสั่ ง wait statement

113
Wait Statement
 สามารถกาหนดลงตรงตาแหน่ งใดๆ ภายในชุ ดคาสั่ ง ลาดับได้
เพือ่ ระงับการทางานภายในชุดคาสั่ ง process ตรงตาแหน่ งที่
wait statement อยู่
 สามารถที่จะกาหนด wait statement ได้ หลายๆอันในแต่ ละ
ตาแหน่ งตามความต้ องการโดยไม่ จากัด
 wait statement ไม่ สามารถใช้ ร่วมกับ sensitivity list
ภายใน process เดียวกันได้
114
กฎเกณฑ์ การเขียน Wait Statement
ตั้งชื่อ wait (จะมีหรือไม่ มีกไ็ ด้ )
Label : wait
[on { , signal_list}]
[ until condition is boolean_expression ]
[for time_expression]
การใช้ on ร่ วมกับ until การทางานจะถูกหยุดจนกระทัง่ สั ญญาณใน
ส่ วนของ on มี event และ ข้ อแม้ ในส่ วนของ until เป็ นจริง
 การใช้ on ร่ วมกับ for การทางานจะถูกหยุดจนกระทัง่ สั ญญาณใน
ส่ วนของ on มี event หรือ เมื่อเวลาในส่ วน for ผ่ านไป

115
กฎเกณฑ์ การเขียน Wait Statement
 การใช้
until ร่ วมกับ for การทางานจะถูกหยุดจนกระทัง่
ข้ อแม้ ในส่ วนของ until เป็ นจริง หรือ เมื่อเวลา for ผ่ านไป
 ถ้ าชุ ดคาสั่ ง process ใดไม่ มี sensitivity list และ wait
statement ภายในโครงสร้ าง process นั้นจะเกิดการทางาน
เป็ นวัฎจักรทีไ่ ม่ มีจุดจบ
116
การใช้ งาน Wait Statement
1. wait ON signal_list;
- - signal sensitivity
Ex. wait ON clock,clear,preset,d;

คาสั่ งนีจ้ ะหยุดการทางานของชุ ดคาสั่ งลาดับจนกว่ าจะเกิด event
ขึน้ ที่ signal_list
2. wait UNTIL condition - - condition
Ex. wait UNTIL (clock=‘1’);

การทางานของชุ ดคาสั่ งลาดับจะหยุดทางานทีต่ าแหน่ ง condition และ
ทางานต่ อไปเมื่อ condition เกิด event และค่ า boolean expression ของ
condition เป็ นจริง ลาดับการทางานจะหยุดตรงนี้
117
การใช้ งาน Wait Statement
3. wait FOR time; --timeout
Ex. wait FOR 10 ns
 คาสั่ งนีเ้ ป็ นการรอหรือหยุดในขณะทีจ่ าลองการทางานจนกว่ า
เวลาการจาลองจะผ่ านไปแล้ว time จะมีผลทาให้ processเริ่ม
ทางานต่ อไปได้
4. wait; -- forever
Ex. wait;
 เป็ นคาสั่ งให้ process หยุดทางานตลอดไป
โดยไม่ มกี าร
เริ่มทางานใหม่
118
Wait Statement Example
Library IEEE;
use IEEE.std_logic_1164.all;
entity D_FLOP is
port (D,CLK :in std_logic;
Q : out std_logic);
end D_FLOP;
architecture A of D_FLOP is
begin
process
begin
wait until CLK’ event and CLK =‘1’;
Q<= D;;
end process;
end A;
119
State Machine in VHDL
120
State Machine
 คือ วงจร sequential มีสญ
ั ญาณ Clock มาควบคุมการทางานซึ่ ง
ออกแบบโดยแบ่งสถานะการทางาน (สเตท) ของ วงจร ออกเป็ น
หลาย ๆ สถานะ
 แต่ละสเตทมีลอจิกการทางานที่ต่างกัน เพื่อกาเนิ ดค่าเอาต์พต
ุ และ
ค่าสเตทถัดไป
 มีสญ
ั ญาณสเตท ที่กาหนดว่า สเตทปัจจุบนั เป็ นสเตทไหน
input
clk
State
Machine
output
state
121
State Machine


สัญญาณเสตทจะถูกเก็บในรี จีสเตอร์ ดังนั้น สเตทจะสามารถ
เปลี่ยนแปลงได้ที่ขอบของ clock เท่านั้น เช่น
clk
state
State Machine มี 2 ประเภท
1 0
2
1
...
...
Moore Machine มีเอาต์พตุ เปลี่ยนแปลงตามจังหวะของ clock เท่านั้น (แต่
ละ สเตทมีค่าเอาต์พตุ ที่กาหนดแน่นอน, เอาต์พตุ จะเปลี่ยนก็ต่อเมื่อเสตท
เปลี่ยน)
 Mealy Machine เอาต์พต
ุ ไม่จาเป็ นต้องเปลี่ยนแปลงตามจังหวะของ clock
(ภายใน สเตทหนึ่ง ๆ เอาต์พตุ สามารถเปลี่ยนแปลงได้ ถ้าอินพุตเปลี่ยน)

122
Moore Machine
C1
x(t)
present
input
s(t+1)
next
state
State Register
init
z(t)
s(t)
present
state
C2
clk
123
Mealy Machine
C1
x(t)
present
input
s(t+1)
next
state
State Register
init
s(t)
present
state C2
z(t)
clk
124
State Machine in VHDL
 สาหรับ State Machine ใน VHDLทาได้โดยใช้คาสัง่ Type กับ
Signal ประกอบกันเพื่อกาหนดชื่อของแต่ละ สเตท และตัวแปรที่
จะใช้แทนสเตท
 มักนิยมทา Moore และ Mealy Machine ด้วยคาสัง่ Case
S0
S1
i/p = 0
i/p = 1
125
ความหมายของ State Diagram
 ตัวอย่างการตีความที่สเตท S0
 ที่ S0
วงจรจะให้ out = 0
 ที่ขอบขาขึ้นของ clk ถ้า in = 1 จะเปลี่ยนสเตทไปเป็ น S1
มิฉะนั้น จะอยูส่ เตท S0 เหมือนเดิม
0
0
S0
“0”
1
S1
“0”
1
S2
“1”
1
0
126
ตัวอย่ างการใช้ งาน FSM
Detect input sequence 1101
din
clk
fsm
dout
clr
din
dout
1 0 1 1 0 1 1 0 1 0 0 1 1 0 1 0
0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0
127
State Diagram to Detect “1101” Sequence
0
S1
0
1
S0
0
0
S11
0
0
CLR
1
1
0
1
0
S1101
1
1
S110
0
128
FSM.vhd (1)
entity fsm is
port (clk: in STD_LOGIC;
clr: in STD_LOGIC;
din: in STD_LOGIC;
dout: out STD_LOGIC);
end;
architecture fsm_arch of fsm is
type state_type is (S0, S1, S11, S110, S1101);
signal present_state, next_state: state_type;
begin
129
FSM.vhd (2)
synch: process(clk, clr)
begin
if clr = '1' then
present_state <= S0;
elsif clk'event and clk = '1' then
present_state <= next_state;
end if;
end process;
130
FSM.vhd (3)
comb1: process(present_state, din)
begin
case present_state is
when S0 =>
if din = '1' then
next_state <= S1;
else
0
1
S0
next_state <= S0;
0
end if;
when S1 =>
CLR
0
if din = '1' then
S1101
next_state <= S11;
1
else
next_state <= S0;
end if;
S1
0
1
S11
0
0
0
1
S110
0
1
0
1
131
FSM.vhd (4)
when S11 =>
if din = '0'
next_state
else
next_state
end if;
when S110 =>
if din = '1'
next_state
else
next_state
end if;
when S1101 =>
if din = '0'
next_state
else
next_state
end if;
when others =>
null;
end case;
end process;
then
<= S110;
<= S11;
then
<= S1101;
S0
0
<= S0;
CLR
then
<= S0;
<= S11;
S1
0
0
1
1
S11
0
0
0
0
S1101
1
1
S110
0
1
0
1
132
FSM.vhd (5)
comb2: process(present_state)
begin
if present_state = S1101 then
dout <= '1';
else
dout <= '0';
end if;
end process;
end fsm_arch;
133
Attribute and Test bench
134
Attributes


Attribute จะใช้ งานในการส่ งกลับ หรือกาหนด ค่ าของข้ อมูลของตัว
Object ต่ าง ๆ เช่ น Scalar/Array, หรือ Signal ทีเ่ ราสนใจ
ตัวอย่ างเช่ น
135
Predefined Attributes for Scalar
T'LEFT
: Left bound of T
T'RIGHT
: Right bound of T
T'HIGH
: Upper bound of T
T'LOW
: Lower bound of T
T'ASCENDING : True if range is ascending
136
Predefined Attributes for Array
A'LEFT[(N)]
A'RIGHT[(N)]
A'HIGH[(N)]
A'LOW[(N)]
A'RANGE[(N)]
A'LENGTH[(N)]
:Left bound of index N of array A
:Right bound of index N of array A
:Upper bound of index N of array A
:Lower bound of index N of array A
:Range A'LEFT(N) to A'RIGHT(N)
:Number of values in index N of
array A
137
Predefined Attributes for Signal
S'TRANSACTION
: Toggles each cycle if S becomes active
S'EVENT
: TRUE when event occurs on S
S'ACTIVE
: TRUE if S is active
S'LAST_EVENT
: Elapsed time since the last event on S
S'LAST_ACTIVE: Elapsed time since S was active
S'LAST_VALUE
: Previous value of S, before last event
S'DRIVING
: TRUE if every element of S is driven
138
Test Bench


นอกจาก VHDL สามารถทาหน้ าทีใ่ นการอธิบายวงจรทั้งในลักษณะของ
Behavioural Structural แล้ ว ยังสามารถทาหน้ าทีเ่ ป็ นตัวทดสอบการ
ทางาน (simulation) วงจรทีอ่ อกแบบ ซึ่งเราจะเรียกว่ า Test Bench File
Test Bench File จะประกอบด้ วย
 Architecture body ทีป
่ ระกอบด้ วย design under test
 ลาดับของค่ าต่ าง ๆ test values ทีจ
่ ะเข้ าไปยังอินพุท
 การแสดงผลค่ าเอาท์ พท
ุ ต่ าง ๆ (Monitors values on output signals)
– either using simulator
– or with a process that verifies correct operation
139
Test Bench Example
entity test_bench is
end entity test_bench;
architecture test_reg4 of test_bench is
signal d0, d1, d2, d3, en, clk, q0, q1, q2, q3 : bit;
begin
dut : entity work.reg4(behav)
port map ( d0, d1, d2, d3, en, clk, q0, q1, q2, q3 );
stimulus : process is
begin
d0 <= ’1’; d1 <= ’1’; d2 <= ’1’; d3 <= ’1’; wait for 20 ns;
en <= ’0’; clk <= ’0’; wait for 20 ns;
en <= ’1’; wait for 20 ns;
clk <= ’1’; wait for 20 ns;
d0 <= ’0’; d1 <= ’0’; d2 <= ’0’; d3 <= ’0’; wait for 20 ns;
en <= ’0’; wait for 20 ns;
…
wait;
end process stimulus;
end architecture test_reg4;
140
Design Examples in VHDL Code
141
Multiplexer
142
Shift Register (p1)
143
Shift Register (p2)
144
Counter (p1)
145
Counter (p2)
146
RAM (p1)
147
RAM (p2)
148
RAM (p3)
149
ROM (p1)
150
ROM (p2)
151
THANK
YOU
152