vhdl
DESCRIPTION
ภาษาที่ใช้เขียนโปรแกรมสำหรับการเขียนวงจรดิจิตอล หรือ IC ที่นิยมใช้กันTRANSCRIPT
1
VHDL: Hardware Description Language
Workshop on FPGA: an easy solution for digital system designs5 March 2005
2
Outline
• What is VHDL• VHDL file structure• Data type• Array• Operators• Concurrent vs. sequential statement• Process and sequential statements in
process• State machines• Design examples
4
อะไรคือ VHDL
VHDL ยอมาจากVHSIC : Very High Speed ICHDL : Hardware Description Language
เริ่มตนจากกระทรวงกลาโหมสหรัฐอเมริกา (US:DOD) ประมาณป ค.ศ. 1981 ทําการพัฒนาโครงการที่มีชื่อวา VHSIC ทําการพัฒนาโปรแกรมซึ่งจะจัดเปนภาษาระดับสูงเชนเดียวกับภาษา C หรือ PASCAL แตสามารถบรรยายพฤติกรรมของ วงจรดิจิตอล หรือโครงสรางของวงจรได ทั้งนี้เพื่อใหสามารถออกแบบ และสรางวงจรดิจิตอลไดเร็วขึ้น
5
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
6
VHDL ทาํอะไรไดบาง
เปนภาษาที่นําไปเขียนรูปแบบระบบดิจิตอล และมีคุณสมบัติที่คน และเครื่อง สามารถเขาใจได โดยไมตองแปลอีกเปนภาษาที่สามารถเขียนขึน้เพื่อจําลองการทํางานไดสามารถนําไปเปนเอกสารประกอบโครงการไดในรายละเอียดตอจากนี้จะเนนถึงการใชภาษา VHDL ในการสงัเคราะหวงจร โดยเขียนเปนรูปแบบภาษาที่สามารถอธิบายพฤติกรรม หรือโครงสรางของระบบดิจิตอล
9
สวนประกอบที่สําคัญของไฟล VHDL
Library...Use...-------------------Entity--------------------------------------Architecture-----------Begin------------------------------------End
1
2
3
10
สวนประกอบทีส่ําคัญของไฟล VHDL
1. สวนที่แสดงถึง Library และ Package ที่จะเรียกใช
2. Entity สําหรับกําหนดพอรตของวงจร ซึ่งเปนไดทั้ง input, output หรือ inout
3. Architecture สําหรับอธิบายการทํางานในลักษณะของทั้ง Behavioral Level หรือ Structural Level
11
Package
ขอมูลตางๆ ตลอดจนโปรแกรมยอย (Subprogram) ที่เปนประโยชนตอการเขียนรูปแบบบรรยายระบบดิจิตอลสามารถเก็บไวในสวนที่เรียกวา Package ได และขอมูลเหลานี้ สามารถถกูเรียกไปใชไดโดย Entity design unit, Architecture design unit หรือจาก Package design unit อื่น ดวยคําสั่ง USE statement
12
Library
Library ทําหนาทีเ่ก็บ Package ตาง ๆ ไว ซึ่งใน Package จะเปนทรัพยากรตาง ๆ ทีใ่ชงานรวมกัน ดังนั้นกอนใชงานจะตองกําหนดไวในตอนตนของ VHDL ไฟลไวดวย
13
Library
ชุดคําสั่ง Library ดังในตัวอยาง เปนชุดคําสั่งทาํให Library ที่มีชื่อสัญลักษณวา IEEE สามารถนาํมาใชในสวนที่เปน entity ชื่อ test ได นั่นคือ library ชื่อ IEEE จะมองเห็นไดสําหรับ entity ชื่อ test รวมทั้งสวนทีเ่ปนหนวยรองดวย
Library IEEE;_ _ _entity test isend test ;
14
ชุดคําสั่ง USE
ใน library(กาํหนดชื่อสัญลักษณ) อาจจะประกอบดวย package หลายๆ ชุด ดังนัน้จะตองกาํหนด package เฉพาะที่ตองการใชงาน ดวยคําสั่ง USE ซึ่งมีรูปแบบดังนี้
USE library_name.package_name.element_of_package;
Library IEEE;USE IEEE.std_logic_1164.and;entity test is_ _ _
15
Standard Packages
attributes.vhd (synopsys)
std_logic_textio.vhd (ieee)
std_logic_unsigned.vhd (ieee)
std_logic_signed.vhd (ieee)numeric_bit.vhd (ieee)
std_logic_misc.vhd (ieee)textio.vhd (std)numeric_std.vhd (ieee)
std_logic_arith.vhd (ieee)standard.vhd (std)std_logic_1164.vhd (ieee)
SYNOPSYS proprietaryVHDL'87/VHDL'93IEEE
16
การเขยีน Comments
------------------------------------------------------------ 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_ _ _
17
Entity
Entity ใน VHDL จะบอกถึงพอรตที่จะใชเชื่อมตอกับสวนอื่น ๆ ของวงจรภายในวงเล็บ โดยจะยังไมมีการพูดถึงพฤติกรรมของวงจร เปนสวนที่ใชสําหรับติดตอระหวางโลกภายนอกกับรูปแบบ (model) ที่จะเขยีนขึ้นเปนสวนที่ใชกําหนดจุดตอ (connection point)ของรปูแบบ กําหนดทิศทางการไหลของสัญญาณ (mode) และประเภทของคา(type of value) ทีส่ามารถกําหนดใหกับสัญญาณตามจุดตางๆ (port) ของขอมูลที่ไหลผานจุดตอเหลานั้น
18
Entity Design Unit
Syntax:entity entity_name isport (port_name :<mode> port_type);end entity_name;
ชื่อของรูปแบบที่ตองการจะเขียนชื่อของรูปแบบที่ตองการจะเขียนกําหนดทางเขาออกของขอมูล
กําหนดทางเขาออกของขอมูล
ประเภทคาของสัญญาณ หรือ ขอมูลก็คือกลุมของคาประเภทคาของสัญญาณ หรือ ขอมูลก็คือกลุมของคา
กําหนดทิศทางที่ติดตอกับภายนอก I/Oกําหนดทิศทางที่ติดตอกับภายนอก I/O
จะตองปดทายดวย end ตามดวย “entity_name” และ ;
จะตองปดทายดวย end ตามดวย “entity_name” และ ;
19
ตัวอยางการเขยีน Entity
สังเกตวาจะไมม ีSemi-Colon ที่บรรทดัสุดทาย กอนที่จะปดดวยวงเล็บปดสังเกตวาจะไมม ีSemi-Colon ที่บรรทดัสุดทาย กอนที่จะปดดวยวงเล็บปด
20
การเขยีนโดยมีขอมูลทางฟสิกส
Syntax:entity entity_name is
generic (generic_list);port (port_name :<mode> port_type);
end entity_name;
Generic (tplh : Time:=3ns,tphl : Time:=5ns);
Generic (tplh : Time:=3ns,tphl : Time:=5ns);
21
Architecture Design Unit
เปนสวนที่เขยีนบรรยายพฤติกรรม ของรปูแบบ ( model) ในมุมมองของการจําลองการทาํงาน (simulation)พฤติกรรมตางทีบ่รรยายในสวนนี้จะขึ้นอยูกับขอมูลที่ผานเขาออกตรงชองทาง ตลอดจนพารามิเตอรตางๆ (port and generics) ทีก่ําหนดใน entity design unitSyntax : เริ่มตนดวยคํา Architecture ตามดวยชื่อ และจบดวย End ตามดวยชื่อ ดังหนาถัดไปนี้
22
Architecture Syntax
Syntax:architecture architecture _name of
entity_name isdeclarations
beginconcurrent_statements
end architecture _name ;
ชื่อชื่อ architecture นั้นบรรยาย entity ใดarchitecture นั้นบรรยาย entity ใด
อยูระหวาง arc และ begin สวนนี้ใชในการเขียนประกาศกําหนดคาตางๆ ที่จะนําไปใชใน arc นั้นอาทิเชน ประเภทของ type, signal,constant, function, procedure, component ที่จะใช
อยูระหวาง arc และ begin สวนนี้ใชในการเขียนประกาศกําหนดคาตางๆ ที่จะนําไปใชใน arc นั้นอาทิเชน ประเภทของ type, signal,constant, function, procedure, component ที่จะใช
23
Architecture
การบรรยายความสัมพันธของขอมูลที่ไหลเขาออก model นั้นจะถูกบรรยายระหวาง begin กับ end ชุดคําสั่งทุกคําสั่งที่อยูในบริเวณนี้จะเปนชุดคําสั่งแบบแขงขนาน (concurrent statement) เทานั้น arc จะตองปดทายดวย end และชื่อของ arc นั้นๆ
การบรรยายความสัมพันธของขอมูลที่ไหลเขาออก model นั้นจะถูกบรรยายระหวาง begin กับ end ชุดคําสั่งทุกคําสั่งที่อยูในบริเวณนี้จะเปนชุดคําสั่งแบบแขงขนาน (concurrent statement) เทานั้น arc จะตองปดทายดวย end และชื่อของ arc นั้นๆ
Syntax:architecture architecture _name of entity_name is
declarationsbegin
concurrent_statementsend architecture _name ;
24
Architecture จะเปนสวนทีจ่ะใชในการอธิบายการทํางาน หรือโครงสรางของวงจร
ตัวอยาง เปน Architecture ของ Half Adder (HA) ที่มีชื่อวา “BEHAVE” ของ Entity ทีม่ีชื่อวา “HALFADD” ซึ่งจะมีการอธิบายการทํางานระหวาง Begin => End
Architecture
26
เปนการเขียนรูปแบบ VHDL ที่ใชบรรยายการทํางานที่มีลักษณะคลายกับการเขียนโปรแกรม ดวยภาษา C หรือ PASCAL มากกวาจะเปนโครงสรางของ hardware เชนมีการใชงานคําสั่งประเภท if-then-else, for-loop เปนตน รูปแบบ VHDL เชนนี้จึงจัดใหอยูในประเภท behaviouralQ:ขอดีของการบรรยายแบบนี้คืออะไร?
Behavioural
27
ตัวอยาง Behavioural Style
architecture behavioural of mux isbegin
process ( IN0,IN1,SEL)begin
if (SEL=‘0’) thenOUTPUT <= IN0;
elseOUTPUT <= IN1;
end if;end process;
end behavioural;
28
Structural
• เปนการเขียนเพื่อบรรยายลักษณะทางโครงสรางของวงจร หรือระบบ ที่ประกอบดวยอุปกรณหลาย ๆ ตัวตอกัน
• ในการเขียนเพื่ออธิบายนั้น จําเปนตองรูวาขาของอุปกรณแตละตัวตอกันอยางไร ทําใหเราสามารถมองเห็น หรือกําหนดโครงสรางได เชนมีการทํางานพรอม ๆ กัน (ขนาน) ของอุปกรณตัวใดบาง
• ตัวอยางเชน การสรางวงจรแบบ Pipeline เราจําเปนตองเขียนในลักษณะของ Structural
29
ตัวอยาง Structural Style
architecture structural of mux iscomponent INV
port( I1 : in bit; O1 : out bit );end component;component AND2
port( I1,I2 : in bit; O1 : out bit );end component;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);
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;
O1I1 G0
I1
I1
I2
I2O1
O1
I1
I2O1
SEL
IN1
IN0
OUTPUT
muxG1
G2
G3INT0
INT1
INT2
30
Hierarchy Design
Hierarchy เปนการออกแบบที่เปนลักษณะของลําดับชั้น ซึ่งจะทาํใหงายในการทําความเขาใจ ตรวจสอบ และแกไข
ตัวอยาง เปนการออกแบบวงจร Full Adder (FA) ซึ่งประกอบดวย HA สองตัว และ OR gate เปนลักษณะของ Hierarchy ดังแผนภาพดานบน
FA
HA HA OR
32
การเขยีน VHDL ในลักษณะของ Hierarchy (2)
เราสามารถแสดงโครงสรางการเชื่อมตอกันของ HA และ OR ไดโดย3 บรรทัดที่อยูระหวาง Begin และ End U1 และ U2 แทน HA และ U3 แทน OR โดยทีท่ัง้ U1, U2, U3 เราเรียกวา Instant Nameมีจดุเชื่อมตอภายในวงจร 3 จดุดวยกันคือ I1, I2,
I3 ซึ่งใน VHDL ถือวาเปน Signal
33
การเขยีน VHDL ในลักษณะของ Hierarchy (3)
• ตัวอยางการเชื่อมตอระหวาง HA กับจุดตาง ๆ โดยรอบ เราจะใชคําสั่ง Port map ซึ่งจะทําการเชื่อมตอใหตรงตามตําแหนงการเรียงกันของพอรตที่กําหนดไวใน Entity
34
Local Declaration
สําหรบัการกําหนดวา เราตองการใช HA และ OR ในการสราง จะตองกําหนดไวเปนลักษณะของ Component ในบริเวณของ Local Declarationชื่อของ Component และตําแหนงของพอรต จะตองเหมือนกับทีก่ําหนดไวใน Entity
37
Type in VHDL
Signal ใน VHDL ที่ใชในการสงผานคาจากจุดหนึ่ง ไปยังอีกจุดหนึ่งนั้น มีไดหลายชนิด (Type) ซึ่งแตละ Type นั้นจะกําหนดชุดของคาที่ Signal ถูกอนุญาตใหใชได
39
Pre-defined Type
ใน Package ที่ชื่อวา standard จะถูกโหลดเขามาใชงานโดยอัตโนมัติ โดยไมตองกําหนดไวที่บรรทัดตนไฟล ซึ่งมีชนิดตาง ๆ ของ Type ดังนี้
40
Standard Pre-defined Type
Boolean : FALSE, TRUEBit : ‘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,...
41
แนวคิดของการกําหนด Type
เมื่อเราตองการกําหนด (assign) คาใหกับ Signal ชนิดของ Type ทัง้ดานซาย และดานขวา ของตัวสงผานคา (<=) จะตองเปนชนิดเดียวกัน ดังตัวอยาง
42
Pre-defined Type ชนิดอืน่
นอกจากนี้ เรายังมี Type ทีก่ําหนดอยูใน Package อื่น ทีไ่มใช Standard package ดังตาราง ดังนั้นกอนที่เราจะใชงานตองกําหนดการใชงาน Package ไวตอนตนดวย
signed, unsignedstd_logic_arith
std_logic, std_logic_vectorstd_ulogic, std_ulogic_vector
std_logic_1164
TypePackage
‘U’ ‘X’ ‘0’ ‘1’ ‘Z’‘W’ ‘L’ ‘H’ ‘-’
std_logic หรือ std_ulogic
“1010”signed = -6
unsigned = 10
43
‘U’ = un-initialized‘X’ = unknown‘0’ = logic 0 Strong drive‘1’ = logic 1‘Z’ = high impedance‘L’ = logic 0 Weak drive‘H’ = logic1 (not often used) ‘-’ = don’t care
Standard Logic Type
45
Signed & Unsigned type
ชนิดสัญญาณ SIGNED และ UNSIGNED ตองกําหนดใชในPackage std_logic_arith.all ในไลบราลี่ IEEE UNSIGNED type จะแสดงคาตัวเลขหรือการกระทําทางตัวเลขเปนคา บวก หรือ 0 เทานั้น และถาเปนเลข binary bitทางดานซายมือสุดจะเปน bit ที่มีนยัสําคัญสูงสุด MSB
“0110” = +6“1010” = +10
46
SIGNED type จะแสดงคาตัวเลขหรือการกระทําทางตัวเลขเปนคา บวก (0) หรือ ลบ (1) เทานั้น โดยที่การกระทําทางตัวเลขจะเปนแบบ 2’complement
“0110” = +6 “1010” = -6
Signed & Unsigned type
47
Type Conversion
• เนื่องจากทัง้ดานซาย และดานขวา ของตัวสงผานคา (<=) จะตองเปน Type ชนิดเดียวกัน ถาตางชนิดกันจะทําอยางไร?
LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;
ENTITY adder ISPORT (op1, op2 : IN UNSIGNED(3 downto 0);
result : OUT INTEGER);END adder;
ARCHITECTURE maxpld OF adder ISBEGIN
result <= CONV_INTEGER(op1 + op2);END maxpld;
49
User-defined Type
เราสามารถที่จะกําหนดคาตาง ๆ ที่เปนไปไดสําหรับ Type ที่เรากําหนดขึ้นมาเองการใชงานจะตองเปนไปตามกฎ นั่นคือ ดานซาย และดานขวาของตัวสงผานคาจะตองเปน Type ชนิดเดียวกัน
50
การใชงาน User-defined Type
User-defined type อาจจะใชในการกําหนดชื่อของแตละ State ที่อยูใน State Machine ซึ่งเวลานําไปแปลดวยเครื่อง จะมีการเขาระหัส เปนเลขฐานสอง เรียงตามลําดับที่กําหนดไวดังรูป
52
Arrayเปนกลุมของสัญญาณ ซึ่งเราสามารถกําหนดชวง หรือขนาดของ Array โดยใช “to” หรือ “down to”ในการสงคา (assign) ขนาดของ Array จะตองเทากัน และเปน Type ชนิดเดียวกนัการสงผานคา จะกระทําโดยอางอิงถึงตําแหนงที่ตรงกัน มิใชอางอิงโดยเลขดัชนี
53
Slice of Array
การแบงอารเรย เพื่อนํามาใชงานบางสวน เราสามารถกําหนดไดดังตัวอยาง
ผดิเพราะวา ทิศทางของอารเรย (to หรือ down to ) จะตองสมัพันธกับที่กําหนดไวตอนเริ่มตน
54
Concatenation & Aggregate
เราสามารถนําสัญญาณยอย ๆ หรืออารเรยยอย มาตอกัน หรือรวมกันได ซึ่งทําไดสองวิธีคือการใชเครื่องหมาย & (ampersand) ตอเชื่อมสวนยอย ๆ เขาดวยกัน เราเรียกวา concatenationการใชวงเล็บ ( ) และจุลภาค , เพื่อรวมสวนยอย ๆ ตาง ๆ เขาดวยกันเราเรียกวา aggregate
57
ในบางกรณี เราอาจกําหนดไดโดยอางถึงดัชนี และกาํหนดคาใหกบัตําแหนงที่เหลอืโดยใชคําวา others
ตัวอยางของ Aggregate
59
VHDL Operators
ตัวกระทํา (operator) ใน VHDL ทําใหเราสามารถกระทํา โอเปอรเรชั่น ตาง ๆ ระหวาง Signal ไดแบงไดเปน 3 ประเภทดวยกันคือ
- Logical Operators- Relational Operators- Arithmetic Operators
Type ชนิดหนึ่ง อาจจะใชตัวกระทําไดเปนบางประเภท
60
Logical Operators
AND, OR, NAND, NOR, XOR ถือวาเปน Logical operators ที่มีความสําคัญเทากนัNOT ถือวามีลําดับความสําคัญมากกวา นัน่คือจะกระทาํกอน ยกเวนเราจะกําหนดใหกระทําใน เครื่องหมายวงเล็บกอน
61
Logical Operators
เราสามารถใช Logical Operator กระทํากับตัวแปรประเภทอารเรยได ตราบใดที่ตัวกระทํา และตัวถูกกระทําเปน Type ชนิดเดียวกัน และมีขนาดเทากัน
62
Relational Operators
ตัวกระทําประเภท Relational Operators นั้นจะใชในการเปรียบเทียบคา ระหวางสองตัวแปรที่เปนชนิดเดียวกัน โดยที่จะใหผลลัพธออกมาเปนคา Boolean (TRUE, FALSE)สวนใหญจะใชในคําสั่งที่มีการตรวจสอบเงื่อนไขกอนเชน If Then
63
Arithmetic Operators• จะใชไดกับ Pre-Defined Type ประเภท
Integer, Real, Time, Signed และ Unsigned เทานั้น
• สําหรับตัวคูณ และตวัหาร เชน A*B หรือ C/DB และ D ตองเปนเลข 2^n เทานัน้
• A**X หมายถึง A ยกกําลัง X โดยที่ A มีคาเปน 2^n เหมือนกัน
64
Arithmetic Operators
จากตัวอยางการใชงาน จะเห็นวา เราสามารถกาํหนดชวงของตัวตั้ง ตัวกระทํา และผลลัพธไดโดยใชคําสั่ง Range ซึ่งหลังจากนี้ถานาํไปจําลองการทํางาน ตัว Simulator จะทําการตรวจสอบชวงของอินพุท และ เอาทพุท วาอยูในชวงหรือไม และจะแสดง error ออกมาเมื่อคาไมอยูในชวงที่กาํหนด
65
Type and Operators
std_logic*std_logic_vector*
std_ulogic*std_ulogic_vector*
signedunsigned
ArithmeticOperators
RelationalOperators
LogicalOperators
std_logic**std_logic_vector**
std_ulogic**std_ulogic_vector*
*
Integerbooleanbitbit_vector
*ไมใช std_logic_{signed,unsigned}**ใช std_logic_{signed,unsigned}
67
Concurrent and Sequential Statement
Concurrent Statement จะทําการแปล หรือประมวลผลในเวลาเดียวกนั หรือทุกบรรทัดพรอมกันเปนแบบขนาน เชนคําสั่งWhen Else, With SelectSequential Statement จะทําการแปล หรือประมวลผลเปนลําดับเรียงกนัไปในแตละบรรทัด เชนคําสั่ง If Then, Case, For Loop เวลาจะใชงาน Sequential Statement จะตองใชใน “Process” เทานั้นระวัง! Sequential Statement เมื่อนําไปสรางวงจร ไมจําเปนตองเปน Sequential Circuit
69
ตัวอยางของ Concurrent Statement
จากตัวอยาง จะเห็นวาเราสามารถสลบับรรทัดได เนื่องจากเปนการประมวลผลแบบขนานวงจรที่ไดจาก Concurrent Statement แสดงถึงลักษณะทางดานฮารดแวรที่แตละโหนด จะตองตอกันเปนลักษณะของ Concurrent โดยที่เราสามารถวาดรูปจากบรรทัดไหนกอนก็ได
70
Concurrent Statement
เปนคําสั่งแบบแขงขนาน สามารถทีจ่ะเขียนลงในตําแหนงใดๆ ภายใน Architecture ได จงึเปนขอดีทีจ่ะคอยๆ แปลง การออกแบบจาก behavioral model ไปสู structural model ได Concurrent statement สามารถมองใหเปนสวนยอยแบบ (subdesign) ที่เปนอิสระในการทํางาน และจากการที ่concurrent statement เปนอิสระตอกัน ฉะนั้นภายใน Architecture เดียวกัน สามารถทีจ่ะมี concurrent statement ไดหลายๆ Statement
71
Concurrent Statements in VHDL
When - Else statementWith - Select statementSignal assignment statementComponent instantiation statementProcess statementProcedure statement
72
When - Else Statement
คําสั่ง When - Else มีลักษณะคลายกับคําสั่ง If - Then - Else แตมีความยืดหยุนนอยกวา
73
With - Select Statement
คําสั่ง With - Select จะมีความหมายคลายกับ Case แตมีความยืดหยุนในการใชงานไดนอยกวา
74
Process Statement
Architecture simple_seq OF mux ISbegin
process (input,sel)begin
CASE sel ISWHEN “00” => output <= input (0) AFTER 5 ns;WHEN “01” => output <= input (0) AFTER 5 ns;WHEN “10” => output <= input (0) AFTER 5 ns;WHEN “11” => output <= input (0) AFTER 5 ns;
end CASE;end process;
end simple_seq;
75
Sequential Statement in VHDL
VHDL นั้นเปนภาษาที่มีคุณสมบัติแบบแขงขนาน นั่นคือชุดคําสั่งภายในตัวโครงสราง จะเปนชุดคําสั่งแบบแขงขนานโครงสรางที่ประกอบดวย Sequential Statement เชน if-then-else, case, for-loop, wait จะไปอยูสวนไหนอยางไรภายใน architecture ของ model? คําตอบก็คือ … อยูในชุดคําสั่ง Process ใน architecture หนึ่ง สามารถมีไดหลายๆ Process ที่ทํางานขนานกัน
77
Process
สําหรับบางคําสั่งที่เปน Sequential Statement ตองกําหนดใหอยูใน Process ซึ่งจะทําการแปลความหมายลงมาทีละบรรทัดดังรูปใน Architecture หนึ่ง ๆ อาจจะมีหลาย ๆ Process ซึ่งทํางานพรอม ๆ กันเปนลักษณะของ Concurrentแตละ Process จะทํางานเมื่อ Signal ที่กําหนดไวใน Sensitivity List มีการเปลี่ยนแปลง
78
ตัวอยางการใชงาน Process
จากตัวอยาง label จะมีหรือไมมีก็ได ตามดวย Processและชื่อ Sensitivity List อยูในวงเล็บSequential Statement จะอยูระหวาง Begin และ End Processจากตัวอยางนี้ เมื่อนําไปสังเคราะหเปนวงจรจะไดเปนวงจร Combinational Logic ธรรมดา ไมใช Sequential Logic!
79
การประมวลผลใน Process
การประมวลผลใน Process จะเรียงลําดับกันเปนบรรทัดลงมา (Sequential) ซึ่งตางกับ บรเิวณที่อยูขางนอก Process ซึ่งจะทําพรอม ๆ กัน (Concurrent) ดังนั้นถาเรากําหนดไวทีบ่ริเวณตางกัน กจ็ะไดลอจิกที่ตางกันดวย ดังตัวอยางตอไปนี้
ตัวอยางที่ 1
ตัวอยางที่ 2
80
จากตัวอยางที ่1 เนื่องจาก Z ถูกกาํหนดคาพรอม ๆ กนัเนื่องจากเปน Concurrent ดังนั้นคาของ Z จะตองเลือกเอาคาใด คาหนึ่งของเอาทพุทลอจิก ทั้งสองตัวที่เขามาสําหรบัตัวอยางที ่2 คาของ Z จะมีการเปลีย่นแปลงคา หรือถกู Update ดวยคาสุดทายที่เกิดขึน้ที่บรรทัดสุดทาย บรรทัดแรกจะถูกมองขามไปเนื่องจากจะถูกแปลทบัดวยบรรทดัที่สอง เพราะวาเปนลักษณะการแปลความหมายเรียงกันลงมาทลีะบรรทัด
การประมวลผลใน Process
ตัวอยางที่ 1 ตัวอยางที่ 2
81
Sensitivity List
Process จะทํางานเมื่อสัญญาณใน Sensitivity List มีการเปลี่ยนแปลง ดังนั้นเราควรจะกาํหนดสัญญาณที่เปนอินพุท ที่จะมีผลตอการทํางานใน Process ทั้งหมด อยูใน List
82
Label : Process (sensivity list)process declarative part
Beginprocess statement part
--Sequential statement--end process label;
กฎเกณฑการเขียน Process
ตั้งชื่อ process (จะมีหรือไมมีก็ได)ตั้งชื่อ process (จะมีหรือไมมีก็ได)
ถาตั้งชื่อ process จะตองมีชื่อหลังend process ดวยถาตั้งชื่อ process จะตองมีชื่อหลังend process ดวย
83
ตัวอยางการใชงาน Process
Architecture behavioral of muxMUT : Process (select)
--process declarative partBeginif (select =‘1’) then
data_out <= a;else
data_out <= b;end if
end process MUT;end architecture behavioral;
84
Variable in Process
สําหรับ Process ใน VHDL เราสามารถกําหนดตัวแปรเปน Variable ได ซึ่งจะมีลักษณะเหมอืนกับภาษาชั้นสูงโดยทั่วไป นั่นคือ จะมกีาร update คาทันที ซึ่งตางกับ Signal ที่จะมีการ update คาในตอนสิ้นสุด Process เทานั้นในการกําหนดคาให Variable จะใชเครื่องหมาย :=Variable จะรูจักเฉพาะใน Process ที่กาํหนดขึ้นมาเทานั้น ซึ่งตางกับ Signal ที่จะรูจักตลอดทั้งใน ArchitectureVariable เปนเพียงตัวแปร ไมมีความเกี่ยวของทาง Hardware แตอยางไร สวน Signal นั้นเปนตัวที่ทําหนาที่เปนพาหะ รับ-สง คาของสัญญาณจึงเปนสวนของ Hardware
85
ตัวอยางการใชงาน 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;
Y <= M + N;
end process;
Take Effect Immediately...
Take Effect When Suspend...
Z =Y =
A + BC + B
88
ชุดคําสั่งที่ใชใน Process
เปนชุดคําสั่งที่สําคัญที่สุดสําหรับการเขียนรูปแบบในลักษณะของการบรรยายพฤติกรรมของระบบดิจิตอลชุดคําสั่งเหลานี้จะทํางานเปนลําดับจากบนลงลางเมื่อ Process ถูกกระตุนใหทํางานจะเปนตัวกําหนดเขตในสวนของ Sequential statementการทํางานภายใน Process จะไมขึน้กับเวลา นั่นหมายความวา ชุดคําสั่ง Process จะทํางานตลอดเวลา
89
If-Then-Else Statement
กฎเกณฑ (Syntax) ในการเขียนภาษา VHDL มีดังนี้
IF condition THEN{sequential-
statement(s)}[{ ELSIF condition THEN}
{sequential-statement(s)}]
[ ELSE END IF;
90
Case Statement
กฎเกณฑ (Syntax) ในการเขียนภาษา VHDL มีดังนี้
CASE expression ISWHEN choice => sequential-statement(s)
[ WHEN choice => sequential-statement(s)]
END CASE;
คําสั่ง WHEN ใชสําหรับกําหนดตัวเลือกที่จะนํามาเปรียบเทยีบกับ expression ตัวเลือกใดเปนไปตาม expression ขางบน PROCESS จะเริม่ตนทํางานที่ชุดคําสั่งลําดับที่ตามมาจนกระทัง้คําสั่งสุดทายของตัวเลือกนั้นๆ และออกจาก CASE statement โดยไมทําหนทางอื่นๆทีย่ังเหลืออยู
91
Loop Statement
คือการทาํงานในลักษณะทีเ่ปนวงรอบ (loop) มีกฏเกณฑในการเขียนดังนี้
Label: interation_scheme loopsequential-statement(s)
END loop label;
เราสามารถสราง loop ได 3 ลักษณะดวยกันคือ LOOP ธรรมดา , FOR-LOOP และ WHILE-LOOP
92
For-Loop Statement
กลุมคําสั่ง for-loop จะทํางานเปนวงรอบตราบเทาที ่คาพารามิเตอรยังอยูในขอบขาย(range)ที่กําหนด
Label: FOR loop_parameter IN discrete_range loopsequential-statement(s)
END loop label;
ตัว loop_parameter เปนพารามิเตอรทีแ่ผงอยูในโครงสรางที่ไมตองประกาศหรือกําหนดขึ้น คาพารามิเตอรนี้หามถูกแกไขดัดแปลงดวยคําสั่งใดๆ ทัง้จากภายในและจากภายนอก for loop
93
ตัวอยาง For-Loop
b1: FOR index IN 0 to 7 loopdout(index) <= din(index);
END loop b1;
จากตัวอยางเปนการยายขอมูลในรูปของ array ชื่อ din ไปยัง array ที่ชื่อ dout ตําแหนงตอตําแหนง โดยอาศัย loop_parameter ชื่อ indexสิ่งที่พึงจําในการสรางคือ discrete range จะตองเปนคาที่ลงตัว ตัวเลขจํานวนเต็มสามารถใชได หรือตัวอักษร เชน a to f
94
While Loop Statement
Label: while boolean_expression loopsequential-statement(s)
END loop label;
กลุมคาํสั่งลาํดับใน WHILE-LOOP จะทํางานเปนวงรอบไปเรอืยๆ ตราบเทาทีข่อแมของ boolean_expression ใน while-loop ยังคงมีคาเปน true จํานวนครั้ง(รอบ) ที่ทําจะถูกควบคุมจากในตัวของ loop เอง นั้นคืออการที่จะออกจากวงรอบไดก็ตอเมือ่ผลลพัธของ boolean_expression ไดคาเปน false ขอแมที่ใชควบคุมการทาํงานนี้จะถูกตรวจสอบทกุครั้งกอนการทาํงานตอไปในวงรอบ
95
ตัวอยาง 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;
96
จากการที่ชุดคําสั่ง Process จะถูกกระตุนไดจากการที่สัญญาณใดสัญญาณหนึ่งใน sensitivity list เกิด event ขึน้เทานัน้ หลังจากกระตุนแลวคําสั่งภายในจะทาํงานเปนลาํดับลงมาจนกระทัง่หมด และชุดคําสั่ง Process จะหยุดทํางานชั่วคราวจนกวาสัญญาณใน list สัญญาณใดสัญญาณหนึ่งเกิด event ขึน้อีกถาในกรณทีี่ภายในรายชื่อภายใน list ประกอบดวยสัญญาณหลายๆ ตัว และ เกิด event ขึน้ในเวลาเดียวกนั จะมีสัญญาณตัวเดียวจากทั้งหมดเทานั้น ทีก่ระตุนการทํางานของชุดคําสั่ง process ซึ่งไมสามารถที่จะบอกไดวาเปนสัญญาณใด ดังนัน้การใชคําสั่ง process รวมกบั sensitivity list จึงมีขีดจํากัดใน VHDL จึงหลีกเลี่ยงปญหานีโ้ดยใชคําสั่งที่มีความออนตัวมากกวา ไดแกชุดคําสั่ง wait statement
Wait Statement
97
Wait Statement
สามารถกําหนดลงตรงตําแหนงใดๆ ภายในชุดคําสั่ง ลําดับได เพื่อระงบัการทํางานภายในชุดคําสั่ง process ตรงตําแหนงที ่wait statement อยูสามารถทีจ่ะกําหนด wait statement ไดหลายๆอันในแตละตําแหนงตามความตองการโดยไมจาํกัดwait statement ไมสามารถใชรวมกับ sensitivity list ภายใน process เดียวกันได
98
Label : wait [on { , signal_list}]
[ until condition is boolean_expression ][for time_expression]
กฎเกณฑการเขียน Wait Statement (1)
ตั้งชื่อ wait (จะมีหรือไมมีก็ได)ตั้งชื่อ wait (จะมีหรือไมมีก็ได)
การใช on รวมกับ until การทํางานจะถูกหยุดจนกระทั่งสัญญาณในสวนของ on มี event และ ขอแมในสวนของ until เปนจริงการใช on รวมกับ for การทํางานจะถูกหยุดจนกระทั่งสัญญาณในสวนของ on มี event หรือ เมื่อเวลาในสวน for ผานไป
99
การใช until รวมกับ for การทาํงานจะถูกหยุดจนกระทัง่ขอแมในสวนของ until เปนจรงิ หรอื เมื่อเวลา for ผานไปถาชุดคําสั่ง process ใดไมมี sensitivity list และ wait statement ภายในโครงสราง process นั้นจะเกิดการทํางานเปนวัฎจักรที่ไมมีจุดจบ
กฎเกณฑการเขียน Wait Statement (2)
100
การใชงาน Wait Statement (1)
1. wait ON signal_list; - - signal sensitivityEx. wait ON clock,clear,preset,d; คําสั่งนี้จะหยุดการทํางานของชุดคําสั่งลําดับจนกวาจะเกิด event ขึ้นที่ signal_list
2. wait UNTIL condition - - conditionEx. wait UNTIL (clock=‘1’);การทาํงานของชุดคําสั่งลําดับจะหยุดทํางานทีต่ําแหนง condition และทาํงานตอไปเมื่อ condition เกิด event และคา boolean expression ของ condition เปนจรงิ ลําดับการทํางานจะหยุดตรงนี ้
101
3. wait FOR time; --timeoutEx. wait FOR 10 ns
คําสั่งนี้เปนการรอหรือหยุดในขณะที่จําลองการทํางานจนกวาเวลาการจําลองจะผานไปแลว time จะมีผลทําให processเริ่มทํางานตอไปได4. wait; -- forever
Ex. wait; เปนคําสั่งให process หยุดทํางานตลอดไป โดยไมมีการเริม่ทํางานใหม
การใชงาน Wait Statement (2)
102
Wait Statement Example
Library IEEE;use IEEE.std_logic_1164.all;entity D_FLOP isport (D,CLK :in std_logic;
Q : out std_logic);end D_FLOP;architecture A of D_FLOP isbegin
process begin
wait until CLK’ event and CLK =‘1’;Q<= D;;
end process;end A;
104
คือคือ วงจรวงจร sequential sequential มสีัญญาณมสีัญญาณ Clock Clock มาควบคุมมาควบคุมการทํางานการทํางานซึ่งซึ่งออกแบบโดยแบงสถานะการทํางานออกแบบโดยแบงสถานะการทํางาน ((สเตทสเตท)) ของของ วงจรวงจร ออกเปนหลายออกเปนหลาย ๆๆ สถานะสถานะแตแตละสเตทละสเตทมีลอจิกการทํางานที่ตางกันมีลอจิกการทํางานที่ตางกัน เพื่อกําเนิดคาเพื่อกําเนิดคาเอาตพุตเอาตพุต และคาสเตทและคาสเตทถัดไปถัดไปมีมีสัญญาณสสัญญาณสเตทเตท ที่กําหนดวาที่กําหนดวา สเตทสเตทปจจุบันปจจุบันเปนสเตทเปนสเตทไหนไหน
State State MachineMachineclkclk
statestate
inputinput outputoutput
State Machine
105
สัญญาณสเตทสัญญาณสเตทจะจะถูกเก็บในรีจีสเตอรถูกเก็บในรีจีสเตอร ดังนั้นดังนั้น สเตทจะสามารถสเตทจะสามารถเปลี่ยนแปลงไดที่ขอบของเปลี่ยนแปลงไดที่ขอบของ clock clock เทานั้นเทานั้น State Machine State Machine มีมี 2 2 ประเภทประเภท
Moore MachineMoore Machine มีมีเอาตพุตเอาตพุตเปลี่ยนแปลงตามเปลี่ยนแปลงตามจังหวะของจังหวะของ clock clock เทานั้นเทานั้น ((แตละสเตทจะมีแตละสเตทจะมีคาคาเอาตพุตที่กําหนดแนนอนเอาตพุตที่กําหนดแนนอน,, เอาตพุตจะเปลี่ยนเอาตพุตจะเปลี่ยนก็ก็ตอเมื่อสเตทตอเมื่อสเตทเปลี่ยนเปลี่ยน))Mealy MachineMealy Machine เอาตพุตเอาตพุตไมจําเปนตองไมจําเปนตองเปลี่ยนแปลงตามจังหวะของเปลี่ยนแปลงตามจังหวะของ clock clock ((ภายในภายใน สเตทสเตท หนึ่งหนึ่ง ๆๆ เอาตพุตสามารถเปลี่ยนแปลงไดเอาตพุตสามารถเปลี่ยนแปลงได ถาถาอินพุตเปลี่ยนอินพุตเปลี่ยน))
State Machine
106
Moore Machine
Stat
e R
egis
ter
C1
x(t)
s(t+1)
s(t)
z(t)
clk
init
presentstatepresent
input
nextstate
C2
107
Mealy Machine
Stat
e R
egis
ter
C1
x(t)
s(t+1)
s(t)z(t)
clk
init
presentstatepresent
input
nextstate
C2
108
สําหรับสําหรับ State Machine State Machine ในใน VHDLVHDLทําไดโดยใชทําไดโดยใชคําสั่งคําสั่ง Type Type กับกับ Signal Signal ประกอบกันเพื่อกําหนดประกอบกันเพื่อกําหนดชื่อของแตละชื่อของแตละ สเตทสเตท และตัวแปรที่จะใชและตัวแปรที่จะใชแทนสเตทแทนสเตท มักนิยมทํามักนิยมทํา Moore Moore และและ Mealy Machine Mealy Machine ดวยดวยคําสั่งคําสั่ง CaseCase
S0 S1
i/p = 1
i/p = 0i/p = 0
State Machine in VHDL
109
ตัวอยางการใชงาน FSM
FSM
din
doutclk
clr
dindout
1 0 1 1 0 1 1 0 1 0 0 1 1 0 1 00 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0
Detect input sequence 1101
111
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
112
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;
Stat
e R
egis
ter
C1
x(t)
s(t+1)s(t)
z(t)
clk
init
presentstatepresent
input
nextstate
C2
113
FSM.vhd (3)
comb1: process(present_state, din)begin case present_state is
when S0 => if din = '1' then next_state <= S1; else next_state <= S0; end if;when S1 => if din = '1' then next_state <= S11; else next_state <= S0; end if;
S00
S10
S110
S1100
S11011
11
0
1
0 10
0
1
0
CLR
Stat
e R
egis
ter
C1
x(t)
s(t+1)s(t)
z(t)
clk
init
presentstatepresent
input
nextstate
C2
114
FSM.vhd (4)
when S11 => if din = '0' then next_state <= S110; else next_state <= S11; end if;when S110 => if din = '1' then next_state <= S1101; else next_state <= S0; end if; when S1101 => if din = '0' then next_state <= S0; else next_state <= S11; end if;when others => null;end case;
end process;
S00
S10
S110
S1100
S11011
11
0
1
0 10
0
1
0
CLR
115
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;
Stat
e R
egis
ter
C1
x(t)
s(t+1)s(t)
z(t)
clk
init
presentstatepresent
input
nextstate
C2