Download as pdf or txt
Download as pdf or txt
You are on page 1of 127

VHDL:

Hardware
Description Language
Workshop on FPGA: an easy solution for digital system designs
5 March 2005
1
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 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 ทําอะไรไดบาง
ˆ เปนภาษาที่นําไปเขียนรูปแบบระบบดิจิตอล และมี
คุณสมบัติที่คน และเครื่อง สามารถเขาใจได โดยไม
ตองแปลอีก
ˆ เปนภาษาที่สามารถเขียนขึน ้ เพื่อจําลองการทํางานได
ˆ สามารถนําไปเปนเอกสารประกอบโครงการได
ในรายละเอียดตอจากนี้จะเนนถึงการใชภาษา VHDL
ในการสังเคราะหวงจร โดยเขียนเปนรูปแบบภาษาที่
สามารถอธิบายพฤติกรรม หรือโครงสรางของระบบ
ดิจิตอล

6
VHDL Language Structure

7
VHDL Example

library ieee;
use ieee.std_logic_1164.all;

8
สวนประกอบที่สําคัญของไฟล VHDL

Library...
1 Use...
-------------------
Entity
2 -------------------
-------------------
Architecture
-----------
Begin
3 ------------------
------------------
End

9
สวนประกอบทีส
่ ําคัญของไฟล VHDL

1. สวนที่แสดงถึง Library และ Package ที่จะ


เรียกใช
2. Entity สําหรับกําหนดพอรตของวงจร ซึ่ง
เปนไดทั้ง input, output หรือ inout
3. Architecture สําหรับอธิบายการทํางานใน
ลักษณะของทั้ง Behavioral Level หรือ
Structural Level

10
Package
ขอมูลตางๆ ตลอดจน
โปรแกรมยอย
(Subprogram) ที่เปน
ประโยชนตอการเขียน
รูปแบบบรรยายระบบ
ดิจิตอลสามารถเก็บไวใน
สวนที่เรียกวา Package
ได และขอมูลเหลานี้
สามารถถูกเรียกไปใชได
โดย Entity design unit,
Architecture design
unit หรือจาก Package
design unit อื่น ดวย
คําสั่ง USE statement
11
Library
ˆ Library ทําหนาทีเ่ ก็บ Package ตาง ๆ ไว ซึ่งใน Package
จะเปนทรัพยากรตาง ๆ ทีใ่ ชงานรวมกัน ดังนั้นกอนใชงาน
จะตองกําหนดไวในตอนตนของ VHDL ไฟลไวดวย

12
Library

† ชุดคําสั่ง Library ดังในตัวอยาง เปนชุดคําสั่งทําให


Library ที่มีชื่อสัญลักษณวา IEEE สามารถนํามาใช
ในสวนที่เปน entity ชื่อ test ได นั่นคือ library
ชื่อ IEEE จะมองเห็นไดสําหรับ entity ชื่อ test
รวมทั้งสวนทีเ่ ปนหนวยรองดวย

Library IEEE;
___
entity test is
end test ;

13
ชุดคําสั่ง USE

† ใน library(กําหนดชื่อสัญลักษณ) อาจจะ
ประกอบดวย package หลายๆ ชุด ดังนัน ้ จะตอง
กําหนด package เฉพาะที่ตองการใชงาน ดวย
คําสั่ง USE ซึ่งมีรูปแบบดังนี้

USE library_name.package_name.element_of_package;

Library IEEE;
USE IEEE.std_logic_1164.and;
entity test is
___
14
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)

15
การเขียน 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
___

16
Entity

ˆ Entity ใน VHDL จะบอกถึงพอรตที่จะใชเชื่อมตอ


กับสวนอื่น ๆ ของวงจรภายในวงเล็บ โดยจะยังไมมี
การพูดถึงพฤติกรรมของวงจร เปนสวนที่ใชสําหรับ
ติดตอระหวางโลกภายนอกกับรูปแบบ (model) ที่
จะเขียนขึ้นเปนสวนที่ใชกําหนดจุดตอ (connection
point)ของรูปแบบ กําหนดทิศทางการไหลของ
สัญญาณ (mode) และประเภทของคา(type of
value) ทีส่ ามารถกําหนดใหกับสัญญาณตามจุด
ตางๆ (port) ของขอมูลที่ไหลผานจุดตอเหลานั้น

17
Entity Design Unit

กํกําาหนด
หนด ชืชื่อ่อของรู
ของรูปปแบบที
แบบที่ต่ตอองการจะเขี
งการจะเขียยนน
Syntax:
ทางเข
ทางเขาาออก
ออก entity entity_name is
ของข
ของขออมูมูลล port (port_name :<mode> port_type);
end entity_name;

จะต
จะตอองป
งปดดททาายด
ยดววยยend
end ตามด
ตามดววยย ประเภทค
ประเภทคาาของสั ของสัญญญาณ
ญาณ หรื
หรืออ
“entity_name”
“entity_name”และ และ;; ขขออมูมูลลก็ก็คคือือกลุ
กลุมมของค
ของคาา
กํกําาหนดทิ
หนดทิศศทางที
ทางที่ต่ติดิดตตออกักับบ
ภายนอก
ภายนอกI/O I/O
18
ตัวอยางการเขียน Entity

สัสังงเกตว
เกตวาาจะไม
จะไมมมี Semi-Colon
ี Semi-Colonทีที่บ่บรรทั รรทัดด
สุสุดดททาายยกกออนที
นที่จ่จะป
ะปดดดดววยวงเล็
ยวงเล็บบปปดด

19
การเขียนโดยมีขอ
 มูลทางฟสิกส

Syntax:
entity entity_name is
generic (generic_list);
port (port_name :<mode> port_type);
end entity_name;

Generic (tplh : : Time:=3ns,


Generic (tplh Time:=3ns,
tphl
tphl : : Time:=5ns);
Time:=5ns);

20
Architecture Design Unit

† เปนสวนที่เขียนบรรยายพฤติกรรม ของรูปแบบ (
model) ในมุมมองของการจําลองการทํางาน
(simulation)
† พฤติกรรมตางทีบ ่ รรยายในสวนนี้จะขึ้นอยูกับขอมูล
ที่ผานเขาออกตรงชองทาง ตลอดจนพารามิเตอร
ตางๆ (port and generics) ทีก่ ําหนดใน entity
design unit
† Syntax : เริ่มตนดวยคํา Architecture ตามดวย
ชื่อ และจบดวย End ตามดวยชื่อ ดังหนาถัดไปนี้

21
Architecture Syntax

ชืชื่อ่อ architecture
architecture นันั้น้นบรรยาย
บรรยาย entity
entity ใดใด
Syntax:
architecture architecture _name of
entity_name is
declarations อยู
อยูรระหว
ะหวาางงarc arcและ
และbegin
beginสสววนนี
นนี้ ้
begin
ใชใชใในการเขี
นการเขี ยยนประกาศกํ
นประกาศกํ าาหนดค
หนดค าา
concurrent_statements
end architecture _name ;
ตตาางๆงๆทีที่จ่จะนํ
ะนําาไปใช
ไปใชใในนarc
arcนันั้น้นอาทิ
อาทิ
เชเชนนประเภทของ
ประเภทของtype,
type,signal,
signal,
constant,
constant,function,
function,procedure,
procedure,
component
componentทีที่จ่จะใช
ะใช
22
Architecture

Syntax:
architecture architecture _name of entity_name is
declarations
begin
concurrent_statements
end architecture _name ;

การบรรยายความสั
การบรรยายความสัมมพัพันนธธขของข องขออมูมูลลทีที่ไ่ไหลเข
หลเขาาออก ออกmodel modelนันั้น้นจะถู จะถูกก
บรรยายระหว
บรรยายระหวาางงbegin beginกักับบend
end ชุชุดดคํคําาสัสั่ง่งทุทุกกคํคําาสัสั่ง่งทีที่อ่อยูยูใในบริ
นบริเวณนี
เวณนี้ ้
จะเป
จะเปนนชุชุดดคํคําาสัสั่ง่งแบบแข
แบบแขงงขนาน
ขนาน(concurrent
(concurrentstatement) statement)เทเทาานันั้น้น
arc
arcจะต
จะตอองป งปดดททาายด ยดววยยend
endและชื
และชื่อ่อของ
ของarc arcนันั้น้นๆๆ
23
Architecture

ˆ Architecture จะเปนสวนทีจ
่ ะใชในการอธิบาย
การทํางาน หรือโครงสรางของวงจร

ˆ ตัวอยาง เปน Architecture ของ Half Adder


(HA) ที่มีชื่อวา “BEHAVE” ของ Entity ทีม
่ ีชื่อ
วา “HALFADD” ซึ่งจะมีการอธิบายการทํางาน
ระหวาง Begin => End
24
Architecture Styles

Algorithmic description

Netlist representation

Behavioral + Structral

25
Behavioural

† เปนการเขียนรูปแบบ VHDL ที่ใชบรรยายการ


ทํางานที่มีลักษณะคลายกับการเขียนโปรแกรม
ดวยภาษา C หรือ PASCAL มากกวาจะเปน
โครงสรางของ hardware เชนมีการใชงานคําสั่ง
ประเภท if-then-else, for-loop เปนตน
รูปแบบ VHDL เชนนี้จึงจัดใหอยูในประเภท
behavioural
† Q:ขอดีของการบรรยายแบบนี้คืออะไร?

26
ตัวอยาง 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;

27
Structural

• เปนการเขียนเพื่อบรรยายลักษณะทาง
โครงสรางของวงจร หรือระบบ ที่ประกอบดวย
อุปกรณหลาย ๆ ตัวตอกัน
• ในการเขียนเพื่ออธิบายนั้น จําเปนตองรูวาขา
ของอุปกรณแตละตัวตอกันอยางไร ทําใหเรา
สามารถมองเห็น หรือกําหนดโครงสรางได เชน
มีการทํางานพรอม ๆ กัน (ขนาน) ของอุปกรณ
ตัวใดบาง
• ตัวอยางเชน การสรางวงจรแบบ Pipeline เรา
จําเปนตองเขียนในลักษณะของ Structural
28
ตัวอยาง Structural Style
architecture structural of mux is
component INV mux
port( I1 : in bit; O1 : out bit ); IN0 I1 G1
INT1
end component; I2
O1

component AND2 IN1 INT0 I1 G3


OUTPUT
port( I1,I2 : in bit; O1 : out bit ); I2
O1
I1 G2
end component; SEL I1 G0
component OR2 I2
O1 INT2
O1

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;
29
Hierarchy Design

ˆ Hierarchy เปนการออกแบบที่เปน
ลักษณะของลําดับชั้น ซึ่งจะทําใหงายใน
การทําความเขาใจ ตรวจสอบ และแกไข
FA

HA HA OR

ˆ ตัวอยาง
เปนการออกแบบวงจร Full
Adder (FA) ซึ่งประกอบดวย HA สองตัว
และ OR gate เปนลักษณะของ
Hierarchy ดังแผนภาพดานบน
30
การเขียน VHDL ในลักษณะของ
Hierarchy (1)

31
การเขียน VHDL ในลักษณะของ
Hierarchy (2)

ˆ เราสามารถแสดงโครงสรางการเชื่อมตอกันของ HA
และ OR ไดโดย3 บรรทัดที่อยูระหวาง Begin และ
End
ˆ U1 และ U2 แทน HA และ U3 แทน OR โดยทีท ่ ง
ั้
U1, U2, U3 เราเรียกวา Instant Name
ˆ มีจดุ เชื่อมตอภายในวงจร 3 จุดดวยกันคือ I1, I2,
I3 ซึ่งใน VHDL ถือวาเปน Signal

32
การเขียน VHDL ในลักษณะของ
Hierarchy (3)

• ตัวอยางการเชื่อมตอระหวาง HA กับจุดตาง ๆ
โดยรอบ เราจะใชคําสั่ง Port map ซึ่งจะทําการ
เชื่อมตอใหตรงตามตําแหนงการเรียงกันของ
พอรตที่กําหนดไวใน Entity

33
Local Declaration
ˆ สําหรับการกําหนดวา เราตองการใช HA และ OR ในการ
สราง จะตองกําหนดไวเปนลักษณะของ Component ใน
บริเวณของ Local Declaration
ˆ ชื่อของ Component และตําแหนงของพอรต จะตอง
เหมือนกับทีก
่ ําหนดไวใน Entity

34
VHDL ที่สมบูรณของ Full Adder

35
Data Type

36
Type in VHDL

ˆ Signal ใน VHDL ที่ใชในการสงผานคาจากจุดหนึ่ง ไป


ยังอีกจุดหนึ่งนั้น มีไดหลายชนิด (Type) ซึ่งแตละ
Type นั้นจะกําหนดชุดของคาที่ Signal ถูกอนุญาตให
ใชได

37
Type

ˆ Type แบงออกไดเปนสองกลุมใหญ ๆ คือ


- Pre-Defined
- User-Defined

38
Pre-defined Type

ˆ ใน Package ที่ชื่อวา standard จะถูกโหลดเขา


มาใชงานโดยอัตโนมัติ โดยไมตองกําหนดไวที่
บรรทัดตนไฟล ซึ่งมีชนิดตาง ๆ ของ Type ดังนี้

39
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,...

40
แนวคิดของการกําหนด Type

ˆ เมื่อเราตองการกําหนด (assign) คาใหกับ Signal


ชนิดของ Type ทัง ้ ดานซาย และดานขวา ของ
ตัวสงผานคา (<=) จะตองเปนชนิดเดียวกัน ดัง
ตัวอยาง

41
Pre-defined Type ชนิดอืน

ˆ นอกจากนี้ เรายังมี Type ทีก่ ําหนดอยูใน
Package อื่น ทีไ่ มใช Standard package ดัง
ตาราง ดังนั้นกอนที่เราจะใชงานตองกําหนดการ
ใชงาน Package ไวตอนตนดวย
Package Type
std_logic_1164 std_logic, std_logic_vector
std_ulogic, std_ulogic_vector
std_logic_arith signed, unsigned

‘U’ ‘X’ ‘0’ ‘1’ ‘Z’ “1010”


‘W’ ‘L’ ‘H’ ‘-’ signed = -6
std_logic หรือ std_ulogic unsigned = 10 42
Standard Logic Type

‘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

43
การใช Standard Logic

44
Signed & Unsigned type

ˆ ชนิดสัญญาณ SIGNED และ UNSIGNED ตอง


กําหนดใชในPackage std_logic_arith.all ใน
ไลบราลี่ IEEE
ˆ UNSIGNED type จะแสดงคาตัวเลขหรือการ
กระทําทางตัวเลขเปนคา บวก หรือ 0 เทานั้น
และถาเปนเลข binary bitทางดานซายมือสุดจะ
เปน bit ที่มีนย
ั สําคัญสูงสุด MSB
ˆ “0110” = +6
ˆ “1010” = +10
45
Signed & Unsigned type

ˆ SIGNED type จะแสดงคาตัวเลขหรือการ


กระทําทางตัวเลขเปนคา บวก (0) หรือ ลบ
(1) เทานั้น โดยที่การกระทําทางตัวเลขจะเปน
แบบ 2’complement
ˆ “0110” = +6
ˆ “1010” = -6

46
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);
47
END maxpld;
Type Conversion

48
User-defined Type

ˆ เราสามารถที่จะกําหนดคาตาง ๆ ที่เปนไปไดสําหรับ Type ที่


เรากําหนดขึ้นมาเอง
ˆ การใชงานจะตองเปนไปตามกฎ นั่นคือ ดานซาย และ
ดานขวาของตัวสงผานคาจะตองเปน Type ชนิดเดียวกัน

49
การใชงาน User-defined Type

ˆ User-defined type อาจจะใชในการกําหนดชื่อของ


แตละ State ที่อยูใน State Machine ซึ่งเวลานําไป
แปลดวยเครื่อง จะมีการเขาระหัส เปนเลขฐานสอง
เรียงตามลําดับที่กําหนดไวดังรูป

50
Array

51
Array
ˆ เปนกลุม
 ของสัญญาณ ซึ่งเราสามารถกําหนดชวง หรือขนาด
ของ Array โดยใช “to” หรือ “down to”
ˆ ในการสงคา (assign) ขนาดของ Array จะตองเทากัน และ
เปน Type ชนิดเดียวกัน
ˆ การสงผานคา จะกระทําโดยอางอิงถึงตําแหนงที่ตรงกัน มิใช
อางอิงโดยเลขดัชนี

52
Slice of Array

ˆ การแบงอารเรย เพื่อนํามาใชงานบางสวน เราสามารถ


กําหนดไดดังตัวอยาง

ผิดเพราะวา ทิศทาง
ของอารเรย
(to หรือ down to )
จะตองสัมพันธกับ 53
ที่กําหนดไวตอนเริ่มตน
Concatenation & Aggregate

ˆ เราสามารถนําสัญญาณยอย ๆ หรืออารเรยยอย
มาตอกัน หรือรวมกันได ซึ่งทําไดสองวิธีคือ
ˆ การใชเครื่องหมาย & (ampersand) ตอเชื่อม
สวนยอย ๆ เขาดวยกัน เราเรียกวา
concatenation
ˆ การใชวงเล็บ ( ) และจุลภาค , เพื่อรวมสวนยอย
ๆ ตาง ๆ เขาดวยกันเราเรียกวา aggregate

54
ตัวอยางของ Concatenation

55
ตัวอยางของ Aggregate

56
ตัวอยางของ Aggregate

ˆ ในบางกรณี เราอาจกําหนดไดโดยอางถึง
ดัชนี และกําหนดคาใหกบ
ั ตําแหนงที่เหลือ
โดยใชคําวา others

57
Operators

58
VHDL Operators

ˆ ตัวกระทํา (operator) ใน VHDL ทําใหเรา


สามารถกระทํา โอเปอรเรชั่น ตาง ๆ ระหวาง
Signal ได
ˆ แบงไดเปน 3 ประเภทดวยกันคือ
- Logical Operators
- Relational Operators
- Arithmetic Operators
ˆ Type ชนิดหนึ่ง อาจจะใชตัวกระทําไดเปนบาง
ประเภท

59
Logical Operators
ˆ AND, OR, NAND, NOR, XOR ถือวาเปน Logical
operators ที่มีความสําคัญเทากัน
ˆ NOT ถือวามีลําดับความสําคัญมากกวา นัน
่ คือจะกระทํา
กอน ยกเวนเราจะกําหนดใหกระทําใน เครื่องหมายวงเล็บ
กอน

60
Logical Operators

ˆ เราสามารถใช Logical Operator กระทํากับตัวแปร


ประเภทอารเรยได ตราบใดที่ตัวกระทํา และตัวถูกกระทํา
เปน Type ชนิดเดียวกัน และมีขนาดเทากัน

61
Relational Operators
ˆ ตัวกระทําประเภท Relational Operators นั้นจะใชในการ
เปรียบเทียบคา ระหวางสองตัวแปรที่เปนชนิดเดียวกัน โดยที่จะ
ใหผลลัพธออกมาเปนคา Boolean (TRUE, FALSE)
ˆ สวนใหญจะใชในคําสั่งที่มีการตรวจสอบเงื่อนไขกอนเชน If
Then

62
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 เหมือนกัน 63
Arithmetic Operators
ˆ จากตัวอยางการใชงาน จะเห็นวา เราสามารถกําหนดชวงของ
ตัวตั้ง ตัวกระทํา และผลลัพธไดโดยใชคําสั่ง Range ซึ่ง
หลังจากนี้ถา  นําไปจําลองการทํางาน ตัว Simulator จะทําการ
ตรวจสอบชวงของอินพุท และ เอาทพุท วาอยูในชวงหรือไม
และจะแสดง error ออกมาเมื่อคาไมอยูในชวงที่กา ํ หนด

64
Type and Operators

bit boolean Integer signed std_logic* std_logic**


bit_vector unsigned std_logic_vector* std_logic_vector**
std_ulogic* std_ulogic**
std_ulogic_vector* std_ulogic_vector*
*

Logical
Operators 3 3 3 3
Relational
Operators 3 3 3 3 3 3
Arithmetic
Operators 3 3 3

*ไมใช
std_logic_{signed,unsigned}
**ใช
std_logic_{signed,unsigned} 65
Concurrent vs.
Sequential Statement

66
Concurrent and Sequential
Statement
ˆ Concurrent Statement จะทําการแปล หรือประมวลผล
ในเวลาเดียวกัน หรือทุกบรรทัดพรอมกันเปนแบบขนาน
เชนคําสั่งWhen Else, With Select
ˆ Sequential Statement จะทําการแปล หรือประมวลผล
เปนลําดับเรียงกันไปในแตละบรรทัด เชนคําสั่ง If Then,
Case, For Loop
ˆ เวลาจะใชงาน Sequential Statement จะตองใชใน
“Process” เทานั้น
ˆ ระวัง! Sequential Statement เมื่อนําไปสรางวงจร ไม
จําเปนตองเปน Sequential Circuit

67
ตําแหนงของ Concurrent และ
Sequential Statement

68
ตัวอยางของ Concurrent
Statement

ˆ จากตัวอยาง จะเห็นวาเราสามารถสลับบรรทัดได เนื่องจากเปน


การประมวลผลแบบขนาน
ˆ วงจรที่ไดจาก Concurrent Statement แสดงถึงลักษณะ
ทางดานฮารดแวรที่แตละโหนด จะตองตอกันเปนลักษณะของ
Concurrent โดยที่เราสามารถวาดรูปจากบรรทัดไหนกอนก็ได
69
Concurrent Statement

ˆ เปนคําสั่งแบบแขงขนาน สามารถทีจ ่ ะเขียนลงใน


ตําแหนงใดๆ ภายใน Architecture ได จึงเปน
ขอดีทจี่ ะคอยๆ แปลง การออกแบบจาก
behavioral model ไปสู structural model ได
ˆ Concurrent statement สามารถมองใหเปน
สวนยอยแบบ (subdesign) ที่เปนอิสระในการ
ทํางาน และจากการที่ concurrent statement
เปนอิสระตอกัน ฉะนั้นภายใน Architecture
เดียวกัน สามารถทีจ ่ ะมี concurrent statement
ไดหลายๆ Statement
70
Concurrent Statements in VHDL

† When - Else statement


† With - Select statement
† Signal assignment statement
† Component instantiation
statement
† Process statement
† Procedure statement

71
When - Else Statement

ˆ คําสั่ง When - Else มีลักษณะคลายกับคําสั่ง If


- Then - Else แตมีความยืดหยุนนอยกวา

72
With - Select Statement

ˆ คําสั่ง With - Select จะมีความหมายคลายกับ Case แต


มีความยืดหยุนในการใชงานไดนอยกวา

73
Process Statement

Architecture simple_seq OF mux IS


begin
process (input,sel)
begin
CASE sel IS
WHEN “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;

74
Sequential Statement in VHDL
† VHDL นั้นเปนภาษาที่มีคุณสมบัติแบบแขงขนาน นั่นคือ
ชุดคําสั่งภายในตัวโครงสราง จะเปนชุดคําสั่งแบบแขง
ขนาน
† โครงสรางที่ประกอบดวย Sequential Statement เชน
if-then-else, case, for-loop, wait จะไปอยูสวนไหน
อยางไรภายใน architecture ของ model? คําตอบก็คือ
… อยูในชุดคําสั่ง Process
† ใน architecture หนึ่ง สามารถมีไดหลายๆ Process ที่
ทํางานขนานกัน

75
Process

76
Process

ˆ สําหรับบางคําสั่งที่เปน Sequential Statement ตอง


กําหนดใหอยูใน Process ซึ่งจะทําการแปลความหมายลง
มาทีละบรรทัดดังรูป
ˆ ใน Architecture หนึ่ง ๆ อาจจะมีหลาย ๆ Process ซึ่ง
ทํางานพรอม ๆ กันเปนลักษณะของ Concurrent
ˆ แตละ Process จะทํางานเมื่อ Signal ที่กําหนดไวใน
Sensitivity List มีการเปลี่ยนแปลง

77
ตัวอยางการใชงาน Process
ˆ จากตัวอยาง label จะมีหรือ
ไมมีก็ได ตามดวย Process
และชื่อ Sensitivity List
อยูในวงเล็บ
ˆ Sequential Statement
จะอยูระหวาง Begin และ End
Process
ˆ จากตัวอยางนี้ เมื่อนําไปสังเคราะห
เปนวงจรจะไดเปนวงจร
Combinational Logic ธรรมดา
ไมใช Sequential Logic!

78
การประมวลผลใน Process
ˆ การประมวลผลใน Process จะเรียงลําดับกันเปนบรรทัด
ลงมา (Sequential) ซึ่งตางกับ บริเวณที่อยูขา  งนอก
Process ซึ่งจะทําพรอม ๆ กัน (Concurrent) ดังนั้นถา
เรากําหนดไวทบ ี่ ริเวณตางกัน ก็จะไดลอจิกที่ตางกันดวย
ดังตัวอยางตอไปนี้

ตัวอยางที่ 1

ตัวอยางที่ 2 79
การประมวลผลใน Process

ˆ จากตัวอยางที่ 1 เนื่องจาก Z ถูกกําหนดคาพรอม ๆ กันเนื่องจาก


เปน Concurrent ดังนั้นคาของ Z จะตองเลือกเอาคาใด คาหนึ่ง
ของเอาทพุทลอจิก ทั้งสองตัวที่เขามา
ˆ สําหรับตัวอยางที่ 2 คาของ Z จะมีการเปลีย่ นแปลงคา หรือถูก
Update ดวยคาสุดทายที่เกิดขึน้ ที่บรรทัดสุดทาย บรรทัดแรกจะ
ถูกมองขามไปเนื่องจากจะถูกแปลทับดวยบรรทัดที่สอง เพราะวา
เปนลักษณะการแปลความหมายเรียงกันลงมาทีละบรรทัด

ตัวอยางที่ 1 ตัวอยางที่ 2 80
Sensitivity List

ˆ Process จะทํางานเมื่อสัญญาณใน Sensitivity List


มีการเปลี่ยนแปลง ดังนั้นเราควรจะกําหนดสัญญาณที่
เปนอินพุท ที่จะมีผลตอการทํางานใน Process
ทั้งหมด อยูใน List

81
กฎเกณฑการเขียน Process

ตัตั้ง้งชืชื่อ่อprocess
process(จะมี
(จะมีหหรืรืออไม
ไมมมีกีก็ไ็ไดด))

Label : Process (sensivity list)


process declarative part
Begin
process statement part
--Sequential statement-- ถถาาตัตั้ง้งชืชื่อ่อprocess
processจะต
จะตอองมี
งมีชชื่อื่อ
end process label; หลั
หลังงend endprocess
processดดววยย

82
ตัวอยางการใชงาน 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;

83
Variable in Process
ˆ สําหรับ Process ใน VHDL เราสามารถกําหนดตัว
แปรเปน Variable ได ซึ่งจะมีลักษณะเหมือนกับ
ภาษาชั้นสูงโดยทั่วไป นั่นคือ จะมีการ update คา
ทันที ซึ่งตางกับ Signal ที่จะมีการ update คาใน
ตอนสิ้นสุด Process เทานั้น
ˆ ในการกําหนดคาให Variable จะใชเครื่องหมาย :=
ˆ Variable จะรูจ  ก
ั เฉพาะใน Process ที่กา ํ หนดขึ้นมา
เทานั้น ซึ่งตางกับ Signal ที่จะรูจก
ั ตลอดทั้งใน
Architecture
ˆ Variable เปนเพียงตัวแปร ไมมีความเกี่ยวของทาง
Hardware แตอยางไร สวน Signal นั้นเปนตัวที่ทํา
หนาที่เปนพาหะ รับ-สง คาของสัญญาณจึงเปนสวน
ของ Hardware 84
ตัวอยางการใชงาน
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;
Take Effect Immediately...
Z <= M + N;
M := C; Take Effect When Suspend...
Y <= M + N;
end process;
Z= A+B
Y= C+B
85
Quiz

ˆ ลองดูตัวอยางVHDL ไฟลนี้ แลวหาคาของ Y


และ Z ตอนสิ้นสุด Process

86
Sequential Statements in Process

87
ชุดคําสั่งที่ใชใน Process

† เปนชุดคําสั่งที่สําคัญที่สุดสําหรับการเขียน
รูปแบบในลักษณะของการบรรยายพฤติกรรม
ของระบบดิจิตอล
† ชุดคําสั่งเหลานี้จะทํางานเปนลําดับจากบนลง
ลางเมื่อ Process ถูกกระตุนใหทํางาน
† จะเปนตัวกําหนดเขตในสวนของ Sequential
statement
† การทํางานภายใน Process จะไมขน ึ้ กับเวลา นั่น
หมายความวา ชุดคําสั่ง Process จะทํางาน
ตลอดเวลา
88
If-Then-Else Statement

†กฎเกณฑ (Syntax) ในการเขียนภาษา


VHDL มีดังนี้

IF condition THEN
{sequential-
statement(s)}
[{ ELSIF condition THEN}
{sequential-
statement(s)}]
[ ELSE
END IF;

89
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 โดยไมทําหนทางอื่นๆทีย ่ ังเหลืออยู 90
Loop Statement

† คือการทํางานในลักษณะทีเ่ ปนวงรอบ (loop) มี


กฏเกณฑในการเขียนดังนี้

Label: interation_scheme loop


sequential-statement(s)
END loop label;

† เราสามารถสราง loop ได 3 ลักษณะดวยกันคือ


LOOP ธรรมดา , FOR-LOOP และ WHILE-LOOP

91
For-Loop Statement

† กลุมคําสั่ง for-loop จะทํางานเปนวงรอบตราบ


เทาที่ คาพารามิเตอรยังอยูในขอบขาย
(range)ที่กําหนด
Label: FOR loop_parameter IN discrete_range loop
sequential-statement(s)
END loop label;

† ตัว loop_parameter เปนพารามิเตอรทแ ี่ ผงอยูใน


โครงสรางที่ไมตองประกาศหรือกําหนดขึ้น
คาพารามิเตอรนี้หามถูกแกไขดัดแปลงดวยคําสั่ง
ใดๆ ทัง
้ จากภายในและจากภายนอก for loop
92
ตัวอยาง 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

93
While Loop Statement

Label: while boolean_expression loop


sequential-statement(s)
END loop label;

† กลุมคําสั่งลําดับใน WHILE-LOOP จะทํางานเปนวงรอบไป


เรือยๆ ตราบเทาทีข ่ อแมของ boolean_expression ใน
while-loop ยังคงมีคาเปน true จํานวนครั้ง(รอบ) ที่ทา ํ จะ
ถูกควบคุมจากในตัวของ loop เอง นั้นคืออการที่จะออก
จากวงรอบไดก็ตอเมือ ่ ผลลัพธของ boolean_expression
ไดคาเปน false ขอแมทใี่ ชควบคุมการทํางานนี้จะถูก
ตรวจสอบทุกครั้งกอนการทํางานตอไปในวงรอบ

94
ตัวอยาง 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;

95
Wait Statement

ˆ จากการที่ชด ุ คําสั่ง Process จะถูกกระตุน  ไดจากการที่สัญญาณ


ใดสัญญาณหนึ่งใน sensitivity list เกิด event ขึน ้ เทานัน

หลังจากกระตุนแลวคําสั่งภายในจะทํางานเปนลําดับลงมา
จนกระทัง่ หมด และชุดคําสั่ง Process จะหยุดทํางานชั่วคราว
จนกวาสัญญาณใน list สัญญาณใดสัญญาณหนึ่งเกิด event
ขึน
้ อีก
ˆ ถาในกรณีที่ภายในรายชื่อภายใน list ประกอบดวยสัญญาณ
หลายๆ ตัว และ เกิด event ขึน ้ ในเวลาเดียวกัน จะมีสัญญาณ
ตัวเดียวจากทั้งหมดเทานั้น ทีก่ ระตุน  การทํางานของชุดคําสั่ง
process ซึ่งไมสามารถที่จะบอกไดวาเปนสัญญาณใด ดังนัน ้
การใชคําสั่ง process รวมกับ sensitivity list จึงมีขีดจํากัด
ˆ ใน VHDL จึงหลีกเลี่ยงปญหานีโ ้ ดยใชคําสั่งที่มีความออนตัว
มากกวา ไดแกชุดคําสั่ง wait statement

96
Wait Statement

† สามารถกําหนดลงตรงตําแหนงใดๆ ภายใน
ชุดคําสั่ง ลําดับได เพื่อระงับการทํางานภายใน
ชุดคําสั่ง process ตรงตําแหนงที่ wait
statement อยู
† สามารถทีจ ่ ะกําหนด wait statement ได
หลายๆอันในแตละตําแหนงตามความตองการ
โดยไมจา ํ กัด
† wait statement ไมสามารถใชรวมกับ
sensitivity list ภายใน process เดียวกันได

97
กฎเกณฑการเขียน Wait
Statement (1)
ตัตั้ง้งชืชื่อ่อwait
wait(จะมี
(จะมีหหรืรืออไม
ไมมมีกีก็ไ็ไดด))

Label : wait
[on { , signal_list}]
[ until condition is boolean_expression ]
[for time_expression]

† การใช on รวมกับ until การทํางานจะถูกหยุดจนกระทั่ง


สัญญาณในสวนของ on มี event และ ขอแมในสวนของ
until เปนจริง
† การใช on รวมกับ for การทํางานจะถูกหยุดจนกระทั่ง
สัญญาณในสวนของ on มี event หรือ เมื่อเวลาในสวน
for ผานไป 98
กฎเกณฑการเขียน Wait
Statement (2)

† การใช until รวมกับ for การทํางานจะถูกหยุด


จนกระทัง ่ ขอแมในสวนของ until เปนจริง หรือ
เมื่อเวลา for ผานไป
† ถาชุดคําสั่ง process ใดไมมี sensitivity list
และ wait statement ภายในโครงสราง
process นั้นจะเกิดการทํางานเปนวัฎจักรที่ไมมี
จุดจบ

99
การใชงาน Wait Statement (1)

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 เปนจริง ลําดับการ
ทํางานจะหยุดตรงนี้

100
การใชงาน Wait Statement (2)

3. wait FOR time; --timeout


Ex. wait FOR 10 ns
† คําสั่งนี้เปนการรอหรือหยุดในขณะที่จําลองการ
ทํางานจนกวาเวลาการจําลองจะผานไปแลว time
จะมีผลทําให processเริ่มทํางานตอไปได
4. wait; -- forever
Ex. wait;
† เปนคําสั่งให process หยุดทํางานตลอดไป
โดยไมมีการเริม ่ ทํางานใหม

101
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; 102
State Machine in VHDL

103
State Machine

 คือ วงจร sequential มีสัญญาณ Clock มาควบคุม


การทํางานซึ่งออกแบบโดยแบงสถานะการทํางาน
(สเตท) ของ วงจร ออกเปนหลาย ๆ สถานะ
 แตละสเตท
ละสเตทมีลอจิกการทํางานที่ตางกัน เพื่อกําเนิดคา
เอาตพุต และคาสเตทถัดไป
 มีสั
สญ ั ญาณสเตท ที่กําหนดวา สเตทปจจุบันเปนสเตท
ไหน

input State output


clk Machine
state 104
State Machine

 สัญญาณสเตทจะถูกเก็บในรีจีสเตอร ดังนั้น
สเตทจะสามารถเปลี่ยนแปลงไดที่ขอบของ
clock เทานั้น
State Machine มี 2 ประเภท
 Moore Machine มีเอาต
เอาตพุตเปลี่ยนแปลงตาม
จังหวะของ clock เทานั้น (แตละสเตทจะมีค
คา
เอาตพุตที่กําหนดแนนอน, เอาตพุตจะเปลี่ยนก็
ตอเมื่อสเตทเปลี่ยน)
Mealy Machine เอาตพุตไมจําเปนตอง
เปลี่ยนแปลงตามจังหวะของ clock (ภายใน
สเตท หนึ่ง ๆ เอาตพุตสามารถเปลี่ยนแปลงได ถา
อินพุตเปลี่ยน) 105
Moore Machine

init

State Register
s(t+1) z(t)
C1 C2
next s(t)
x(t) state present
present state
input
clk
106
Mealy Machine

init

State Register
s(t+1)
C1 next s(t)
x(t) state present z(t)
present state C2
input
clk

107
State Machine in VHDL

 สําหรับ State Machine ใน VHDLทําไดโดยใช


คําสั่ง Type กับ Signal ประกอบกันเพื่อกําหนด
ชื่อของแตละ สเตท และตัวแปรที่จะใชแทนสเตท
แทนสเตท
 มักนิยมทํา Moore และ Mealy Machine ดวย
คําสั่ง Case

S0 S1 i/p = 0
i/p = 1 108
ตัวอยางการใชงาน FSM

Detect input sequence 1101

din
clk FSM dout
clr

din 1011011010011010
dout 0000010010000010

109
State Diagram to Detect
“1101” Sequence

0 S1
1
0 1
S0
0
0
S11
0
0
CLR 1
0 1
0
S1101
1 S110
1 0
110
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

111
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;
init

State Register
C1 s(t+1) C2 z(t)
next s(t)
x(t) state present
present state
input
clk 112
FSM.vhd (3)

comb1: process(present_state, din)


S1
begin 0 0
S0 1
case present_state is 0
1
0 S11
when S0 => 0
if din = '1' then CLR 0
0 1
next_state <= S1; 1
S1101 0
else 1
S110
0
next_state <= S0; 1
end if;
when S1 =>
if din = '1' then
init
next_state <= S11;

State Register
else
C1 s(t+1) C2 z(t)
next_state <= S0; next s(t)
end if; state present
x(t)
present state
input
clk 113
FSM.vhd (4)

when S11 =>


if din = '0' then
next_state <= S110;
else
next_state <= S11;
end if;
when S110 =>
if din = '1' then
S1
next_state <= S1101; 0 0
else S0 1
1
next_state <= S0; 0 S11
0
end if; 0
when S1101 => CLR 0
0 1
if din = '0' then 1
S1101 0
next_state <= S0; 1
S110
else 0
1
next_state <= S11;
end if;
when others =>
null;
end case; 114
end process;
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; init

State Register
C1 s(t+1) C2 z(t)
next s(t)
x(t) state present
present state
input
clk 115
Design Examples in VHDL Code

116
Multiplexer

117
Shift Register (p1)

118
Shift Register (p2)

119
Counter (p1)

120
Counter (p2)

121
RAM (p1)

122
RAM (p2)

123
RAM (p3)

124
ROM (p1)

125
ROM (p2)

126
THANK
YOU

127

You might also like