11.07.2015 Views

Book: HDL chip design (Preview version) - ภาค วิชา วิศวกรรม ...

Book: HDL chip design (Preview version) - ภาค วิชา วิศวกรรม ...

Book: HDL chip design (Preview version) - ภาค วิชา วิศวกรรม ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Table of Contentบทที่1. อุปกรณลอจิกที่โปรแกรมได (Programmable Logic Device) ......................................................................... 1ความเปนมาของวงจรดิจิตอลลอจิก ............................................................................................................................... 6อุปกรณลอจิกที่โปรแกรมได ......................................................................................................................................... 8Simple Programmable Logic Device (SPLD) ............................................................. 9Complex Programmable Logic Device (CPLD) ....................................................... 10Field Programmable Gate Array (FPGA) .................................................................. 11โครงสรางของตัว FPGA .................................................................................................................. 12การออกแบบ .................................................................................................................................... 19ความสามารถ .................................................................................................................................... 22บทที่ 2. ภาษาที่ใชในการออกแบบ (Design Language) ............................................................................................. 24ภาษาสําหรับซอฟทแวร (Software Programming Language) ..................................................................................... 25ภาษา C ....................................................................................................................... 27ภาษา C++ .................................................................................................................. 29ภาษา JAVA ............................................................................................................... 31ภาษา Visual Basic ..................................................................................................... 32ภาษาสคริป (Scripting Languages) ............................................................................ 34ภาษาสําหรับฮารดแวร (Hardware Design Language) ................................................................................................. 35การออกแบบฮารดแวรในอดีต ................................................................................... 36การออกแบบดวยสมการบูลีน (Designing with Boolean Equations) ............................................... 36การออกแบบดวย Schematic (Schematic-based Design) ................................................................. 36ขอเสียของการออกแบบแบบเดิมในอดีต (Drawback of Traditional Methods) ............................... 37ภาษาฮารดแวร (Hardware Description Language) .................................................... 38การออกแบบในระดับตาง ๆ (Dealing with Different Design Levels) ...................... 39


บทที่ 3. ภาษา V<strong>HDL</strong> (V<strong>HDL</strong> Language) .................................................................................................................. 41รูจักกับภาษา V<strong>HDL</strong> .................................................................................................................................................... 43โครงสรางพื้นฐานของภาษา V<strong>HDL</strong> ............................................................................................................................ 45Library and Package .................................................................................................. 46Library.............................................................................................................................................. 46Package ............................................................................................................................................ 46Entity ......................................................................................................................... 49Architectures .............................................................................................................. 50การเขียนอธิบายในสวนของ Architechture ................................................................................................................. 51Data Flow Designs .................................................................................................... 51Structural Designs ..................................................................................................... 52Sequential Behavior Designs ..................................................................................... 54• Sensivity List ............................................................................................................................ 55• Process Declarative Region ...................................................................................................... 55• Process Statement Part .............................................................................................................. 56Hardware Concurency ................................................................................................................................................. 56การกําหนดการใชงาน Architechture .......................................................................................................................... 59Generics ....................................................................................................................................................................... 60แบบของสัญญาณ และตัวแปร (Signal and Variable Types) ....................................................................................... 63สัญญาณ (Signal) ....................................................................................................... 63ตัวแปร (Variable) ...................................................................................................... 65คาคงที่ (Constant) ...................................................................................................... 66แบบของขอมูล (Data Types) ....................................................................................................................................... 67Scalar types ................................................................................................................ 68Integer types ..................................................................................................................................... 68Real types ......................................................................................................................................... 69Enumerated types ............................................................................................................................. 70Physical types................................................................................................................................... 71Composite Types ....................................................................................................... 72Array types ....................................................................................................................................... 72


Record Types ................................................................................................................................... 76บทที่ 4. นิพจนและการสงผานคา (Expression and Assignment) ................................................................................ 78ตัวกระทํา (Operators) .................................................................................................................................................. 79ตัวกระทําทางตรรกะ (Logical Operators) ................................................................. 80ตัวกระทําเชิงความสัมพันธ (Relational operators) .................................................... 81ตัวกระทําเชิงคณิตศาสตร (Arithmetic operators) ...................................................... 82ตัวกระทําอื่น ๆ (Miscellaneous operators) ................................................................ 82ความสามารถในการใชงานตัวกระทําของตัวแปรหรือสัญญาณชนิดตาง ๆ ............... 83การสงผานคาสัญญาณในภาษา V<strong>HDL</strong> ........................................................................................................................ 84การสงผานคากรณีตัวแปรตางชนิดกัน ....................................................................... 86ประเภทของการสงผานคาสัญญาณ ............................................................................................................................. 88Simple signal assignment .......................................................................................... 88Conditional Signal Assignment ................................................................................. 89Selected Signal Assignment ...................................................................................... 90บทที่ 5. การเขียนอธิบายโครงสรางวงจร (V<strong>HDL</strong> Structural <strong>design</strong>) .......................................................................... 92ตัวอุปกรณที่ถูกเรียกใช Components ........................................................................................................................... 92คําสั่ง Port Map ............................................................................................................................................................ 94การออกแบบวงจรแบบลําดับชั้น (Hierarchy Design) ................................................................................................. 96บทที่ 6. การเขียนอธิบายพฤติกรรมวงจร (V<strong>HDL</strong> Behavioral Design) ....................................................................... 98Process Statement ........................................................................................................................................................ 98Sensitivity List ........................................................................................................... 99Process Example ........................................................................................................ 99Processes with Incomplete Sensitivity Lists ............................................................ 100Wait Statement ........................................................................................................ 101Signal Assignment เทียบกับ Variable Assignment ................................................................................................... 103If Statement ............................................................................................................................................................... 106การใชงานคําสั่ง if ที่ไมสมบูรณ (Incomplete if Statement) .................................... 108Case Statement .......................................................................................................................................................... 110Loop Statement ......................................................................................................................................................... 112Simple loop .............................................................................................................. 112


While loop ............................................................................................................... 113For loop ................................................................................................................... 113Next Statement ........................................................................................................ 117Exit Statement ......................................................................................................... 118Assert Statement ........................................................................................................................................................ 120บทที่ 7. ภาษา Verilog (Verilog Language) .............................................................................................................. 122รูจักกับภาษา Verilog ................................................................................................................................................. 123สวนประกอบของระบบ (The Anatomy of a System) ............................................................................................... 124ระบบ วงจร และโมดูล (System, Circuit and Module) ............................................ 124Interface และ Body ในโมดูล Verilog (Interface and Body in Verilog Module) .... 125โครงสรางของโมดูล Module (The Structure of a Module) ...................................................................................... 126คําจํากัดความของโมดูล (The Definition of a Module) ........................................... 126ชื่อของโมดูล (The Name of a Module) ................................................................... 127การเขียนขอสังเกตุ หรือหมายเหตุใน Verilog (Comments in Verilog) ................... 128รายละเอียดของระบบ (Descriptions of a System) ................................................... 128สวน Interface ในโมดูล (The Module Interface) ..................................................... 129การเขียนในสวนของ Body (The Body of a Module) ............................................................................................... 130MUX in structural <strong>design</strong> style ................................................................................ 131MUX in dataflow <strong>design</strong> style ................................................................................. 132MUX in behavioral <strong>design</strong> style .............................................................................. 133ประเภทสัญญาณในภาษา Verilog ............................................................................................................................. 134แนวคิดเกี่ยวกับสัญญาณ (Concept of Signals) ........................................................ 135สัญญาณในอุปกรณอิเล็กทรอนิกส (Signals in Electronic Device) ......................... 135ความสําคัญของสัญญาณทางไฟฟา (The Importance of Electrical Signals) ........... 135คาที่เปนไปไดของสัญญาณ (Available Values of Signals) ..................................... 136การกระทําทางลอจิกสําหรับคาของสัญญาณตาง ๆ (Logic Operations on Four-value Signals) .................. 137ประเภทของสัญญาณ (Class of Signals) ในภาษา Verilog ...................................... 137Nets ................................................................................................................................................ 138การกําหนดสัญญาณ (Signal Specification) ............................................................. 138สัญญาณสเกลลาร และเวกเตอร (Scalar Signals and Vectors) ................................. 139


การกําหนดการใชงานแบบเวกเตอร (Vector Specification) .......................................................... 139สัญญาณ Internal เทียบกับ External (Internal vs External Signals) ......................... 140พอรตของโมดูล (Module Ports) ................................................................................................................................ 141ชนิดของพอรต (Port Types) .................................................................................... 141การกําหนดการใชงานพอรต (The Specification of Ports) ....................................... 142การสรางรีจิสเตอรที่เอาทพุท (Registered Outputs) ................................................. 143บทที่ 8. นิพจนและการสงผานคา (Expression and Assignment) .............................................................................. 145นิพจน (Expressions) ................................................................................................................................................. 145รูจักกับ Expressions (Introduction to Expressions) ................................................. 145ตัวถูกกระทํา (Operands) ........................................................................................................................................... 146คาคงที่จํานวนเต็ม (Integer Constants) ..................................................................... 147Bit-select และ Part-select สําหรับตัวแปรเวกเตอร (The Bit-select and Part-select Operands) ................... 149ตัวกระทํา (Operators) ................................................................................................................................................ 150ตัวกระทําทางคณิตศาสตร (Arithmetic Operators) .................................................. 150ตัวกระทําเชิงความสัมพันธ (Relational Operators) ................................................. 152ตัวกระทําทางตรรก (Logical Operators).................................................................. 153ตัวกระทําพิเศษ (Special Operators) .......................................................................................................................... 155ตัวกระทําที่เปน Shift Operators ............................................................................... 155การตอเชื่อมสัญญาณเวกเตอร (Vector Concatenations) .......................................... 155การสงผานคา (Assignment) ...................................................................................................................................... 156การสงผานคาแบบตอเนื่อง (The Continuous Assignment) ..................................... 156การสงผานคาแบบแฝง (The Implicit Continuous Assignment) .............................. 157การสงผานคาแบบมีเงื่อนไข (The Conditional Assignment) ................................... 158บทที่ 9. การเขียนอธิบายโครงสรางวงจร (Verilog Structural Design) ...................................................................... 160อุปกรณพื้นฐานใน Verilog (Verilog Primitives) ...................................................................................................... 160เกตพื้นฐานที่สรางไวแลว (Predefined Gate Primitives) .......................................... 161การออกแบบโดยใชอุปกรณพื้นฐาน (Design with Primitives) ...................................................... 164การวางลําดับของตัวอุปกรณ (The Order of Instances) .................................................................. 165อุปกรณพื้นฐานที่กําหนดโดยผูออกแบบ (User-defined Primitives: UDP) ............. 166UDP Structure ................................................................................................................................ 167


UDP: Mux2to1 ............................................................................................................................... 167UDP: TFF....................................................................................................................................... 168การใชงาน UDPs (Using UDPs) .................................................................................................... 169โมดูลใน Verilog (Module in Verilog) ...................................................................................................................... 170การเรียกใชงานโมดูล (Module Instantiation) .......................................................... 170หลักการตอเชื่อมพอรต (Port Connection Rules) ..................................................... 171การเชื่อมตอพอรตโดยลําดับ (Connecting Ports by Ordered Port List) ................... 172การเชื่อมตอพอรตโดยชื่อ (Connecting Ports by Name) .......................................... 173การกําหนดพอรตที่ไมมีการเชื่อมตอ (Unconnected Ports) ...................................... 173บทที่ 10. การอธิบายพฤติกรรมวงจร (Verilog Behavioral Design) .......................................................................... 176ตัวแปร และพารามิเตอร (Variables and Parameters) ................................................................................................ 176รีจีสเตอร (Rergisters) .............................................................................................. 177เวกเตอร และอารเรย (Vectors and Arrays) .............................................................. 178คาคงที่ในภาษา Verilog (Constants in Verilog) ....................................................... 179การกําหนด และการใชงานพารามิเตอร (The Declaration and Use of Parameters) . 180การอธิบายพฤติกรรมเบื้องตน (Behavioral Basics) ................................................................................................... 181Behavioral Blocks ................................................................................................... 182การกําหนดคาตัวแปร (Variable Assignment) ......................................................... 183การใชงานที่ซับซอนมากขึ้น (Complex Statements) ................................................................................................. 184Conditional Operations ............................................................................................ 184การมีตัวเลือกหลายกรณี (Multiple Choice) ............................................................. 186การวนรอบ (Loops) ................................................................................................. 187การควบคุมพฤติกรรมของวงจรขั้นสูง (Advance Control over Behavior) ................................................................ 188เหตุการณ (Events) ................................................................................................... 188คําสั่งรอ (Wait Statement) ........................................................................................ 189Sensitivity List ......................................................................................................... 189การสงผานคาแบบ Non-blocking (Non-blocking Assignment) .............................. 190บทที่ 11. ตัวอยางการออกแบบดวยภาษา <strong>HDL</strong> (Design Examples) .......................................................................... 193วงจรเชิงผสม (Combinational logic) ......................................................................................................................... 193การออกแบบหนวยคํานวณและตรรกะ (ALU) ........................................................ 194


วงจรเชิงลําดับ (Sequential circuit) ............................................................................................................................ 196การออกแบบตัวนับ (Counter) ................................................................................. 197วงจรเครื่องสถานะจํากัด (Finite state machine) ........................................................................................................ 198การออกแบบวงจร Sequence Detector แบบ Moore machine ดวยภาษา Verilog .... 200การออกแบบวงจร Sequence Detector แบบ Mealy machine ดวยภาษา V<strong>HDL</strong> ...... 202บทที่ 12. การใชงานโปรแกรม Xilinx ISE Webpack .............................................................................................. 204การออกแบบและจําลองการทํางานของตัวนับเวลา ................................................................................................... 205เริ่มตนออกแบบ (Design Entry) ในการกําหนดคุณสมบัติของชิปที่ใช.................... 205การตรวจสอบความถูกตองของ Syntax ................................................................... 211การจําลองการทํางาน ............................................................................................... 214การออกแบบตัวควบคุมจังหวะไฟจราจรดวย STATE MACHINE ........................................................................... 218ขั้นตอนการออกแบบ ............................................................................................... 219การจําลองการทํางาน ............................................................................................... 228การออกแบบ Top Level ดวย V<strong>HDL</strong> และการโปรแกรมลงชิพ ................................................................................. 231การออกแบบ Top Level ดวย V<strong>HDL</strong> ....................................................................... 231การโปรแกรมลงบนชิฟ FPGA ................................................................................ 237Index .......................................................................................................................................................................... 242


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Chapter1บทที่1. อุปกรณลอจิกที่โปรแกรมได(Programmable Logic Device)ในการออกแบบวงจรอิเล็กทรอนิกสในปจจุบัน เพื่อใหสามารถแขงขันไดในธุรกิจ จําเปนตองมีการพัฒนาหลาย ๆอยางในกระบวนการผลิต ไมวาจะเปนการลดเวลาที่ใชในการออกแบบ ความสามารถในการใชงานที่ยืดหยุน ความเชื่อถือไดของระบบ นอกจากนี้ยังมีความตองการในดานความสามารถในการโปรแกรมได เพื่อใหมีการปรับปรุงและใชงานไดใหมหลาย ๆ ครั้ง ทําใหลดความเสี่ยงในการลงทุนเพื่อออกแบบ และใชงานระบบปจจุบัน มีเทคโนโลยีที่สามารถทําการสรางระบบดิจิตอลอยางหลากหลาย ไมวาจะเปนการใชงานวงจรลอจิกที่สรางใชงานเฉพาะอยาง (Fixed Functionality) หรือการใชงานระบบที่ประกอบดวยโปรเซสเซอรที่สามารถโปรแกรมไดทั้ง ไมโครโปรเซสเซอร (uP) ไมโครคอลโทรเลอร (uC) หรือชิพประมวลสัญญาณดิจิตอล(DSP) นอกจากนี้ยังมีลักษณะของตัวฮารดแวรที่สามารถโปรแกรมได เชน Programmable Logic Device(PLD) หรือ Field Programmable Logic Device (FPGA) องคประกอบที่สําคัญอีกสวนหนึ่งของวงจรดิจิตอลคือหนวยความจํา (Memory) ที่ใชสําหรับเก็บคําสั่งและตัวขอมูลในรูปที่ 1.1 แสดงทางเลือกตาง ๆ ที่จะสามารถสรางวงจรดิจิตอลได โดยมีอยูสองทางเลือกหลักไดแก การนําเอาชิพไอซีมาตรฐาน (Standard Product IC) ที่มีใชงานทั่วไปในทองตลาดที่อาจเปนไอซีใชงานเฉพาะโปรเซสเซอร ฮารดแวรที่โปรแกรมได และหนวยความจํามาสรางเปนระบบขึ้นมา หรือการสรางชิพในลักษณะของ Application Specific IC (ASIC) ขึ้นมาเองในรูปแบบตาง ๆ โดยมีสถาปตยกรรม หรือโครงสรางวงจรพิเศษสําหรับงานเฉพาะอยางเทานั้น1


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 1.1 ทางเลือกแบบตาง ๆ สําหรับการออกแบบระบบดิจิตอลการออกแบบทั้งที่เปน ASIC และ Standard IC สามารถทําไดหลาย ๆ รูปแบบที่เหมือนกันไดแก ไอซีใชงานเฉพาะ (Fixed Functionality) โปรเซสเซอร (Processor) ฮารดแวรลอจิกที่โปรแกรมได (PLD) และหนวยความจํา (Memory) โดยในแตละแบบมีรายละเอียดดั้งนี้1. ไอซีใชงานเฉพาะ (Fixed Functionality) จะเปนตัวไอซีที่ถูกออกแบบมาเพื่อใชงานเฉพาะอยางที่ไมสามารถเปลี่ยนแปลงได ผูใชงานสามารถใชงานไอซีชนิดนี้ไดตามที่กําหนดเทานั้น ตัวอยางเชน ชิพเขารหัสถอดรหัสวิดีโอ (Video codec <strong>chip</strong>)2. โปรเซสเซอร (Processor) เปนอุปกรณที่สวนใหญคอนขางจะคุนเคยกัน และใชกันอยูในชีวิตประจําวัน เชนที่อยูในตัวเครื่องคอมพิวเตอร เรียกวา General Processor หรือตัวโปรเซสเซอรขนาดเล็กในงานควบคุม (Microprocessor) หรือตัวโปรเซสเซอรสําหรับการประมวลผลทางดิจิตอล2


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>(Digital Signal Processor: DSP) ซึ่งจะทําหนาที่ในการรันตัวโปรแกรมที่ถูกเขียนขึ้นมาใหทําตามฟงกชันตาง ๆ ตามที่ตองการ ผูใชงาน หรือผูออกแบบสามารถปรับเปลี่ยนตัวโปรแกรมเพื่อใหมีการเปลี่ยนแปลงการทํางานไดตามที่ตองการ3. หนวยความจํา (Memory) สําหรับการใชเก็บขอมูล หรือคําสั่งตาง ๆ ในระบบที่สรางมาจากตัวโปรเซสเซอร มีสองแบบไดแก ROM (Read-only memory) และ RAM (Random access memory)โดยที่ ROM จะสามารถคงคาของขอมูลในตัวมันไดแมไมมีกระแสไฟเลี้ยง (เรียกวา non-volatilestorage) โดยขอมูลนั้นอาจถูกบรรจุในตัวมันระหวางการผลิต (Fabrication) หรือกอนใชงานที่อาจโปรแกรมไดเพียงแคครั้งเดียว หรือลบแลวโปรแกรมใหมไดหลาย ๆ ครั้งแลวแตเทคโนโลยีการผลิตเชน MROM (Masked ROM) PROM (Programmable ROM) EPROM (Electrically programmableROM) หรือ EEPROM (Electrically erasable programmable ROM) ระหวางการใชงาน ขอมูลหรือคําสั่งจะถูกอานจาก ROM เทานั้น แตในสวนของ RAM นั้นเราสามารถทั้งอานและเขียนได และมันจําเปนตองมีกระแสไฟเลี้ยงอยูตลอดเวลา (เรียกวา Volatile storage) แบงไดเปนสองแบบหลัก ๆไดแก Static RAM และ Dynamic RAM4. อุปกรณลอจิกที่โปรแกรมได (Programmable Logic Device: PLD) เปนอุปกรณที่มีลักษณะเปนตัวไอซีที่ภายในประกอบดวยลอจิกเซลล (Logic Cell) ที่สามารถโปรแกรมกําหนดการทํางานไดหลายๆ รูปแบบ และเสนทางการเชื่อมตอที่โปรแกรมได (Programmable Interconnect) สําหรับการเชื่อมตอลอจิกเซลลตาง ๆ เขาดวยกันใหเกิดเปนวงจรตามที่ตองการ ดังนั้นดวยการออกแบบที่งายเพื่อกําหนดรูปแบบการทํางานของลอจิกเซลล และโครงสรางของการเชื่อมตอ (เรียกวา HardwareConfiguration) ทําใหรองรับการทํางานแบบขนาน (Concurrency) และไมมีความเสี่ยงเนื่องจากความสามารถในการโปรแกรมไดหลาย ๆ ครั้ง อุปกรณประเภทนี้จึงมีความนิยมเพิ่มมากขึ้นเรื่อย ๆและหนังสือเลมนี้จะเนนถึงการออกแบบวงจรใน CPLD (Complex Programmable Logic Device)และ FPGA (Field Programmable Gate Array)ทั้งตัวอุปกรณประเภทโปรเซสเซอร กับ PLD สามารถเปลี่ยนแปลงรูปแบบการทํางานตามกําหนดตลอดเวลาสิ่งที่เปนขอแตกตางที่สําคัญคือโปรเซสเซอรจะเปนลักษณะของการทํางานตามคําสั่งโปรแกรมที่เขียนขึ้นมาโดยการประมวลผลเกิดขึ้นทีละบรรทัดของคําสั่ง (เรียกวา Sequential) แต PLD เปนการออกแบบฮารดแวรที่สามารถกําหนดใหการทํางานของบลอกฟงกชั่นตาง ๆ เกิดขึ้นพรอม ๆ กัน (เรียกวา Concurency) เรามักเรียก3


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การกําหนดการทํางานในโปรเซสเซอรวา Software program สวนในตัว PLD จะเรียกวา Hardwareconfigurationสําหรับ ASIC ถือวาเปนการออกแบบชิพไอซีเพื่อใชในงานเฉพาะอยางตามความตองการที่อาจเกิดขึ้นเปนกรณีพิเศษในองคกร หรือบริษัทหนึ่ง ๆ และถือเปนลิขสิทธิ์ (Intellectual Property) ดังนั้นจึงไมมีวางขายตามทองตลาดทั่วไป เราสามารถออกแบบสรางไอซีขึ้นมาใหเหมาะสมกับการใชงาน ซึ่งอาจจะเปน FixedFunctionality, Processor, Memory, PLD โดยสามารถจําแนกไดเปนวิธีการตาง ๆ ดังนี้• Full-custom approach: ผูออกแบบจะทําการออกแบบ หรือเลยเอาท (Layout) สวนตาง ๆ ของระบบขึ้นมาใหมทั้งหมด ทําใหสามารถควบคุมพารามิเตอรตาง ๆ ในกระบวนการออกแบบ เริ่มตั้งแตขนาดของตัวทรานซิสเตอรแตละตัว แลวนํามาตอกันเพื่อใหเปนวงจรพื้นฐาน แลวมารวมกันเปนระบบ ซึ่งการออกแบบในลักษณะนี้จะตองใชผูออกแบบที่มีประสบการณและความชํานาญเปนอยางมาก อีกทั้งเวลาที่จะตองใชในการออกแบบจะคอนขางนาน สวนใหญจะใชสําหรับการออกแบบวงจรอนาลอก• Semi-custom approach: สามารถแบงไดเปนสองลักษณะยอย ๆ คือ Standard cell และ MaskProgrammable Gate Array (MPGA) ในลักษณะของ Standard cell นั้นผูออกแบบจะมีไลบรารี(Library) ที่ประกอบดวยสวนพื้นฐานที่ออกแบบไวแลว และสามารถดึงมาใชงานไดทันที เชนตัวลอจิกเกตพื้นฐานตาง ๆ เซลลของแพดที่จะใชเชื่อมตอจากชิพ (หรือ Die) ไปยังตัว Package เปนตนซึ่งจะทําใหสามารถประหยัดเวลาในการออกแบบไดเปนอยางมากเมื่อเทียบกับ Full-customผูออกแบบจะเรียกใชวงจรยอย ๆ ตาง ๆ เหลานี้ (เรียกวา Standard cell) นํามาวางเรียงตามความตองการแลวทําการเลยเอาทเสนทางที่จะเชื่อมตอจุดตาง ๆ เขาดวยกัน ในสวนของ MPGAวงจรลอจิกเกตพื้นฐานจะถูกกําหนดตําแหนงการวางไวแลว และไมสามารถเปลี่ยนแปลงไดผูออกแบบเพียงแตกําหนดการเชื่อมตอเทานั้นเอง ดังนั้นจึงอาจจะมีเกตบางตัวไมไดถูกใชงานหลังจากขั้นตอนการออกแบบ ASIC ขอมูลการออกแบบก็จะถูกสงไปยังบริษัทที่รับผลิตชิพ(Manufacturer) กอนที่จะทําการสรางหรือ Fabricate ดวยกระบวนการ และเทคโนโลยีที่ทันสมัยตอไปซึ่งจะตองใชเวลาและคาใชจายที่คอนขางสูงทีเดียวการเลือกการออกแบบที่เหมาะสมสําหรับระบบนั้น เปนหนาที่ของผูออกแบบที่จําเปนตองคํานึงถึงความตองการ หรือขอจํากัดในดานตาง ๆ ประกอบดวย4


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• คาใชจาย (Cost) ในกระบวนการออกแบบ จะมีทั้งคาการออกแบบพัฒนาและผลิต คาอุปกรณไอซีตาง ๆ ที่ใชงาน คาเครื่องมือและซอฟทแวรที่ใชงาน และอาจรวมถึงคาใชจายที่เกิดขึ้นจากการบํารุงรักษา และอื่นๆ อีกมากมาย ซึ่งทางเลือกแตละทางในการออกแบบนั้น จะทําใหเกิดคาใชจายที่แตกตางกัน• เวลาในการออกแบบ (Design Time) ที่มีอยูอยางจํากัด เพื่อใหทันกับความตองการใชงาน หรือตามที่ไดตกลงกันกับลูกคาที่ทําสัญญากันไว (Contract Arrangement)• ความชํานาญประสบการณของผูออกแบบ (Prior Experience) ซึ่งผูออกแบบควรมีพื้นฐานประสบการณในการออกแบบใชงานเทคโนโลยีนั้น ๆ มากอน ทั้งนี้อาจจําเปนมีการฝกอบรม(Trainning) สําหรับผูออกแบบที่ยังขาดประสบการณที่เพียงพอ• ทางเลือกซื้ออุปกรณตาง ๆ ที่จะนํามาใชงานในระบบ (Component Supply) ซึ่งอุปกรณแตละตัวอาจมีความยากงายในการสั่งซื้อที่ไมเหมือนกัน รวมทั้งความสามารถในการทดแทนกันไดของอุปกรณบางตัวที่อยูในระบบ• ขอจํากัดทางดานกายภาพ (Physical Constraints) ตาง ๆ เชนขนาด น้ําหนักเพื่อใหไดตามที่ตองการเหมาะสมกับบรรจุภัณฑ หรือเหมาะสมกับการใชงานในลักษณะตาง ๆ ที่อาจเปน Portable หรือHandheld เปนตน• ขอจํากัดทางดานพลังงาน (Power Consumption Constraint) ที่อุปกรณแตละตัวจําเปนตองการพลังงานไฟฟาจากแหลงตาง ๆ ซึ่งอาจมีอยูอยางจํากัด เชนแบตเตอรี ทําใหการออกแบบตองการวงจรที่กินไฟนอย เพื่อใหสามารถทํางานไดนาน หรือเปนผลดีตอสภาพแวดลอมเมื่อเปรียบเทียบระหวางการออกแบบระบบดวย ASIC และ Standard Product IC แลว อยางแรกจะตองใชเงินทุนคอนขางสูงในการผลิต ตั้งแตขั้นตอนของการออกแบบ ซึ่งจะตองระมัดระวังเปนอยางมาก มีการจําลองการทํางาน (Simulation) หรือการทํา Rapid prototyping จนกระทั่งแนใจในการทํางานไดในระดับหนึ่งกอนที่จะทําการสงไปทําการ Fabricatation เพราะการแกไขในแตละครั้งจะทําใหเกิด Non-recurringengineering costs (NRE) ซึ่งเปนคาใชจายในการสรางชิพที่เกิดขึ้นใหมทั้งหมด ในแตละรอบของการแกไขถือวาคาใชจายที่เกิดขึ้นเนื่องจากการไมสามารถทําซ้ําได แต ASIC ชิพมีขอไดเปรียบในแงของการสราง5


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• CMOS: Complementary Metal Oxide Semiconductor (NMOS + PMOS)• BiCMOS: BipolarCMOS (bipolar + CMOS)ปจจุบันวงจรดิจิตอลนิยมสรางขึ้นบนแผนซิลิคอนเวเฟอร ( Si wafer) ดวยลักษณะของวงจร CMOS logicเนื่องจากกระบวนการสรางทรานซิสเตอรประเภท MOS (Metal Oxide Semiconductor) ทําไดงายกวาทรานซิสเตอรประเภท Bipolar และเมื่อนําทั้ง NMOS และ CMOS มาทํางานรวมกันเปนลักษณะของComplementary (ใหทํางานสลับกัน) สามารถทําใหวงจรนี้กินไฟนอยกวาวงจรลอจิกอื่น ๆรูปที่ 1.3 ตัวอยางวงจรลอจิกเกตที่เปน CMOS 2อุปกรณลอจิกที่โปรแกรมไดในอดีตที่ผานมา การใชงานวงจรลอจิก สามารถสรางขึ้นมาไดดวยการนําเอาอุปกรณไอซีลอจิกแตละเบอร(เชนใน 74 TTL series หรือ 4000 CMOS series) ที่ทําหนาที่ตาง ๆ กัน มาประกอบเขาดวยกันบนบอรดPCB (Print circuit board) ซึ่งเหมาะกับวงจรที่ไมสลับซับซอนมากนัก เนื่องจากขอจํากัดหลาย ๆ อยาง เชนขนาดของวงจรบนแผน PCB ขอจํากัดของแหลงจายไฟ จํานวนชิพไอซีบนแผนวงจรเปนตน ในกรณีที่เปนระบบใหญ ที่มีความซับซอนของวงจรมากนั้น อาจจะตองออกแบบแตละสวนแยกกันในแผนวงจรหลาย ๆแผน แลวนํามาเชื่อมตอกันเปนระบบอีกที หรือหากมีขอจํากัดของพื้นที่และไฟเลี้ยงแลว ก็อาจจะตองสราง2 กรณีของวงจรลอจิกที่สรางขึ้นในลักษณะของ CMOS โดยธรรมชาติของวงจรแลว คาของเอาทพุทที่ไดจะเปนคาที่กลับ (Invert)8


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ในลักษณะของ ASIC ชิพ ซึ่งทําใหเกิดคาใชจายในการดําเนินการทั้งการออกแบบ (Layout) และการสราง(Fabrication) ที่สูงมากอุปกรณลอจิกที่โปรแกรมได หรือ Programmable Logic Device (PLD) ไดถูกพัฒนาขึ้นมาเพื่อใหสามารถสรางวงจรลอจิกใหมีขนาดเล็กภายในชิพไดเอง โดยไมตองนําเอาอุปกรณแตละตัว (Discreate device) มาประกอบกันบนแผน PCB และไมจําเปนตองทําในลักษณะของ ASIC ชิพ โดยเริ่มจากโครงสรางที่เปนAND-OR plane เพื่อแทนโครงสรางของสมการบูลีนที่เปน Sum of Product เชน z = abc + de + acdโดย AND plane จะใหผลลัพธที่เกิดจากการ AND กันของอิทพุทกอน (เรียกวา Product) สวน OR planeจะเปนการนําเอาผลลัพธเหลานั้นมา OR กัน หรือรวมกันนั่นเอง ซึ่งผูใชงานสามารถกําหนดการโปรแกรมจุดเชื่อมตอตาง ๆ เพื่อทําการ AND หรือ OR กันตามลักษณะของสมการบูลีนที่ตองการรูปที่ 1.4 โครงสรางของ AND-OR planeสําหรับอุปกรณลอจิกที่โปรแกรมได (Programmable Logic) สามารถแบงประเภทไดดังนี้Simple Programmable Logic Device (SPLD)เปนอุปกรณลอจิกที่โปรแกรมได ที่ไดมีการผลิตขึ้นมาใชงานในชวงแรก อุปกรณประเภทนี้แยกเปนหลาย ๆลักษณะไดแก PLA (Programmable Logic Array), PAL (Programmable Array of Logic) และ GAL(Generic Array of Logic) โดยแตละประเภทมีความแตกตางกันดังนี้คือ9


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• PLA: โครงสรางของ PLA จะเปนลักษณะ AND-OR plane ดังรูปที่ 1.4 โดย AND planeประกอบดวย AND gates หลาย ๆ ตัว (ตัวละหลาย ๆ อินพุท) ซึ่งจะเชื่อมตอกับอินพุทใดก็ไดจากการโปรแกรมซึ่งกําหนดโดยผูออกแบบ สวน OR plane ประกอบดวย OR gates หลาย ๆ ตัว (ตัวละหลาย ๆ อินพุท) ซึ่งจะเชื่อมตอกับผลลัพธจาก AND plane อีกที เพื่อใหออกมาเปนโครงสรางของสมการบูลีนที่เปนลักษณะของ Sum of Product นั่นเองในตอนเริ่มแรก จุดตัด (Crossover points) ตาง ๆ จะยังไมมีการเชื่อมตอใด ๆ จนกระทั่งมีการโปรแกรมเกิดขึ้น ซึ่งจะเปนการกําหนดจุดเชื่อมตอในวงจรที่ตองการโดยผูใชงานผานทางเครื่องมือหรือซอฟทแวรที่ชวยในการออกแบบ (Design tools)• PAL: มีโครงสราง AND-OR plane เหมือนกับ PLA แตสิ่งที่แตกตางกันคือมันสามารถโปรแกรมไดเพียง AND plane เทานั้น สวน OR plane จะมีการเชื่อมตอที่กําหนดขึ้นมาแลวแตบริษัทผูผลิตซึ่งทําใหราคาต่ํากวา การออกแบบงายกวาเนื่องจากมีจุดที่จะตองโปรแกรมนอย แตขอเสียก็คือมีความยืดหยุน หรือความสามารถในการใชงานเปนวงจรประเภทตาง ๆ ไดนอยกวา PLA• GAL: ทั้ง PLA และ PAL ที่กลาวมากอนหนานี้ เปนอุปกรณที่สามารถโปรแกรมไดเพียงครั้งเดียวเรียกวา OTP (One Time Programmable) เนื่องจากโครงสรางหนวยความจําภายในเปน PROMดังนั้นจะไมสามารถเปลี่ยนแปลงแกไขไดอีกหลังจากการโปรแกรมเขาไปเรียบรอยแลว ดังนั้นGAL จึงถูกพัฒนาขึ้นมาเพื่อกําจัดขอเสียนี้ไป โดย GAL จะใช EEPROM แทนจึงสามารถทําการโปรแกรมเพื่อใชงานตาง ๆ ไดหลายครั้งComplex Programmable Logic Device (CPLD)ความซับซอนของวงจรที่มีมากขึ้น ทําใหมีการเพิ่มจํานวนเกตที่อยูภายในของอุปกรณประเภท PLD เพื่อรองรับการใชงานใหไดมากขึ้น เรียกวา CPLD ที่มีโครงสรางภายในที่ประกอบดวยกลุมกอนของลอจิกยอยๆ ที่มีโครงสรางเปน AND-OR plane เรียกวา Logic Block กระจายอยู และสามารถเชื่อมตอกันไดดวยวงจรเชื่อมตอที่สามารถกําหนดเสนทางได เรียกวา Programmable Interconnect ดังแสดงในรูปที่ 1.510


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 1.5 โครงสรางโดยทั่วไปของ CPLDLogic Block หรือบางครั้งอาจเรียกวา Functional Block ที่ภายในประกอบดวย Macrocell ที่มีโครงสรางคลายกับ PLA หรือ PAL ที่เปน AND-OR plane นอกจากนี้ก็จะมีรีจิสเตอร หรือมัลติเพลกเซอร ที่สวนของสัญญาณเอาทพุท โดยที่การออกแบบโครงสรางวงจรที่โปรแกรมไดนี้ จะตองคํานึงถึงความยืดหยุนสามารถรองรับการใชงานหลาย ๆ ประเภทมากที่สุดสวนของการเชื่อมตอ Interconnect อาจแบงไดเปนสองลักษณะคือ Local Interconnect ที่เปนการเชื่อมตอที่เกิดขึ้นภายในตัว Macrocell เอง และ Global Interconnect ที่เปนการเชื่อมตอระหวาง Macrocells ตาง ๆภายในชิพ รวมถึง I/O Blocks ที่เปนสวนที่เชื่อมตอรับสงสัญญาณขอมูลตาง ๆ กับโลกภายนอก ซึ่งผูใชงานสามารถโปรแกรมกําหนดเสนทางการเชื่อมตอตาง ๆ ได เพื่อใหไดวงจร หรือระบบที่ทํางานตามที่ตองการField Programmable Gate Array (FPGA)FPGA ยอมาจาก Field Programmable Gate Array ถูกพัฒนาขึ้นมาโดยมีความซับซอนมากกวา CPLD หรือSPLD และมีโครงสรางที่เปลี่ยนไปจากเดิมที่เปน AND-OR plane นอกจากนี้ยังเปนตัวอุปกรณชิพวงจรรวมที่สามารถเปลี่ยนไดในลักษณะทั้งบางสวนของชิพ (Partially) หรือทั้งหมด (Completely) เมื่อมีการโปรแกรมเขาไป โดยสวนที่เปลี่ยนแปลงไดจะเปนตัววงจรยอยที่โปรแกรมได (Configurable Logic Block) และมีการเชื่อมตอ โดยใชการควบคุมสวิทชที่สามารถโปรแกรมเลือกทิศทาง (Matrix Switches) ตาง ๆ ได เพื่อใหไดลักษณะของวงจรที่ตองการ รูปที่ 1.6 แสดงโครงสรางภายในของตัวชิพไอซีที่เปน FPGA (ReconfigurableDevice)11


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 1.6 โครงสรางโดยทั่วไปของ FPGAFPGA ถูกประดิษฐขึ้นตัวแรกในป คศ 1985 เพื่อขยายความสามารถใหมากกวา PLA/PLD(Programmable logic array/Programmable logic device) ในแงของจํานวนความจุของเกต และความเร็วสําหรับการรองรับการใชงานในระบบที่มีความซับซอนมากขึ้นเรื่อย ๆ สามารถนํามาใชงานเปนฮารดแวรที่สามารถโปรแกรม (Programmable) หรือเปลี่ยนลักษณะของการทํางานได (Reconfigurable) ทําใหมีความยืดหยุนในการใชงานสูง สามารถโปรแกรมใหมไดตลอดเวลา จากจํานวนความจุเกตไมกี่รอยตัว ตอนนี้สามารถทําไดเปนหลายลานตัว ในชิพ FPGA เพียงตัวเดียวที่รอการโปรแกรมใหทํางานไดในลักษณะตาง ๆตามที่ตองการโครงสรางของตัว FPGAสําหรับ FPGA เปนวงจรรวมที่มีโครงสรางภายในประกอบไปดวย “ลอจิกเซลล” (Logic cell) ที่สามารถโปรแกรมไดเปนจํานวนมาก ในแตละคายของผูผลิต เชน Altera Xilinx หรือ Actel อาจเรียกชื่อลอจิกเซลลตาง ๆ กัน เชน CLB configurable logic block, LE logic element, PLB programmable logic block เปนตน โดยชิพ FPGA แตละเบอร จะมีจํานวนลอจิกเซลลแตกตางกันออกไปขึ้นอยูกับความตองการของผูใช มีใหเลือกตั้งแตไมกี่พันลอจิกเซลล ไปจนถึงหลาย ๆ แสนลอจิกเซลล เชื่อมตอกันแบบเมทริกซ (Matrix) ดังรูปที่ 1.7 และเมื่อลอจิกเซลลภายในชิพ FPGA ถูกนําไปใชงาน การเชื่อมตอทั้งภายใน และภายนอกของลอจิกเซลลก็จะทําไดโดยการปด-เปด Transistor switch ที่กําหนดไดโดยลอจิก “0” หรือ “1” ที่เก็บไวใน12


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>เซลลหนวยความจํายอย (Memory cell) ที่ตอกับขาเกตของสวิทชตัวนั้น เพื่อเลือกใชลอจิกเซลลภายในตามที่เราไดออกแบบวงจรไวไดอยางอิสระ ดังนั้นเราสามารถจําแนกประเภทของ FPGA ไดเปนสองลักษณะใหญตามประเภทของ Memory cell คือ RAM-based และ ROM-based นั่นเองรูปที่ 1.7 – FPGA: Configurable Logic Element Grid (CLB = LE = PLB = LB)สวนประกอบพื้นฐานของตัว FPGA สามารถแบงไดเปน1. สวิทชเมตริกซ (Switch Matrix) ถือวาเปนสวนที่กินเนื้อที่มากที่สุดในชิพ FPGA เนื่องจากจะตองทําการสรางทางเชื่อมตอที่เปนไปไดใหมากที่สุด ทั้งนี้เพื่อรองรับการใชงานในการสรางวงจรไดอยางหลากหลายนั่นเอง ซึ่งโครงสรางที่จะใชเชื่อมตอนั้นแบงไดเปนสองลักษณะใหญ ๆ คือ LocalInterconnect ที่เปนการเชื่อมตอภายในลอจิกเซลลเอง และ Global Interconnect ที่เปนการเชื่อมตอระหวางลอจิกเซลลตาง ๆ นอกจากนี้ยังอาจมีโครงสรางการเชื่อมตอพิเศษสําหรับเปนเสนทางดวนในการรับสงขอมูล หรือโครงสรางการเชื่อมตอสําหรับสัญญาณนาฬิกาที่ตองการกระจายตัวตลอดทั่วทั้งชิพเทา ๆ กันรูปที่ 1.8 แสดงรูปขยายของสวิทชเมตริกซที่ประกอบดวยทรานซิสเตอร ที่ทํางานใน13


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>สวนประกอบที่สําคัญของลอจิกเซลล นอกจาก LUT ที่จะใชเพื่อสรางวงจรลอจิกเกตในลักษณะ Combincational Logic แลว ยังมีตัวรีจิสเตอร (Register) ที่สามารถสรางเปนวงจรSequential Logic ได นอกจากนั้นอาจจะมีตัว Multiplexer หรือตัวที่ใชเชื่อมตอกับลอจิกเซลลอื่นๆ เพื่อประกอบเปนวงจรใหญ ๆ เชน Carry logic สําหรับการสรางเปนฟงกชันพีชคณิต(Arithmatic functions) หรือ Expansion logic สําหรับการสรางฟงกชันบูลีนที่มีมากกวา 4 อินพุทเปนตน สําหรับการใชงาน LUT เพื่อสรางวงจรลอจิกใหทํางานตามที่เราตองการนั้น ทําไดเหมือนกับเรากําหนดตารางคาความจริงของวงจรลอจิกเกตนั้น ๆ เขาไปโดยตรงที่ LUTดังนั้นแอดเดรส (Address) แตละแอดเดรสของ LUT ก็เสมือนเปนแตละเงื่อนไขของอินพุทที่สามารถเปนไปไดในแตละกรณี สวนคาที่กําหนดไวในแตละแอดเดรสของหนวยความจําก็เสมือนเปนคาของเอาทพุทที่จะเกิดขึ้นในตารางคาความจริงนั่นเอง ตัวอยางในรูป 1.9 (ข) ที่เราตองการสรางวงจรลอจิกเกตที่ประกอบดวย NAND gate, AND gate และ OR gate ตอกัน โดยมีอินพุท 4อินพุทคือ A, B, C และ D ตามลําดับ ซึ่งการทํางานของวงจรนี้ เปนไปตามคาในตารางคาความจริงทางดานซายมือที่มีอินพุทเปนคาแอดเดรส ตั้งแต “0000” – “1111” รวมทั้งหมด 16 กรณีของอินพุทที่เปนไปได สวนเอาทพุทของวงจรลอจิกเกตนั้นก็จะเปนคาที่ถูกเก็บไวในแตละแอดเดรสนั่นเอง ขอดีของการใชงาน LUT แทนAND-OR plane เพื่อสรางลอจิกเกตตาง ๆ นั้น มีสองขอใหญ ๆ คือดีเลยของวงจรจะนอยลง เปนคา Access delay time (เวลาที่ใชในการเขาถึงขอมูล) ของ LUT แทน และเราสามารถสรางวงจรไดแตกตางกันถึง 2 16 รูปแบบดวยกัน (อยูบนสมมุติฐานที่วา แตละรูปแบบวงจรจะทําใหเกิดรูปแบบของเอาทพุทที่แตกตางกัน ตั้งแต “0000 0000 0000 0000”, “0000 0000 0000 0001”, …, “11111111 1111 1111” รวมทั้งหมด 2 16 รูปแบบ โดยแตละรูปแบบสามารถกําหนดไวที่แอดเดรสทั้ง 16แอดเดรสของ LUT นั่นเอง) รูป 1.9 (ค) แสดงถึงการดีโคด(Decode) คาแอดเดรสโดยใช Multiplexer 2-to-1 หลาย ๆ ตัว เพื่อที่จะนําคาของขอมูลในแตละแอดเดรสออกมาที่เอาทพุท การโปรแกรมฮารดแวรหรือที่เรียกวา Configuration ในตัว FPGA นั้นจะเปนการกําหนดคาใน Memory cell นอกจากที่ Switch Matrix เพื่อเปนการกําหนดเสนทางการเชื่อมตอสัญญาณแลว ก็จะมีที่ LUT และที่ตัว Multiplexer ในลอจิกเซลล เพื่อเปนการกําหนดการทํางานของวงจรลอจิกเกตนั่นเอง15


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>(ก) โครงสรางของ Logic cellA B C D Z0 0 0 0 00 0 0 1 10 0 1 0 10 0 1 1 10 1 0 0 00 1 0 1 10 1 1 0 10 1 1 1 11 0 0 0 01 0 0 1 11 0 1 0 11 0 1 1 11 1 0 0 01 1 0 1 01 1 1 0 0Truth-tableABCDABCDLUTLUT implementationGate implementationZZ(ข) การใชงาน LUT ขนาด 4-input(ค) โครงสรางของ LUT ขนาด 3-input และการ Decode คาแอดเดรส16


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 1.9 โครงสรางและการทํางานของลอจิกเซลลที่เปน LUT3. ขาอินพุท เอาทพุท (I/O Pin) เปนสวนประกอบหลักสําคัญอีกอันหนึ่ง ที่จะใชในการเชื่อมตอวงจรภายในชิพ FPGA ไปยังโลกภายนอก โดยแตละขาของ I/O block สามารถโปรแกรมใหทําหนาที่ตาง ๆ ไดไมวาจะเปน Uni-directional port ที่อาจเปนอินพุท หรือเอาทพุท หรือ Bi-directionalport ที่เปนไดทั้งอินพุท และเอาทพุท ผูใชงานสามารถกําหนดใหเปน Pull-up/down, HighImpedance, Output/input registered ดังนั้นสวนประกอบหลักของ I/O block ก็จะมีตัวตานทานสําหรับใช Pull-up/down ตัวรีจิสเตอร ตัว Tri-state buffer และ Multiplexer ดังรูปที่1.10 ขาแตละขาสามารถยังสามารถกําหนดใหใชงานใหเหมาะสมกับลักษณะของการอินเทอรเฟสกับวงจรภายนอก เชน TTL, LVTTL, LVDS, PCI, PCIexpress, Gigabit Ethernet,Multi-gigabit transceiver เปนตน นอกจากนี้จะมีพอรตใชงานเฉพาะสําหรับสัญญาณนาฬิกาGlobal Clock ที่จะจายไปยังสวนตาง ๆ ของวงจร โดยมันจะถูกออกแบบใหมีดีเลยเกิดขึ้นนอยที่สุดThree-StateFF EnableClockSet/ResetD QECSRThree-StateControlOutputFF EnableD QECSROutput PathDirect InputFF EnableRegisteredInputQDECInput PathSRรูปที่ 1.10 โครงสรางของ I/O blockเนื่องจากเทคโนโลยีที่กาวหนาขึ้น ทั้งทางดานการผลิตชิพ และความสามารถของเครื่องมือที่ใชในการออกแบบ Design tools ชิพ FPGA ในปจจุบันประกอบดวยสวนตาง ๆ มากมาย เพิ่มขึ้นมานอกจากลอจิกเซลลพื้นฐาน เพื่อใหสามารถสรางเปนระบบทีซับซอนภายในชิพเพียงตัวเดียว ที่เรามักเรียกวา SoPC17


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>(System on a programmable <strong>chip</strong>) ตัวอยางเชน DSP blocks ที่เปนตัวคูณ 18 บิต ที่สามารถทํางานได 250ลานครั้งตอวินาที, Soft-cores ที่สามารถเลือกใชเลย, บล็อกฟงกชันตาง ๆ (Multipliers, ALUs) หรือหนวยความจํา (Memory blocks) ปจจุบันบริษัทที่ผลิต FPGA ชั้นนําของโลกทั้ง Altera และ Xilinx ตางผลิตชิพที่มี Hard processor core อยูภายในพื้นที่บางสวนของชิพ โดยจะถูกลอมรอบดวยลอจิกอารเรยที่สามารถโปรแกรมได ออกมารองรับการใชงานที่เปนการผสมผสานระหวางฮารดแวรและซอฟทแวรตัวอยางเชน Excalibur device ของ Altera ที่มี 32-bit ARM922T processor (200 MHz) หรือ Virtex IIPro ของ Xilinx ที่มี 32-bit IBM PowerPC405 (400MHz) ฝงอยูภายใน โดยที่ Embedded processorcore เหลานี้จะแทนสวนของซอฟทแวร และลอจิกอารเรยที่ลอมรอบอยูจะแทนสวนของฮารดแวรของระบบแตแนนอนวาชิพลักษณะนี้มีราคาที่สูงมาก ๆ ทางเลือกอีกอยางหนึ่งก็คือสรางโปรเซสเซอรขึ้นมาเปนลักษณะของ Soft processor core โดยใชลอจิกอารเรยบางสวนมาทํา เชน NIOS processor ของ Alteraหรือ Microblaze ของ Xilinx เปนตนตัว FPGA ชิพมีพอรต I/O ใหใชงานอยางมากมาย และเขากับหลาย ๆ มาตรฐาน บางพอรตสามารถทําหนาที่ในการสงผานขอมูลแบบอนุกรมที่ความเร็วสูง เปนหลาย ๆ พันลานบิตตอวินาที (Multi-gigabittransceivers) ตัวลอจิกเซลลที่ประกอบเปนวงจรตาง ๆ สามารถทํางานที่ความถี่สูง 200-400MHz ซึ่งอาจดูเหมือนวาจะเปนความถี่ที่ชากวา CPU clock ในปจจุบัน แตเนื่องจากการทํางานใน FPGA ชิพเปนลักษณะของฮารดแวรที่สามารถทําไดพรอม ๆ กันเปนแบบขนาน จึงทําใหการทํางานที่ความถี่ 300 MHz นั้นเร็วกวา1-GHz 32-bit processor (ที่ตองทําการประมวลผลโปรแกรมทีละบรรทัด) หลาย ๆ เทาเลยทีเดียว ดังแสดงในรูปที่ 1.11รูปที่ 1.11 เปรียบเทียบลักษณะการทํางานในซอฟทแวร (CPU) และฮารดแวร (FPGA)18


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ผูผลิต FPGA คือ Altera และ Xilinx มีสวนแบงตลาดรวมกันถึงเกือบ 90 เปอรเซนตคิดเปนมูลคาหลายพันลานเหรียญ แตละคายนั้นมีตัวอุปกรณออกมาใหใชงานอยูเรื่อย ๆ ในตารางที่ 1.1ตัวอยางชิพที่สรางโดยใชเทคโนโลยีการผลิตเปน 90nm คือ Xilinx Virtex-4 และ Altera Stratix-II ตามลําดับตารางที่ 1.1 ตัวอยาง FPGA ชิฟตระกูล Virtex-4 และ Stratix-IIDevice Xilinx Virtex-4 Altera Stratix-IIจํานวนขา I/O pins 960 1170จํานวนลอจิกเซลล* >200000 179000RAM ภายใน 10Mbits 9.6MBitsDSP block (18x18 mult/accu) 192 380ตัวจัดการสัญญาณนาฬิกา 20 12ความเร็วในการสงขอมูลแบบอนุกรม 622Mb/s – 11.1Gb/s Up to 1Gb/s*1 ลอจิกเซลลประมาณไดเทากับ 20-25 ลอจิกเกตตัวแปรสําคัญอันหนึ่งที่ทําใหตัว FPGA ไดรับความสนใจเพิ่มขึ้นเปนอยางมากในชวงเวลาไมกี่ปมานี้นอกจากจะเปนความสามารถในการโปรแกรมได หรือความหนาแนนของเกตที่ใชงานไดเปนหลาย ๆ ลานตัวในชิพตัวเดียวทําใหรองรับการออกแบบที่ซับซอนในปจจุบันไดแลว ความเร็วในการโปรแกรม หรือคอนฟกกูเรชัน ที่ลดลงจากวินาที เปนมิลลิวินาที ก็เปนตัวดึงดูดการใชงานจากผูออกแบบ ที่ตองการความเร็วในการทดสอบวงจร หรือระบบ โดยการโปรแกรมเขาไปในชิพ ซึ่งสามารถทําไดตลอดเวลาโดยไมมีความเสี่ยง หรือคาใชจายใด ๆ ทั้งสิ้น นอกจากนี้เวลาการโปรแกรมตัวฮารดแวรที่สั้นลง ยังทําใหผูออกแบบสามารถใชงานระบบไดในลักษณะของ Run-time Reconfiguration ซึ่งเปนการใชทรัพยากรของระบบไดคุมคาที่สุดเนื่องจากสามารถเปลี่ยนฟงกชันการทํางานของ FPGA ชิพโดยอาจจะเปนตัวเดียวกัน หรือตัวอื่น ๆ ที่อยูในระบบ ในขณะที่มีการทํางานการออกแบบการออกแบบวงจรดิจิตอลดวย FPGA นั้นตางกับการออกแบบซอฟทแวรสําหรับตัวโปรเซสเซอร เนื่องจากเปนลักษณะการออกแบบฮารดแวรที่สามารถกําหนดโครงสรางสถาปตยกรรมของระบบที่จะใชงานไดรวมทั้งการทํางานของฟงกชันในแตละบล็อกที่สามารถทํางานไดพรอม ๆ กันแบบขนาน แทนที่จะเปน19


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ซอฟทแวร หรือตัวโปรแกรมที่จะตองถูกประมวลผลทีละคําสั่ง โดยทั่วไปการออกแบบวงจรดิจิตอลสําหรับการสรางหรือโปรแกรมในตัว FPGA มีองคประกอบ 4 สวนหลัก ๆ ดวยกันคือรูปที่ 1.12 ขั้นตอนการออกแบบบน FPGA1. Design Entry เปนขั้นตอนของการรับขอมูลของการออกแบบเขาไปในระบบ โดยทั่วไปสามารถทําไดหลาย ๆ ทาง เชน โดยใช Schematic <strong>design</strong> entry ดึงอุปกรณมาจากไลบารีของ FPGA หรือโดยใชภาษา <strong>HDL</strong> อยางเชน V<strong>HDL</strong> หรือ Verilog ซึ่งการออกแบบโดยใชภาษาชั้นสูงนั้นมีขอดีกวาก็คือ ไมขึ้นกับเทคโนโลยี หรือตัวชิฟที่จะถูกโปรแกรม ดังนั้นผูออกแบบไมจําเปนตองกังวลถึงอุปกรณที่มากับเทคโนโลยีนั้น นอกจากนั้นการอธิบายการทํางานโดยใชภาษาชั้นสูง ผูออกแบบไมจําเปนตองรูถึงลักษณะการเชื่อมตอของวงจร ตัวอยางเชน ถาตองการสรางตัวบวก (Adder) ที่ทําการบวกขอมูล a กับ b เขาดวยกัน ก็เพียงแคเพิ่มบรรทัด z=a+b; เขาไปเทานั้น สวนการทดสอบความถูกตองเปนในลักษณะการตรวจสอบระดับฟงกชันการทํางาน (Functional simulation) โดยใชซอฟตแวรสําหรับจําลองการทํางาน ซึ่งจะไมมีขอมูลเกี่ยวกับดีเลยใหเห็น2. Synthesis ขั้นตอนนี้จะเกี่ยวของกับการแปลงแบบที่ไดออกแบบจาก Schematic หรือ <strong>HDL</strong> ใหเปนวงจรลอจิก โดยจะมีขึ้นตอนยอย ๆ คือการสังเคราะหวงจร (Logic synthesis) ซึ่งโดยปกติแลว20


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>จะมีขั้นตอนการ optimization ดวยเพื่อใหไดวงจรที่ใชทรัพยากรนอยที่สุด หรือทํางานไดเร็วที่สุดผลลัพธจากขั้นตอนนี้จะเปน EDIF (Electronic <strong>design</strong> intermediate form) ซึ่งเปนไฟลที่อธิบายการเชื่อมตอ (Netlist) และยังไมขึ้นกับเทคโนโลยี นั่นหมายถึงวาเปนมาตรฐานที่ตัวเครื่องมือในการออกแบบ (Design tools) สวนมากจะสามารถเขาใจไฟลชนิดนี้ได การจําลองการทํางานในขั้นตอนนี้จะเปนลักษณะของ Post-synthesis simulation ซึ่งจะไมมีขอมูลเกี่ยวกับดีเลยใหเห็นเชนกัน แตผลการจําลองจะไดมาจาก EDIF ไฟล3. Implementation หลังจากได Netlist file มาแลว จะเปนการแมป (Map) ใหเขากับเทคโนโลยี หรือตัวชิฟที่จะใชงาน (Technology mapping) เชนโดยสวนมากแลว FPGA จะเปนเทคโนโลยีแบบLUT (Look-up table) และหลังจากนั้นก็จะทําการวางตําแหนง (Placement) ของลอจิกตามที่ลอจิกเซลลตาง ๆ แลวทําการเชื่อมตอสายสัญญาณ (Routing) กอนที่จะไดไฟลสําหรับโปรแกรมลงชิป (Reconfiguration file) การจําลองการทํางานในระดับนิ้จะสามารถดูดีเลยตามจุดตาง ๆ ไดหลังจากมีการสรางขึ้นจริง ๆ ตามเทคโนโลยี หรือตัวชิฟที่จะใชงาน4. Hardware Program การโปรแกรมอุปกรณหรือชิฟ FPGA นั้นเราสามารถทําไดเอง ไดทันที ดังรูปที่ 1.13 รวมทั้งการปรับเปลี่ยนแกไขไดตลอดเวลา โดยกลับไปทําตั้งแตตน กอนที่จะทําการโปรแกรมทดสอบการทํางานจริง ๆ ไดโดยไมมีคาใชจาย หรือความเสียหายเกิดขึ้น ซึ่งเหมือนกับไมโครคอนโทรเลอรนั้นเอง ดังนั้นชิฟ FPGAจึงอาจถูกเรียกวาฮารดแวรที่สามารถโปรแกรมได(Reprogrammable hardware)21


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตาราง 1.2 เปรียบเทียบความสามารถในดานตาง ๆMicrocontroller FPGA ASICความเร็ว Speed ชา เร็ว เร็วมากพลังงาน Power นอย ปานกลาง นอยมากราคา Cost นอยมาก ปานกลาง มากเวลาพัฒนา Development time นอย นอย มากความยืดหยุน Flexibility มาก ปานกลาง-มาก นอยจากขอไดเปรียบเสียเปรียบตาง ๆ จึงทําใหอุปกรณแตละชนิดมีความเหมาะสมกับงานประเภทตาง ๆ กัน ถาหากเปนงานที่ไมตองการความเร็วมาก และมีงบประมาณที่คอนขางจํากัด เชน ชุดควบคุมอุปกรณขนาดเล็กก็ควรจะใชไมโครคอนโทรลเลอรที่มีราคาถูก แตถาเปนงานที่ตองการความเร็วสูง และใชการประมวลผลขอมูลที่มาก ตองการการสงผานขอมูลที่เร็ว เชน งานทางดาน DSP (Digital signal processing) งานทางดานการประมวลผลภาพ (Image processing) การบีบอัดขอมูล (Data compression) ก็ควรที่จะเลือกใช FPGAซึ่งปจจุบันมีการรวมเอาอุปกรณตาง ๆ เขาไวในชิฟ (เชน RISC processor, Memory, DSP block, Multigigabittransceiver) ทําใหสามารถออกแบบเปนลักษณะของระบบใหญบนชิฟเดียวไดที่เรียกกันวา SoPC(System on a Programmable Chip)23


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Chapter2บทที่ 2. ภาษาที่ใชในการออกแบบ(Design Language)ภาษาที่ใชในการออกแบบ หมายรวมถึงทั้งการออกแบบโปรแกรมซอฟทแวร และการออกแบบวงจรที่เปนฮารดแวรถูกพัฒนาขึ้นมาเพื่อที่จะอธิบายขั้นตอนการทํางานตาง ๆ ในระบบโดยใชเครื่องมือนั่นก็คืออักษร (Text) มาประกอบกันเปนคําสั่ง และกําหนดเปนรูปแบบการเขียนไวยกรณตาง ๆ เพื่อที่จะใชในการอธิบายการทํางาน หรือสิ่งตางๆ ที่เกิดขึ้นในระบบ มีภาษาตาง ๆ มากมายหลาย ๆ ระดับทั้งเปนภาษาระดับสูงที่เขาใจไดงายคลายกับภาษาที่เราใชงาน หรือเปนภาษาระดับต่ําลงมาที่ใกลเคียงกับภาษาเครื่อง ก็ไดพัฒนาขึ้นมาใชงานในการออกแบบตางๆทั้งซอฟทแวรและฮารดแวร บางก็ไมไดรับความนิยม จึงสูญหายไป สวนที่ไดรับความนิยม ก็ไดพัฒนาปรับปรุงและกําหนดเปนมาตรฐานรวมกันภาษาที่ใชในการออกแบบซอฟทแวร ถูกเรียกวา Software Programming Language (SPL) สวนที่ใชในการออกแบบฮารดแวร เรียกวา Hardware Description Language (<strong>HDL</strong>) ซึ่งตามลักษณะของการออกแบบระบบโดยทั่วไปที่อาจมีทั้งฮารดแวร และซอฟทแวรแลว มักจะแยกกันออกแบบอยางชัดเจนโดยใชคนละภาษา ดังนั้นผูออกแบบอาจจะตองแยกกันคนละทีม หรือจําเปนตองรูทั้ง SPL และ <strong>HDL</strong>ปจจุบันไดมีความพยายามในการพัฒนาภาษาชั้นสูงขึ้นกวาเดิม ในระดับที่เปนระบบ (System Level)เพื่อที่จะสามารถใชอธิบายไดทั้งการทํางานของฮารดแวร และซอฟทแวร ไดเกิดขึ้น จากความตองการในการลดความซับซอนยุงยากในการออกแบบออกแบบในระบบใหญ ๆ อีกทั้งยังชวยใหเวลาในการออกแบบลดลงโดยกําหนดการทํางานโดยรวมทั้ง แลวอาศัยเครื่องมือหรือซอฟทแวรที่ชวยในการออกแบบ (Desing Tools)ทําหนาที่ในการสรางหรือสังเคราะหวงจรแทนในระดับลาง เพื่อลดโอกาสผิดพลาดที่เกิดขึ้นในบทนี้จะพูดถึงภาษาตาง ๆ ที่สําคัญ และไดรับความนิยมในการใชออกแบบซอฟทแวร เชน C, C++ หรือภาษาฮารดแวร เชน V<strong>HDL</strong> หรือ Verilog รวมทั้งภาษาที่สามารถใชไดทั้งออกแบบไดทั้งสองอยาง เชนSystemC ดังรูป 2.1 เพื่อใหทราบลักษณะของภาษาโดยคราวกอนที่จะใชงานจริงตอไป24


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 2.1 ภาษาที่ใชในการออกแบบภาษาสําหรับซอฟทแวร (Software Programming Language)เปนภาษาที่ผูใชงานสามารถใชในการออกแบบโปรแกรมซอฟทแวรตาง ๆ ที่ถูกรัน หรือที่ทํางานในตัวโปรเซสเซอร (Target Processor) ตามที่กําหนด ซึ่งอาจจะเปน โปรเซสเซอรทั่วไป (General Processor)ไมโครคอนโทรลเลอร (Microcontroller) หรือตัวประมวลผลสัญญาณดิจิตอล (Digital Signal Processor)เปนตนตัวโปรเซสเซอรที่ใชงานทั่วไป (General Processor) เปนชิพวงจรรวมที่ประกอบดวย CPU (CentralProcessing Unit) และหนวยความจํา (Memory) ขนาดใหญที่สามารถใชงานทั่วไปได โดยอาศัยการแปลความหมายของคําสั่ง (Instructions) ตาง ๆ ที่ทําการโปรแกรมเก็บไวในหนวยความจํา เรียงไปทีละคําสั่งหรือทีละแอดเดรสตามลําดับที่มาจากตัวนับโปรแกรม (Program Counter) โดยสามารถแบงประเภทของ25


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>โปรเซสเซอรไดตามมีรูปแบบของคําสั่งคือ CISC (Complex Instruction Set Computer) หรือ RISC(Reduced Instruction Set Computer) ทั้งนี้การใชงานโปรเซสเซอรสามารถประยุกตใชงานไดในหลาย ๆลักษณะ ตัวอยางที่คุนเคยกันก็คือเครื่องคอมพิวเตอร PC ที่ใชกันอยูในปจจุบันที่มีโปรเซสเซอรของ Intelหรือ AMD เปนชิพประมวลผลอยูภายในสําหรับไมโครคอนโทรลเลอร (Microcontroller) เปนชิพวงจรรวมที่ประกอบดวย CPU และหนวยความจําเหมือนกัน แตจะลดความซับซอนลงมา เพื่อใชในงานระบบที่มีขนาดเล็กลง เชน Embedded System และมีราคาถูก โดยจะเพิ่มความสําคัญของพอรตที่ใชเชื่อมตอกับสัญญาณภายนอก ที่อาจมาจากตัวเซนเซอรตาง ๆหรือสัญญาณควบคุมจากผูใชงาน โดยรูปแบบการเชื่อมตอขอมูลอาจจะเปนแบบอนุกรม หรือแบบขนานหรือเปนรูปแบบการเชื่อมตอเฉพาะเชน CAN (Control Area Network) ที่ใชในรถยนตเปนตนตัวประมวลผลสัญญาณดิจิตอล (DSP) จะมีโครงสรางพิเศษเฉพาะสําหรับงานที่ตองการการคํานวณ หรือประมวลผลขอมูลทางดิจิตอลมาก ๆ โดยอาจมีหนวยคํานวณที่เร็ว และมีรีจิสเตอรสําหรับการเก็บคาจากการคํานวณตาง ๆ มากกวาปกติ สามารถประมวลผล หรือทําการคํานวนในอัลกอริทึมตาง ๆ เพื่อใหไดผลลัพธออกมาในเวลาจริง (Real-time)โดยทั่วไปแลว ซอฟทแวรถูกพัฒนาขึ้นมาเพื่อใชในสองลักษณะดังนี้คือ• เปนซอฟทแวรแอปพลิเคชัน (Application Software) ที่ทํางานบนเครื่องคอมพิวเตอร (PC) หรือเวิรกสเตชัน (Workstation) ที่มีระบบปฏิบัติการ (Operating System: OS) ตาง ๆ ไมวาจะเปนWindows, Unix, MacOS หรือ Linux ซึ่งภาษาที่ใชสําหรับพัฒนาออกแบบซอฟทแวรชนิดนี้มีอยางหลากหลาย รวมทั้งเครื่องมือที่ใชในการพัฒนา (Development tools) เชน Visual Studio .NET• เปนซอฟทแวรแบบฝงตัว (Embedded Software) สําหรับทํางานบนโปรเซสเซอรที่อยูในระบบสมองกลแบบฝงตัว (Embedded System) ที่มักจะใชในงานประเภทที่ตองการการควบคุมตาง ๆ เชนในรถยนต เครื่องซักผา หรือในโรงงานอุตสาหกรรมเปนตน ซึ่งระบบประเภทนี้จะตองการโปรแกรมที่ทํางานในลักษณะ Stand-alone มากกวาที่จะทํางานบนระบบปฏิบัติการ (OS) ชนิดใดชนิดหนึ่ง การพัฒนาโปรแกรมขึ้นมาใชงานจะมีเครื่องมือเฉพาะอยางขึ้นกับตัวโปรเซสเซอรที่จะใช ทั้งนี้ภาษา Cมักเปนที่นิยมใชในการออกแบบ26


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ภาษา Cภาษา C เปนภาษาที่พัฒนาขึ้นมาจากภาษา BCPL และ B ทั้งนี้ภาษา BPCL ถูกพัฒนาโดย Martin Richardsในป 1967 หลังจากนั้น Ken Thompson ไดพัฒนาอีกภาษาหนึ่งขึ้นมาโดยอยูบนพื้นฐานของภาษา BPCLเรียกวา ภาษา B ซึ่งภาษานี้ไดถูกพัฒนาตอมาอีกขั้นเปนภาษา C โดย Dennis Ritchie ใน Bell Laboratoriesและเริ่มใชงานในป 1972 ในระบบ Unix และขยายมาใชงานในระบบปฏิบัติการอื่น ๆ เนื่องจากไดรับความนิยมเปนอยางมากในการใชงาน ทั้งนี้ตัว Microsoft Windows เองก็ถูกพัฒนาขึ้นมาจาก C และสวนตอขยายที่เรียกวา C++ อีกดวย นอกจากใชงานในการออกแบบซอฟทแวรประเภทแอปพลิเคชันตาง ๆ แลว ภาษา Cยังไดรับความนิยมในการออกแบบซอฟทแวรสําหรับระบบสมองกลฝงตัว (Embedded System) อีกดวยตัวมาตรฐานของภาษา C คือ ANSI/ISO Standard C ที่ไดรับการรับรองในป 1989 และมีการปรับปรุงในป1999 ซึ่งทําใหเปนภาษาที่ไดรับความนิยม ใชไดกับโปรเซสเซอรหลาย ๆ ชนิด จึงจัดไดวาเปนภาษาที่ไมขึ้นกับฮารดแวร (Hardware Independent) และสามารถยายไปมา (Portable) ไดในหลาย ๆ ระบบ/********************************************************//* This program simply outputs a line of arbitrary text *//********************************************************/#include void main (void){printf(“Hello World\n”);}/********************************************************//* End of File *//********************************************************/รูปที่ 2.2 ตัวอยางของภาษา Cตัวอยางการใชงานภาษา C สําหรับโปรแกรม “Hello World” แสดงในรูป 2.2 ที่มี 3 บรรทัดแรก และ 3บรรทัดสุดทายเปนการใสหมายเหตุ (Comment) ใหกับตัวโปรแกรมเพื่ออธิบาย ทําใหงายในการทําความเขาใจ หรือการตรวจสอบแกไขโปรแกรมจากนั้นจะเปนการกําหนดการใชงาน include file ที่อาจเปนไฟลมาตรฐานที่เก็บไวในไลบรารี สามารถนํามาใชไดเลย หรือเปนไฟลที่ผูเขียนไดเขียนไวเองเพื่อนํามาใชงานไดหลาย ๆ ครั้งโดยไมตองเขียนใหมทุกครั้ง นั้นคือไฟลที่มีนามสกุล .h เชน stdio.h ดังในตัวอยาง โดยใชคําสั่ง #include 27


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>โปรแกรมเริ่มตนที่คําสั่ง main ซึ่งตัวอยางนี้ไมมีการรับคาเขาไปประมวลผล หรือสงคากลับมาแตอยางใด ๆจึงใชคําวา void (ซึ่งอาจจะไมมีก็ได) เปนการกําหนดการทํางานหลักของโปรแกรม (Main Function)หลังจากนั้นคําสั่งตาง ๆ ของภาษา C ที่กําหนดใหทํางานอยูในฟงกชันหลัก จะถูกเขียนอยูระหวางเครื่องหมายวงเล็บเปด { ที่ใชเปนตัวกําหนดจุดเริ่มตน และไปสิ้นสุดที่วงเล็บปด } ทั้งนี้ในตัวอยางจะมีแคคําสั่งเดียวคือ printf (“ … “); ที่เปนคําสั่งใหพิมพตัวอักขระตาง ๆ ที่อยูระหวางเครื่องหมายอัญญประกาศออกมาที่หนาจอ (Standard output) โดยอักขระสองตัวสุดทาย \n เปนการใหเริ่มตนบรรทัดใหม(Newline) สังเกตุวาเราจะใชเครื่องหมาย Semi colon (;) ในการจบคําสั่งในแตละบรรทัดการพัฒนาโปรแกรมดวยภาษา C นอกจากไลบรารีมาตรฐานแลว ควรจะตองมี Design Environment (DE)ที่ประกอบดวยเครื่องมือตาง ๆ (Toolset) ที่ใหผูออกแบบสามารถเขียนโปรแกรม คําสั่งตาง ๆ ไดอยางสะดวกรวมทั้งแบบ (Template) ของการใชงานคําสั่งตาง ๆ ผูออกแบบสามารถกําหนดใหเปนการออกแบบระบบใหญ ๆ ที่มีไฟลหลาย ๆ ไฟลโดยการกําหนดใหอยูภายใต Project เดียวกัน ทําใหงายในการบริหารจัดการไฟลตาง ๆ รวมไปถึงการคอมไพล การตรวจสอบการทํางาน และการแกไข (Debugging) ที่จะมีเครื่องมือใหผูออกแบบสามารถตรวจแกไขขอผิดพลาดตาง ๆ ไดงายขึ้น เชนการกําหนดใหโปรแกรมทํางานทีละคําสั่งการกําหนดใหหยุดชั่วคราวที่บรรทัดที่เราตองการ เปนตนการพัฒนาโปรแกรมโดยภาษา C สรุปไดเปนขั้นตอนดังนี้1. การเขียนซอรสโคด (Source Code Editing) เปนการพิมพคําสั่งตาง ๆ เขาไปเปนลักษณะของ Textfile ซึ่งอาจจะใช Text Editor ทั่วไป หรือปอนเขาไปใน Design Environment (DE) ซึ่งสวนใหญจะมี Text Editor ใหอยูแลว เชน Microsoft Visual C/C++ สําหรับภาษา C แลวนามสกุลของไฟลซอรสโคดตาง ๆ จะเปน .c2. การคอมไพล (Compilation) ซึ่งเปนกระบวนการในการแปลซอรสโคด ไปเปนภาษาเครื่อง(Machine Laguage) หรืออาจเรียกวา Object code ซึ่งแตกตางกันสําหรับแตละชนิดของโปรเซสเซอร3. การลิงคกับไลบรารี (Linking) เปนกระบวนการที่เกิดขึ้นหลังจากการคอมไพล โดยเปนการเรียกใชงานหรือการลิงค หาคําสั่ง หรือฟงกชันตาง ๆ ที่มีอยูใน Library ตาง ๆอยูแลว ทําใหลดเวลาในการเขียนโปรแกรม ผลลัพธจากกระบวนการนี้จะไดเปน Executable image ที่สามารถรัน หรือทํางานไดโดย ตัว Executable image จะถูกโหลดเขาไปยังหนวยความจํา (RAM) ของระบบกอนการรัน28


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ภาษา C++เปนภาษาที่พัฒนาขยายตอมาจากภาษา C ที่มีลักษณะการเขียนเปน Object-oriented programming (OOP)สําหรับการเขียนออกแบบซอฟทแวรเพื่อใชในงานตาง ๆ โดยจะมี classes และ objects เปนสวนประกอบ ซึ่งจะมองแตละสวนของโปรแกรมที่อาจเปนฟงกชัน หรือชุดของคําสั่ง อยูในกลองหรือเปนวัตถุ (object) อันหนึ่งที่จะตองกําหนดตัวแปร ขอมูล และกระบวนการที่อยูขางใน โดยที่การรับหรือสงผานขอมูลจะกระทําผานตัวแปรรวมตาง ๆ (Variable, Constants, Types) ตามความเหมาะสมความจริง แนวความคิดเกี่ยวกับ object นี้อยูในชีวิตประจําวันรอบ ๆ ตัวเรา ตัวอยางเชน รถยนต ของแตละคน (ที่อยูในประเภท (class) ของยานพาหนะ) ก็ถือวาเปน object หนึ่ง ที่ใชงานในแตละความตองการของแตละคน และมีความแตกตางกันในดานตาง ๆ เชนสี ยี่หอ การใชงาน เปนตน แตก็อาจมีความเหมือนกันในบางลักษณะ (เนื่องจากอยูใน class เดียวกัน) เชนผูผลิต เครื่องยนต หรือประเภทของน้ํามันที่ใช เปนตนอีกตัวอยางหนึ่งที่อยากยกมาสําหรับการอธิบายเพิ่มเติม คือตัวเรา หรือมนุษยนั่นเองที่อาจถือวาเปน objectหนึ่งที่มีความแตกตางกัน เชน รูปราง หนาตา สีผิว เปนตน และมีความเหมือนกัน เชนมีสองตา สองแขนหนึ่งหัว หนึ่งปาก เปนตน มีกระบวนการความคิด หรือการประมวลผลที่แตกตางกัน ตามประสบการณหรือความรูของแตละคน สามารถติดตอสื่อสารกันไดดวยทางวาจา สายตา หรือกริยาทาทางโดยสรุปแลว object เสมือนกลองดํา ที่กระบวนการตาง ๆ จะเกิดขึ้นภายใน สามารถกระทําสิ่งตาง ๆ ได ตามวิธีการที่กําหนดโดยผูใชงาน (user) ไมจําเปนตองรู แตผูใชงานสามารถกําหนดการเขาออกของขอมูล หรือการเชื่อมตอของแตละ object เพื่อใหเกิดกระบวนการทํางานที่เปนระบบใหญ ๆ ขึ้นมาได โดยที่แตละobject ถูกสรางมาจาก class ตาง ๆ โดยที่ class เปนตัวกําหนดประเภท หรือความสามารถในการทํางานตางๆ วาจะเปนไปในลักษณะใดภาษา C++ ถือวาเปน Superset ของภาษา C ที่ไดเพิ่มเติมลักษณะตาง ๆ ใหมีความสามารถที่มากกวาคอมไพลเลอรของ C++ จึงสามารถใชงานไดกับภาษา C ตัวอยางคําสั่งที่แตกตางกันระหวาง C กับ C++ ที่เห็นไดชัดเจนที่สุดคือการรับสงขอมูลกับโลกภายนอก ขณะที่เราเคยใช scanf หรือ printf ในภาษา C แตในC++ คําสั่งจะเปน cin และ cout ตามลําดับดังตัวอยาง//-------------------------------------------------------------------------// C++ source code to prompt a user to enter two integer numbers,calculate29


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>// the sum and difference and to display the results to the standardoutput.//-------------------------------------------------------------------------#include void message1();void message2(void);int sumFunction(int x, int y);int diffFunction(int x, int y);int a = 0;int b = 0;int sum = 0;main() {cout > a;message2();cin >> b;cout


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ภาษา JAVAรูปที่ 2.3 ตัวอยางของภาษา C++ภาษา Java ไดถูกพัฒนาขึ้นมาใชงานตั้งแตป 1995 โดยบริษัท Sun Microsystems โดยมีชุดพัฒนาโปรแกรม(Software development kit) เรียกวา JDK ที่สามารถดาวนโหลดไดฟรี โดยภาษา Java นิยมพัฒนาใชงานกันในซอฟทแวร หรือระบบที่ใชงานผานอินเทอรเนต (Internet-based software systems)ภาษา Java ยังคงใชหลักการของ OOP ในการเขียนโปรแกรมเหมือนกับ C++ แตสิ่งที่แตกตางกันคือการมีลักษณะของ Platform independent ที่หมายถึงโปรแกรมซอรสโคด (Sourcecode) ที่เราเขียนสามารถรันไดกับทุก ๆ ระบบปฏิบัติการ (Operating system) เนื่องจากซอรสโคดจะถูกคอมไพลใหอยูในรูปแบบมาตรฐานที่เรียกวา bytecode ที่สามารถนําไปรันไดกับทุก ๆ เครื่อง เนื่องจากกอนที่จะรันโปรแกรมbytecode นี้ จะตองถูกแปลงโดยตัว Java interpreter ที่อยูในเครื่องแตละเครื่องที่จะใชงานกอน ดังนั้นกระบวนการในการออกแบบโดยภาษา Java จึงมีอยู 3 ขั้นตอน ดังนี้1. เขียน sourcecode ในลักษณะตามไวยากรณของภาษา Java โดยใช Text editor ที่เหมาะสม โดยไฟลจะตองมีนามสกุลเปน .java2. ทําการคอมไพล sourcecode ใหอยูในรูปของ bytecode โดยใช javac โดยที่ลักษณะของ bytecodeนี้จะเปนมาตรฐานใชไดกับเครื่องทุกเครื่องที่ถึงแมใชระบบปฏิบัติการแตกตางกัน เชน Windows,Linux, MacOS หรือ Unix3. ทําการรัน Java bytecode ซึ่งจะมีตัวคําสั่งใหตัวแปร (Interpreter) ทําการประมวลผลใหทํางานตามลักษณะที่ตองการimport java.lang.*;public class HelloWorld {public static void main(String[] arguments) {System.out.println("Hello World");}}รูปที่ 2.4 ตัวอยางโปรแกรมภาษา Java31


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตัวอยางของโปรแกรมที่เขียนดวยภาษา Java ดังรูปที่ 2.4 ประกอบดวย class เดียวที่มีชื่อวา HelloWorldและภายใน class จะประกอบดวยการกระทํา (method) เพียงอยางเดียว ที่เรียกวา main กอนที่โปรแกรมที่ถูกเขียน ในบรรทัดแรกจะมีการเรียกใช package ที่มีชื่อวา java.lang ที่ประกอบดวย class ตาง ๆ ที่เปน userinterface, painting, หรือ image (ความจริงมันจะถูกเรียกใชโดยอัตโนมัติ โดยไมตองมีการกําหนดก็ได)ภาษา Visual BasicVisual Basic หรือ VB เปนภาษาชั้นสูงที่พัฒนาโดย บริษัทไมโครซอฟท สําหรับการพัฒนาโปรแกรมตาง ๆที่รันบนระบบปฏิบัติการ Windows® ทั้งนี้จะมีสิ่งอํานวยความสะดวกในการพัฒนาโปรแกรมที่เรามักเรียกวา Programming Environment ที่ชวยใหผูพัฒนาโปรแกรมสามารถสรางแอปพลิเคชั่น(Applications) ตาง ๆ ดวย GUI (Graphic user interface) ที่ผูใชงานสามารถเห็นรูปรางของสิ่งตาง ๆ ที่ตัวเองออกแบบไดโดยตลอด เชน เมนู หรือปุมตาง ๆ ที่สามารถกําหนดบริเวณที่จะวางได โดยมีการกําหนดการทํางานสิ่งตาง ๆ ดวยการเขียนโปรแกรมในลักษณะของ OOP (Object oriented programming)ซึ่งจะมี class ตาง ๆ ของไมโครซอฟทที่พรอมใชงานVisual Basic คนสวนใหญนิยมใชกัน เนื่องจากงายในการทําความเขาใจ และพัฒนาเปนโปรแกรม ความจริงแลว มันอยูเปนสวนหนึ่งของเครื่องมือ (Tools) ที่ใชในการพัฒนาโปรแกรมของไมโครซอฟท เรียกวาMicrosoft® Visual Studio suite development tools ที่ประกอบดวย Visual Basic, Visual C++, VisualFoxPro เปนตน32


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Item collectionsApplication windowButton’s propertiesรูปที่ 2.5 Visual Basic: <strong>design</strong> environmentการพัฒนาโปรแกรมใชงาน (Applications) ดวย Visual Basic มีสามขั้นตอนหลัก ๆ คือ1. กําหนดขนาด และหนาตาของหนาตางโปรแกรมใชงาน (Application window) โดยจะมีการเลือกสิ่งตาง ๆ เชน เมนู (Menus) หรือปุมลักษณะตาง ๆ (Buttons) ที่วางสําหรับเขียนตัวอักษร (Textboxs) เปนตน ที่มีอยูแลว มาวางดวยขนาด และบริเวณตาง ๆ ตามความเหมาะสม เพื่อใหผูใชงานสามารถใชเมาส หรือคียบอรดในการใชงาน หรือติดตอกับตัวโปรแกรมได (User interfacing)2. เขียนโปรแกรมกําหนดการทํางานของแตละปุม หรือเมนูตาง ๆ โดยมีการกําหนดลักษณะพฤติกรรมการใชงานตาง ๆ เชน การคลิ๊ก หรือดับเบิ้ลคลิ๊กที่ปุม เปนตน3. ทําการคอมไพล เพื่อใหได .exe ไฟล เพื่อที่จะสามารถนําไปใชงานได ในระหวางนี้อาจมีการทดสอบ และการแกไขปรับปรุง (Debugging process) กอนนําไปใชงานจริง33


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ภาษาสคริป (Scripting Languages)ภาษาสคริป เปนภาษาชั้นสูงที่ชวยใหการพัฒนา และการทดสอบโปรแกรมทําไดรวดเร็วขึ้น เนื่องจากไมจําเปนตองทําการคอมไพลใหเปน .exe ไฟลกอนที่จะสามารถนําไปรันในเครื่องคอมพิวเตอรไดเหมือนกับภาษา C/C++ ภาษา Basic เปนตน ทั้งนี้ไฟลที่เขียนดวยภาษาสคริปสามารถถูกแปล (Interpret) เพื่อที่จะทําการประมวลผลหรือรันบนเครื่องภายใตสภาวะที่กําหนดไดทันทีตัวอยางภาษาสคริปที่ใชงานกันในปจจุบันไดแก• Javascript ถูกสรางขึ้นโดย Bredan Eich ในปคศ. 1995 เพื่อใชงานในเวปไซตที่สามารถปฏิสัมพัทธ (Interactive) กับผูใชงานไดผานทาง Internet browsers ตาง ๆ (เริ่มแรกมันถูกเรียกวาLiveScript ที่ใชงานใน Netscape) ภาษา Javascript ที่เปนสวนหนึ่งของหนาเวปที่เขียนดวยภาษาHTML สามารถรันบนเครื่องผูใชงานไดที่มีตัวแปล (Interpreter) ไดทันที• PERL (Practical Extraction and Report Language) ถูกพัฒนาขึ้นมาในชวงประมาณปลายทศวรรษที่ 1980 โดย Larry Wall โดยมันถูกใชงานกันมากในงานลักษณะของการจัดการ และประมวลผลกับไฟล (File manipulation and processing), การติดตอกับระบบปฏิบัติการ(Interacting with OS) และการเชื่อมตอกับโครงขาย (Network connection) โดยเริ่มตนมันเปนสวนหนึ่งในระบบ UNIX จนกระทั่งปจจุบันที่มีการใชงานอยางหลากหลายในระบบปฏิบัติการตางๆ รวมทั้งความสามารถในการเขียนโปรแกรมในลักษณะของ OOP อีกดวย• Python ถูกสรางขึ้นในป 1990 โดย Guio van Rossum โดยมันถูกใชงานสวนใหญในโปรแกรมประเภท System utilities ที่มีการทํางานผานทางอินเทอรเนต และระบบฐานขอมูล• Tcl/Tk ยอมาจาก Tool command language/Toolkit ถูกสรางขึ้นโดย John Ousterhout โดยสามารถทํางานไดทั้งบน Windows®, Linux®, MacOS®, และ Unix ทําใหมันสามารถสงตอ(Transport) จากระบบหนึ่งไปยังอีกระบบหนึ่งไดงาย• PHP เปนภาษาที่อยูทํางานอยูที่ตัวเซิฟเวอรสําหรับการสราง Dynamic webpage โดยการแปลคําสั่งตาง ๆ ของภาษา PHP จะเกิดขึ้นที่ดานของตัวเซิฟเวอร หรือ Hosts (แทนที่จะเปนที่หนาจอของ Clients) เพื่อที่จะไดเปนภาษา HTML กอนที่จะไปแสดงผลที่ปลายทาง หรือหนาจอผูใชงานใน Web browser34


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• VBScript พัฒนาโดยไมโครซอฟท เพื่อมาแขงกับ Javascript โดยมันจะทํางานในฝงผูใชงาน(Client side) ที่ใชงาน Microsoft® Internet Explorer เทานั้นรูปที่ 2.6 ตัวอยาง PHP script สําหรับแสดงคําวา “Hello World” บน Internet Explorerภาษาสําหรับฮารดแวร (Hardware Design Language)เนื่องจากในปจจุบัน การออกแบบทางดิจิตอลฮารดแวร ประกอบดวยจํานวนของลอจิกเกตนับพัน ๆ ถึง แสนๆ ตัว ผูออกแบบจําเปนตองมีเครื่องมือในการออกแบบที่สามารถรองรับความตองการนี้ได อยางมีประสิทธิภาพ มากกวาการออกแบบดวยสมการบูลีน หรือ Schematic เครื่องมือที่เราจะพูดถึงนี้ไดแกภาษาชั้นสูงที่ใชในการอธิบายการทํางานของฮารดแวร (High-level hardware description language) ซึ่งภาษาประเภทนี้ที่เปนที่นิยมใชกันอยางกวางขวางในการออกแบบดิจิตอลฮารดแวรคือ V<strong>HDL</strong> และ Verilogนั่นเอง35


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การออกแบบฮารดแวรในอดีตการออกแบบดวยสมการบูลีน (Designing with Boolean Equations)คงเปนการยากสําหรับการออกแบบระบบดิจิตอลระบบหนึ่งโดยปราศจากความเขาใจถึงอุปกรณพื้นฐาน เชนเกต (Gate) หรือฟลิปฟลอป (Flip-flop) เพราะวงจรลอจิกโดยสวนใหญแลวจะสรางมาจากเกต และฟลิปฟลอป ซึ่งกําหนดไดจากสมการบูลีน มีหลาย ๆ เทคนิคที่ถูกออกแบบมาสําหรับการ Optimize การออกแบบประกอบดวยการลดรูปของสมการบูลีนโดยใช Karnough map (K-Map) สําหรับการใชทรัพยากรคือ เกตหรือฟลิปฟลอป ใหนอยที่สุดการออกแบบดวยสมการบูลีนตองการสมการสําหรับการกําหนดการใชงานของแตละเกต ดังนั้นจึงทําใหไมสามารถใชงานไดจริงสําหรับระบบที่มีขนาดใหญ ที่ประกอบดวยจํานวนเกตเปนแสน ๆ ตัว ที่จะตองกําหนดมากจากสมการบูลีนหลาย ๆ พันสมการ แมในทางทฤษฎีแลว ทุก ๆ ระบบสามารแทนไดดวยสมการบูลีน แตอยางไรก็ตามมันไมสามารถนํามาใชในการออกแบบจริงของระบบดิจิตอลที่ซับซอนในปจจุบันการออกแบบดวย Schematic (Schematic-based Design)การออกแบบดวย Schematic ชวยในการขยายความสามารถในการออกแบบดวยสมการบูลีน เนื่องจากไมใชมีแคเกต หรือฟลิปฟลอปที่เปนอุปกรณพื้นฐานเทานั้น แตยังมีวงจร หรือตัวไอซีที่อยูในไลบราลี (Library)ดวย นอกจากนั้น วิธีนี้ยังสามารถออกแบบระบบเปนลักษณะของลําดับชั้น (Hierarchy) ไดอีกดวย ซึ่งทําใหสามารถออกแบบระบบที่ซับซอนได และสามารถประหยัดเวลาในการออกแบบเนื่องจากสามารถมองเห็นเปนรูปรางของระบบที่ชัดเจน สามารถเรียกใชอุปกรณไดหลาย ๆ ครั้ง (Design reuse) และแชรการใชงานระหวางผูออกแบบโดยสรางเปนไลบรารีรวม (Shared library) ทําใหงายในการออกแบบเปนกลุมหลายคนจะชอบลักษณะการออกแบบที่มองเห็นเปนภาพ (Graphical representation) โดยสามารถมองเห็นไดวาอุปกรณตัวไหน ตอกันอยางไร ซึ่งจากการออกแบบที่งายขึ้นในลักษณะ Schematic นั้นทําใหเปนที่นิยมกัน โดยในหลาย ๆ ปกอนหนานี้นั้น การออกแบบลักษณะนี้ถูกมองวาจะเปนวิธีการออกแบบที่ดีสําหรับระบบตาง ๆ จนกระทั่งเราตองการระบบที่ซับซอนที่มีจํานวนอุปกรณมากขึ้น อาจจะเปนหลาย ๆ พันตัว ซึ่งก็ทําใหเวลาในการออกแบบนั้นมากขึ้นเรื่อย ๆ เนื่องจากจะตองเสียเวลาในการเชื่อมตอแตละขาของอุปกรณรวมทั้งยากในการตรวจสอบความถูกตอง และการแกไข ที่อาจเปนบริเวณใด บริเวณหนึ่งของวงจรSchematic ที่มีการเชื่อมตอกันอยางมากมาย36


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 2.7 ลักษณะการออกแบบวงจรงาย ๆ ดวย Schematicขอเสียของการออกแบบแบบเดิมในอดีต (Drawback of Traditional Methods)แมจะเปนลักษณะของออกแบบที่งาย ของการออกแบบระบบแบบเดิมที่ใชสมการบูลีน หรือใช Schematicแตมีขอเสียที่สําคัญคือ ระบบถูกกําหนดเปนการเชื่อมตอเปนโครงขายของอุปกรณพื้นฐานตาง ๆ เชน เกตฟลิปฟลอป หรืออุปกรณในไลบรารี แตไมไดเปนการสรางจากวิธีการในการกําหนดความสามารถในการทํางานของระบบ (System specification) โดยตรง ดังนั้นผูออกแบบจําเปนตองมีพื้นฐานความรูพอสมควรในการออกแบบเชน การออกแบบวงจรบวก ผูออกแบบก็จะตองรูตั้งแต Half-adder หรือ Full-adder วาจะตองใชการตอกันของ And/Or/Xor gate อยางไรบาง อีกทั้งความงายในการทําความเขาใจวาเปนวงจรที่ทํางานอะไรโดยผูออกแบบคนอื่น โดยดูจาก Schematic หรือสมการบูลีนนั้นคอนขางยากขอเสียอีกอยางคือ ความสามารถในการรองรับการออกแบบระบบที่ซับซอน การจัดการกับสมการบูลีนแครอยสมการ ก็คอนขางยาก (แตสามารถทําได ถามีเวลาพอ) อยางไรก็ตามถาเพิ่มเปนพัน หรือหมื่นสมการ ถือวาเปนเรื่องที่ยากมาก กลาวกันวาการออกแบบโดยใช Schematic นั้นสามารถรองรับระบบที่มีเพียงหกพันเกตเทานั้น ถาเกินกวานั้นจะทําใหระบบยากในการตรวจสอบ หรือทําความเขาใจจะเห็นไดวาในปจจุบัน ความกาวหนาทางดานวงจรรวม (Integrated circuit) ที่สามารถบรรจุเกต ไดเปนลานๆ ตัวในชิฟ เราตองการการออกแบบระบบที่ใหญ และซับซอน เพื่อตอบสนองความตองการการใชงานชิฟในดานตาง ๆ ดังนั้นจึงจําเปนตองมีวิธีที่สามารถรองรับการออกแบบระบบดิจิตอลในลักษณะนี้ได37


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ภาษาฮารดแวร (Hardware Description Language)ภาษาฮารดแวร คือภาษาชั้นสูงที่ใชในการอธิบายการทํางานของฮารดแวร โดยที่เราไมจําเปนตองแปลงเปนสมการบูลีน หรือ Schematic ตัวอยางเชน ภาษา <strong>HDL</strong> สวนใหญสามารถสราง หรืออธิบาย Finite satemachine สําหรับวงจร Sequential logic ได หรือสรางเปนตารางคาความจริง (Truth table) สําหรับวงจรCombinational logic ไดภาษา <strong>HDL</strong> ใชเปนภาษาหลักในการออกแบบระบบในอุปกรณประเภท Programmable logic device(PLD) หรือ Complex PLD (CPLD) และ Field programmable gate array (FPGA) ซึ่งในปจจุบันมีภาษาลักษณะนี้ใชงานกันหลาย ๆ ตัว แตตัวที่เปนที่นิยม และรูจักกันไดแก Abel, Palasm, Cupl ที่ใชสําหรับการออกแบบวงจรที่ไมซับซอนนักใน PLD หรือ Verilog, V<strong>HDL</strong> สําหรับการออกแบบระบบที่ซับซอนในอุปกรณพวก CPLD หรือ FPGAจากรูปที่ 2.8 จะเห็นวาเรามีสองแนวทางในการออกแบบวงจรดิจิตอลฮารดแวรไดแก 1) แบบเดิมที่เราใชการออกแบบดวย Schematic ที่แปลมาจากสมการบูลีน กอนที่จะสงไปสังเคราะหวงจร (Synthesis) หรือ 2)แบบใหมที่งาย และรวดเร็วกวาดวยการกําหนดการทํางานของฮารดแวรดวยภาษา <strong>HDL</strong> กอนที่จะสงใหเครื่องมือที่ใชในการออกแบบทําการคอมไพลและสังเคราะหเปนวงจรออกมารูปที่ 2.8 วิธีการออกแบบวงจรดิจิตอล38


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การออกแบบในระดับตาง ๆ (Dealing with Different Design Levels)เนื่องจากวงจรในปจจุบันเพิ่มความซับซอนมากขึ้นเรื่อย ๆ ดังนั้นแนวโนมของความตองการในการออกแบบคือ ความสามารถในการเปลี่ยน หรือรองรับลักษณะของ Design entry ไดหลาย ๆ แบบ เชนสามารถออกแบบไดทั้งการใชภาษาชั้นสูงในการอธิบายระบบ หรือการใชสมการบูลีน หรือการใช Schematicเราสามารถแบงระดับของการอธิบายระบบไดเปนชั้นดังรูป 2.9 จากชั้นลางสุดไดแก Silicon level ไปยังชั้นสูงสุดไดแก System level โดยที่แตละระดับสามารถแยกไดเปนการอธิบายในลักษณะของโครงสราง(Structure) หรือการทํางาน (Behavior)การออกแบบในระดับลาง ๆ นั้นสามารถกําหนดรายละเอียด หรือคุณสมบัติของวงจรไดทุกขั้นตอน เริ่มตั้งแตขนาดของทรานซิสเตอร ที่จะนํามาสรางเปนเกต ทําใหเราไดวงจรตามที่กําหนดรอยเปอรเซนต แตทวาผูออกแบบจะตองใชเวลาในการออกแบบมาก รวมทั้งจําเปนตองมีประสบการณพอสมควร สวนการออกแบบในระดับสูง ๆ นั้นเราสามารถทําการออกแบบไดเร็ว จากการกําหนดการทํางานของระบบในระดับที่สูงขึ้นทําใหทําไดงายขึ้น หนาที่ของการสรางวงจรในระดับลางลงมาในแตละระดับนั้นตัวเครื่องมือจะเปนตัวรับผิดชอบเองการออกแบบดวยภาษาชั้นสูงอยาง V<strong>HDL</strong> และ Verilog สามารถครอบคลุมลักษณะของการออกแบบไดเกือบทั้งทุกระดับ ทั้งทางดานโครงสราง (Structure) หรือลักษณะการทํางาน (Behavior) ซึ่งถือวาเปนประโยชนสําหรับการเปลี่ยน หรือยาย (Transfer) การออกแบบไปยังระดับตาง ๆ ในแตละเฟสของการออกแบบ หรือการทําเอกสารประกอบในการออกแบบ เนื่องจากความเปนเอกภาพของการออกแบบนั่นเอง39


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูป 2.9 การออกแบบระบบในระดับตาง ๆ40


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Chapter3โดยทั่วไปที่ผานมา การออกแบบระบบดิจิตอลจะเปนกระบวนการออกแบบที่อยูบนเครื่องมือ (Design Tools) ที่ผูออกแบบสามารถกําหนดการเชื่อมตอของอุปกรณตาง ๆเปนลักษณะของรูปวงจร (Schematic) ซึ่งมีขอดีคือทําใหผูออกแบบสามารถมองเห็นการเชื่อมตอไดทันที ทวาการออกแบบลักษณะนี้มีขอจํากัดเฉพาะการออกแบบที่ไมซับซอนมีอุปกรณไมกี่ตัวเทานั้น ไมสามารถที่จะรองรับการออกแบบระบบขนาดใหญ ที่มีจํานวนอุปกรณ เชน เกตตาง ๆ เปนหลายแสนตัว ทําใหจําเปนตองมีวิธีใหมสําหรับการออกแบบวงจรดิจิตอลขึ้นมาบทที่ 3. ภาษา V<strong>HDL</strong>(V<strong>HDL</strong> Language)เหตุผลจากการแขงขันทางดานธุรกิจเทคโนโลยีในปจจุบัน ทําใหผูออกแบบระบบจําเปนตองอาศัยเครื่องมือในการออกแบบที่รวดเร็ว เพื่อทําการออกแบบระบบใหมีประสิทธิภาพ และมีราคาที่ไมแพง สามารถแขงขันและทันกับความตองการในตลาดได ซึ่งความจําเปนตาง ๆ เหลานี้ ทําใหผูออกแบบไดหันมาใชวิธีการออกแบบในลักษณะของ Top-down Design ซึ่งจะเปนการกําหนดการทํางานหรือ Specification ของระบบดวยภาษาชั้นสูงสําหรับการอธิบายลักษณะตาง ๆ ทางดานฮารดแวร กอน ดวยภาษา Hardware DescriptionLanguage (<strong>HDL</strong>) เราสามารถทําการออกแบบ ทําการจําลองการทํางาน (Simulation) ได ซึ่งสามารถตรวจสอบการทํางานของสิ่งที่เรากําลังออกแบบวาถูกตองหรือไม กอนที่จะนําไปสราง (Implement) จริง ๆ ในอุปกรณประเภท ASIC (Application Specific Integrated Circuit) หรือ FPGA (Field Programmable Gate Array)เปนตนภาษาชั้นสูงจริง ๆ แลวมีอยูมากมาย เชน ภาษา C, PASCAL, Basic, MALAB เปนตน ที่ใชในการเขียนโปรแกรมซอฟทแวรที่รันอยูในตัวประมวลผล แบบลําดับเรียงกันไปทีละบรรทัด (SequentialProcess) แตภาษาเหลานี้ยังขาดความสามารถในการอธิบายการทํางานของระบบฮารดแวรที่อาจทํางานไดพรอม ๆ กันในหลาย ๆ สวนของระบบ (เรียกวา Parallel Process)หรือการกําหนดขอมูลทางเวลาที่จะใชในการจําลองการทํางาน หรือการกําหนดจํานวนบิตของขอมูลไดอยางอิสระ จึงเปนเหตุผลที่จําเปนตองมีภาษาเฉพาะ ที่สามารถอธิบาย ลักษณะทางฮารดแวรได41


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>โดยภาษาที่นิยมมากขึ้นในหมูนักออกแบบวงจรดิจิตอล และไดถูกกําหนดใหเปนมาตรฐานในการใชงานไดแก V<strong>HDL</strong> และ VerilogV<strong>HDL</strong> ซึ่งยอมาจาก Very High Speed Integrated Circuit (VHSIC) Hardware Description Languageซึ่งภาษานี้เปนผลมาจากการวิจัยในกระทรวงกลาโหมของอเมริกาหรือ DoD ในชวงป 70s-80sโดยมีรากมาจากภาษา ADA โดยเปดใหสามารถใชงานไดทั่วไป ในป 1986ไดเสนอใหเปนภาษามาตรฐานกับสถาบัน IEEE (Institute of Electrical and Electronics Engineers)ซึ่งก็มีการพัฒนาปรับปรุงเปลี่ยนแปลง จนกระทั่งไดรับเปนมาตรฐาน IEEE 1076 ในชวงปลายป 1987โดยภาษานี้ เปนการปฏิวัติการออกแบบฮารดแวรดวยภาษาชั้นสูง ที่สามารถอธิบายไดในรูปแบบที่สามารถเขาใจไดงาย สามารถรองรับการออกแบบได หลากหลาย และมีความยืดหยุนดวยไลบรารี่ตาง ๆที่ผูใชงานสามารถนํามาใชไดทันที หรือในสวนของการจําลองการทํางาน ที่ทําไดในหลาย ๆ ระดับในสวนของภาษา Verilog นั้น ชื่อเต็ม ๆ คือ Verilog <strong>HDL</strong> เปนภาษาที่ใชในการอธิบายลักษณะการทํางานของฮารดแวร (Hardware description language) ภาษาหนึ่งที่ถูกสรางขึ้นมาในชวง คศ 1984-1985 โดย PhilipMoorby ที่ตองการภาษาที่งาย และมีประสิทธิภาพในการอธิบายลักษณะของวงจรดิจิตอล สําหรับการโมเดลการจําลองการทํางาน และการวิเคราะหการทํางาน ภาษานี้ไดกลายเปนลิขสิทธิ์ของบริษัท Design GatewayAutomation ซึ่งตอมาไดรวมกับบริษัท Cadence Design Systems และตั้งแตป คศ 1990 เปนตนมา ทางCadence ไดเปดใหเปนภาษาที่ทุกคนสามารถใชงานได ทั้งนี้เพื่อใหงายในการกําหนดมาตรฐาน และพัฒนารวมกัน และในที่สุด ภาษานี้ไดเขาเปนภาษามาตรฐานของ IEEE ในป คศ 1995 (IEEE Standard 1364)สําหรับในเมืองไทยเองนั้น V<strong>HDL</strong> จะเปนที่นิยมใชในการออกแบบมากกวา Verilog ผูเขียนเองไดเรียนรูภาษา V<strong>HDL</strong> กอน แตตอมาไดมีโอกาสออกแบบระบบโดยใชภาษา Verilog ที่คลายคลึงกับภาษา Cโดยใชเวลาเรียนรูไมมากนัก ดังนั้นถาหากเรามีพื้นฐานภาษา <strong>HDL</strong> ภาษาใด ภาษาหนึ่งแลวการเรียนรูอีกภาษาหนึ่งก็สามารถทําไดไมยาก ผูอานเองไมควรที่จะปดกั้นตัวเอง ในการใชงานภาษาใดภาษาหนึ่ง เนื่องจากวาในอนาคตมีแนวโนมวาเราตองการภาษา ที่มีระดับสูงขึ้นกวาทั้งภาษา V<strong>HDL</strong> และVerilog เพื่อที่จะสามารถนํามาใชงาน ในระบบ ที่สามารถอธิบายได ทั้งที่เปนสวนของฮารดแวรและซอฟทแวรในตัวเดียวกัน ตัวอยางเชนในระบบที่เปน HW/SW Co<strong>design</strong> หรือ ในระบบ EmbeddedSystems เปนตน ตัวอยางภาษาประเภทนี้ที่กําลังพัฒนาไดแก SystemC ซึ่งถาเราไดดูถึงโครงสรางแลวจะมีลักษณะคอนขางเหมือน V<strong>HDL</strong>42


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>หนังสือเลมนี้จะอธิบายเกี่ยวกับการใชงานทั้งภาษา V<strong>HDL</strong> และ Verilog โดยในบทนี้ จะเปนการแนะนําภาษาV<strong>HDL</strong> ในการออกแบบวงจรหรือระบบดิจิตอล โดยจะอธิบายใหทราบเกี่ยวกับโครงสราง ไวยากรณ คําสั่งคุณลักษณะตาง ๆ ของภาษา โดยจะมีตัวอยางการเขียนใชงานในแตละแบบ สวนภาษา Verilog จะอยูสวนทายของหนังสือเลมนี้ รวมทั้งการออกแบบระบบในชิพ FPGA ของ Xilinx ดวยภาษา <strong>HDL</strong> ทั้งสองเพื่อใหสามารถเรียนรูไดดวยการปฏิบัติจริงในชวงทาย ๆ ของหนังสือรูจักกับภาษา V<strong>HDL</strong>กอนที่จะไดเรียนรูรายละเอียดเกี่ยวกับภาษา V<strong>HDL</strong> ขอเริ่มตนดวยคํานิยาม (Terminology) ตาง ๆที่สําคัญไดแก• Entity: เปนสวนประกอบพื้นฐานที่สําคัญของการออกแบบ โดยอาจมองเปน Building Blockของแตละวงจรที่ใชในการกําหนดขาอินพุท ขาเอาทพุทตาง ๆ ของวงจร ซึ่งแตละ Entityสามารถประกอบกันเปนระบบใหญ ๆ ขึ้นมา เปนลักษณะการออกแบบลําดับชั้น (Hierarchy) โดยสวนบนสุดของการออกแบบคือ Top-level Entity ซึ่งขางในประกอบดวยวงจรยอย ๆ เปน LowerlevelEntity ตามลําดับลักษณะของการออกแบบ• Architecture: เปนสวนที่ใชในการอธิบายการทํางานของแตละ Entity ซึ่งภายในอาจประกอบดวยอุปกรณ ตาง ๆ ที่ถูกเรียกใชมาจากไลบรารี หรือเสนสัญญาณขอมูลตาง ๆ ที่ใชในการเชื่อมตอรวมทั้งฟงกชันการทํางานตาง ๆ เปนตน• Configuration: เนื่องจาก Entity สามารถมีลักษณะการทํางานไดหลาย ๆ แบบ หรือหลาย ๆโครงสรางโดยการเขียนอธิบาย ใน Architecture ที่ตาง ๆ กัน ดังนั้นในการกําหนดวาเราตองการใชArchitecture แบบใดในการออกแบบชนิดหนึ่ง ๆ นั้นจะใชการกําหนดผาน Configuaration ซึ่งทําใหผูออกแบบมีความสะดวกในการใช Architecture ใหเหมาะสมกับประเภทการใชงาน• Package: เปนไลบรารี่ ของฟงกชันตาง ๆ มาตรฐานที่ไดกําหนดไวแลว หรือที่เราออกแบบไวทําใหเราสามารถนํามาใชงานไดทันที เชน การกําหนดชนิดตัวแปรตาง ๆ (Data types) เกตหรือวงจรยอยพื้นฐานที่นิยมใชในการออกแบบ43


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• Driver: เปนแหลงจายสัญญาณใหกับอุปกรณตาง ๆ หรืออีกนัยหนึ่งนั่นคือ สัญญาณตาง ๆในระบบถูกขับโดยตัว Driver• Bus: คือกลุมของสัญญาณที่มีมากกวา 1 เสน ทั้งนี้เพื่อใหสะดวก ในการใชงานในระบบหรือเพื่อจุดประสงคอื่น ๆ ในการรับสงสัญญาณ• Attribute: คือขอมูลที่ใชในการกําหนดคุณลักษณะของ V<strong>HDL</strong> Object ตาง ๆเชนการกําหนดคาอุณหภูมิสูงสุดในการทํางานของอุปกรณตัวหนึ่งที่เปน Buffer• Generic: เปนการกําหนดพารามิเตอรตาง ๆ ที่ใชในการสงผานคาไปยังสิ่งที่เราออกแบบเพื่อใหมีความยืดหยุนในการใชงานมากยิ่งขึ้น เชนการปรับเปลี่ยนคาดีเลยในเกตใหแตกตางกันเพื่อใชในการจําลองการทํางานหรือการปรับเปลี่ยนคาความกวางของบัสอุปกรณตัวหนึ่ง ใหเหมาะสมกับการใชงาน• Process: เปนหนวยพื้นฐานที่อยูในแตละ Architecture ที่สามารถทํางานได โดยที่แตละ Processนั้นสามารถทํางานไดพรอม ๆ กัน (Concurency)รูปที่ 11.1 โครงสรางไฟลในภาษา V<strong>HDL</strong>44


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 11.2 ตัวอยางไฟลในภาษา V<strong>HDL</strong>โครงสรางพื้นฐานของภาษา V<strong>HDL</strong>การเขียนภาษา V<strong>HDL</strong> ประกอบดวย 3 สวนที่สําคัญ (ดูรูป x.1, x.2) คือ 1) สวนที่เรียกใชงานไลบรารี(Library) หรือสิ่งตาง ๆ ที่มีอยูแลว เพื่อที่จะนําไปใชงานในการออกแบบระบบตอไป 2) สวนที่กําหนดการเชื่อมตอของพอรตตาง ๆ เรียกวา Entity 3) อีกสวนหนึ่งคือสวนที่จะอธิบายการทํางานของระบบ หรือวงจรเรียกวา Architecture ซึ่งจะมีความสัมพันธกันในการอธิบายซึ่งกันและกัน กับสวน Entityสังเกตุวาการเขียนหมายเหตุ (Comment) ตาง ๆ เพื่อชวยในการอธิบาย หรือตรวจสอบ ทําความเขาใจใหงายยิ่งขึ้น สามารถทําไดโดยใสเครื่องหมาย –- ไวขางหนาในแตละขอความ ที่อยูในแตละบรรทัด โดยตัวคอมไพลเลอรจะไมนําขอความตาง ๆ ที่อยูขางหลังเครื่องหมาย –- ไปประมวลผล ทั้งนี้ในภาษา V<strong>HDL</strong>สามารถทําไดมากที่สุด ทีละบรรทัดเทานั้น ไมสามารถทําเปนบล็อกได ดังเชนที่เราใชเครื่องหมาย /* และ*/ เพื่อกําหนดจุดเริ่มตน และจุดสิ้นสุดของคําอธิบายหรือหมายเหตุตาง ๆ ไดหลาย ๆ บรรทัดพรอม ๆ กันในภาษา C หรือ Verilog เปนตน45


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Library and PackageLibraryLibrary ทําหนาที่เก็บ Package ตาง ๆ ไว ซึ่งใน Package จะเปนทรัพยากรตาง ๆ ที่ใชงานรวมกัน ดังนั้นกอนใชงานจะตองกําหนดไวในตอนตนของ V<strong>HDL</strong> ไฟลไวดวย โดยขอมูลตางๆ ตลอดจนโปรแกรมยอย(Subprogram) ที่เปนประโยชนตอการเขียนรูปแบบบรรยายระบบดิจิตอลสามารถเก็บไวในสวนที่เรียกวาPackage ได และขอมูลเหลานี้ สามารถถูกเรียกไปใชไดโดย Entity, Architecture หรือจาก Package อื่นดวยคําสั่ง USE เชนlibrary ieee;use ieee.std_logic_1164.all;ตัวอยางขางตน แสดงการเรียกใชไลบรารีที่ชื่อวา ieee โดยที่กําหนดการเรียกใชโดยใชคําวา LIBRARYตามดวยชื่อ ieee และจบดวยเครื่องหมาย ; (Semi-colon) เมื่อเรียกใชไลบรารีแลว จะตองกําหนดการใชงานPackage ที่ตองการใชที่อยูในไลบรารีนั้น ๆ โดยอยูในบรรทัดถัดไป นั่นคือ useieee.std_logic_1164.all; โดยที่ USE เปนคําสั่ง ตามดวยชื่อ Package ไดแกieee.std_logic_1164 สวน .all นั้นเปนการแสดงวาจะใชทุกสิ่งที่เขียนกําหนดไวใน Packageนี้ เชนคาลอจิกตาง ๆ ที่เปนไปได 9 คาดวยกันของสัญญาณแบบ STD_LOGIC หรือSTD_LOGIC_VECTOR รวมทั้งตารางคาความจริงของการกระทําในลอจิกเกตพื้นฐานตาง ๆ เชน AND,OR, NOT เปนตนPackageขอมูลตางๆ ตลอดจนโปรแกรมยอย (Subprogram) ที่เปนประโยชนตอการเขียนรูปแบบบรรยายระบบดิจิตอลสามารถเก็บไวในสวนที่เรียกวา Package และขอมูลเหลานี้ สามารถถูกเรียกไปใชไดดวยคําสั่งUSE statement ดังตัวอยางในรูปที่ 11.3 จะเห็นวา Package PROJECT_X ที่เขียนไว สามารถถูกเรียกใชในหลาย ๆ Entity ได ซึ่งเปนการใชทรัพยากรในการออกแบบรวมกัน ทําใหการออกแบบทําไดอยางรวดเร็วและมีความยืดหยุนสูง46


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 11.3 ตัวอยางการใชงาน Packageรูปที่ 11.4 ตัวอยางขอมูลภายใน Packageตัวอยาง Package ในรูป x.4 มีชื่อวา STANDARD โดย Package นี้จะมีการกําหนดชนิด (Type) และคาของตัวแปรตาง ๆ ที่ใชงาน เชน แบบ BOOLEAN ที่มีคาเปน FALSE หรือ TRUE เทานั้น แบบ BIT ที่มีคาเปนลอจิก ‘0’ หรือ ‘1’ เปนตน ทั้งนี้แบบของตัวแปรตาง ๆ จะขอนําเสนอใหละเอียดอีกทีในภายหลัง สังเกตวาโครงสรางของการเขียน Package จะขึ้นตนบรรทัดแรกดวยคําวา package และลงทายดวยคําวา end ตามดวยชื่อ Package นั้น ๆ ในบรรทัดสุดทาย47


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 11.5 Library และ Package ที่ใชกันเปนสวนใหญสําหรับ Package ที่นิยมใชกันอยางแพรหลาย จะอยูในไลบรารีที่มีชื่อวา IEEE ประกอบดวย Package ตางๆ เชน STC_LOGIC_1164, STD_LOGIC_ARITH, STD_LOGIC_UNSIGNED,STD_LOGIC_SIGNED, และ NUMERIC_STD ทั้งนี้ความสามารถในการใชงานตัวแปร Type ตาง ๆที่อยูในแตละ Package จะแตกตางกันตามที่กําหนดไว เชน ตัวแปร STD_LOGIC และSTD_LOGIC_VECTOR ใน STC_LOGIC_1164 จะไมสามารถกระทําทางคณิตศาสตรตาง ๆ (บวก ลบคูณ หาร) ได ซึ่งแตกตางจาก STD_LOGIC_ARITH เปนตน ตัวแประประเภทตาง ๆ เหลานี้สามารถแปลงกลับไปมาได ตามความเหมาะสมในการใชงานซึ่งจะกลาวถึงตอไปในสวนของไลบรารี STD และ WORK เปนไลบรารีที่จะถูกเรียกใชโดยปริยาย (Default library) โดยผูใชงานไมจําเปนตองกําหนด หรือเขียนในลักษณะของการเรียกใชงานดังขางลางLIBRARY STD, WORK;USE STD.STANDARD.ALL;48


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Entityในสวนนี้จะเปนการกําหนดชื่อของ Entity และกําหนดพอรตตาง ๆ ที่จะใชงานในการรับสงสัญญาณกับภายนอก ยกตัวอยางเชนENTITY mux ISPORT ( a, b, c, d : IN BIT;s0, s1 : IN BIT;x : OUT BIT); -- สังเกตวาจะไมมี ; ที่บรรทัดสุดทาย กอนที่จะปดดวยวงเล็บปดEND mux;รูปที่ 11.6 แสดงการเขียน Entity เพื่อกําหนดพอรตของ muxจากตัวอยางขางบน จะมีคําสงวนตาง ๆ ซึ่งในหนังสือเลมนี้ จะเขียนดวยตัวพิมพใหญ เพื่อใหสังเกตไดชัดเจน(ถึงแมวาภาษา V<strong>HDL</strong> จะเปนลักษณะของ Case Insensitive นั่นคือ การใชตัวอักษรพิมพเล็ก และพิมพใหญนั้นจะไมตางกัน) นั่นคือ ENTITY, IS, PORT, IN, OUT, END เปนตน ซึ่งคําตาง ๆเหลานี้ไดถูกกําหนดไวแลวในไลบรารีมาตรฐาน (STANDARD PACKAGE)ที่ถูกโหลดมาใชงานโดยอัตโนมัติ โดยไมตองมีการเขียนกําหนดไวในสวนของคําที่กําหนดโดยผูใชงาน ในที่นี้จะใชตัวพิมพเล็ก ตัวอยางเชน mux ซึ่งเปนชื่อของ ENTITYที่กําหนดขึ้นมา นอกจากนี้ยังมีชื่อของอินพุทพอรตไดแก a, b, c, d, s0, s1และเอาทพุทพอรตไดแก x ซึ่งทั้งหมดจะมีลักษณะขอมูล (Data type) เปน BIT ที่มีคาเปน ‘0’ (Logic Low)หรือ ‘1’ (Logic High) หรือ ‘X’ (High Impedance) ไดเทานั้น49


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ดังนั้นเราจะเห็นไดวา หนาที่ของ ENTITY คือการกําหนดสวนที่จะใชในการอินเทอรเฟสหรือเชื่อมตอกับโลกภายนอก โดยจะมีการกําหนดชื่อพอรตตาง ๆ ทิศทางของสัญญาณ วาเปนอินพุทหรือเอาทพุท นอกจากนี้ยังมีขนาดของพอรต (จํานวนบิต) รวมทั้ง กําหนดลักษณะของขอมูลที่จะสงผานพอรต (Data Type) อีกดวยArchitecturesในภาษา V<strong>HDL</strong> หลักจากที่เราใช ENTITY ในการกําหนดการอินเทอรเฟสแลว สวนตอมาในการบรรยายลักษณะหนาที่การทํางานตาง ๆ ภายใน ENTITY นั้น ๆ จะถูกกําหนดในสวนของARCHITECTURE ซึ่งจะประกอบดวยคําสั่ง Statements ตาง ๆ สําหรับใชงาน ดังตัวอยางARCHITECTURE dataflow OF mux ISSIGNAL select : INTEGER;BEGINselect


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การเขียนอธิบายในสวนของ Architechtureเรามีวิธีการเขียน Architecture ของ mux อยู 3 ประเภทดวยภาษา V<strong>HDL</strong> นั่นคือ dataflow, structure และsequential ซึ่งถาเปนงานที่จะตองใชในการออกแบบดวย Layout ในวงจรรวมที่ตองการความถูกตองของการเชื่อมตอสัญญาณตาง ๆ ก็ควรจะตองเลือกใชวิธีการเขียนแบบ structure ที่เราสามารถกําหนดไดทั้งการใชงานเกตตาง ๆ และลักษณะการเชื่อมตอในวงจร ซึ่งผูออกแบบเองจําเปนตองมีความรูพอสมควรในเรื่องของวงจรตาง ๆสําหรับวิธีการเขียนที่งายกวา และเร็วกวาในการออกแบบ นั่นคือแบบ dataflow และ sequential โดยที่โดยสวนใหญแลวเรามักจะคุนเคยกับแบบ sequential เนื่องจากมีความเหมือนกันการเขียนโปรแกรมภาษาชั้นสูงโดยทั่วไป ที่มีการแปลทีละบรรทัดจากบนลงลาง (Sequential statement) โดยมีคําสั่งอยางเชน if-then-elseหรือ case-select ที่ตองเขียนใชงานอยูภายใน Process เทานั้นแตทวาในแบบ dataflow ซึ่งเปนการเขียนในลักษณะที่แสดงถึงการไหลของขอมูลในแตละ statement ที่ทํางานไดพรอม ๆ กัน (Concurrency statement)ทําใหเราสามารถสลับตําแหนงบรรทัดการเขียนของแตละ statement กันไดโดยไมมีผลตอวงจร ก็จะเหมาะสําหรับการเขียนอธิบายวงจรที่เล็ก และกระชับทั้งนี้การเขียนทั้ง 3 รูปแบบนั้น เราสามารถนํามาใชงานไดรวมกัน ในการออกแบบวงจร หรือระบบใด ๆ ก็ตาม หรือใน Architecture เดียวกันที่มีวิธีการเขียนหลาย ๆแบบ ซึ่งถือวาทําใหผูออกแบบมีความสะดวกในการใชงาน แลวแตความถนัด หรือความเหมาะสมData Flow Designsตามปกติแลวในโปรแกรมภาษาชั้นสูงทั่วไป เชน C หรือ C++ ลักษณะของการประมวลผลจะเปนไปทีละบรรทัดจากบนลงลางตามลักษณะของการเขียน (Sequential Process) แตในภาษา V<strong>HDL</strong> จะไมมีการกําหนดการประมวลผลเปนลําดับบรรทัด แตจะอาศัยการเกิดเหตุการณ (Event) หรือการเปลี่ยนแปลงของสัญญาณที่เกิดขึ้น ที่จะเปนตัวกําหนดลําดับการทํางานของ Statement ใด ๆ ที่กําหนดใหมีความเกี่ยวของกับEvent นั้น ๆ ดังนั้นในแตละ Statement ที่ความเกี่ยวของกับสัญญาณ Event เดียวกัน จะมีการทํางานเกิดขึ้นพรอมกัน (Concurrency Process) ถึงแมถูกเขียนอยูในบรรทัดที่ตางกัน51


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ในตัวอยาง ARCHITECTURE dataflow เราจะใชสัญลักษณ


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>COMPONENT orgatePORT(a, b, c, d : IN bit; x : OUT BIT);END COMPONENT;SIGNAL s0_inv, s1_inv, x1, x2, x3, x4 : BIT;BEGINU1 : inverter PORT MAP (s0, s0_inv);U2 : inverter PORT MAP (s1, s1_inv);U3 : andgate PORT MAP (a, s0_inv, s1_inv, x1);U4 : andgate PORT MAP (b, s0, s1_inv, x2);U5 : andgate PORT MAP (c, s0_inv, s1, x3);U6 : andgate PORT MAP (d, s0, s1, x4);U7 : orgate PORT MAP (x2=>b, x1=>a, x4=>d, x3=>c, x=> x);END structure;au1s0_invu3x1bu2s1_invu4x2u7xcu5x3du6x4s0s1รูปที่ 11.7 รูปวงจรของ mux ที่เขียนอธิบายแบบโครงสรางใน ARCHITECTURE structure นี้ มีอุปกรณพื้นฐานอยูสามตัวไดแก inverter, andgate, และ orgate ซึ่งอยูในไลบรารีมาตรฐานที่เราสามารถเรียกใชไดเลย ลักษณะการเรียกใชคือการกําหนด COMPONENT ตาง ๆเหลานั้นไวระหวาง ARCHITECTURE และ BEGIN นอกจากนี้ ยังมีเสนสัญญาณตาง ๆ ที่เราจะใช กําหนดไวขางหลัง SIGNAL ไดแก s0_inv, s1_inv, x1, x2, x3, x4ในการกําหนดการเชื่อมตอของพอรตตาง ๆ จากอุปกรณตัวหนึ่ง ไปยังอีกตัวหนึ่ง เรียกวา PORT MAPโดยจะมีวิธีการอยูสองลักษณะ คือแบบยอ และ แบบเต็ม ในแบบยอนั้น53


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>จะเปนการแมปการเชื่อมตอโดยตําแหนงของพอรตที่กําหนดไวในสวนของ COMPONENTตัวอยางเชนในบรรทัดแรกU1 : inverter PORT MAP (s0, s0_inv);U1 เปนชื่อ (Instance name) ของอุปกรณ inverter (กรณีที่เราเรียกใชอุปกรณนั้น ๆ หลาย ๆ ครั้งในARCHITECTURE เดียวกัน ก็จะใช Instance name ที่ตางกัน) ที่มีการเชื่อมตอสัญญาณ s0ตอกับพอรตตําแหนงแรกของ inverter (นั่นคือ in1) และ s0_inv ตอกับพอรตตําแหนงที่สองของ inverter (นั่นคือ x) ทํานองเดียวกันกับ U3 ที่เปน andgate สัญญาณ a, s0_inv, s1_inv, และ x1 ตอเขากับพอรต a, b, c และ xของ andgate ตามลําดับอีกวิธีหนึ่งสําหรับ PORT MAP ที่ไมจําเปนตองคํานึงถึงลําดับของพอรตที่เรากําหนดไวใน COMPONENTไดแก การเขียนแบบเต็ม ดังเชนในบรรทัดสุดทาย ของ U7U7 : orgate PORT MAP (x2=>b, x1=>a, x4=>d, x3=>c, x=>x);จะเห็นไดวา เราไดกําหนดการเชื่อมตอของพอรตตาง ๆ ของ orgate ไวเลย เชนสัญญาณ x2 ตอกับพอรต bของ orgate โดยใชเครื่องหมาย => หรือ สัญญาณ x1 ตอกับพอรต a และอื่น ๆ โดยไมจําเปนตองคํานึงถึงลําดับที่กําหนดไวกอนหนานี้ การเขียนลักษณะนี้มักไมคอยเปนที่นิยมนัก เนื่องจากชา และอาจมีการสลับที่ของตําแหนงพอรตจากที่กําหนดไวไดSequential Behavior Designsมีอีกวีธีหนึ่งที่จะสามารถบรรยายการทํางานของ mux ไดคือการอธิบายพฤติกรรมของมัน เราเรียกวา(Behavioral Design) โดยลักษณะการอธิบายนี้จะมีคําสั่งเหมือนกับภาษาชั้นสูงทั่ว ๆ ไปในการกําหนดเงื่อนไขตาง ๆ ของการกระทําที่มีการประมวลผลเปนลําดับจากบนลงลาง เชน if-then-else, for-loop, caseselectเปนตน โดยคําสั่ง statement ตาง ๆ นี้จะตองถูกใชงานอยูในPROCESS เทานั้น ดังตัวอยางที่แสดงตอไปนี้ARCHITECTURE sequential OF mux ISBEGINPROCESS behave (a, b, c, d, s0, s1 )VARIABLE sel : INTEGER;BEGINIF s0 = ‘0’ and s1 = ‘0’ THENsel := 0;54


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ELSIF s0 = ‘1’ and s1 = ‘0’ THENsel := 1;ELSIF s0 = ‘0’ and s1 = ‘0’ THENsel := 2;ELSEsel := 3;END IF;CASE sel ISWHEN 0 =>x x x x


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>สัญญาณ sel ไดถูกกําหนดใชงานเปนตัวแปรแบบจํานวนเต็ม ดวยคําสั่ง VARIABLE ซึ่งจะใชงานเปนตัวเก็บคาจํานวนเต็มตาง ๆ (0, 1, 2, 3) ตามคาของสัญญาณที่พอรต s0 และ s1• Process Statement Partสวนนี้เปนการอธิบายพฤติกรรมการทํางานของ PROCESS ซึ่งอยูระหวางคําวา BEGIN และ ENDPROCESS โดยจะมีการประมวลผลการทํางานคําสั่งตาง ๆ ภายในนี้ เปนลักษณะของ Sequentialstatement นั่นหมายถึงมีการประมวลผลทีละบรรทัดจากบนลงลาง เหมือนกับภาษาชั้นสูงโดยทั่วไป นั่นคือสิ่งที่เกิดขึ้นภายใน PROCESS แตถาเรามองออกมาขางนอกของระบบที่มีหลาย ๆ PROCESS แลว แตละ PROCESS สามารถทํางานพรอม ๆ กันเปนแบบ Concurency ไดเหมือนกับระบบฮารดแวรทั่ว ๆ ไปที่ทุกสวนทํางานพรอม ๆ กัน ซึ่งรายละเอียดจะไดนําเสนอในหัวขอถัดไปจากทั้งสามสวนที่ประกอบกันเปน PROCESS ที่ตองการใหทํางานเปน Multiplexer สามารถอธิบายไดดังนี้คือ สมมุติในเบื้องตน คา s0 และ s1 มีคาเปน ‘0’, ‘0’ ตามลําดับ ทําใหคาเอาทพุท x มีคาเหมือนกับอิทพุทที่พอรต a ถายังไมมีการเปลี่ยนแปลงใด ๆ เกิดขึ้นที่ (a, b, c, d, s0, s1) ที่ถูกกําหนดใหเปน Sensivity listของ PROCESS นี้แลว ก็จะไมมีการประมวลผล แตถาหาก สมมุติวา s0 มีการเปลี่ยนแปลงคาจาก ‘0’ ไปเปน‘1’ แลว กระบวนการตรวจสอบภายใน PROCESS ก็จะเกิดขึ้น ซึ่งจากคําสั่ง IF-THEN-ELSE เราจะไดคา selคาใหมเปน 1 ตามเงื่อนไขของคา s0, s1 ซึ่งผลจากการเปลี่ยนคา sel นี้จะเกิดขึ้นทันที (สังเกตการใชเครื่องหมาย := กับตัวแปร VARIABLE) ทําใหการประมวลผลคําสั่ง CASE ที่อยูถัดมามีเปลี่ยนคา x ใหตรงกับเงื่อนไขของคา sel ที่เปลี่ยนแปลงไป นั่นคือ คาอินพุทที่พอรต b จะถูกสงผานคาไปยังพอรตเอาทพุท xแทนที่จะเปนคาอินพุทที่พอรต a กอนหนานี้ ซึ่งก็คือการทํางานของ Multiplexer นั่นเองHardware Concurencyเนื่องจากการทํางานในระบบฮารดแวรจริงนั้น เปนการทํางานที่ทําพรอม ๆ กันทั้งระบบ หรือที่เรียกวาConcurrency ซึ่งภาษาชั้นสูงเชน C หรือ Pascal โดยทั่วไปนั้นไมสามารถเขียนอธิบายได ซึ่งเปนความจําเปนที่ตองมีภาษาเฉพาะที่มาอธิบายการทํางานของฮารดแวรนั่นเองภาษา V<strong>HDL</strong> เปนภาษาที่สามารถโมเดลระบบเปนลักษณะของการทํางานของระบบยอย ๆ (Subsystem)เกิดขึ้นไปพรอม ๆ กัน ซึ่งลักษณะของระบบยอย ๆ นั้นก็คือ ตัว Process ตาง ๆ รวมทั้งการติดตอสื่อสารระหวางกันที่เปนการสงผานคาสัญญาณโดยใชคําสั่ง Assign ความจริงแลวถึงแมกระบวนการตาง ๆ ภายใน56


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Process จะเกิดขึ้นเปนลักษณะของแบบเรียงลําดับ (Sequential) แตถามองออกมาภายนอกในระดับ Processดวยกันแลว ทุก Process จะมีการทํางานพรอมกัน (Concurrency) อธิบายไดตามรูปที่ 5.1รูปที่ 5.1 การทํางานของภายใน และภายนอก Processคําสั่งแบบขนาน (Concurrent statement) ที่สําคัญที่สุดคือ Process ที่มีการทํางานภายในตัวมันเองเปนแบบเรียงลําดับ และอิสระกับ Process อื่น ๆ ซึ่งมันจะเริ่มทํางานทุกครั้งเมื่อสัญญาณตัวใดตัวหนึ่งในSensitivity list มีการเปลี่ยนแปลง ความจริงแลวเราไดเรียนเกี่ยวกับคําสั่งตาง ๆ ที่ใชงานภายใน Processมาแลวในบทที่ 4 ที่ผานมา ดังนั้นในบทนี้จะมองการทํางานในระดับภายนอก Process โดยเนนถึงวิธีการออกแบบโครงสรางของระบบที่มีการทํางานเปนลักษณะ Concurrecy นั่นเองรูปที่ 5.2 วงจร Full adder ขนาด 1 บิต57


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 5.2 แสดงวงจร Full adder ที่เราสามารถเขียนอธิบายเปนการทํางานของเกตแตละตัวในลักษณะของแตละ Process ขนานกันไดดังนี้entity add_1 isport (a, b, cin: in bit;s, cout: out bit);end add_1;architecture processes of add_1 issignal s1, s2, s3, s4: bit;beginp1: process (b, cin)begins1


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>เปนสัญญาณที่ทุก Process รูจัก และสามารถใชงานได ซึ่งความจริงในวงจรฮารดแวรแลวมันคือเสน ๆ หนึ่งในการเชื่อมตอฮารดแวรแตละสวนเขาดวยกัน และใชในการสงผานคาสัญญานจากจุดหนึ่งไปยังอีกจุดหนึ่งสําหรับการสงผานคาใน Process เองที่อาจมองวาเปนตัวแปรทองถิ่น (Local variable) ที่มีใชงาน และรูจักเฉพาะใน Process นั้น เราสามารถกําหนดไดดวยคําสั่ง variable ดังที่อธิบายมาแลวในบทที่ผานมา โดยvariable เหลานี้ไมสามารถใชงานเพื่อเปนการเชื่อมตอระหวาง Process ไดเราสามารถสรุปลักษณะของ Process เปนขอ ๆ ดังนี้• แตละ Process จะทํางานขนานกันกับ Process อื่น ๆ• ใน Process ไมสามารถมีคําสั่งแบบขนาน (Concurrent statement) เชนคําสั่ง assignment ตาง ๆได (อธิบายในบทที่ 4)• ใน Process ประกอบดวยคําสั่งแบบเรียงลําดับ (Sequential statement) เชน if, case, loop ที่เปนคําสั่งคลายกับภาษาชั้นสูงอยูภายใน (อธิบายในบทที่ 6)• แตละ Process จะตองมี Sensivity list กําหนดการทํางาน ยกเวนมีการใชงานคําสั่ง wait อยูภายใน• การสงผานคาระหวาง Process ทําไดโดยการใช signal ที่เสมือนเปนตัวแปรรวม (Global) และกําหนดในสวนของ Architecture declaration• การสงผานคาภายใน Process ใด ๆ ทําไดโดยการใชงาน variable ที่เสมือนเปนตัวแปรทองถิ่น(Local) ภายในตัว Processs นั้น ๆการกําหนดการใชงาน Architechtureจากที่กลาวมาแลววา Entity ใด ๆ สามารถมี Architecture ไดมากกวาหนึ่ง ดังนั้นเพื่อเปนการปองกันปญหาในการเลือกใชงาน Architecuture สําหรับการสังเคราะห (Synthesis) หรือการจําลองการทํางาน59


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>(Simulation) ก็ตาม จึงจําเปนตองมีการกําหนด Architecture ที่ตองการใช ดวยคําสั่ง CONFIGURATIONดังตัวอยางตอไปนี้CONFIGURATION muxcon1 OF mux ISFOR structureFOR U1,U2 :inverter USE ENTITY WORK.myinv(<strong>version</strong>1);END FOR;FOR U3,U4,U5,U6 :andgate USE ENTITY WORK.myand(<strong>version</strong>1);END FOR;FOR U7 :orgate USE ENTITY WORK.myor(<strong>version</strong>1);END FOR;END FOR;END muxcon1;จากตัวอยาง สามารถอธิบายไดดังนี้คือ CONFIGURATION นี้ที่ชื่อ muxcon1 ใชสําหรับ ENTITY mux ซึ่งจะเปนการเรียกใชงาน ARCHITECTURE ที่มีชื่อวา structure ซึ่งจะเปนการอธิบายการเชื่อมตอกันของอุปกรณแตละตัว โดยที่ U1, U2 ที่เปน inverter จะใชโมเดลที่มี ENTITY ชื่อวา myinv ที่มีARCHITECTURE ที่ชื่อวา <strong>version</strong>1 สวนของ U3, U4, U5, U6 ที่เปน andgate จะใชโมเดลที่มี ENTITY ชื่อวา myand ที่มี ARCHITECTURE ที่ชื่อวา <strong>version</strong>1 สวนของ U7 ที่เปน orgate จะใชโมเดลที่มี ENTITY ชื่อวา myor ที่มี ARCHITECTURE ที่ชื่อวา <strong>version</strong>1 ตามลําดับ โดยทุกตัวจะอยูในไลบรารี WORK ซึ่งเปนWorking directory ที่เรากําลังออกแบบอยู โดยไดเรคตอรีนี้ เครื่องมือ ที่ใชในการออกแบบ (Design tools) ที่เราใช จะสรางใหเองโดยอัตโนมัติโดยปกติแลว ถาหากเราไมกําหนด CONFIGURATION ใหกับ ENTITY แลว ARCHITECTURE ที่จะถูกเรียกมาใชงานโดยปริยาย คือตัวสุดทายที่ถูกคอมไพลในWorking directory นั่นเองGenericsในการออกแบบบางลักษณะ เราตองการที่จะเปลี่ยนแปลงคาตัวแปรบางคา เพื่อใหเกิดความแตกตางของวงจร และสามารถใชงานไดหลาย ๆ ลักษณะ เชน ในระบบหนึ่งอาจตองการ Shift register ขนาด 8 bitsแตในอีกระบบหนึ่งใช Shift register เหมือนกันแตตองการ 32 bits เปนตน ซึ่งแทนที่เราตองเขียน V<strong>HDL</strong>ไฟล สําหรับ Shift register ที่มีการทํางานเหมือนกันหลาย ๆ ไฟล เราสามารถใชคําสั่ง GENERIC ในการ60


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>กําหนดตัวแปร เชน ความยาวของ Shift register ความกวางของบัส หรืออาจเปนคาของดีเลย ใหเหมาะสมกับความตองการใชงานไดสําหรับคาของตัวแปรตาง ๆ กําหนดไดในสวนของ ENTITY โดยใชคําสั่ง GENERIC สําหรับการใชงานตัวแปรเหลานั้นภายใน ARCHITECTURE ซึ่งการกําหนดคาตัวแปรทําไดสองลักษณะคือ การกําหนดคาโดยปริยายหลังการกําหนดตัวแปรในคําสั่ง GENERIC (ในสวนของ Entity หรือ Component) หรือการกําหนดคากอนการใชงานดวยคําสั่ง GENERIC MAP (ในสวนของ Architecture ) โดยลักษณะการประมวลผลจะเปนแบบ Compile time นั่นคือคาตาง ๆ สําหรับตัวแปรจะถูกกําหนดใหขณะการคอมไพลเทานั้น กระบวนการที่เกิดขึ้นหลังจากการคอมไพล เชน การจําลองการทํางาน หรือการสังเคราะหวงจรคาของตัวแปรจะไมสามารถเปลี่ยนแปลงไดอีกตัวอยางตอไปนี้จะเปนการใชงาน GENERIC ในการสงผานคาตัวแปร สําหรับการกําหนดคาดีเลย risetime/fall time ของ AND gate ซึ่งทําใหเราสามารถกําหนดใหแตละตัวมีคาดีเลยที่แตกตางกันไดENTITY and2 ISGENERIC(rise, fall : TIME; load : INTEGER);PORT( a, b : IN BIT;PORT( c : OUT BIT);END AND2;ARCHITECTURE load_dependent OF and2 ISSIGNAL internal : BIT;BEGINinternal


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ที่เกิดขึ้นจะเปนตัวเลือกวาจะใหดีเลยสัญญาณเทากับเทาไหร ตามเงื่อนไขนั่นคือ เมื่อ internal มีคาเปน‘1’ (จากที่กอนหนานี้เปน ‘0’ จึงเปนลักษณะของ rise time) จะสงผานคาที่อัปเดตนี้ไปยังสัญญาณ cหลังจากดีเลยไปเทากับเวลา T rise หรือเมื่อมีคาเปน ‘0’ (จากที่กอนหนานี้เปน ‘1’ จึงเปนลักษณะของ falltime) จะสงผานคาที่อัปเดตนี้ไปยังสัญญาณ c หลังจากดีเลยไปเทากับเวลา T fallตัวอยางสําหรับการนํา and2 มาใชงาน และวิธีการกําหนดคาตัวแปรตาง ๆ นั้น แสดงไดดังนี้LIBRARY IEEE;USE IEEE.std_logic_1164.ALL;ENTITY test ISGENERIC(rise, fall : TIME;GENERIC(load : INTEGER);PORT ( ina, inb, inc, ind : IN std_logic;PORT ( out1, out2 : OUT std_logic);END test;ARCHITECTURE test_arch OF test ISCOMPONENT and2GENERIC(rise, fall : TIME := 10 NS;GENERIC(load : INTEGER := 0);PORT ( a, b : IN std_logic;PORT ( c : OUT std_logic);END COMPONENT;inainbincindababU1U2ccout1out2BEGINU1: and2 GENERIC MAP(5 ns, 12 ns, 3 )PORT MAP (ina, inb, out1 );U2: and2 PORT MAP (inc, ind, out2 );END test_arch;ตัวอยางนี้ เปนการใชงาน and2 ใน ENTITY test ซึ่งไดประกาศการใชงานเปนลักษณะของ componentภายใน ARCHITECTURE test_arch ซึ่งเราจะไดเห็นลักษณะการกําหนดตัวแปรใน and2 สองลักษณะคือ1) การกําหนดคาโดยปริยายที่ COMPONENT ซึ่งกําหนดให rise และ fall มีคาเทากับ 10ns สวน loadกําหนดใหมีคาเทากับ 0 และ 2) การกําหนดคาใหมกอนใชงานโดยใชคําสั่ง GENERIC MAP ระหวางBEGIN และ END สําหรับตัวอุปกรณ and2 ที่มีชื่อ (Instance name) U1 ที่กําหนดให rise = 5ns, fall =12ns, load = 3 แทน ตามตําแหนงของตัวแปรที่กําหนดไวที่ GENERIC ที่ตัวอุปกรณ สวน U2 เนื่องจากไมไดกําหนดคาใหมโดยคําสั่ง GENERIC MAP ฉะนั้นจึงยังใชคาปริยายที่กําหนดไวเบื้องตน (นั่นคือrise = 10ns, fall = 10ns, load = 0)62


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การอธิบายการทํางานของวงจรนี้ ใชลักษณะของ Structural modeling (อธิบายในบทตอไป) นั่นคือใชคําสั่ง PORT MAP ในการเชื่อมตอพอรต กับจุดสัญญาณตาง ๆ เขาดวยกัน ตามตําแหนง เชน U1 ที่กําหนดการเชื่อมตอโดยคําสั่ง PORT MAP (ina, inb, out1 ) นั่นหมายถึงวา ตําแหนงพอรตแรก (a) ตอกับina ตําแหนงพอรตที่สอง (b) จะตอกับ inb สวนตําแหนงพอรตที่สาม (c) ตอกับ out1 ตามลําดับ ซึ่งจะไดวงจรตามรูปดานขางแบบของสัญญาณ และตัวแปร (Signal and Variable Types)ในการเขียนภาษา V<strong>HDL</strong> เพื่ออธิบายการทํางานของฮารดแวร จะมีการกําหนดคาของสัญญาณ หรือตัวแปรตาง ๆ เพื่อใชงานโดยที่• สัญญาณ (Signal) จะทําหนาที่เปนเชื่อมตอขอมูลระหวางจุดตาง ๆ เขาดวยกัน เชนระหวางพอรตของอุปกรณหรือ Component ตาง ๆ โดยเราอาจจะมองวามันเปนเสนตัวนํา(Interconnection wire) ที่รับสงสัญญาณภายในระบบนั่นเอง• ตัวแปร (Variable) เปนชื่อที่ใชสําหรับการเก็บคาชั่วคราวตาง ๆ ภายใน Process เทานั้น• คาคงที่ (Constant) เปนชื่อที่กําหนดขึ้นสําหรับแทนคาคงที่ที่ใชงานในระบบสัญญาณ (Signal)เปนการสงผานคาสัญญาณ(ทางไฟฟา) ที่เปนขอมูลตาง ๆ ระหวาง Entity โดยที่เราสามารถกําหนดการใชงานดวยคําสั่ง SIGNAL ไดดังนี้SIGNAL signal_name : signal_type [:= initial_value];โดยที่ชื่อของสัญญาณ signal_name สามารถกําหนดไดชื่อเดียว หรือหลาย ๆ ชื่อไดในบรรทัดเดียวกันโดยใชเครื่องหมาย , คั่น กรณีที่แตละชื่อของสัญญาณนั้นเปนชนิด (signal_type) เดียวกันนอกจากนี้เราสามารถกําหนดคาเริ่มตนใหกับสัญญาณตาง ๆ โดยใชเครื่องหมาย := ตามดวยคาเริ่มตน(initial_value) กอนที่จะปดทายบรรทัดดวยเครื่องหมาย ;63


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การกําหนดการใชงาน Signals ตาง ๆ กําหนดไดในสวนของการกําหนด (Declaration sections) ของEntity หรือ Architecture หรือ Package โดยที่สัญญาณที่กําหนดใน Package นั้นสามารถใชไดรวมกันในหลาย ๆ Entity นั่นหมายถึงวามันเปน Global signals นั่นเองตัวอยางการกําหนดการใชงาน Signals ในสวนตาง ๆ ดังนี้LIBRARY IEEE;USE IEEE.std_logic_1164.ALL;PACKAGE sigdecl ISTYPE bus_type IS ARRAY(0 to 7) OF std_logic;SIGNAL vcc : std_logic := ‘1’;SIGNAL ground : std_logic := ‘0’;FUNCTION magic_function( a : IN bus_type) RETURN bus_type;END sigdecl;USE WORK.sigdecl.ALL;LIBRARY IEEE;USE IEEE.std_logic_1164.ALL;ENTITY board_<strong>design</strong> isPORT( data_in : IN bus_type;PORT( data_out : OUT bus_type);SIGNAL sys_clk : std_logic := ‘1’;END board_<strong>design</strong>;ARCHITECTURE data_flow OF board_<strong>design</strong> ISSIGNAL int_bus : bus_type;CONSTANT disconnect_value : bus_type := (‘X’, ‘X’, ‘X’, ‘X’, ‘X’, ‘X’,‘X’, ‘X’);BEGINint_bus


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตัวอยางนี้ มี ARCHITECTURE data_flow เดียว และมีการใชงานสัญญาณ sys_clk ในบรรทัดสุดทายกอนจบในสวนของสัญญาณที่กําหนดใน ARCHITECTURE ที่ชื่อวา int_bus นั้น เรากําหนดใหเปนแบบbus_type ซึ่งแบบของสัญญาณนี้ไดถูกนิยามใน PACKAGE sigdecl ที่กําหนดไวตอนตน และถูกเรียกใชงานโดยคําสั่ง USE เรียบรอยแลว จึงสามารถเรียกใชงานไดตัวแปร (Variable)ตัวแปรใชสําหรับการใชเก็บคาชั่วคราวของกระบวนการประมวลผลตาง ๆ ที่เกิดขึ้นใน Process หรือSubprogram โดยสิ่งที่แตกตางจากสัญญาณคือ การเปลี่ยนแปลงคาของตัวแปร จะถูกเปลี่ยนแปลงคาโดยทันทีหลังจากการกระทําใด ๆ ที่เกิดขึ้นใน Expression หรือคําสั่งตาง ๆ ที่มีผลตอคาตัวแปรนั้น ๆ แตสําหรับการเปลี่ยนแปลงคาสัญญาณ (Signal) ตาง ๆ ที่อยูใน Process ใด ๆ นั้นจะถูกดีเลยไว แลวเปลี่ยนแปลงคาพรอม ๆ กันในตอนจบ Process นั้นขอแตกตางอีกอยางคือ ตัวแปร (Variable) ที่ใชงานใน Process ใด ๆ จะใชไดภายใน Process ที่กําหนดไวเทานั้น หรือพูดไดวามันจะเปน Local variable ของ Process แตสําหรับคาสัญญาณ (Signal) ที่กําหนดไวในArchitecture ใด ๆ สามารถใชไดในหลาย ๆ Process ที่ถูกเขียนออกแบบอยูใน Architecture นั้นการกําหนดคาตัวแปรสําหรับใชงานใน Process จะคลาย ๆ กับคาสัญญาณ แตจะใชคําวา VARIABLE โดยสามารถทําไดดังนี้VARIABLE variable_name {,variable_name} : variable_type[:=ini_value];จะเห็นไดวา เราสามารถกําหนดชนิดของตัวแปร (variable_type) รวมทั้งอาจกําหนดคาเริ่มตน(ini_value) ใหกับตัวแปรนั้น ๆ ไดเลย ซึ่งการกําหนดคาเริ่มตนนี้จะใชในการจําลองการทํางานเทานั้นสวนการสังเคราะหวงจร (Hardware synthesis) จะละเลยคาตรงนี้ไป โดยไมนําคาเริ่มตนไปเก็บไวที่รีจิสเตอรใด ๆ ในการใชงานใน Process ใด ๆ เราจะใชเครื่องหมาย := (Variable assignment) ในการสงผานคาไปยังตัวแปรที่กําหนด ดังตัวอยางการใชงานตอไปนี้LIBRARY IEEE;USE IEEE.std_logic_1164.ALL;65


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ENTITY and5 ISPORT ( a, b, c, d, e : IN std_logic;PORT ( q : OUT std_logic);END and5;ARCHITECTURE and5 OF and5 ISBEGINPROCESS(a, b, c, d, e)VARIABLE state : std_logic;VARIABLE delay : time;BEGINstate := a AND b AND c AND d AND e;IF state = ‘1’ THENdelay := 4.5 ns;ELSIF state = ‘0’ THENdelay := 3 ns;ELSEdelay := 4 ns;END IF;q


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>นอกจากนี้ การใชชื่อแทนตัวเลขที่เปนคาคงที่ ยังชวยใหเรางายในการอานทําความเขาใจ เชนแทนที่จะใช3.1415 ตรง ๆ ในตัวโปรแกรม เราอาจกําหนดใหเปนคาคงที่ชื่อ PI ดังนี้CONSTANT PI: REAL := 3.1414;การกําหนดคา CONSTANT นั้นสามารถกําหนดไดทั้งในPackage, Entity หรือ Architecture ซึ่งจะกําหนดระดับการใชงานไดวาตัวแปรคาคงที่นั้นใชงานไดเปนระดับ Local constant หรือ Global constant นั่นเองแบบของขอมูล (Data Types)สัญญาณ หรือตัวแปร หรือคาคงที่สามารถกําหนดไดใหเปนหลาย ๆ ชนิด หรือหลาย ๆ แบบ แลวแตความเหมาะสมของขอมูลที่เราตองการใช เรียกวา (Data types) โดยในภาษา V<strong>HDL</strong> ที่มีความยืดหยุนสูงจึงมีแบบของขอมูลมากมาย ตั้งแตเปนจํานวนธรรมดา จํานวนจริง หรือจนกระทั่งถึงแบบที่เปนจํานวนเชิงซอน ซึ่งอาจเปนประโยชนในการจําลองการทํางาน (Simulation) แตไมจําเปนวาทุกแบบจะสามารถนํามาสังเคราะห (Synthesis) เปนวงจรไดในการกําหนดคาของแบบขอมูลตาง ๆ (Type declaration) สามารถกําหนดไดในสวนของทั้ง Package,Entity, Architecture รวมทั้งในแตละ Process ไดอีกดวย โดยสามารถเขียนไดในลักษณะดังตอไปนี้TYPE type_name IS type_mark;โดยที่ type_mark เปนไดหลาย ๆ แตกตางกันตามลักษณะของ types ที่ใชงาน ซึ่งสามารถแบงเปนกลุมไดในรูปที่ 11.9 ซึ่งจะเห็นวามีอยู 4 กลุมหลัก ๆ คือ File type, Access type, Scalar type และComposite type ในสวนของ File type ที่เกี่ยวของกับการอานเขียนไฟล และสวนของ Access type ที่เกี่ยวของกับการใชงาน pointer ในภาษาชั้นสูงสวนใหญ ไมคอยจะเกี่ยวของกับการเขียนเพื่อการออกแบบ และสังเคราะหวงจรเทาไหรนัก จึงจะขอกลาวเพียงแคสวนของ Scalar type และ Compositetype เทานั้น67


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Scalar typesรูปที่ 11.9 Data type แบบตาง ๆ ในภาษา V<strong>HDL</strong>เปนแบบที่ใชสําหรับเก็บคาตาง ๆ ณ เวลาใด ๆ ประกอบดวย Interger types, Real types, Enumeratedtypes และ Physical types ซึ่งจะไดอธิบายเปนลําดับตอไปInteger typesเปนจํานวนเต็มที่ใชงานในคณิตศาสตรทั่วไป มีทั้งจํานวนเต็มบวก ศูนย และจํานวนเต็มลบ ซึ่งสามารถกระทําทางคณิตศาสตรไดไมวาจะเปนการบวก การลบ การคูณ หรือการหาร โดยกําหนดใหมีคาอยูในชวงตั้งแต -2,147,483,647 ถึง +2,147,483,647 ใน Standard packageสําหรับการกําหนดการใชงานคาตัวแปร (Variable) สัญญาณ (Signal) หรือคาคงที่ (Constant) ใหเปนแบบInteger นั้น แสดงไดดังตัวอยางตอไปนี้ARCHITECTURE test OF test ISBEGINPROCESS(X)68


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>VARIABLE a : INTEGER;BEGINa := 1; --Ok 1a := -1; --Ok 2a := 1.0; --error 3END PROCESS;END test;จะเห็นวาตัวแปร a ไดถูกกําหนดใหใชงานเปนแบบ INTEGER ดังนั้นการกําหนดให a เทากับคา 1 หรือ -1 ในสองคําสั่งแรกจึงไมมีปญหา สวนการกําหนดใหมีคาเทากับ 1.0 โดยมีจุดทศนิยม ซึ่งถือวาเปนเลขจํานวนจริง ในคําสั่งตอมา จึงทําใหเกิดความผิดพลาด (Error) ขึ้นReal typesเปนแบบที่ใชแทนคาจํานวนจริงตาง ๆ โดยใน Standard package ไดกําหนดใหมีคาอยูในชวง -1.0E+38ถึง +1.0E+38 ซึ่งตัวอยางการใชงานแสดงไดดังนี้ARCHITECTURE test OF test ISSIGNAL a : REAL;BEGINa


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Enumerated typesแบบประเภทนี้มีประโยชนมากสําหรับการเขียนโปรแกรมเพื่อใหงายในการทําความเขาใจ เนื่องจากจะใชคําหรือตัวอักษรที่มีความหมาย แทนคาที่เปนตัวเลข โดยผูใชงานสามารถกําหนดไดตามความตองการ หรือเรียกไดอีกอยางหนึ่งวามันเปน user-defined type เชน ในวงจรที่มีการแสดงผลดวยสีตาง ๆ ตามงื่อนไขคาของเอาทพุท เราอาจแทนคา “00” ดวย Red, “01” ดวย Green, “10” ดวย Blue และ “11” ดวย White ทําใหงายในการตรวจสอบ และทําความเขาใจ เปนตนTYPE color IS (Red, Green, Blue, White);อีกการใชงานหนึ่งที่นิยมกันมาก คือการใชในการเขียนวงจรแบบ State machine ที่มีการกําหนดคาเอาทพุทในแตละสถานะ (states) และมีการเปลี่ยนสถานะเมื่อไดรับอินพุท หรือเกิดสิ่งตาง ๆ ตามเงื่อนไขที่วางไว มักนิยมใชกันในระบบวงจรควบคุม (Control system) โดยการกําหนดชื่อใหกับแตละสถานะ ใหเหมาะสมกับการทํางานในสถานะนั้น ๆ จะชวยใหการอานทําความเขาใจทําไดงายมากยิ่งขึ้นดังตัวอยางตอไปนี้ENTITY traffic_light ISPORT(sensor : IN std_logic;PORT(clock : IN std_logic;PORT(red_light : OUT std_logic;PORT(green_light : OUT std_logic;PORT(yellow_light : OUT std_logic);END traffic_light;ARCHITECTURE simple OF traffic_light ISTYPE t_state is (red, green, yellow);Signal present_state, next_state : t_state;BEGINPROCESS(present_state, sensor)BEGINCASE present_state ISWHEN green =>next_state


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ELSEnext_state red_light


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>บรรทัดตอมาจะเปนการกําหนดหนวย ของ current โดยเริ่มตนดวยคําวา UNITS หลังจากนั้นจะเปนการกําหนดชื่อของหนวยฐาน (base unit) โดยในที่นี้ใหมีหนวยเปน na (nano amps) หลังจากนั้น เราสามารถใชกําหนดเปนหนวยอื่น ๆ โดยบอกวามีคาเปนกี่เทาของหนวยฐาน หรือหนวยที่ไดกําหนดไวแลวดังตัวอยาง ua = 1000 na; ma = 1000 ua, a = 1000 ma ตอเนื่องไปเรื่อย ๆ จนกระทั่งจบดวยคําสั่ง ENDUNITS;ใน Standard package ไดมี Type ที่ถูกกําหนดไวแลว (Predefined type) ที่เปนคาการวัดในเชิงเวลา (Time)ซึ่งสวนใหญ ใชในการจําลองการทํางาน ดังตอไปนี้ สังเกตวาเราสามารถกําหนดชวง (RANGE) การใชงานไดตามตองการ (Implementation defined) แตตองไมเกินชวงที่ใชไดของตัวแปรแบบ INTEGERTYPE TIME IS RANGE UNITSfs; --femtosecondps = 1000 fs; --picosecondns = 1000 ps; --nanosecondus = 1000 ns; --microsecondms = 1000 us; --millisecondsec = 1000 ms; --secondmin = 60 sec; --minutehr = 60 min; --hourEND UNITS;Composite Typesประกอบดวย Array และ Record types ซึ่งสวนใหญคงทราบกันแลววา Array คือกลุมของสัญญาณ หรือตัวแปรประเภทเดียวกัน สวน Record เปนการรวมกลุมกันของสัญญาณ หรือตัวแปรที่ตางประเภทกันArray มีประโยชนสําหรับการสรางเปนหนวยความจําทั้ง RAM และ ROM ขณะที่ Record จะใชสําหรับการสรางชุดของขอมูล (Data packet) หรือคําสั่ง (Instruction) ตาง ๆArray typesจากที่กลาวมา คุณสมบัติของ Array คือเปนการรวมกลุมของสัญญาณ หรือตัวแปรชนิดเดียวกัน โดยสามารถเขาถึงขอมูลไดเปนกลุม หรือบางสวนตามที่ตองการ โดยอาศัยดัชนี (Indices) เปนตัวกําหนด ตัวอยางของArray ที่เปนมิติเดียว (Single dimemsional array) อาจแสดงไดดังนี้72


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>TYPE data_bus IS ARRAY(0 TO 31) OF BIT;..VARIABLE X: data_bus;VARIABLE Y: BIT;..Y := X(0); --line 1Y := X(15); --line 2ซึ่งหมายถึงเรากําหนดแบบ ชื่อ data_bus โดยมีขนาด 32 เสน ซึ่งในแตละเสน เปนชนิดของขอมูลเปนBIT ที่มีคาไดไมเปน ‘0’ก็ ‘1’หลังจากนั้นมีการนํามาใชงานโดยกําหนดตัวแปร X ใหเปนชนิดdata_bus สวนตัวแปร Y กําหนดใหเปนชนิด BIT เพื่อใชในการรับคาจากการเขาถึงขอมูล X ในบิตที่ 0และบิตที่ 15 ในบรรทัด Y := X(0); และ Y := X(15); ตามลําดับ โดยการใชเครื่องหมาย ()เปนตัวกําหนดตําแหนง ที่มีเลขดัชนีของขอมูลที่เราตองการเขาถึงอยูภายในเราสามารถกําหนดใหมีโครงสราง Array ซอนกับ Array ได เพื่อใหมีหลาย ๆ มิติ (Multi dimensional array) เชนในตัวอยางการสรางหนวยความจํา ROM ที่มีหลาย ๆ แอดเดรส (Memory depth) และแตละแอดเดรส ก็มีหลายๆ บิต (Memory width) เปนตน ตัวอยางขางลางตอไปนี้ เปนการเขียนเพื่อกําหนดการใชงาน ROM (Read OnlyMemory) โดยมีการกําหนดโครงสรางเปนอารเรยซอนกัน นั่นคือ data_out ที่เปนอารเรยของstd_logic ถูกกําหนดใหใชงานอยูในอารเรยของ mem_data อีกทีLIBRARY IEEE;USE IEEE.std_logic_1164.ALL;ENTITY rom ISPORT( addr : IN INTEGER;PORT( data : OUT data_out;PORT( cs : IN std_logic);END rom;ARCHITECTURE basic OF rom ISCONSTANT width : INTEGER := 3;CONSTANT memsize : INTEGER := 7;TYPE data_out IS ARRAY(0 TO width) OF std_logic;TYPE mem_data IS ARRAY(0 TO memsize) OF data_out;CONSTANT x_state : data_out := (‘X’, ‘X’, ‘X’, ‘X’);CONSTANT rom_data : mem_data :=( ( ‘0’, ‘0’, ‘0’, ‘0’),( ( ‘0’, ‘0’, ‘0’, ‘1’),( ( ‘0’, ‘0’, ‘1’, ‘0’),73


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>( ( ‘0’, ‘0’, ‘1’, ‘1’),( ( ‘0’, ‘1’, ‘0’, ‘0’),( ( ‘0’, ‘1’, ‘0’, ‘1’),( ( ‘0’, ‘1’, ‘1’, ‘0’),( ( ‘0’, ‘1’, ‘1’, ‘1’) );BEGINdata


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 11.10 คาในแตละบิตของแตละแอดเดรสใน ROMในการกําหนดชนิดของพอรต data ที่เปนเอาทพุทพอรตของ ROM เรากําหนดใหเปน data_outเนื่องจากขอมูลในหนวยความจําแตละแอดเดรสเปนลักษณะของอารเรยที่กําหนดขึ้นมาใหมในบรรทัดTYPE data_out IS ARRAY(0 TO width) OF std_logic;โดยการเขาถึงคาของหนวยความจําในแตละแอดเดรส ทําไดโดยการใสคา addr ที่เปนชนิด Integer โดยคาที่เก็บไวก็จะถูกอานมาที่พอรต data ที่ถูกกําหนดใหเปนชนิด data_out นั่นเองสวนการเขาถึงคาในแตละบิตของหนวยความจําในแตละแอดเดรส สามารถใชงานรูปแบบคําสั่งไดดังนี้bit_value := rom_data(addr) (bit_index);โดยที่คาแตละบิตของขอมูลในแอดเดรสนั้น ๆ จะถูกอางอิงถึงไดดวยคาของ bit_index ที่เพิ่มเติมเขามาดานหลังของคําสั่ง (ซึ่งในภาษา Verilog ไมสามารถทําลักษณะนี้ได ในบรรทัดเดียว)จากตัวอยางที่ผานมา เปนการกําหนดอารเรยซอนอารเรยเพื่อใหไดเปนสองมิติสําหรับทําเปนหนวยความจําซึ่งจะตองใชคําสั่ง TYPE จํานวนสองครั้ง ตัวอยางตอไปนี้จะแสดงใหเห็นการใชงานอีกลักษณะหนึ่งในการกําหนดเปนอารเรยหลายมิติ (Multidimentional array)TYPE mem_data_md IS ARRAY(0 TO memsize, 0 TO width) OF std_logic;CONSTANT rom_data_md : mem_data :=( ( ‘0’, ‘0’, ‘0’, ‘0’),( ( ‘0’, ‘0’, ‘0’, ‘1’),( ( ‘0’, ‘0’, ‘1’, ‘0’),( ( ‘0’, ‘0’, ‘1’, ‘1’),( ( ‘0’, ‘1’, ‘0’, ‘0’),( ( ‘0’, ‘1’, ‘0’, ‘1’),( ( ‘0’, ‘1’, ‘1’, ‘0’),(( ‘0’, ‘1’, ‘1’, ‘1’) );จากตัวอยางคาคงที่ mem_data_md ถูกกําหนดใหเปนแบบ (Type) ของอารเรยสองมิติที่ใชแทนหนวยความจํา ROM ที่กําหนดคาในแตละแอดเดรสดวยคาคงที่ rom_data_md75


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ในการเขาถึงในแตละหนวยบิตของหนวยความจําทําไดเหมือนกันกับตัวอยางที่ผานมา แตใชวิธีการเขียนที่แตกตางกันเชน x := rom_data_md(3,3); ซึ่ง x ที่ไดจะมีคาเทากับ ‘1’Record Typesเปนอีกชนิดหนึ่งของตัวแปรที่เปน Composite type โดยจะเปนกลุมของชนิดตัวแปร (Types) ตาง ๆ ทั้งที่เหมือนหรือที่ตางกัน โดยสามารถกําหนดขึ้นมาใหเปนออปเจคเดียวดังตัวอยางTYPE optype IS ( add, sub, mpy, div, jmp );TYPE instruction ISRECORDopcode : optype;src : INTEGER;dst : INTEGER;END RECORD;ในบรรทัดแรกของตัวอยาง เปนการกําหนดชนิดตัวแปรใชงานเองในลักษณะของ enumerated type ที่มีชื่อวา optype ที่ประกอบดวย add, sub, mpy, div, jmp ตามลําดับ ในบรรทัดตอมาเปนการกําหนด Record type ที่มีชื่อวา instruction ซึ่งในการกําหนด (Declare) สิ่งตาง ๆ ที่อยูภายในจะตองขึ้นตนดวย RECORD และลงทายดวย END RECORD ในตัวอยางนี้ประกอบดวยตัวแปร opcode ที่เปนชนิด optype (ที่กําหนดในบรรทัดแรก) สวน src และ dst เปนตัวแปรชนิด INTEGERสําหรับวิธีการใชงาน หรือเขาถึงคาในแตละตัวแปรสามารถดูไดตามตัวอยางขางลางตอไปนี้PROCESS(X)VARIABLE inst : instruction;VARIABLE source, dest : INTEGER;VARIABLE operator : optype;BEGINsource := inst.src; --Ok line 1dest := inst.src; --Ok line 2source := inst.opcode; --error line 3operator := inst.opcode; --Ok line 4inst.src := dest; --Ok line 5inst.dst := dest; --Ok line 6inst := (add, dest, 2); --Ok line 7inst := (source); --error line 8END PROCESS;76


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตามตัวอยางของ PROCESS(X) เริ่มตนมีการกําหนดตัวแปรตามชนิดที่ตองการใชงานไดแก instเปนชนิด instruction สวน source และ dest เปนชนิด INTEGER และ operator เปนชนิดของ optype หลังจากนั้นมีการสงผานคา โดยคาของตัวแปรตาง ๆ ที่อยูใน Record type โดยจะตองเปนประเภทเหมือนกันทั้งซายและขวาของเครื่องหมาย := ในการอางอิงคาของตัวแปรในRecord จะใชเครื่องหมายจุด (.) ตัวอยางเชน inst.src เปนการเขาถึงคาของ src (ที่เปนชนิดINTEGER) ของตัวแปร inst (ที่เปนชนิด instruction) ดังนั้นดานซายมือของเครื่องหมาย :=ก็เปนตัวแปร source ที่เปนชนิด INTERGER เชนเดียวกันบรรทัดที่ 3 ผิดเนื่องจาก inst.opcode ดานขวามือเปนตัวแปรชนิด optype ไมใช INTEGER เหมือนกับตัวแปรทางดานซายมือ ในบรรทัดที่ 7 เปนการสงผานคาพรอมกันทั้งสามตัวไดแก add, dest, 2 (ซึ่งเปนประเภท optype, INTEGER, INTEGER ตามลําดับ) ไปใหตัวแปร inst ดานซายมือ เทียบกับบรรทัดที่ 8ที่ผิดเนื่องจากสงไปเพียงแคตัวเดียว77


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Chapter4บทที่ 4. นิพจนและการสงผานคา(Expression and Assignment)นิพจน หรือ Expression หมายถึงการนําตัวแปร (variables) หรือคาคงที่ (constant) ที่เรามักเรียกวา ตัวถูกกระทํา (Operand) มากระทํากันดวยตัวกระทํา (Operator) ในลักษณะตาง ๆ เชนทางคณิตศาสตร ทางการเปรียบเทียบ หรือทางตรรกะในภาษา V<strong>HDL</strong> สามารถกําหนดนิพจนใหเปนการกระทําไดทั้ง 3 ลักษณะเหมือนกัน ไมวาจะเปนการกระทําทางคณิตศาสตร (Arithmatic operators) เชน การบวกลบคูณหาร การกระทําเชิงความสัมพันธ(Relational operators) เชนการเปรียบเทียบมากกวานอยกวาเทากับ และการกระทําทางตรรกะ (Logicaloperators) เชนการ And, Or, Not, Xor ตาง ๆ ซึ่งหลังจากการกระทําในนิพจนแลว อาจตองมีการสงผานคา (Assignment) มายังตัวแปร หรือสัญญาณที่ตองการนํามาใช ซึ่งจะอยูทางดานซายมือของเครื่องหมาย


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตัวกระทํา (Operators)ในภาษา V<strong>HDL</strong> ตัวกระทําตาง ๆ มีลักษณะที่แตกตางกันโดยอาจจําแนกประเภทไดจากชนิดของการกระทําจํานวนของตัวถูกกระทํา ชนิด (Type) ของตัวถูกกระทํา หรือชนิดของผลลัพธ นอกจากนี้เราสามารถกําหนดงตัวกระทําเพิ่มเติมขึ้นมาเหมือนกับฟงกชันหนึ่ง โดยอาจกําหนดการทํางานเปนตารางคาความจริงเพิ่มขึ้นมาเอง นอกเหนือจากตัวกระทําตามปกติที่กําหนดขึ้นมาแลว (Predefined operators) ในภาษาV<strong>HDL</strong> ที่แสดงในตารางที่ 4.1ตารางที่ 4.1 Predefined V<strong>HDL</strong> operatorsในตารางยังแสดงถึงลําดับความสําคัญ (Precedence) ของตัวกระทําชนิดตาง ๆ จากนอยไปมา โดยเรียงจากบรรทัดบนลงลาง ซึ่งหมายถึงกรณีที่ไมมีวงเล็บกําหนดการกระทํากอนหลังแลว ตัวกระทําที่อยูดานลางจะทํากอนดังตัวอยางA + B * C ≡ A + (B * C)not BOOL and (NUM = 4) ≡ (not BOOL) and (NUM = 4)ในบรรทัดแรก A + B * C มีทั้งตัวกระทําบวก (Adding) และคูณ (Multiplying) ซึ่งในการประมวลผลจากซายไปขวา ถึงแมเราจะเจอตัวบวกกอน แตเมื่อเทียบความสําคัญกับตัวคูณแลวมีนอยกวา ดังนี้นิพจนนี้จึงทําการคูณกันระหวาง B และ C กอนที่จะนําผลลัพธนั้นมาบวกรวมกับ A (ซึ่งเหมือนกับการใสวงเล็บที่ Bกับ C ในนิพจนสมมูลทางดานขวามือ)ในบรรทัดที่สอง not BOOL and (NUM = 4)มีตัวถูกกระทําไดแก BOOL และคาบูลีนจากการเปรียบเทียบคา NUM กับคาคงที่ 4 ทั้งนี้ลําดับของการประมวลผลจะทําในวงเล็บกอน แลวระหวางตัวกระทําnot กับ and จะตองมีการกลับคาของ BOOL กอนที่จะนํามา and กับคาบูลีนที่ไดจากการเปรียบเทียบในวงเล็บ ตามลําดับความสําคัญ79


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตัวกระทําทางตรรกะ (Logical Operators)ไดแก and, or, nand, nor, xor, xnor, not โดยที่ตัวถูกกระทํา (Operands) จะตองเปนชนิด (Type) เดียวกันซึ่งอาจจะเปน BIT หรือ BOOLEAN หรือเวกเตอรของ BIT หรือของ BOOLEAN ที่มีขนาดเทากันตัวอยางแสดงไดดังตอไปนี้signal A, B, C: BIT_VECTOR(3 downto 0);signal D, E, F, G: BIT_VECTOR(1 downto 0);signal H, I, J, K: BIT;signal L, M, N, O, P: BOOLEAN;A


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตัวกระทําเชิงความสัมพันธ (Relational operators)เปนการเปรียบเทียบมากกวา นอยกวา หรือเทากับ ระหวางตัวถูกกระทํา (Operands) สองตัวที่เปนชนิดเดียวกัน โดยมีผลลัพธเปนคาบูลีน (จริง หรือเท็จ) เทานั้นการเปรียบเทียบเทากัน (=) หรือไมเทากัน (/=) สามารถใชงานไดกับทุกชนิดของตัวแปร หรือสัญญาณ ทั้งที่เปนสเกลาร หรือแบบเวกเตอร สําหรับการตรวจสอบคาที่เทากันหรือไม สวนการเปรียบเทียบมากกวานอยกวา (=) สามารถใชงานไดกับตัวแปรหรือสัญญาณชนิดที่เปนจํานวนเต็ม (Integer) หรือชนิดบิตเวกเตอรโดยจะใหผลลัพธจากการเปรียบเทียบเปนคาบูลีนสําหรับการเปรียบเทียบเวกเตอร หรืออารเรยมิติเดียว จะมีการเปรียบเทียบเรียงลําดับที่ละบิตจากซายไปขวา(โดยไมคํานึงถึงดัชนี หรือ index ของอารเรย) โดยผลลัพธมากกวาหรือนอยกวาจะสรุปมาจากการเปรียบเทียบในแตละบิตเรียงลําดับกันไป ดังตัวอยางเชน “101011” มีคาที่นอยกวา “1011” เนื่องจากบิตที่สี่จากซายมีคาที่แตกตางกัน นั่นคือ ‘0’ ในอารเรยแรก และ ‘1’ ในอารเรยหลัง ดังนั้นขอสรุปสําหรับการเปรียบเทียบบิตอารเรย ขึ้นอยูกับบิตที่สี่ที่บอกวาตัวแรกมีคานอยกวากรณีการเปรียบเทียบระหวาง “101” กับ “101000” ที่มีสามบิตแรกมีคาเทากัน แลวการเปรียบเทียบสิ้นสุดกอนเนื่องจากอารเรยแรกมีแคสามบิต โดยที่อารเรยตัวหลังที่ยาวกวายังมีคาอยู ในลักษณะนี้ขอสรุปก็คือตัวแรกที่หมดกอนมีคานอยกวาตัวอยางอื่น ๆ เชน’1’ = ’1’“101” = ”101””101” < ”110””1” > ”011” -- Array comparisonUNSIGNED’”1” < UNSIGNED’”011” -- Numeric comparisonสําหรับตัวอยางในบรรทัดที่สี่ ที่เปนการเปรียบเทียบแบบอารเรยระหวาง “1” และ “011” จะดูเพียงแคบิตแรกที่แตกตางกัน นั่นคือ ‘1’ ในอารเรยแรก ที่มากกวา ‘0’ ในอารเรยหลัง ทั้งนี้หากพิจารณาในบรรทัดถัดมาที่มีการแปลงเปนจํานวนเต็มบวก (โดยใชฟงกชัน UNSIGNED ) ผลลัพธที่ไดจะตางกันเนื่องจากเปนการเปรียบเทียบคา 1 ที่นอยกวา 3 ในฐานสิบ81


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตัวกระทําเชิงคณิตศาสตร (Arithmetic operators)ไดแกการบวกลบ คูณหาร (+, -, *, /) สําหรับจํานวนเต็ม นอกจากการกระทําทางคณิตศาสตรพื้นฐานเหลานี้คอมไพเลอรบางตัวยังอนุญาตใหใชงาน Modulus (mod) และ Remainder (rem) ในการหาผลหาร และเศษจากการหาร ตามลําดับ หรือการหาคาสัมบูรณ (abs) ของจํานวนเต็ม หรือการยกกําลัง (**) ที่เลขฐานตองเปน2 n โดยที่ n เปนจํานวนเต็มบวกเทานั้นตัวอยางการใชงาน เชนsignal A, B, C, D, E, F, G, H, I, J: INTEGER range 0 to 15;A


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• Unary (Signed) operator (+,-) : ไดแกการกําหนดคาบวกลบของขอมูลสําหรับจํานวนเต็ม โดยใชเครื่องหมายบวกหรือลบนําหนาคาคงที่ หรือตัวแปร หรือสัญญาณ ซึ่งจะมีตัวถูกกระทํา (Operand)เพียงตัวเดียว เราจึงเรียกวา Unary operator นั่นเอง เชนsignal A, B: INTEGER range -8 to 7;A


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>จะเห็นวาหากเราตองการใชงานชนิดตัวแปรประเภท std_logic ทั้งที่เปนบิต หรือเวกเตอร แลวใหมันสามารถใชงานตัวกระทําไดทุกชนิด ควรจะตองเรียกใช Package ที่มีชื่อวา std_logic_signed หรือstd_logic_unsigned แลวแตระบบเลขที่ตองการใชงานในการออกแบบ วาใหเปนแบบเครื่องหมาย (Signed) หรือไมมีเครื่องหมาย (Unsigned)การสงผานคาสัญญาณในภาษา V<strong>HDL</strong>การสงผานคาสัญญาณ หรือ Signal assignment เปนคําสั่งพื้นฐานที่สุดในลักษณะของการอธิบายพฤติกรรมการทํางานของวงจร เชน a


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>สําหรับภาษา V<strong>HDL</strong> แลวมีวิธีการที่จะจัดการกับกรณีที่จุดใดจุดหนึ่งของวงจรมีหลาย ๆ ตัวขับเกิดขึ้น(Multiple driven signals) ซึ่งจะมีประโยชนในการออกแบบระบบบัสขอมูล หรือบัสสองทิศทาง(Bidirectional bus) เปนตนความจริงแลว คาของสัญญาณ ณ จุดใด ๆ ของวงจรตองมีคาเพียงคาเดียว ซึ่งกรณีที่จุดนั้นมีตัวขับหลาย ๆ ตัวที่สงคาสัญญาณแตกตางกันก็จําเปนตองมีการจัดการคาสัญญานตาง ๆ เหลานั้นเกิดขึ้นใหมีเพียงคาใดคาหนึ่งเทานั้น ซึ่งเราเรียกวา Resulution function (ซึ่งจะไดกลาวตอไปในบท Subprogram and Package) โดยจะมีลักษณะเปนเงื่อนไขตารางคาความจริงในการพิจารณาสัญญานตาง ๆ ที่เขามาตัว Driver ปกติแลวจะเกิดขึ้นเมื่อเราใชคําสั่งในการสงผานคา (Assignment statement) ดวยสัญลักษณ


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>เปนการสรางตัว Multiplexer ขนาดเขา 4 ออก 1 โดยจะมีการสงผานคา i0 ไปยัง q เมื่อเงื่อนไข a เทากับ 0และ b เทากับ 0 เกิดขึ้น (มิฉะนั้น จะสงผานคา ‘0’ ออกไปแทน) และมีการสงผานคา i1 ไปยัง q เมื่อเงื่อนไข a เทากับ 1 และ b เทากับ 0 เกิดขึ้น (มิฉะนั้น จะสงผานคา ‘0’ ออกไปแทน) และอื่น ๆการเขียนลักษณะนี้จะมีตัว Driver ที่สงคาตาง ๆ ไปยังเอาทพุท q อยูทั้งหมด 4 ตัวดวยกัน ซึ่งแตละตัวจะสงผานคา i0, i1, i2, i3 ตามลําดับ ถาเงื่อนไขของมันเปนจริง มิฉะนั้นจะสง ‘0’ ออกไป ดังนั้นจะเห็นวาจะมีการขัดแยงกันของสัญญาณที่สงมาที่ q เกิดขึ้น เชน ในกรณีที่ a=’0’ และ b=’0’ เขาเงื่อนไขแรกเพราะฉะนั้น q จะไดรับคาสัญญาณมาจาก i0 ในบรรทัดแรก สวนที่เหลืออีก 3 บรรทัดนั้น q จะไดรับคา‘0’ ซึ่งสุดทายแลวจะตองมาตัดสินอีกทีดวย Resolution function วา q ควรจะมีคาเทาไหรดีดังนั้นทางที่ดีที่สุดสําหรับการออกแบบนี้คือ การใช Driver เพียงแคตัวเดียวในการสงผานคาสัญญาณตามเงื่อนไขตาง ๆ เหมือนเดิม ดังตัวอยางARCHITECTURE better OF mux ISBEGINq


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>result


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ประเภทของการสงผานคาสัญญาณเราสามารถแบงลักษณะการสงผานคาได 3 ลักษณะ แตกตางกันไดแก แบบธรรมดา (Simple signalassignment) แบบมีเงื่อนไข (Conditional signal assignment) และแบบเลือก (Selected signalassignment)Simple signal assignmentเปนการสงผานคาจากทางฝงทางดานขวามือของเครื่องหมาย


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Conditional Signal Assignmentสําหรับการสงผานคาแบบมีเงื่อนไขนี้ เหมือนกับการใชงานคําสั่ง if นั่นเอง แตสามารถเขียนไดสั้นกวาและอยูภายนอก Process โดยขอจํากัดคือสามารถสงผานคามายังจุดเดียวเทานั้น โดยเปนสัญญาณที่อยูทางซายมือของเครื่องหมาย


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตัวอยางถัดไป จะเปนการเปรียบเทียบการใชงาน Conditional assignment ใน arch1_xor2เปรียบเทียบกับคําสั่ง if ใน arch2_xor2 โดยเปนการอธิบายการทํางานของ xor gate ซึ่งจะเห็นวาวิธีการแรกจะสั้นกระชับกวาentity xor2 isport (a, b: in bit;x: out bit);end xor2;architecture arch1_xor2 of xor2 isbeginx


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>โครงสรางของคําสั่ง เหมือนกับคําสั่ง case นั่นคือ แตละทางเลือกจะถูกกําหนดดวยคาของselection_expression แตละคานั่นคือ option_1, option_2, …, option_nโดยที่ในแตละทางเลือกในกรณีที่เปนชุดของคาตาง ๆ เราสามารถเชื่อมตอกันไดดวยเครื่องหมาย “|” หรือใชเปนชวงของคา (Range) หรือพรอมกันทั้งสองแบบการกําหนดทางเลือกตาง ๆ ควรจะตองกําหนดใหครบทุกกรณีที่สามารถเปนไปได เพื่อปองกันการเกิดแลทชเพื่อเก็บคาเอาทพุทโดยไมจําเปน หรืออีกวิธีหนึ่งคือการเพิ่มบรรทัดสุดทายดวยการกําหนดการกระทําของเงื่อนไขตาง ๆ ที่เหลือดวยคําวา when othersตัวอยางการใชงานสําหรับการอธิบายการทํางานของ xor gate แสดงไดดังนี้entity xor2 isport (a, b: in bit;x: out bit);end xor2;architecture arch_xor2 of xor2 issignal temp: bit_vector (1 downto 0);begintemp


Chapter5บทที่ 5. การเขียนอธิบายโครงสรางวงจร (V<strong>HDL</strong> Structural <strong>design</strong>)ในการออกแบบทางฮารดแวรโดยทั่วไปนั้น เรามักจะมองเปนระบบใหญที่ประกอบดวยอุปกรณตาง ๆ อยูภายในเพื่อทําหนาที่ตาง ๆ กัน และทําการรับสงสัญญาณระหวางกันเพื่อใหเกิดการทํางานอยางที่เราตองการ ซึ่งแนนอนวาภาษาที่ใชในการอธิบายฮารดแวรอยาง V<strong>HDL</strong> ก็จะตองมีความสามารถที่จะทําการอธิบายการเชื่อมตออุปกรณตาง ๆ เขาดวยกันเปนวงจรขึ้นมา ทําใหผูออกแบบสามารถกําหนดโครงสรางของระบบ (Structure) ไดเอง เชนโครงสรางแบบ Pipeline โครงสรางของตัวบวกแบบตาง ๆ เปนตนตัวอุปกรณที่ถูกเรียกใช Componentsในภาษา V<strong>HDL</strong> เราเรียกอุปกรณยอยที่ประกอบขึ้นมาเปนระบบหนึ่ง ๆ ดวยวิธีการเขียนแบบอธิบายโครงสรางของวงจรตาง ๆ วาเปน Components ที่จะถูกเรียกมาใชงานในการตอเชื่อมเปนระบบใหญขึ้นมาโดยตัว Component อาจจะเปนเกตพื้นฐานตาง ๆ ที่อยูในไลบรารีมาตรฐาน และสามารถเรียกใชงานไดเลยหรือเปนตัวที่ผูใชงานออกแบบไวเอง เปนลักษณะของ V<strong>HDL</strong> ไฟลรูปที่ 5.1 การเรียกใชงาน Component


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตัวอยางในรูป 5.1 เปนระบบที่มีชื่อวา MUX2 ที่ประกอบดวยอุปกรณสองตัวที่มีชื่อวา INV และ AOI ที่เราไดออกแบบไวแลวเปน V<strong>HDL</strong> ไฟลแยกตางหากดังนี้library IEEE;use IEEE.STD_LOGIC_1164.all;entity INV isport (A: in STD_LOGIC;F: out STD_LOGIC);end INV;architecture V1 of INV isbeginF


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ภายหลังจากการกําหนดการใชงานอุปกรณตาง ๆ ที่ไดออกแบบไวแลว เราสามารถใชคําสั่ง port map ทําการเชื่อมตอกันระหวางพอรตตาง ๆ หรือกับเสนสัญญาณ (Signal) ตาง ๆ ที่กําหนดไวดังนี้library IEEE;use IEEE.STD_LOGIC_1164.all;entity MUX2 isport (SEL, A, B: in STD_LOGIC;F : out STD_LOGIC);end;architecture STRUCTURE of MUX2 iscomponent INVport (A: in STD_LOGIC;F: out STD_LOGIC);end component;component AOIport (A, B, C, D: in STD_LOGIC;F : out STD_LOGIC);end component;signal SELB: STD_LOGIC;beginG1: INV port map (SEL, SELB);G2: AOI port map (SEL, A, SELB, B, F);end;ในการเชื่อมตอวงจรดวยคําสั่ง port map จะเห็นวาเราไดกําหนดชื่อของ INV เปน G1 และ AOI เปนG2 ซึ่งเราเรียก G1, G2 เหลานี้วา Instance name ซึ่งจะเปนประโยชนในกรณีที่เราเรียกใชงานอุปกรณชนิดเดียวกันหลาย ๆ ตัว การตั้งชื่อ Instance name ที่ตางกันก็จะสามารถชวยในการทําความเขาใจ หรือตรวจสอบไดงายมากยิ่งขึ้นคําสั่ง Port Mapจากที่กลาวมาแลววา การกําหนดการใชงานอุปกรณ Component ใด ๆ จะตองมีการกําหนดพอรตใหเหมือนกันทุกประการกับการกําหนดพอรตใน Entity ทั้งชื่อ และการเรียงลําดับของพอรตตาง ๆ หลังจากนั้นก็จะมีการเชื่อมตอสัญญาณตาง ๆ เขาดวยกันโดยใชคําสั่ง Port map94


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>เราสามารถเปรียบเทียบคําสั่ง Port map นี้ไดกับการเสียบอุปกรณที่เปนตัวไอซีลงไปบนแผน PCB (Printedcircuit board) โดยขาอุปกรณไอซีที่เรียกใชจะตองตรงกับใน Datasheet ที่เทียบไดกับการที่เรากําหนดไวแลวใน Entity นั่นเอง ดังรูป 5.2รูปที่ 5.2 การเปรียบเทียบคําสั่ง Port map กับการลงอุปกรณในแผน PCBรูปที่ 5.3 รูปขยายแสดงขาตาง ๆ ของ AOI และสัญญาณตาง ๆ โดยรอบในตัวบอรด PCB ที่เทียบไดกับระบบที่เราตองการออกแบบ ที่สามารถมีเสนลายทองแดงเชื่อมตอสัญญาณแตละจุดเขาดวยกัน โดยแตละเสนเราไดกําหนดใหมีชื่อแตกตางกัน ซึ่งก็คือการกําหนด signals ตาง ๆ เพื่อใชงานใน Architecture declaration area นั่นเอง95


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>เราลองขยายภาพเพื่อดูในสวนของอุปกรณ AOI ที่จะลงบนแผน PCB และทําการเชื่อมตอคาสัญญาณจุดตอจุด ระหวางพอรตของตัวอุปกรณ และสัญญาณบริเวณรอบ ๆ ในแผน PCB (ดังรูปที่ 5.3) ไดแก SEL, A,SELB, B, F โดยเราตองการใหเสนสัญญาณ SEL, A, SELB, B, F (ที่อยูบน PCB) ตอกับพอรต A, B, C, D, F (ที่อยูบนตัวอุปกรณ) ตามลําดับ ซึ่งในการเขียนอธิบายดวยภาษา V<strong>HDL</strong> เราสามารถทําไดดวยคําสั่ง port map ในบรรทัดของG2: AOI port map (SEL, A, SELB, B, F);จะเห็นไดวาการเขียนลักษณะนี้ จะเปนการเชื่อมตอโดยลําดับ ตามตําแหนงของพอรตที่กําหนดไวใน Entityอีกวิธีหนึ่งสําหรับคําสั่ง PORT MAP ที่ “ไมจําเปน” ตองคํานึงถึงลําดับของพอรตที่เรากําหนดไวในCOMPONENT ไดแก การเขียนแบบเต็ม ที่กําหนดทั้งชื่อสัญญาณ และพอรต โดยมีเครื่องหมาย => แสดงการเชื่อมตอเขาดวยกัน เชนเราอาจเขียนไดเปนG2: AOI port map (D=>B, C=>SELB, B=>A, A=>SEL, F=>F);กรณีที่พอรตใดพอรตหนึ่งไมมีการเชื่อมตอกับเสนสัญญาณใด ๆ ใหใช “OPEN” แทน เพื่อแสดงใหเห็นวามีการปลอยลอยไว ตัวอยางเชน หากตองการใหพอรต D ของอุปกรณ AOI ไมมีการเชื่อมตอ สามารถเขียนไดดังนี้G2: AOI port map (SEL, A, SELB, OPEN, F);G2: AOI port map (D=>OPEN, C=>SELB, B=>A, A=>SEL, F=>F);การออกแบบวงจรแบบลําดับชั้น (Hierarchy Design)เพื่อใหการออกแบบระบบที่ซับซอนทําไดงายขึ้น ทั้งในการออกแบบ และการตรวจสอบ เรานิยมใชการออกแบบที่เปนลําดับชั้น นั่นคือ อุปกรณหรือวงจรเล็ก ๆ หลาย ๆ ตัว ก็จะคอย ๆ ประกอบกันเปนระบบที่ใหญขึ้น ตามลําดับ ยกตัวอยางเชนในรูปวงจรที่ 5.4 ที่จะเห็นวาวงจร Full adder (FA) ที่เปนชั้นสูงสุดของการออกแบบนี้ ประกอบดวยวงจร Half adder (HA) อยูสองตัว และ Or gate (OR) หนึ่งตัว อยูที่ชั้นลางถัดมา การมองเปนไดอะแกรมหรือแผนภาพดานขวามือ ที่เขียนเปนลําดับชั้น ทําใหงายในการเขียนการทําความเขาใจ และรวมถึงการแกไขตรวจสอบอีกดวย96


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 5.4 การออกแบบเปนลําดับชั้นของตัวบวก 1 บิตแบบ Full adderในการเขียนออกแบบระบบในลักษณะนี้ จะตองใชการเขียนอธิบายแบบโครงสราง (Architectural<strong>design</strong>) ดังที่ไดกลาวมาแลว ดังนั้นในสวนของ Architecture เราจะตองกําหนดเรียกใชงานอุปกรณ 3 ตัวดวยกัน คือ HALFADD สองตัว และ ORGATE หนึ่งตัว โดยใชคําสั่ง component ในการที่จะนํามาประกอบเปน FULLADD แลว หลังจากนั้นก็จะทําการตอกันระหวางพอรตตาง ๆ ของแตละอุปกรณโดยใชคําสั่ง port map นั่นเอง97


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Chapter6บทที่ 6. การเขียนอธิบายพฤติกรรมวงจร (V<strong>HDL</strong> Behavioral Design)ในบทนี้จะพูดถึงการใชงานคําสั่งที่เรียกวา Sequentialstatement ซึ่งโดยความหมายแลวก็คือ คําสั่งที่มีการทํางานเปนบรรทัดเรียงกัน (Sequence) จากบนลงลาง ซึ่งตามลักษณะแลวก็คือ คําสั่งที่เหมือนกับภาษาชั้นสูง เชนC/C++ โดยทั่วไปทํางานเรียงลําดับกันทีละบรรทัด ตัวอยางเชน if-then-else, for-loop, case-when เปนตนซึ่งคนที่มีความรูพื้นฐานเกี่ยวกับการเขียนโปรแกรมอยูแลว ก็จะสามารถเรียนรูไดอยางรวดเร็ว ทั้งในการทําความเขาใจ ในระบบที่คนอื่นออกแบบไวแลว หรือการออกแบบวงจรเองโดยใชคําสั่งตาง ๆ เหลานี้ที่จะอธิบายพฤติกรรมการทํางานของวงจรProcess Statementใน Architecture ของตัว Entity ใด ๆ ก็ตาม การกระทําของคําสั่งหรือ Statement ตาง ๆ ในแตละที่นั้นจะเกิดขึ้นพรอม ๆ กัน ซึ่งเปนลักษณะโดยธรรมชาติของวงจรที่เปนฮารดแวรอยูแลว ที่มีหลาย ๆ สวนทํางานเชื่อมตอกัน แตทั้งนี้จะมีคําสั่งที่ใชกันโดยทั่วไปในภาษาชั้นสูงที่มีการทํางานทีละบรรทัด เชน ifthen-elseหรือ case หรือ for-loop ซึ่งภาษา V<strong>HDL</strong> ไดนํามาใชงานในการอธิบายพฤติกรรมการทํางานของวงจรไดดวย โดยการใชงานจะตองถูกบรรจุ (Wrapped) อยูในสวนที่เราเรียกวา PROCESS (ที่มีสวนประกอบ และวิธีการเขียน การประมวลผลดังที่จะไดอธิบายตอไป) ซึ่งขอใหเรามองวาถึงแมภายในจะประกอบดวย Sequential statements ที่ทํางานเรียงกันทีละบรรทัดก็จริง แตถามองในระดับ Processดวยกัน หลาย ๆ Process ที่อยูใน Architecture เดียวกันแลว ทุกตัวทํางานพรอมกัน (Concurrency) นั่นคือในโปรแกรม เราสามารถสลับตําแหนงของแตละ Process ไดโดยการทํางานยังเหมือนเดิมทุกประการสําหรับสวนประกอบของ PROCESS นั้น มีสวนตาง ๆ ดังนี้คือ98


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Sensitivity Listเปนลิสตรายชื่อของสัญญาณตาง ๆ ที่เปนตัวกระตุนใหเกิดการประมวลผลใหเกิดขึ้นใน PROCESS นั้นๆ เมื่อสถานะสัญญาณอันใด อันหนึ่งในรายการมีการเปลี่ยนแปลงเกิดขึ้น ซึ่งในทุก ๆ PROCESS จําเปนจะตองมีการกําหนด Sensitivity list ขึ้นมา สามารถกําหนดใหเห็นชัดเจน (Explicit) โดยใหรายชื่อของสัญญาณตาง ๆ นั้นอยูในวงเล็บหลังจากคําสั่ง PROCESS หรือกําหนดซอนอยู (Implicit) ภายในตัวPROCESS เองโดยใชคําสั่ง WAIT ซึ่งจะไดอธิบายในลําดับตอไปProcess Exampleตัวอยางขางลางจะเปนการเขียนการใชงาน PROCESS โดยใหเปนการออกแบบของ NAND gate แบบสองอินพุท คือ a, b และหนึ่งเอาทพุท คือ c โดยทุกตัวกําหนด TYPE ใหเปน std_logic โดยสามารถมีสถานะตาง ๆ แตกตางกันไดถึง 9 คาไดแก ‘0’ ‘1’ ‘H’ ‘L’ ‘X’ ‘Z’ ‘U’ ‘-‘ ‘W’ (อยูในIEEE.std_logic_1164.ALL) ตามที่กําหนดไวในสวนของ ENTITYLIBRARY IEEE;USE IEEE.std_logic_1164.ALL;ENTITY nand2 ISPORT( a, b : IN std_logic;PORT( c : OUT std_logic);END nand2;ARCHITECTURE nand2 OF nand2 ISBEGINPROCESS( a, b )VARIABLE temp : std_logic;BEGINtemp := NOT (a and b);IF (temp = ‘1’) THENc


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ในตัวอยางนี้ พฤติกรรมการทํางานของวงจรอธิบายไดดวยคําสั่ง IF-THEN-ELSE ที่อยูใน Process อันเดียวภายใน ARCHITECTURE จะสังเกตุเห็นวา Sensivity list นั้นอยูในวงเล็บภายหลังการกําหนดProcess ดวยคําสั่ง PROCESS นั่นคือประกอบดวยสัญญาณ a และ สัญญาณ b (อินพุทของคําสั่งตาง ๆ ที่อยูใน Process)ใน Process เราไดกําหนดตัวแปร VARIABLE temp ตัวหนึ่งขึ้นมาสําหรับการใชงานภายใน Process นั้นๆ เทานั้น (เปนลักษณะของตัวแปรภายใน หรือ Local variable นั่นเอง) ซึ่งตัวแปร temp จะถูกกําหนดใหมีคา (โดยใชเครื่องหมาย :=) ดังนี้temp := NOT (a and b);ซึ่งก็คือการทํางานของ NAND gate นั่นเอง โดยเปนการ nand กันระหวาง a และ b ที่เปนอินพุทของวงจรแลวสงผลลัพธมาเก็บไวที่ตัวแปร temp “ทันที” หลังจากนั้นเราไดกําหนดเงื่อนไขของการนําผลลัพธนั้นออกมาที่เอาทพุท c โดยใชคําสั่ง IF-THEN-ELSE หรือเปนการกําหนดดีเลยของมันนั่นเอง โดยที่เงื่อนไขแรกคือถา temp = ‘1’ แลวใหรอ 6 ns หรือเงื่อนไขที่สอง มิฉะนั้นถา temp = ‘0’ แลวใหรอ 5 nsหรือเงื่อนไขสุดทาย มิฉะนั้นใหรอ 6 ns กอนที่จะสงผานคา temp ไปยังเอาทพุท c ซึ่งก็คือการกําหนดrise time และ fall time ตามลําดับนั่นเอง สวนเงื่อนไขสุดทายจะกระทําเมื่อไมเขาสองเงื่อนไขแรก ซึ่งtemp อาจจะเปน ‘X’ ‘Z’ ‘U’ หรือคาอื่น ๆ ของสัญญาณที่เปนแบบ std_logicProcesses with Incomplete Sensitivity Listsในตัวสังเคราะหวงจร (Synthesis tools) บางตัว สามารถตรวจสอบความสมบูรณของ Sensitivity list ในแตละ Process ได ซึ่งมันจะถือวาสัญญาณทุกตัวที่อยูทางขวามือของการสงผานคา (หรือมองวาเปนอินพุทของสมการ) ก็ถูกกําหนดใหอยูใน List แตถาหากตัวสังเคราะหวงจร ไมมีความสามารถในการตรวจสอบนั้นแลวก็อาจทําใหการทํางานของวงจรผิดไปจากที่เราตองการดังตัวอยางตอไปนี้เห็นไดวา proc2 มี Sensitivity list ไมครบ ตัวคอมไพลเลอรบางครั้งจะไมมีการฟองหรือแจงเตือนใหผูออกแบบทราบ ผลก็คือเมื่อมีการจําลองการทํางาน แมกรณีที่คาของ c มีการเปลี่ยนแปลง ก็จะทําใหไมมีการตรวจสอบ หรือประมวลผลคาคําตอบของ x ที่เกิดจากการ and กันของทั้ง a, b และ c ดังนั้นเพื่อเปนการปองกัน ผูออกแบบเองควรตรวจสอบใหรอบคอบ โดยใหนําตัวแปรที่อยูดานขวาของการสงผานสัญญาณรวมทั้งในกรณีที่เปนตัวแปรสําหรับการตรวจสอบเงื่อนไขตาง ๆ เชนในคําสั่ง If-then-else หรือในคําสั่งCase-select มาใสใน Sensivity list ใหหมด100


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>proc1: process (a, b, c)beginx


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• wait on sensitivity_list; เปนการใชงานเพื่อใหเกิดการรอ จนกระทั่งมีการเปลี่ยนแปลงที่เกิดขึ้นในตัวแปรใด ตัวแปรหนึ่งที่อยูใน sensitivity_list ตามตัวอยางที่ผานมา• wait until conditional_expression; เปนการใชงานเพื่อใหเกิดการรอ จนกระทั่งเงื่อนไขใน conditional_expression มีคาเปนจริง เชน wait until clk’EVENT and clk= ‘1’; เปนการรอจนกระทั่งขอบขาขึ้นของสัญญาณ clk ในการใชงาน wait untilนั้นควรจะตองเปนคําสั่งแรกใน Process• wait for time_expression; เปนการใชงานเพื่อใหเกิดการรอ จนกระทั่งหมดเวลาที่กําหนดตัวอยางเชน wait for 10ns;ในบางครั้งเราสามารถใชงานรวมกันไดในแตละกรณีของ Wait statement ดังตัวอยางตอไปนี้ ที่มีเงื่อนไขในการรอจนกระทั่งมีการเปลี่ยนแปลงเกิดขึ้นที่สัญญาณ a หรือ b ทั้งนี้ตองเปนตอนที่คาของสัญญาณนาฬิการ clk มีคาเปน ‘1’ เทานั้นproc4: processbeginwait on a, b until clk = '1';...end process proc4;Wait statement สามารถนํามาใชงานเพื่อสรางไดทั้ง Combinational logic และ Sequential logic ดังตัวอยางproc5: processbeginwait on a, b;z


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ใน proc5 ผลลัพธจากการสังเคราะหวงจร จะไดเปน and gate 2 อินพุทธรรมดา สวนใน proc6เนื่องจากมีสัญญาณ clk มาเกี่ยวของ คา เอาทพุท z ที่จะออกมานั้นก็จะตองรอให clk = ‘1’;กอน ซึ่งตามความหมายแลวก็จะตองมีตัวฟลิปฟลอป (Flipflop) ตัวหนึ่งที่เอาทพุทดังรูปรูปที่ 4.1 ผลลัพธวงจร Sequential logic ที่ไดSignal Assignment เทียบกับ Variable Assignmentจากตัวอยางที่ผานมาในการสราง NAND gate นั้น ถาหากเราสังเกตุใหดี จะเห็นวามีเครื่องหมายในการสงผานคาจากขวาไปซายอยูสองแบบคือ ใชเครื่องหมาย := สําหรับตัวแปรใน Process (เรียกวา Variableassignment) และ เครื่องหมาย


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 4.2 โครงสรางวงจร Shift register ที่ตองการออกแบบหากผูออกแบบทําการเขียนโดยใช Variable assignment ดังตอไปนี้LIBRARY IEEE;USE IEEE.std_logic_1164ALL;ENTITY ShiftReg ISPORT (inq, clk : IN std_logic;PORT (outq : OUT std_logic);END ShiftReg;ARCHITECTURE VariableAssignement OF ShiftReg ISBEGINPROCESS (clk)Variable q1, q2 : std_logic;BEGINIf (clk’EVENT and clk == ‘1’) THENBEGINq1 := in; -- update q1 = in;q2 := q1; -- update q2 = q1 (= in)out := q2; -- update out = q2 (= in)END IF;END PROCESS;END VariableAssignement;กระบวนการตาง ๆ ใน Process จะเกิดขึ้นเมื่อสัญญาณ clk ในสวนของ Sensitivity list มีการเปลี่ยนแปลงในลักษณะที่เปนขอบขาขึ้น (กําหนดไวในเงื่อนไขของคําสั่ง If-then-else) และเนื่องจากมีการใชงานเปนVariable assignment ดังนั้นการปรับปรุงคาของตัวแปร Variable q1, q2 ที่กําหนดไว จะเกิดขึ้นทีหลังจากที่จบแตละบรรทัด ดังนั้นในบรรทัดที่มีการสงผานคาบรรทัดแรก q1 := in; หรือบรรทัดสอง q2 :=q1; หรือบรรทัดสาม outq := q2; ก็จะสงผลให ทุกตัวมีคาเทากันหมดนั่นคือ outq = q2 = q1 = inหรือสรุปไดวา outq = in ทําใหผลของการสังเคราะหวงจรจึงทําใหไดรีจิสเตอรเพียงแคตัวเดียว ซึ่งผลลัพธที่ไดจากการใชงาน Variable assignement จะเปนดังรูป 4.2104


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 4.3 ผลลัพธที่ไดจากการใชงาน Variable assignement สําหรับสราง Shift registerดังนั้นการใชงานที่ถูกตองสําหรับการสรางวงจรประเภท Sequential circuit เชน Shift register ดังตัวอยางจึงจําเปนตองใชงานเปนลักษณะของ Signal assignment ที่มีการปรับปรุงคาพรอม ๆ กันทีเดียวในตอนสุดทายของแตละ Process ดังตอไปนี้LIBRARY IEEE;USE IEEE.std_logic_1164ALL;ENTITY ShiftReg ISPORT (inq, clk : IN std_logic;PORT (outq : OUT std_logic);END ShiftReg;ARCHITECTURE SignalAssignement OF ShiftReg ISSIGNAL q1, q2 : std_logic;BEGINPROCESS (clk)BEGINIf (clk’EVENT and clk == ‘1’) THENBEGINq1


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>library ieee;use ieee.numeric_bit.all;..signal count: unsigned (3 downto 0);processbeginwait until clk = '1';if reset = '1' thencount


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>หรือเราอาจเขียนใหมีการตรวจสอบเงื่อนไขซอนกันตามลําดับความสําคัญ (Priority) ไดโดยใช elsif ก็ไดโดยมีโครงสรางการใชงานคําสั่งดังนี้if condition then statement_sequence[elsif condition then statement_sequence...][else statement_sequence]end if;ตัวอยางการใชงานคําสั่ง if เพื่อตรวจสอบคาของ a และ b วาเทากัน (result = 0) หรือมากกวา นอยกวา (result = 1, -1) แสดงไดดังนี้process (a, b)beginif a = b thenresult


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ลําดับถัดมา ซึ่งจะเห็นวา s0 มีลําดับความสําคัญที่มากกวา ซึ่งผลของการสังเคราะหวงจรแสดงไดดังรูปที่4.5 ก็จะเห็นวา s0 จะเปนตัวควบคุม Mux ที่อยูใกลเอาทพุท z มากกวา s1 ที่มีลําดับความสําคัญรองลงมารูปที่ 4.5 แสดงวงจรที่สังเคราะหไดจากการใชงานคําสั่ง ifการใชงานคําสั่ง if ที่ไมสมบูรณ (Incomplete if Statement)หมายความวาเราไมไดมีการกําหนดคาของสัญญาณตาง ๆใหครบทุกกรณี หรือทุกกิ่ง (Branch) ที่สามารถเปนไปไดในการใชงานคําสั่ง if ยกตัวอยางเชนไมมีการใชงาน else ที่จะเปนการกําหนดใหทํางานเมื่อเงื่อนไขไมเปนจริงเกิดขึ้น ในกรณีนี้ตัวแปลความหมาย (Compiler) ก็จะทําการเก็บคาเอาทพุทคาเดิมไวเหมือนเดิม ซึ่งอาจทําใหเกิดความผิดพลาดในการใชงานจริง และยังทําใหเกิดตัวรีจิสเตอรประเภทแลทช(Latch) หรือฟลิปฟลอป (Filpflop) เพิ่มขึ้นมาอีกดวยดังตัวอยางตอไปนี้processbeginwait until clk = '1';if en = '1' thenq


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 4.6 ผลการสังเคราะหวงจรที่เปน Incomplete if statementหรือถึงแมจะมีการใชงาน else แตไมมีการกําหนดคาสัญญาณเอาทพุทตาง ๆ ที่เกิดขึ้นใหครบก็จะทําใหเกิดรีจิสเตอรเพิ่มขึ้นมาเหมือนกัน เชนprocessbeginwait on a, b, c;if c = '1' thenz


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Case Statementการใชงานคําสั่ง Case เหมือนกับคําสั่ง If ที่ใชในการเลือกทํางานตามเงื่อนไขตาง ๆ ที่เกิดขึ้น แตสิ่งที่แตกตางกันคือ• เงื่อนไขของคําสั่ง Case ไมจําเปนตองเปนคาจริงหรือเท็จ (Boolean type) เหมือนกับคําสั่ง If แตสามารถใหเปนคาของสัญญาณ (Signal) หรือตัวแปร(Variable) หรือคาตาง ๆ (Integer, Character,enumerate type) เปนตัวกําหนดเงื่อนไขการทํางาน• ในแตละเงื่อนไขของคําสั่ง Case เปนแตละกิ่งของการทํางานที่มีลําดับความสําคัญ (Priority) ที่เทาเทียมกันในการออกแบบที่มีหลาย ๆ เงื่อนไข หรือหลาย ๆ กรณีการทํางานที่แตกตางกัน เรามักนิยมใชงานคําสั่ง Caseมากกวาคําสั่ง If เนื่องจากงายในการเขียนแยกการทํางานในแตละเงื่อนไข รวมทั้งการอานทําความเขาใจ โดยมีลักษณะการใชงานดังนี้case expression iswhen options_1 =>statement_sequence...when options_n =>statement_sequence[when others =>statement_sequence]end case;ในการทํางาน จะเปนไปตามคา expression ที่สามารถเกิดขึ้นไดในแตละเงื่อนไข (option_1,option_2, option_n) โดยการทํางานที่แตกตางกันก็จะกําหนดไวหลังจากเครื่องหมาย => ของแตละเงื่อนไขนั่นเอง ทั้งนี้อาจมีการทํางานหลาย ๆ บรรทัดใน statement_sequence โดยที่ไมจําเปนตองมี begin และ end เหมือนกับภาษา Verilog แตอยางใด สวนของ when others เปนสิ่งที่ผูใชงานควรกําหนดไวในตอนทาย ซึ่งจะเปนการทํางานในเงื่อนไขที่ “เหลือ” ทั้งหมด ที่ไมไดกําหนดในตอนตน และสามารถเกิดขึ้นได110


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>กรณีที่ในแตละเงื่อนไข สามารถมีคาที่เปนไปไดหลาย ๆ คา เราสามารถแยกแตละคาไดดวยเครื่องหมาย “|”หรือการอางถึงชวงของคาที่เปนไปได เราสามารถใชคําวา “to” เปนตัวกําหนดชวงนั้น ๆ หรือการใชงานในทั้งสองลักษณะผสมกันได ดังตัวอยางcase expression iswhen val =>statement_sequencewhen val1 | val2 | ... | valn =>statement_sequencewhen val3 to val4 =>statement_sequencewhen val5 to val6 | val7 to val8 =>statement_sequence...when others =>statement_sequenceend case;ตัวอยางขางลางเปน Process ที่ใชคําสั่ง Case และกําหนดการทํางานในแตละเงื่อนไขที่เปนแบบEnumeration type โดยกําหนดเปนแตละสีของสัญญาณไฟจราจรtype type_color is (red, yellow, green);process (color)case color iswhen red =>next_color next_color next_color


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>x: out std_logic);end xor2;architecture arch_xor2 of xor2 isbeginprocess (a, b)variable temp: std_logic_vector (1 downto 0);begintemp := a & b;case temp iswhen "00" => x x x x x


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>E3: loopa := a + 1;exit E3 when a > 10;end loop E3;While loopในการใชงานลักษณะนี้จะมีการกําหนดเงื่อนไขใหมีการวนรอบ โดยกอนเขาไปทําคําสั่งตาง ๆ ใน whileloop จะมีการตรวจสอบเงื่อนไขกอน (ซึ่งแตกตางจาก Simple loop ที่ไมมีการตรวจสอบเงื่อนไขแตอยางใด)ทุกครั้งที่มีการวนรอบ ก็จะมีการตรวจสอบเงื่อนไข ถามีคาเปนเท็จก็จะหยุด และออกจากลูปนั้น ๆ ดังตัวอยางตอไปนี้ที่มีการนับขอบขาขึ้นของสัญญาณ clk ตราบเทาที่สัญญาณ level มีคาเปน ‘1’ โดยใชคําสั่ง wait เขามาชวยprocessvariable count: integer := 0;beginwait until clk = '1';while level = '1' loopcount := count + 1;wait until clk = '0';end loop;end process;นอกจากนี้ เราสามารถทําเปนลูปซอนลูป (Nested loop) ไดหลาย ๆ ชั้นตามตองการดังตัวอยางE1: while i < 10 loopE2: while j < 20 loop...end loop E2;end loop E1;For loopเปนลักษณะการใชงานเพื่อใหมีการวนรอบตามจํานวนครั้งที่กําหนด โดยจะมีการตรวจสอบคาที่ถูกกําหนดใหเปนตัวนับรอบ ซึ่งจะเพิ่มขึ้น หรือลดลงทีละ 1 แลวแตลักษณะที่เรากําหนดกําหนดชวงของตัวนับรอบวาจะกําหนดใหเปน ‘to’ หรือ ‘downto’ ทั้งนี้ตัวแปรที่ใชใหเปนตัวนับรอบ เราสามารถใชงานไดเลย113


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ทันที โดยไมจําเปนตองกําหนดใหเปนชนิดใดชนิดหนึ่งกอน เนื่องจากมันจะถูกกําหนดใหเปนชนิด Integerโดยอัตโนมัติดังตัวอยางfor i in 1 to 10 loopi_square (i)


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>entity match_bits isCONSTANT (width : INTEGER := 7);port (a, b: in bit_vector (width downto 0);matches: out bit_vector (width downto 0));end match_bits;architecture functional of match_bits isbeginprocess (a, b)beginfor i in width downto 0 loopmatches (i) '0');for i in 15 downto 0 loopif v(i) = '1' thenresult := result + 1;end if;end loop;count


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ในตัวอยางนี้ เปนการนับจํานวนบิตของเวกเตอร v ที่มีคาเทากับ ‘1’ โดยผลลัพธจะถูกนับรวมกันเรื่อย ๆ ในตัวแปรที่ชื่อวา result ซึ่งในบรรทัดสุดทายกอนจบ Process คาใน result จะถูกสงผานไปยังเอาทพุท countของวงจรนี้ ในลูปเราใชคําสั่ง if ในการตรวจสอบเงื่อนไขที่เปน ‘1’ ของแตละบิต วนรอบตั้งแตบิตที่ 15 ถึงบิตที่ 0 โดยจํานวนครั้งที่เจอจะถูกบวกรวมกัน (Accumulate) ในตัวแปร result ซึ่งผลลัพธจากการสังเคราะหวงจรสามารถแสดงไดในรูปที่ 4.7รูปที่ 4.7 ผลลัพธจากการสังเคราะหวงจรที่สรางดวยคําสั่ง For loopในตัวอยางที่ผานมา การกําหนดจํานวนรอบของการวนลูป ทําไดดวยการกําหนดชวงของตัวเลขใหเห็นชัดเจน (Explicit) ในการใชงานบางกรณีที่ตองการอางอิงที่ขนาดของอารเรยที่อาจมีการเปลี่ยนแปลงได เราอาจใช Array attribute สําหรับการกําหนดรอบของการวนลูปได 3 ลักษณะดังตอไปนี้1. กรณีที่การนับรอบจากซายไปขวา ตามการกําหนดดัชนี (Index) ของตัวแปรอารเรย และกระทําตอทุกบิตในอารเรยใหใชดังนี้for i in v'range loop2. กรณีที่ตองการนับรอบจากขวาไปซาย ตามการกําหนดดัชนี (Index) ของตัวแปรอารเรย และกระทําตอทุกบิตในอารเรย ใหใชดังนี้for i in v'reverse_range loop3. กรณีที่ใชดัชนี (Index) ของอารเรย ตัวสูงสุดและตัวต่ําสุดเปนตัวกําหนดชวง โดยใหนับขึ้นลงตามตัวอยางตอไปนี้for i in v'low to v'high loopfor i in v'high downto v'low loopตัวอยางของการทํางาน ในลักษณะของการใช Array attribute ตาง ๆ ในการกําหนดการวนรอบ สามารถแสดงไดในรูป 4.8116


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Loop statementsArray DescriptionsTYPE v IS ARRAY(0 TO 31) OFBIT;TYPE v IS ARRAY(31 DOWNTO0) OF BIT;for i in v'range loopLoop starts from bit 0 to bit 31 Loop starts from bit 31 to bit 0for i in v'reverse_range loop Loop starts from bit 31 to bit 0 Loop starts from bit 0 to bit 31for i in v'low to v'high loop Loop starts from bit 0 to bit 31 Loop starts from bit 0 to bit 31for i in v'high downto v'lowloopLoop starts from bit 31 to bit 0 Loop starts from bit 31 to bit 0รูปที 4.8 การวนรอบที่แตกตางกันในแตละวิธีการใชงาน Array attributeเนื่องจากการใชงานคําสั่ง for loop จะตองกําหนดขอบเขต (Bound) ของการนับใหชัดเจน ซึ่งผูออกแบบจะตองกําหนดใหเปนคาที่เปนตัวเลข หรือคาคงที่คาใดคาหนึ่ง โดยไมสามารถกําหนดใหเปนชื่อของตัวแปร หรือสัญญาณที่มีคาเปลี่ยนแปลงไปมาได เนื่องจากจะทําใหการอธิบายวงจรทําไดยากตัวอยางเชน เราตองการวนลูปเพื่อใหนับจํานวนบิตที่เปนคาศูนยของจํานวนเต็มใด ๆ ซึ่งไมสามารถรูจํานวนรอบของการวนลวงหนาได กรณีเชนนี้การใชงานคําสั่ง next และ exit จึงถูกนํามาใชงานNext Statementเปนคําสั่งที่มีรูปแบบการใชงานดังนี้next [label] [when condition];เมื่อคําสั่ง next ถูกพบในการวนรอบใด ๆ การทํางานที่เหลือในลูปนั้นก็จะถูกขามไป (Skip) โดยจะมีการวนมาทําในรอบใหมตั้งแตเริ่มตน เมื่อ condition ที่กําหนดไวมีคาที่เปนจริง โดยที่ตัวนับรอบจะถูกเพิ่มขึ้นทันที และทําการตรวจสอบเงื่อนไขวาไดจํานวนครั้งในการวนรอบที่กําหนดไวหรือยัง กอนที่จะทํางานในรอบตอไป หรือจบการวนรอบตัวอยางตอไปนี้ แสดงการใชงานคําสั่ง next ใน for loop สําหรับการหาจํานวนบิตที่มีคาเปน ‘1’ เหมือนกับตัวอยางที่ผานมา แตสังเกตวาเราไดใชงานคําสั่ง next แทนการใชงานคําสั่ง If โดยวงจรที่สังเคราะหไดแสดงไดในรูปที่ 4.9 และมีโครงสรางวงจรที่คลายกับในรูป 4.7 ยกเวนขาควบคุมของ Multiplexer ในรูป 4.9ถูกกลับคาสัญญาณ แตทั้งนี้การทํางานจะใหผลลัพธที่เหมือนกันทุกประการ117


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>library ieee;use ieee.numeric_bit.all;entity count_ones isport (v: in bit_vector (15 downto 0);count: out signed (3 downto 0));end count_ones;architecture functional of count_ones isbeginprocess (v)variable result: signed (3 downto 0);beginresult := (others => '0');for i in v'range loopnext when v(i) = '0';result := result + 1;end loop;count


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ซึ่งบางครั้งเราจะมี label ของลูปที่กําลังทํางานอยู หรือมีเงื่อนไขในการออกจากลูปที่กําหนดไวหลังคําสั่งwhen ก็ได (ถาไมมีหมายถึงออกจากลูปโดยไมมีเงื่อนไขใด ๆ ทั้งสิ้น)ลักษณะของการออกจากลูปทั้งที่มีเงื่อนไข และไรเงื่อนไข แบงเปนสองกรณีไดดังนี้1. กรณีไมมี label และมีคําสั่ง exit อยูในลูปที่อยูขางในลูปอีกอันหนึ่ง (Inner loop) เปนลักษณะของลูปซอนกับลูป การออกจากลูปจะเปนทีละชั้น นั่นคือถึงแมจะออกจากลูปภายในแลว การทํางานก็จะมาวนรอบที่ลูปภายนอกตอ2. กรณีที่มี label การออกจากลูปจะออกไปจากลูปที่มีชื่อ label นั้น ๆไดทันทีโดยตรงตัวอยางการใชงานคําสั่ง exit ที่มี label โดยเปนตัวนับที่ทําการนับวนรอบไปเรื่อย ๆ ตราบเทาที่คาที่นับไดไมเกิน 10 แสดงไดดังนี้E3: loopa := a + 1;exit E3 when a > 10;end loop E3;ตัวอยางถัดมาเปนวงจรที่ใชนับจํานวนบิตที่มีคาเปน ‘0’ ในเวกเตอรอินพุท โดยถาเมื่อไรที่เจอบิตที่มีคาเปน ‘1’ ก็จะหยุดการวนรอบการนับทันทีโดยใชคําสั่ง exit ซึ่งผลจากการสังเคราะหวงจรแสดงไดดังรูปที่ 4.10 โดยสังเกตุวาจะมี or gate เพิ่มขึ้นมาที่ตําแหนงของขาควบคุมของ Multiplexer ในแตละตัวlibrary ieee;use ieee.numeric_bit.all;entity count_zeros isport ( v: in bit_vector (15 downto 0);count: out signed (3 downto 0));end count_zeros;architecture functional of count_zeros isbeginprocess (v)variable result: signed (3 downto 0);beginresult := (others => '0');for i in v'reverse_range loopexit when v(i) = '1';result := result + 1;end loop;119


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>count


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• การแจงระดับ warning ใชในกรณีที่การจําลองการทํางานยังสามารถดําเนินตอไปนี้ แตผลลัพธไมสามารถคาดเดาได หรือไมแนนอน (Unpredictable)• การแจงระดับ error ใชงานเมื่อมีความผิดพลาดเกิดขึ้นที่สามารถบอกไดวามาจากการออกแบบโดยการจําลองการทํางานจะหยุดทันที• การแจงระดับ failure ถูกใชงานเมื่อมีความผิดพลาดอยางรายแรง เชนการหารดวยเลขศูนยหรือการกําหนดการใชงานอารเรยที่ไมไดอยูในชวงที่กําหนด การจําลองการทํางานจะหยุดทันทีตัวอยางการใชงาน เมื่อกรณีที่สัญญาณ R และ S มีคาเปน ‘1’ แลวมีการแจงเตือน พรอมกับหยุดการจําลองการทํางานแสดงไดดังนี้assert not (R = '1' and S = '1')report "Both signals R and S have value '1'"severity error;กรณีที่ตองการแสดงขอความใด ๆ ขึ้นมาโดยไมมีเงื่อนไข เราสามารถใช FALSE แทนเงื่อนไขการแสดงดังนี้ assert (FALSE) report "Start simulation";เราสามารถใชคําสั่ง Assert ใน Process ตาง ๆ ที่มีการประมวลผลเปนลักษณะทีละบรรทัด (Sequential )อยางไรก็ตาม คําสั่งนี้สามารถใชงานภายนอก Process โดยมีลักษณะการทํางานพรอม ๆ กันไปกับแตละProcess ไดเหมือนกัน ดังนั้นคําสั่งนี้จึงเปนไดทั้ง Sequential statement และ Concurrent statement ไดทั้งสองลักษณะแลวแตการใชงานทั้งนี้การทํางานของคําสั่งนี้ในลักษณะของ Concurrent statement จะทํางานเมื่อไหรก็ตามที่หนึ่งในสัญญาณที่อยูใน condition มีการเปลี่ยนแปลง ซึ่งแตกตางจากการใชงานในลักษณะของ Sequentialstatement ที่จะทํางานเมื่อถึงบรรทัด (ของคําสั่ง assert) ที่อยูใน Process ที่มีการทํางานเมื่อสัญญาณในSensitivity list มีการเปลี่ยนแปลง โดยอยาลืมวาสําหรับคําสั่ง Assert จะใชเฉพาะการจําลองการทํางานเทานั้น ในขณะที่มีการสังเคราะหวงจรคําสั่งนี้จะถูกละเลยไป121


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Chapter7บทที่ 7. ภาษา Verilog(Verilog Language)Verilog หรือชื่อเต็ม ๆ คือ Verilog <strong>HDL</strong> เปนภาษาที่ใชในการอธิบายลักษณะการทํางานของฮารดแวร (Hardwaredescription language) ภาษาหนึ่งที่ถูกสรางขึ้นมาในชวง คศ1984-1985 โดย Philip Moorby ที่ตองการภาษาที่งาย และมีประสิทธิภาพในการอธิบายลักษณะของวงจรดิจิตอล สําหรับการโมเดล การจําลองการทํางาน และการวิเคราะหการทํางาน ภาษานี้ไดกลายเปนลิขสิทธิ์ของบริษัท Design Gateway Automation ซึ่งตอมาไดรวมกับบริษัท Cadence Design Systems และตั้งแตป คศ 1990 เปนตนมา ทาง Cadence ไดเปดใหเปนภาษาที่ทุกคนสามารถใชงานได ทั้งนี้เพื่อใหงายในการกําหนดมาตรฐาน และพัฒนารวมกัน และในที่สุด ภาษานี้ไดเขาเปนภาษามาตรฐานของ IEEE ในป คศ 1995 (IEEE Standard 1364)คุณลักษณะที่สําคัญในภาษานี้ไดแก• Universal: ภาษา Verilog อนุญาตใหการออกแบบทั้งระบบทําไดภายใตสภาวะแวดลอมของการออกแบบ (Design environment) เดียวกัน ที่ประกอบดวย การวิเคราะห และการตรวจสอบ (Analysis and verification) อยางไรก็ตาม Verilog อาจไมเหมาะกับระดับของการออกแบบที่เปน Complex system <strong>design</strong> ที่ตองการภาษาชั้นสูงกวานี้ที่อาจตองการความสามารถในการอธิบายการทํางานไดทั้งซอฟทแวร และฮารดแวร• Extensibility: มาตรฐาน IEEE std 1364 ประกอบดวย Verilog PLI (ProgrammingLanguage Interface) ซึ่งชวยขยายความสามารถของภาษา Verilog โดยจะประกอบดวยวิธีการที่จะเพิ่มเติมฟงกชันตาง ๆ ขึ้นมา หรือการติดตอกับภาษาอื่น เปนตน• Industrial support: ภาษา Verilog ไดรับการตอนรับเปนอยางดีจากผูออกแบบวงจรประเภทASIC (Application specific circuit) เนื่องจากเปนภาษาที่งายในการเรียนรู และชวยใหการจําลองการทํางาน หรือตรวจสอบระบบทําไดอยางรวดเร็ว จากขอมูลของนิตยสาร EE Times122


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ไดพูดถึงเกี่ยวกับการใชงานภาษา Verilog ในการออกแบบ ASIC ในป 1993 นั้นมีถึง 85%ของการออกแบบทั้งหมดผูออกแบบมือใหมหลาย ๆ คนมักตั้งคําถามกับตัวเองวา แลวภาษา <strong>HDL</strong> ภาษาไหนควรนํามาใชในการออกแบบดี V<strong>HDL</strong> หรือ Verilog คําตอบก็คือทั้งสองภาษาตางมีขอไดเปรียบ เสียเปรียบ หรือยากงายตางกันแลวแตความถนัด หรือความชอบของผูใชงาน ดังนั้นเมื่อเปรียบเทียบกันทั้งสองภาษา ถือวาไมมีผูชนะความไดเปรียบของภาษา Verilog คือ ความงายในการทําความเขาใจ และใชงาน โครงสรางไวยากรณเหมือนภาษา C และไมจุกจิก ถือวามีความยืดหยุนในการเขียนมากกวา V<strong>HDL</strong> ดังนั้นจึงคอนขางเปนที่นิยมในการใชงานในการออกแบบทั่วไปในอุตสาหกรรมวงจรรวม โดยเฉพาะทางอเมริกา และญีปุน อยางไรก็ตาม ภาษาVerilog คอนขางจะดอยในดานความสามารถในการกําหนดการทํางานของระบบในระดับที่สูงขึ้น (Systemlevel specification)สําหรับภาษา V<strong>HDL</strong> จะซับซอนกวา มีคุณสมบัติดานตาง ๆ (Feature) ที่เยอะกวา (ซึ่งบางทีไมจําเปนในงานการออกแบบโดยทั่วไป) จึงมีไวยากรณของภาษา หรือกฎตาง ๆ มากกวา ทําใหคอนขางยากในการเรียนรูและใชงาน แตขอดีคือมีความยืดหยุนในการใชงานสูง เนื่องจากสามารถใชในการเขียนออกแบบรูปแบบตางๆ มากมาย (Permissible coding styles) ดังนั้น V<strong>HDL</strong> จึงเหมาะสําหรับการออกแบบระบบที่ซับซอน ทําใหไดรับความนิยมมากจากนักออกแบบวงจรดิจิตอลโดยทั่วไป โดยเฉพาะแถบทางดานยุโรปรูจักกับภาษา Verilogภาษา Verilog ไดถูกพัฒนาขึ้นมาเพื่อใชในการอธิบายการทํางานของวงจรดิจิตอล ที่มีการทํางานพรอม ๆ กันหลาย ๆ วงจรยอย เปนลักษณะแบบขนาน (Concurrency) และความตองการที่จะตองเปนภาษาที่สามารถใชในการจําลองการทํางานได โดยที่ภาษาชั้นสูงทั่วไปอยางเชน ภาษา C, Basic ไมสามารถนํามาใชงานในลักษณะนี้ได ในบทนี้จะแนะนําใหรูจักภาษา Verilog โดยจะพิจารณาถึงความสามารถในการอธิบายระบบดิจิตอลโดยทั่วไปในบทนี้ จะอธิบายถึงแนวคิดของการสรางระบบโดยใชภาษา Verilog ที่มองระบบเหมือนกับกลองดํา (Blackbox) อันหนึ่งที่มีสวนที่ตอเชื่อมกับภายนอกอยูรอบ ๆ ซึ่งตัวกลองดําอันนี้ใน Verilog เราเรียกวา โมดูล(Module) หลังจากนั้นจะพูดถึงสวนประกอบของ Verilog ที่อยูในโมดูล รวมทั้งวิธีการตั้งชื่อโมดูลที่ถูกตองทายสุดของบทนี้ จะบอกวิธีการกําหนดการทํางานของกลองดํานี้ ซึ่งมีอยูหลัก ๆ ดวยกันสามแบบไดแก123


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Structural, Dataflow และ Behavioral โดยจะมีตัวอยางวิธีการกําหนดโดยทั่วไปของการอธิบายระบบโดยใชวิธีการทั้งสามแบบนี้สวนประกอบของระบบ (The Anatomy of a System)ระบบ วงจร และโมดูล (System, Circuit and Module)ภาษา <strong>HDL</strong> ถูกใชในการอธิบายลักษณะของวงจร หรือระบบอิเล็กทรอนิกส ซึ่งโดยทั่วไปแลวระบบ(System) จะถูกอางอิงในภาษา <strong>HDL</strong> เหลานี้ในลักษณะเปน Entity โดยที่สวนประกอบของระบบนั้น ไดแกวงจร (Circuit) ตาง ๆ ที่ทํางานสอดคลองกัน ใหไดเปนผลลัพธอยางที่ผูออกแบบตองการ แตอยางไรก็ตามทั้งความหมายของวงจร หรือระบบนั้นสามารถนํามาใชแทนกันได แลวแตการมองของผูออกแบบแตละคนรูปที่ 6.1 ตัวอยางโมดูลในภาษา Verilogขอกําหนดของระบบ (System specification) นั้นจะตองสามารถอธิบายองคประกอบ (Elements) ตาง ๆ ในระบบ และความเกี่ยวของระหวางกันใหได สําหรับ Verilog เองนั้น ระบบจะถูกกําหนดไดดวยคําสั่งmodule และจบดวย endmodule ดังแสดงในรูป 6.1เมื่อไรก็ตามที่ระบบทํางาน ระบบจะรับอินพุทขอมูลเขามา และสรางเอาทพุทตามฟงกชันที่ถูกกําหนดขึ้นมาในระบบนั้น ๆ หรือมองอีกนัยหนึ่งก็คือ ระบบทําการติดตอ (Interface) กับสิ่งตาง ๆ รอบตัวมันผานทาง124


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>พอรตอินพุท และพอรตเอาทพุท ถาปราศจากการอินเทอรเฟส ระบบก็จะไมสามารถทํางานได ลองคิดดูงายๆ วาถาเรามีคอมพิวเตอรโดยปราศจากเมาส หรือคีบอรด (ซึ่งถือวาเปนอินพุทของระบบ) และมอนิเตอร(เอาทพุทของระบบ) นั้นจะเปนอยางไรในระบบตาง ๆ นั้นเราสามารถแยกไดเปนสองสวนหลัก ๆ คือ Body และ Interface หนาที่ของ Body คือทําการประมวลผลขอมูลที่รับเขาไป และสงออกมา ผานทางสวนของการ Interface นอกจากนี้ระบบบางระบบอาจมีสวนเพิ่มเติม หรือที่เรียกวา Add-on ที่จะมาใชงานควบคูกับระบบที่มีอยู ซึ่งถาเทียบกับเครื่องคอมพิวเตอรเครื่องหนึ่งแลว (ดูรูป 6.2) สวนของ Body คือ Main board นั่นเอง สวนของ Interface คือเมาส และคียบอรด และในสวนของ Add-on อาจจะเปน Sound card หรือ Video card เปนตนรูปที่ 6.2 เปรียบเทียบสวนประกอบของโมดูล เทียบกับเครื่องคอมพิวเตอรInterface และ Body ในโมดูล Verilog (Interface and Body in Verilog Module)เนื่องจาก module ใน Verilog ใชแทนระบบดิจิตอล ดังนั้น module จะตองสามารถแทนสวนประกอบของระบบได นั่นคือ Body และ Interfaceพอรตของโมดูลจะถูกกําหนดไวในวงเล็บ หลังจากขื่อของโมดูล โดยสวนนี้จะทําหนาที่เปน Interface ของระบบ โดยที่รายละเอียดตาง ๆ ของแตละพอรต (Direction and type) เชน เปนอินพุท หรือเอาทพุทพอรตขนาดกี่บิต จะถูกกําหนดขางลางตอมา หลังจากวงเล็บปด (ดูรูป 6.3) คําสั่ง 'include เสมือนกับ Add-onของระบบที่จะเรียกไฟลอื่นมาใชงาน หลังจากนั้นจะเปนสวนของ Body ที่จะกําหนดการทํางาน หรือเรียกใช125


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>โมดูลยอยที่มีอยูแลวมาใชงานในระบบ ซึ่งมีวิธีการกําหนดการทํางานแตกตางกันสามแบบคือ 1) Structural,2) Dataflow และ 3) Behavioral ดังจะแสดงใหดูตอไปรูปที่ 6.3 รูปแบบการกําหนดโมดูล ดวยภาษา Verilogโครงสรางของโมดูล Module (The Structure of a Module)คําจํากัดความของโมดูล (The Definition of a Module)สําหรับโมดูล ใน Verilog หมายถึง บล็อกพื้นฐานที่สรางขึ้นมาสําหรับการกําหนดคุณสมบัติของระบบ ทั้งระบบเล็ก ๆ ที่เปนเกตเพียงตัวเดียว หรือระบบใหญ ที่ประกอบดวยโมดูลยอย ๆ หลาย ๆ โมดูล อยางไรก็ตามไมวาระบบเล็ก หรือใหญ ที่อธิบายดวยโมดูลนั้น จะตองมีโครงสรางเหมือนกันทุก ๆ โมดูล จะตองเริ่มตนดวยคําสงวน (Reserve words) คือ module ตามดวยชื่อของโมดูล และจบดวยคําสงวน endmodule (สังเกตวา ไมมีชองวางระหวาคําวา end กับคําวา module) ภายในตัวโมดูลจะประกอบดวยสามสวนดังที่กลาวมาแลวขางตน คือ• Interface: ประกอบดวยพอรต และการกําหนดตัวพารามิเตอรของโมดูล• Body: จะเปนการกําหนดการทํางานของตัวโมดูล• Optional add-on: สามารถกําหนดไดทุกที่ในโมดูล เพื่อเรียกใชสวนประกอบอื่น ๆ ที่เขียนไวแลวเปนไฟล มาใชเพิ่มเติม โดยใชคําสั่ง 'include126


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ชื่อของโมดูล (The Name of a Module)รูปที่ 6.4 แสดงโครงสรางของโมดูลหลักของการตั้งชื่อโมดูลคือ กระทัดรัด และมีความหมายที่สามารถเขาใจไดงาย ที่เปนการอธิบายวาโมดูลตัวนั้นทําหนาที่อะไร เนื่องจากขอกําหนดของภาษา Verilog จะเปนภาษาที่คํานึงถึงขนาดตัวอักษรที่ใชงาน(Case sensitive) ซึ่งไมเหมือนกับ V<strong>HDL</strong> ที่ตัวอักษรเล็กใหญสามารถใชแทนกันได ดังนั้นเราสามารถใชลักษณะตัวอักษรเล็กใหญสลับกันเพื่อใหอานไดงายขึ้น ตัวอยางเชน FastBinaryCntr เปนตน (สังเกตวาคําสงวนใน Verilog จะใชตัวเล็กเทานั้น)โดยสรุป มีขอกําหนดในภาษา Verilog ในการตั้งชื่อโมดูลดังนี้• ประกอบดวย ตัวอักษรภาษาอังกฤษ (Letter) ตัวเลข (Digit) เครื่องหมาย $ (Dollar sign) และ _(Underscore) เทานั้น• ตองเริ่มตนดวยตัวอักษร หรือ Underscore เทานั้น• ไมสามารถเวนวางระหวางตัวอักษร หรือเครื่องหมายได• ตัวอักษรเล็ก ใหญมีความหมายตางกัน (Case sensitive)• ตองไมเปนคําสงวนตัวอยางชื่อของโมดูลที่ถูกตอง เชน Counter_4bit, Mux_4_1, ALU, UART_Tx, Receiver เปนตน127


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การเขียนขอสังเกตุ หรือหมายเหตุใน Verilog (Comments in Verilog)วิธีการเขียนโคด (Coding style) ที่ดีนั้นจําเปนจะตองคํานึงถึงผูอานในการทําความเขาใจสวนตาง ๆ ของการเขียนดวย หรือแมกระทั่งตัวผูออกแบบเองในการที่จะกลับมาตรวจสอบ แกไขสวนตาง ๆ ในภายหลัง ดังนั้นลักษณะการเขียนที่ดีนอกจากจะตองเขียนใหอานงาย เปนสัดสวนแลวควรจะตองมีคําอธิบายสั้น ๆ ในแตละสวนของโปรแกรมดวยสําหรับภาษา Verilog นั้นจะอนุญาตใหเขียนหมายเหตุในตัวโปรแกรม โดยที่ตัวคอมไพเลอรจะไมนําไปประมวลผลแตอยางใด นั้นคือ• One-line comment: เริ่มตนดวย // และจบดวยการจบบรรทัด (end-of-line)• Block comment: จะเริ่มตนดวย /* จนกระทั่งถึงจุดที่มีเครื่องหมาย */ ทําใหสามารถกําหนดหมายเหตุไดครอบคลุมหลาย ๆ บรรทัดเทาที่ตองการการกําหนดขอสังเกตุ หรือหมายเหตุนั้นสามารถกําหนดที่ใดก็ไดในตัวโปรแกรม ยกเวนกําหนดภายในคําสงวน หรือชื่อของสิ่งตาง ๆ ที่เราตั้งขึ้นมา เชนชื่อของพอรต โมดูล เปนตนรายละเอียดของระบบ (Descriptions of a System)รูปที่ 6.5 ตัวอยางการเขียนหมายเหตุการเริ่มตนการเขียนออกแบบที่ดีนั้นควรจะมีสวนหัวของไฟลในการอธิบายลักษณะของระบบ (Systemdescription) เพื่อใหงายในการตรวจสอบ ทั้งจากผูออกแบบเอง หรือผูรวมงานอื่น ๆ รวมทั้งผูใชงานดวยทั้งนี้ขอมูลตาง ๆ อาจประกอบดวยสวนตาง ๆ เชน ชื่อไฟล ลักษณะของการใชงาน ขอจํากัด ขอผิดพลาดที่เกิดขึ้นแลวไดแกไขในเวอรชั่นกอน ชื่อของผูออกแบบ เวอรชันในการออกแบบ และวันที่ของการออกแบบเปนตน ดังแสดงในรูปที่ 6.6128


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>สวน Interface ในโมดูล (The Module Interface)รูปที่ 6.5 ตัวอยางการเขียนรายละเอียดของการออกแบบในการที่จะกําหนดสวนของการ Interface ในตัวโมดูล จะตองประกอบดวยสองสวนดังนี้• Port list: เปนรายชื่อของพอรตที่จะใชในตัวโมดูล ซึ่งกําหนดอยูในวงเล็บหลังจากชื่อของโมดูลโดยมีเครื่องหมาย Comma (,) ระหวางพอรตตาง ๆ• Port declaration: เปนสวนที่กําหนดขึ้นมาเพื่ออธิบายคุณลักษณะของพอรตตาง ๆ ที่อยูในPort list โดยจะเปนขอมูลของทิศทางวาเปนอินพุท หรือเอาทพุท หรือทั้งสอง และความกวางของพอรต เปนตนสําหรับชื่อของพอรตควรตั้งในเหมาะสม เพื่อใหงายในการอานทําความเขาใจ หรืออาจจะเพิ่ม Commentตามหลังแตละพอรตโดยใช One-line comment (//) ก็ได ดังแสดงในรูปที่ 6.7129


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 6.7 ตัวอยางการเขียนกําหนดพอรตเชื่อมตอของโมดูลการเขียนในสวนของ Body (The Body of a Module)เนื่องจากความหลากหลายของวงจรที่เราตองการออกแบบ ทั้งในดานการทํางาน และในดานโครงสรางการออกแบบ ซึ่งบางทีในวงจรชนิดเดียวกันสามารถออกแบบไดหลายวิธีเปนตน ดังนั้นภาษาที่ดีควรจะสนับสนุนลักษณะการออกแบบ หรือลักษณะการเขียนอธิบายวงจร (Coding style) ไดหลายแบบ ทั้งแบบที่เหมาะสมสําหรับวงจรเล็ก ๆ ไมกี่เกต แตบางทีวิธีการนี้อาจไมเหมาะสมกับวงจรใหญ ๆ ที่มีหลายพันเกตเนื่องจากทําความเขาใจไดยากสําหรับภาษา Verilog <strong>HDL</strong> สามารถมีวิธีการเขียนในการอธิบายวงจร แบงไดเปน 3 ลักษณะตามความตองการในวงจรแตละระดับ (Hierarchy) หรือความถนัดที่แตกตางกันของผูออกแบบ ไดแก130


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• Structural <strong>design</strong>: เปนการใชอุปกรณที่มีอยูแลวในไลบรารีมาตรฐาน หรือที่เรียกวาPrimitives และโมดูลยอย ๆ มาตอกันโครงสราง (Structure) แบบพอรตตอพอรต เพื่อใหเปนระบบขึ้นมา• Dataflow style: เปนการสงผานคาเอาทพุทที่ขึ้นอยูกับคาของอินพุท หลังจากผานตัวกระทําหรือฟงกชันตาง ๆ โดยสามารถเห็นเปนการไหลของขอมูล (Data flow) วาคาในแตละจุดในวงจรนั้นมาจากไหน• Behavioral style: เปนการเขียนลักษณะการทํางาน (Behavior) ของวงจรไดโดยตรงตัวอยางเชน เราตองการออกแบบ Multiplexer ที่มี 4 inputs (In0, In1, In2, In3) และ 1 output (Out) โดยมีสัญญาณควบคุมการเลือกคือ Sel0 และ Sel1 นั้นสามารถแสดงเปนการออกแบบในแตละสไตลไดดังตอไปนี้MUX in structural <strong>design</strong> style131


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 6.8 ตัวอยางการเขียน Structural Designจะเห็นไดวาวงจรสามารถกําหนดไดโดยอุปกรณพื้นฐานตาง ๆ นั่นคือ And Or Not เกต ซึ่งเปนอุปกรณประเภท Primitive ในภาษา Verilog ที่สามารถเรียกใชงานไดทันที หรือเปนโมดูลยอยที่เราสรางขึ้นมาแลวเก็บไวในไลบรารี เราสามารถกําหนดการตอเชื่อมกันระหวางพอรตของอุปกรณพื้นฐาน หรือโมดูลยอยนั้น ๆซึ่งผูออกแบบก็จําเปนจะตองรูวา MUX นั้นจะตองมีการตอเชื่อมกันของอุปกรณตาง ๆ อยางไรMUX in dataflow <strong>design</strong> style132


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 6.9 ตัวอยางการเขียน Dataflow Designการออกแบบลักษณะนี้จะเหมือนกับการออกแบบโดยสมการลอจิก (แตวาไมจํากัดเพียงแคลอจิก ‘0’ หรือ ‘1’เทานั้น) ขอกําหนดตาง ๆ ในวงจรจะสรางมาจากการสมการการกําหนด (Assign) อินพุทไปยังเอาทพุทผานฟงกชันตาง ๆ ที่อาจเปนตัวกระทําทางลอจิก (Logical operator) หรือตัวกระทําทางคณิตศาสตร(Mathematical operator) ตาง ๆ เปนตนแทนที่จะเปนการตอกันของอุปกรณตาง ๆ ทําใหวิธีการนี้งายในการดู ทําความเขาใจMUX in behavioral <strong>design</strong> style133


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 6.10 ตัวอยางการเขียน Dataflow Designการออกแบบจะเปนการอธิบายการทํางานของ MUX มากกวาวาจะทํางานไดอยางไรในการที่จะสงผานอินพุทไปยัง เอาทพุท จากเงื่อนไขตัวเลือก Sel0 Sel1 โดยใชคําสั่ง Case เปนตน ซึ่งการออกแบบลักษณะนี้ไมจําเปนตองรูถึงโครงสรางวงจร ทําใหงาย และยืดหยุนมาก แตตองรูวิธีการอธิบายการทํางานวงจร การอธิบายจําเปนตองขึ้นอยูกับไวยกรณ และคําสั่งของภาษาชั้นสูงที่ใช ดังนั้นจึงจําเปนตองมีเครื่องมือในการสังเคราะหวงจร (Synthesis tools) ในการแปล และสรางวงจรขึ้นมาประเภทสัญญาณในภาษา Verilogทุกอยางในวงจรอิเล็กทรอนิกส สามารถมองไดเปนลักษณะของการรับ การแปลง และการสงสัญญาณทางไฟฟา (Receiving, transforming, and sending signals) จึงไมแปลกใจวาสัญญาณเปนสิ่งที่สําคัญในระบบอิเล็กทรอนิกส ดังนั้นในสวนนี้จะพูดถึงเรื่องสัญญาณเปนสําคัญ และวิธีการที่เราจะเรียกใชในภาษา Verilogโดยจะเริ่มแนะนําใหรูจักกับนิยาม และลักษณะตาง ๆ ของสัญญาณ รวมทั้งหนาที่ของสัญญาณที่มีอยูในวงจรดิจิตอลการกําหนดสัญญาณในภาษา Verilog ซึ่งโดยทั่วไปแลวสัญญาณจะมีอยูสองลักษณะคือ nets และ registersแตในบทนี้จะพูดถึง nets เทานั้น เนื่องจาก registers จะตองเกี่ยวของกับการอธิบายวงจรแบบ Behavioralซึ่งอยูในบทตอไปจากที่กลาวมาในเบื้องตนถึงลักษณะของโมดูลวา สามารถแบงออกเปนสองสวนหลัก ๆ คือ Body และInterface ดังนั้นลักษณะของสัญญาณก็เชนกันสามารถแบงไดเปน Internal ที่ใชในสวนของ Body และExternal ที่ใชในสวนของ Interface ที่เปนการกําหนดการทํางานของพอรต134


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>แนวคิดเกี่ยวกับสัญญาณ (Concept of Signals)สิ่งหนึ่งที่เปนปรากฎการณสําคัญในโลกเราก็คือ การติดตอสื่อสาร ซึ่งทําใหเราสามารถใชขอมูลรวมกัน ซึ่งเปนกระบวนการในการแลกเปลี่ยน มีการเกี่ยวของกับการสงขอมูลจากผูสงไปยังปลายทางที่เปนผูรับ และถึงแมวาจะมีวิธีการหลาย ๆ วิธีการในการรับสงขอมูลนี้ แตมีสิ่งหนึ่งที่รวมกันคือ สัญญาณ หรือที่เรียกวาSignalsสัญญาณสามารถมีไดหลาย ๆ รูปแบบ เชน อยูในรูปของแสง (Optical) เสียง (vocal) ทางกล (mechanical)หรือทางไฟฟา (Electrical) เปนตน แตไมวาจะอยูในรูปใดก็ตาม สัญญาณจะเปนตัวที่มีขอมูลบรรจุอยูเสมอรูปที่ 6.11 ตัวอยางลักษณะของสัญญาณตาง ๆสัญญาณในอุปกรณอิเล็กทรอนิกส (Signals in Electronic Device)การติดตอสื่อสารไมไดจํากัดเฉพาะสิ่งมีชีวิตเทานั้น เครื่องจักร หรือเครื่องมือตาง ๆ ก็สามารถทําไดเชนกันตัวอยางเชน ตัววัดอุณหภูมิ (Temperature sensor) อาจบอกวงจรควบคุมเมื่อมีอุณหภูมิเกินระดับที่กําหนดไว ใหวงจรควบคุมทําการสั่งแอรใหทํางาน เปนตนสัญญาณที่สงผานระหวางอุปกรณ หรือเครื่องมือตาง ๆ สามารถมีอยูไดหลาย ๆ แบบแตตราบใดที่เกี่ยวของกับวงจรไฟฟา ดังนั้นทุกสัญญาณจากสภาวะแวดลอมภายนอกจําเปนจะตองถูกแปลงเปนสัญญาณทางไฟฟา(Electrical signals) เพื่อที่จะนําไปใชงาน หรือประมวลผลดวยตัวอุปกรณทางไฟฟาไดความสําคัญของสัญญาณทางไฟฟา (The Importance of Electrical Signals)สัญญาณทางไฟฟาเปนสิ่งสําคัญในการทํางานในวงจร หรืออุปกรณอิเล็กทรอนิกส ซึ่งความจริงแลวถาปราศจากสัญญาณไฟฟา อุปกรณตาง ๆ เหลานั้นไมสามารถถูกเรียกไดวาเปนอุปกรณอิเล็กทรอนิกสได135


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>นั่นเอง ซึ่งถาพิจารณาทางกายภาพ สัญญาณทางไฟฟาคือการไหลของอิเล็กตรอน และโปรตรอน ซึ่งเปนการมองในทางฟสิกสนั่นเอง แตทางภาษาชั้นสูงอยาง Verilog เราไมจําเปนตองไปกังวลถึง เพียงแตทําการกําหนดหนาที่การทํางานของวงจร โดยคํานึงถึงคา หรือความหมายของสัญญาณทางไฟฟาที่จะเกิดขึ้นเทานั้นเอง โดยจะมีตัวสังเคราะหวงจร (Synthesis tools) ที่ทําการสรางวงจรขึ้นมาใหรับ และสรางสัญญาณไฟฟาตามที่เราตองการรูปที่ 6.12 สัญญาณที่ถูกสงไปมาระหวางโมดูลจากนี้ไปสัญญาณไฟฟาจะถูกเรียกสั้น ๆ วาสัญญาณ ซึ่งไหลไปตามเสนทางที่ตอเชื่อมกันระหวางอุปกรณอิเล็กทรอนิกส หรือโมดูลตาง ๆ ตามลักษณะของทิศทางที่ถูกกําหนดขึ้นมาโดยชนิดของพอรตที่ตัวอุปกรณซึ่งอาจเปน อินพุท เอาทพุทพอรต หรือพอรตที่เปนไดทั้งอินพุท/เอาทพุทคาที่เปนไปไดของสัญญาณ (Available Values of Signals)คาของสัญญาณที่เปนไปไดในภาษา Verilog มีเพียงแค 4 คาตามลักษณะของสัญญาณ และความเปนไปไดจริง ๆ ในวงจรอิเล็กทรอนิกส ซึ่งไดแก ‘0’, ‘1’, ‘X’, ‘Z’ โดยที่• ‘0’ คือคาลอจิกศูนย (Logic zero) หรือลอจิกต่ํา (Logic low) หรือคาที่ไมจริง (Falsecondition) จากการเปรียบเทียบ• ‘1’ คือคาลอจิกหนึ่ง (Logic one) หรือลอจิกสูง (Logic high) หรือคาที่เปนจริง (Truecondition) จากการเปรียบเทียบ136


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• ‘x’ หรือ ‘X’ เปนลอจิกไมทราบคา (Logic unknown) ที่อาจเกิดจากการไมลงรอยกัน (Conflict)ของสัญญาณที่จุด ๆ นั้นที่อาจเปนไปไดทั้ง ‘0’ ‘1’ ‘Z’• ‘z’ หรือ ‘Z’ เปนลอจิกที่เกิดจากการเปดวงจร (Open circuit) ทําใหเกิดสภาวะ Highimpedance ณ จุดนั้น ๆสังเกตุไดวา ถึงแมภาษา Verilog จะเปน Case sensitive แตสําหรับสภาวะ unknown หรือ high impedanceสามารถใชไดทั้งตัวเล็ก และตัวใหญการกระทําทางลอจิกสําหรับคาของสัญญาณตาง ๆ (Logic Operations on Four-value Signals)วงจรทางดิจิตอลที่ซับซอนเพียงใด เราสามารถแบงแยกยอยออกมาเปนลอจิกเกตตาง ๆ (สามารถกําหนดไดเปนสมการบูลีน) และเราใชตารางคาความจริง (Truth table) สําหรับแสดงความสัมพันธกันระหวางอินพุทและเอาทพุท โดยที่สัญญาณทั้งอินพุท และเอาทพุทสามารถเปนไปไดทั้ง 4 คาทางสัญญาณไฟฟานั้นคือ ‘0’‘1’ ‘X’ ‘Z’รูปที่ 6.13 ตัวอยางของตารางคาความจริงของ AND และ OR เกต แสดงไดดังรูปประเภทของสัญญาณ (Class of Signals) ในภาษา Verilogแตละสัญญาณในภาษา Verilog สามารถจัดใหอยูในสองประเภทของสัญญาณ คือ nets และ registers• Nets แทนการเชื่อมตอระหวางสวนตาง ๆ ของวงจร มันไมสามารถเก็บ (Storage) คาของสัญญาณไวได และคาที่ปรากฎบน nets กําหนดไดโดยตัวขับ (Driver) หรือแหลงจาย (Source)ดังนั้นเมื่อตัดแหลงจายออกไปจาก nets ก็จะเกิดสภาวะ High impedance ‘Z’ (ไมไดตอกับแหลงจายใด ๆ ) เกิดขึ้นที่ nets137


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• Registers ตางกับ nets คือสามารถเก็บคาของสัญญาณได โดยยังคงคาเดิมเมื่อไมไดตอกับแหลงขับ คาที่ถูกกําหนดกอนหนานี้ สามารถถูกแทนไดดวยสัญญาณใหมที่เพิ่งเขามา ดังนั้นสัญญาณประเภท registers ก็คลายกับรีจีสเตอร หรือฟลิปฟลอป (Flip-flop) ที่ใชงานในวงจรดิจิตอลทั่วไป แตตางกันตรงที่ไมจําเปนตองใชสัญญาณนาฬิกา (Clock) ในการเก็บคาNetsในภาษา Verilog สัญญาณที่จัดอยูในประเภท nets ประกอบดวย• wire และ tri : เปน nets ที่ใชกันมากที่สุด ชื่อที่ตางกันนี้ใชตามลักษณะการใชงานนั่นคือ wireควรจะในจุดที่มีตัวขับตัวเดียว (Single drive nets) สวน tri ควรใชสําหรับจุดที่มีหลาย ๆ ตัวขับ• wand/triand และ wor/trior : เปน nets ที่มีการกระทําทางลอจิก And หรือ Or ตามลําดับ• supply0, supply1, tri0, tri1, trireg : เปน nets ที่มีลักษณะการใชงานพิเศษสําหรับการออกแบบในระดับลาง (Low level) เชน ทรานซิสเตอรตารางคาความจริงของ Nets แตละชนิดสามารถแสดงเปนตารางคาความจริงไดดังรูป 6.14รูปที่ 6.14 ตารางคาความจริงของการใชงาน Nets ในลักษณะตาง ๆการกําหนดสัญญาณ (Signal Specification)กอนที่จะทําการใชประเภทของสัญญาณในภาษา Verilog เราจําเปนตองมีการกําหนด (Declaration) ชนิดและชื่อกอน ในที่นี้จะพูดถึงการกําหนดสัญญาณประเภท internal ที่อยูในสวนของ body ของโมดูลเทานั้นสวนสัญญาณประเภท external ที่อยูในสวนของการเชื่อมตอ (Interface) จะพูดถึงในสวนตอไป138


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>กฎ หรือไวยกรณของการกําหนดการใชสัญญาณสามารถทําไดโดยงายคือ บอกชนิดของสัญญาณกอนวาเปนwire, tri, wand,…แลวตามดวยชื่อ โดยอาจใสพรอม ๆ กันหลาย ๆ ชื่อไดโดยใสเครื่องหมาย , (comma)กั้นระหวางชื่อ เชน wire a, b, c, d; เปนตนสิ่งที่สะดวกอยางหนึ่งของภาษา Verilog ก็คือเราสามารถกําหนดการใชสัญญาณไดทุกที่ บรรทัดใดก็ได ในสวนของ body แตตองกําหนดไวกอนการใชงานสัญญาณสเกลลาร และเวกเตอร (Scalar Signals and Vectors)ถึงตอนนี้เราไดพูดถึงเฉพาะสัญญาณที่มีเสนเดียว หรือบิตเดียว ที่เราอาจเรียกวา Scalar signal ซึ่งมีคาสัญญาณทางลอจิกคาเดียว ณ เวลาใดเวลาหนึ่ง ตัวอยางเชน สัญญาณนาฬิกาที่ใชเปนจังหวะ (Synchronize)ของการทํางานในระบบดิจิตอลหลาย ๆ ระบบจําเปนตองมีกลุมของสัญญาณหลาย ๆ เสนที่เรียกวา บัส หรือเวกเตอร (Buses or vectors) ซึ่งจะทําการรับสงขอมูลที่ประกอบดวยคาทางลอจิกที่อยูในแตละเสนหลาย ๆ คา ตัวอยางที่มักจะเห็นกันเปนประจําก็คือ ระบบไมโครโปรเซสเซอร เมื่อไดยินถึง 32-bit microprocessor นั่นหมายถึงวา บัสขอมูล และบัสแอดเดรส มีขนาด 32 bit หรือ 32 เสน แตละบิตในบัสสามารถเขาถึงไดทั้งการอาน และการเขียน โดยการใชตัวชี้ (Index) เชน data[31:0], address[31:0] ดังตัวอยางในรูป 6.15รูปที่ 6.15 โครงสรางของระบบที่มีสายนําสัญญาณแบบเสนเดียวคือ Clock และ Resetและแบบหลายเสนคือ Address และ Dataการกําหนดการใชงานแบบเวกเตอร (Vector Specification)ในการกําหนดการใชงานแบบเวกเตอร เราไมจําเปนตองมีชนิดของสัญญาณขึ้นมาใหมสําหรับเวกเตอรแทจริงแลว สัญญาณสเกลลารนั้นอาจถือไดวาเปนกรณีเฉพาะของสัญญาณแบบเวกเตอรที่มีเสนเดียวโดยที่139


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>บิตสําคัญมากสุด MSB (Most significant bit) กับบิตสําคัญนอยสุด LSB (Least significant bit) นั้นอยูในตําแหนงเดียวกันเมื่อสัญญาณแบบเวกเตอรประกอบดวยหลาย ๆ บิต ซึ่งในแตละบิตจะตองสามารถเขาถึงไดโดยการอาศัยตัวชี้(Index) สําหรับภาษา Verilog นั้นเราสามารถกําหนดตัวเลขชี้บิต (Indexing number) ที่ใชไดทั้งเลขลบและเลขบวก กําหนดลงใน [ ] โดยที่ตัวเลขชี้บิตจะมีอยูสองตัวสําหรับการกําหนดชวงโดยจะถูกคั่นดวยเครื่องหมาย : (Colon) สําหรับตัวเลขดานซายจะเปน MSB และตัวเลขดานขวาคือ LSB ตัวอยางเชน wire[0:5] Bus1; wire [5:0] Bus2; wire [5:-5] Address; เปนตนรูปที่ 6.16 ตัวอยางการกําหนดคาสัญญาณที่เปนเวกเตอร และตําแหนงของคา MSB และ LSBสัญญาณ Internal เทียบกับ External (Internal vs External Signals)สัญญาณที่พูดถึงกอนหนาที่อยูในประเภท Internal ที่ใชภายในโมดูลในสวนของ Body และไมสามารถเขาถึง (Accessible) ไดจากภายนอกโมดูลถาปราศจากสัญญาณ External ที่อยูในสวนของการ Interfaceดังนั้นความแตกตางระหวางสัญญาณ Internal และ External คือ สัญญาณ Internal จะใชภายในตัวโมดูลสําหรับการรับสงขอมูลตาง ๆ สวนสัญญาณ External จะเปนตัวที่ติดตอกับอุปกรณตาง ๆ ที่อยูภายนอกโมดูล โดยจะกําหนดเปนพอรตของโมดูล (Module port) นั่นเอง สําหรับการรับขอมูลอินพุทเขามา หรือสงขอมูลเอาทพุทออกไป140


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 6.17 ลักษณะของสัญญาณ External และ Internalพอรตของโมดูล (Module Ports)โมดูลสามารถสื่อสารระหวางภายใน และภายนอกผานทางพอรต ในการกําหนดการใชงานพอรตนั้นจะตองกําหนดความกวางของพอรต และทิศทางของขอมูลที่จะผานพอรต (เขาหรือออก เทียบกับตัวโมดูลนั้น ๆ )ชนิดของพอรต (Port Types)ในภาษา Verilog เราสามารถกําหนดชนิดของพอรตโดยดูจากทิศทางการไหลของขอมูล เขา หรือออกจากโมดูลนั้น ๆ ไดแก• input: ขอมูลจะถูกอานโดยโมดูลจากภายนอกผานทาง input ports เราไมสามารถเขียนขอมูลจากภายในโมดูลไปยังพอรตชนิดนี้ได• output: ขอมูลจะถูกสงไปยังภายนอกโมดูลผานทาง output ports เราไมสามารถอานขอมูลเขามายังภายในโมดูลผานทางพอรตชนิดนี้ได• inout: ขอมูลสามารถถูกอาน และเขียนผานทางพอรตชนิดนี้ได ดังนั้นจึงถูกเรียกวา bidirectionalports141


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 6.17 ตัวอยางการกําหนดทิศทางพอรตของโมดูลสําหรับตัวอยางในรูป 6.17 จะแสดงการกําหนดการใชงาน Bi-directional port สําหรับเปนพอรตขอมูลระหวาง Processor กับ Memory โดยที่ขอมูลสามารถไปกลับไดสองทิศทาง คือจากซายไปขวา หรือจากขวาไปซายการกําหนดการใชงานพอรต (The Specification of Ports)การกําหนดการใชงานพอรตในภาษา Verilog ประกอบดวยสองสวนดังนี้• ชื่อของพอรตที่ถูกเรียงอยูในสวนที่เรียกวา Port list ที่ตามหลังชื่อของโมดูล รายชื่อของพอรตตาง ๆ จะอยูในวงเล็บ โดยถูกคั่นดวยเครื่องหมาย , (comma)• หลังจากสวนของ Port list จะตองตามดวย Port declaration ที่เปนตัวกําหนดทิศทางของพอรต รวมทั้งขนาดของพอรตแตละพอรต การกําหนดการใชงานในสวนนี้จะคลายกับการกําหนดการใชงานของ Internal signals โดยมีไวยกรณดังนี้Keyword vector_range identifier;โดยที่ Keyword คือ input, output หรือ inoutตัวอยางในรูป 6.18 แสดงการกําหนดการใชงานพอรตในโมดูล Processor และโมดูล Memory ซึ่งเราจะเห็นสวนของ Port list ตามดวย Port declaration เชนในกรณีของ Processor ที่มีพอรตตาง ๆ คือ Clock,Reset, Read_Write, Data และ Address กําหนดไวใน Port list ภายในวงเล็บที่อยูหลังชื่อโมดูล บรรทัด142


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>หลาย ๆ บรรทัดตอมาจะเปนสวนของ Port declaration ที่เปนกําหนดทิศทาง และขนาดของสัญญาณ กอนที่จะนําไปใชงานตอไปPort listPort declarationรูปที่ 6.18 แสดงการกําหนดการใชงานพอรตในโมดูล Processor และโมดูล Memoryการสรางรีจิสเตอรที่เอาทพุท (Registered Outputs)ในการออกแบบระบบใหญ ๆ ที่ดีนั้น เรามักจะกําหนดใหคาเอาทพุทของแตละโมดูลมีการเก็บคาไวดวยรีจิสเตอร ทั้งนี้เพื่อใหงายในการเชื่อมตอ และไดคาที่เสถียรกอนที่จะนําไปใชงาน หรือเปนอินพุทของโมดูลอื่น ๆ เนื่องจากเราทราบวาถาเอาทพุทตอโดยตรงกับสัญญาณประเภท Nets เชน wire นั้นจะมีสภาวะเปนHigh impedance เมื่อไมมีตัวขับ หรือแหลงจายตออยู ซึ่งสภาวะนี้ไมเปนที่ตองการในการใชงานวิธีการที่จะทําใหเปนเอาทพุทแบบรีจีสเตอร สามารถทําไดงาย ๆ โดยกําหนด Internal signals แบบ reg(Register) และใหสัญญาณเปนชื่อเดียวกันกับเอาทพุทพอรต ดังตัวอยางในรูป 6.19143


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 6.18 แสดงการกําหนดพอรตที่มีรีจิสเตอรที่ขาออก144


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Chapter8บทที่ 8. นิพจนและการสงผานคา(Expression and Assignment)ในบทนี้จะอธิบายความสัมพันธระหวางเอาทพุท และอินพุทโดยจะแนะนําใหรูจักกับนิพจน (Expression) ที่ประกอบดวยตัวถูกกระทํา (Operands) ที่เปนตัวแปรอินพุทตาง ๆ ที่ถูกดําเนินการดวยตัวกระทํา (Operator) ซึ่งหลังจากกระทํากันแลว ผลลัพธที่ไดก็จะถูกสงผานมายังตัวแปร หรือสัญญาณใด ๆ ซึ่งเราเรียกการสงผานคานี้วา Assignment เพื่อที่จะนําไปใชงานตอไปสําหรับตัว Operators ในภาษา Verilog นั้นมีใหใชงานหลากหลาย ตามชนิดของ Operands และการใชงานที่แตกตางกัน ในการกําหนดเปน Dataflow expression นั้น ผลจากการกระทําใน Expression จะตองถูกกําหนดหรือสงผาน (Assign) มาใหกับสัญญาณที่ตองการ (Target signal) ลักษณะการสงผานคาสัญญาณในลักษณะนี้ เราเรียกวา Continuous assignments ซึ่งจะกลาวในบทนี้เชนกันนิพจน (Expressions)รูจักกับ Expressions (Introduction to Expressions)โดยปกติแลวในระบบทั่วไป สัญญาณอินพุทจะถูกแปลง (Transform) ดวยวิธีการใด ๆ วิธีการหนึ่ง เพื่อสรางสัญญาณเอาทพุทที่ตองการออกมา กระบวนการแปลงเชนนี้ สามารถเขียนไดเปนOutputs


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>สามารถมี Operands ไดตั้งแต 1, 2, หรือ 3 ตัว ตามแตความตองการใชงาน โดยอาจเปน Operands ตางชนิดกันก็ได ซึ่งเปนขอยืดหยุนที่สําคัญในภาษา Verilog ที่ตางกับภาษา V<strong>HDL</strong>ตัวอยางของ Expression แสดงไดดังรูป x.1รูปที่ 8.1 แสดงโครงสรางของ Expressionตัวถูกกระทํา (Operands)แตละ Expression จําเปนตองมี Operands ที่ถูกกระทําดวยตัว Operators ในการที่จะกําหนดฟงกชันการทํางานเพื่อที่จะสรางผลลัพทที่ตองการออกมา และเนื่องจากตัว Operands มีหลายชนิด ดังนั้นการเลือกใชOperators จะตองสอดคลองกันกับชนิดของ Operands ดวย ซึ่งสามารถแบงไดเปนดังนี้• ตัวอยางที่เห็นไดงาย และชัดเจนที่สุดสําหรับชนิดของ Operands คือการอางอิงถึงสัญญาณNets และ Registers ดวยชื่อตาง ๆ หรือที่เรียกวา Instance names นั่นเอง• คาคงที่ หรือ Constant values ก็เปนอีกชนิดหนึ่งของ Operands ที่สําคัญ ซึ่งในภาษา Verilogนั้นมีคาคงที่หลาย ๆ ประเภทเชน Integer, Real เปนตน• คาที่ประกอบดวยหลาย ๆ บิต หรือที่เรียกวา Vector ซึ่งสามารถเปนไดทั้ง Nets หรือ Registersและเราสามารถกําหนดการเรียกใชงานในแตละบิต (Bit-select) หรือบางสวน (Part-select)ของคาเวกเตอรนั้น ๆ ใด• ชนิดสุดทายของ Operands อาจจะเปนการเรียกใชฟงกชัน (A call to a function) ทั้งฟงกชันของระบบ หรือที่ผูใชงานออกแบบขึ้นเอง โดยที่หลังจากเรียกใชจะมีคาที่สงกลับมา ที่มีความสอดคลองกับชนิดของตัวกระทํา (Operators)146


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 8.2 แสดงตัวอยางของ Operandsตัวอยาง Operands สามารถแสดงไดในรูป x.2 จะเห็นวา in1, Radius และ DataBus เปน Simple referenceที่เปนการอางอิงถึงสัญญาณ Nets และ Registers ที่เปนแบบเวกเตอร สวนการใชงานบางสวน (Part-select)สามารถใชเปน DataBus[7:4] หรือการใชงานเฉพาะบิตคือ DataBus[0] เปนตน สําหรับตัวอยางของOperands ที่เปนคาคงที่ (Constant values) เชน 1.3e7 (Scientific) , 127 (Decimal), 4’b1001 (Binary)สําหรับตัวอยางที่เปนชนิดของการเรียกใชฟงกชันคือ CircleArea(Radius) เปนตนคาคงที่จํานวนเต็ม (Integer Constants)คาคงที่จํานวนเต็ม คือคาจํานวนเต็มที่เขียนในเลขฐานสิบที่ใชในชีวิตประจําวัน สามารถเปนไปไดทั้งคาที่เปนบวก หรือลบ เชน 1, 3, 457, -34, -872 เปนตนในภาษา Verilog คาเลขฐานของจํานวนเต็มโดยปริยาย (Default) คือฐานสิบ (Decimal) ถาหากไมกําหนดเลขฐานกํากับ แตเราสามารถกําหนดใหมใหเปนฐานสอง ฐานแปด หรือฐานสิบหกไดตามตองการ โดยตองมีสัญลักษณ ‘ ตามดวยตัวอักษรที่บอกคาของเลขฐาน เชน ‘h’ หรือ ‘H’ สําหรับฐานสิบหก, ‘o’ หรือ ‘O’สําหรับเลขฐานแปด, ‘b’ หรือ ‘B’ สําหรับเลขฐานสอง, ‘d’ หรือ ‘D’ สําหรับเลขฐานสิบการกําหนดคาในลักษณะนี้จะถูกกําหนดใหเปนเลขจํานวนเต็มบวก เชน 8’b10100001,12’B0001_0010_1010, 16’H12AB เปนตน เราจะสังเกตเห็นวาตัวเลขดานหนาของเครื่องหมาย ‘ จะเปนคาที่แสดงจํานวนบิตของคาจํานวนเต็มนั้น ๆ ซึ่งบางครั้งเราอาจละไวถาเราใสคาครบทุกบิต เชน‘b0001_0010_1010 ซึ่งเปนการแสดงคาในเลขฐานสอง และมีอยู 12 บิต สวนเครื่องหมาย _ (Underscore)147


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ใชสําหรับชวยในการกําหนดกลุมใหงายสําหรับการอานคา และไมมีผลตอคาของจํานวนเต็มที่กําหนดแตอยางใด• Unsized integer: เปนการกําหนดคาเลขจํานวนเต็มโดยไมบอกจํานวนบิต คาจํานวนบิตจะถือเปนคา Default นั่นคือ 32 บิต แตการกําหนดเลขฐานสําหรับคาที่ไมใชฐานสิบตองมีกํากับตามปกติ ตัวอยางเชน• Sized integer: จําเปนตองมีจํานวนบิตกํากับ โดยกําหนดใหเปนตัวเลขจํานวนเต็มบวกฐานสิบซึ่งคาที่แทจริงของคาคงที่นั้นจะตองมีจํานวนบิตที่นอยกวา หรือเทากับจํานวนบิตที่กําหนด ในกรณีที่นอยกวา ตัวคอมไพเลอรจะเติมคา ‘0’ ใหในบิตสูงที่ไมถูกกําหนด เชน• Negative value: คาที่เปนลบของจํานวนเต็ม สามารถกําหนดไดโดยการใสเครื่องหมายลบไวขางหนาสุด โดยตัวคอมไพเลอรจะมองเปน 2’s compliment form ดังตัวอยาง• Use of ‘?’: เครื่องหมายคําถาม ? ใชแทนการกําหนดคา ‘z’ หรือ High impedance ที่เปนการกําหนดคา “don’t care condition” ของคาคงที่นั้น ๆ โดยจํานวนบิตของ ‘z’ จะเทากับ 4, 3, 1เมื่อกําหนดในเลขฐานสิบหก ฐานแปด ฐานสอง ตามลําดับ148


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• Use of ‘x’ and ‘z’: การแทนบิตคาคงที่ดวย ‘x’ หรือ ‘z’ (สามารถใชตัวเล็ก หรือใหญก็ได) เปนการกําหนดคา “Unknown” หรือ คา “High impedance” ตามลําดับ สามารถใชในเลขฐานสอง ฐานแปด หรือฐานสิบหก (แตไมสามารถใชกับฐานสิบได) โดยจํานวนบิตของ ‘z’จะเทากับ 4, 3, 1 เมื่อกําหนดในเลขฐานสิบหก ฐานแปด ฐานสอง ตามลําดับ• Use of ‘_’: เครื่องหมาย Underscore เปนการกําหนดกลุม หรือวรรคของคาคงที่ที่กําหนด ทําใหสามารถอานไดโดยงาย สามารถแทรกไดตามจุดตาง ๆ ภายในคา แตไมสามารถเขียนไวหนาสุดของคานั้น ๆ ได เชน• Left padding: ในกรณีที่ขนาดของคาจํานวนเต็มนอยกวาคาของจํานวนบิต การทํา Leftpadding หรือการเติมคาเขาทางดานซายในตําแหนงที่ไมมีการกําหนด จะถูกนํามาใชงาน กรณีปกติจะเปนคา ‘0’ สําหรับการทํา Left padding แตถาคาดานซายสุดของคาที่กําหนดเปน ‘x’หรือ ‘z’ จะตองใสคา ‘x’ หรือ ‘z’ เขาไปใหเต็มแทนที่จะเปน ‘0’ ตามตัวอยางBit-select และ Part-select สําหรับตัวแปรเวกเตอร (The Bit-select and Part-select Operands)เมื่อเราตองการสวนหนึ่งของตัวแปรเวกเตอร อาจจะเปนแคบิตเดียว หรือหลาย ๆ บิตตอกัน สามารถทําไดโดยการใช Select operand โดยมีไวยากรณที่ไมซับซอน แคกําหนดบิต หรือชวงบิตที่ตองการในเครื่องหมาย [ ] โดยถาเปนการกําหนดชวงในลักษณะของ Part select การกําหนดชวงบิตจะตองมีเครื่องหมาย : (Colon) เปนตัวคั่นระหวาง MSB กับ LSB นั่นคือ [MSB:LSB] ดังรูป x.3149


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 8.3 การกําหนดตัวแปร Operands แบบเวกเตอรถาเรากําหนดชวงของบิต (Indexes) เกินกวาที่กําหนดไวในตัวแปรเวกเตอร คาของบิตในตําแหนงที่เลยออกมาจะถูกกําหนดเปน ‘x’ โดยอัตโนมัติตัวกระทํา (Operators)ในภาษา Verilog มีตัวกระทํามากถึง 32 ตัว สามารถแบงไดเปนสามกลุมตามจํานวนของ Operands ที่ใชงานดวย คือ Unary (with one operand), Binary (with two operands), Ternary (with three operands) หรือถาแยกตามประเภทของการทํางานสามารถกําหนด ไดเปนชนิดหลัก ๆ ไดดังนี้คือ• ตัวกระทําเชิงคณิตศาสตร (Arithmetic operator)• ตัวกระทําเชิงตรรก (Logical operator)• ตัวกระทําเชิงความสัมพันธ (Relational operator)ตัวกระทําทางคณิตศาสตร (Arithmetic Operators)ตัวกระทําเชิงคณิตศาสตรไดแก + แทนการบวก, – แทนการลบ, * แทนการคูณ, / แทนการหาร โดยที่สองตัวแรกคือ + และ – สามารถเปน Unary operator ที่มี Operand เพียงแคตัวเดียวสําหรับการแทนเปนจํานวนบวก หรือจํานวนลบ150


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>นอกจากตัวกระทําพื้นฐานทั้งสี่ตัวนี้แลว % เปนอีกตัวหนึ่งสําหรับการ Modulo ซึ่งจะไดผลลัพธเปนคาที่เหลือ (Remainder) จากการหารกันระหวางตัวตั้ง และตัวหารสิ่งสําคัญอยางหนึ่งสําหรับการกระทําโดยใช Arithmetic operators คือคาที่ไดจาก Operands ประเภทRegister และ Integer จะแตกตางกันเนื่องจาก คาของสัญญาณ หรือตัวแปรประเภท Register จะคิดเปนคาจํานวนเต็มบวก (Unsigned) แตสําหรับ Integer จะคิดเปนคาจํานวนเต็มที่มีคาไดทั้งบวก และลบ (Signed)ทําใหบางครั้งคาผลลัพธที่ไดจะแตกตางกัน ถึงแมวาจะมีการกําหนดคาที่เหมือนกัน ดังตัวอยางตอไปนี้• IntA ถูกกําหนดเปนตัวแปรประเภท interger ซึ่งคา -12 จะถูกแปลงเปนเลข 2’s กอนทําการหารโดยไดผลลัพธเทากับ 65532 ซึ่งเปนคา 2’s ของ -4รูปที่ 8.3 การใชงานตัวแปรประเภท integer• IntA ถูกกําหนดเปน Register ซึ่งถากําหนดเปน -12 ซึ่งแทนไดดวยคาภายในตัวคอมไพเลอร เปนจํานวนบวกที่เทากับ 65524 ดังนั้นจะไดผลลัพธเทากับ 21841 ซึ่งไมถูกตอง151


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 8.4 การใชงานตัวแปรเปนประเภทเวกเตอรรีจิสเตอรตัวกระทําเชิงความสัมพันธ (Relational Operators)เปนตัวกระทําที่ใชในการเปรียบเทียบวา มากกวา นอยกวา หรือเทากับ ระหวางตัว Operands สองตัวใด ๆโดยผลลัพธที่ไดออกมานั้น ถาเปนไปตามเงื่อนไขของความสัมพันธ (วามีตัวใดมีคามากกวา หรือนอยกวาหรือเทากัน) จะมีคาเปน ‘1’ เมื่อความสัมพันธนั้นเปนจริง และจะมีคาเปน ‘0’ เมื่อเปนเท็จในกรณีที่บิตใด บิตหนึ่งของ Operands มีคาเปน ‘x’ หรือ ‘z’ คาผลลัพธที่ไดจะเทากับ ‘x’ (Unknown) และถาจํานวนบิตของ Operands ไมเทากัน ตัวที่นอยกวาจะถูกเติมดวย ‘0’ ในดานซายมือ (Left padding)ลําดับความสําคัญของการทํางาน หรือที่เรียกวา Precedence ของ Relational operators จะนอยกวาArithmetic operatorsรูปที่ 8.5 ตัวอยางการเปรียบเทียบพื้นฐาน นอยกวา มากกวา152


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>นอกจากลักษณะของการกระทําเปรียบเทียบวาเทากับ ‘==’ หรือไมเทากับ ‘!=’ แลว ในภาษา Verilog มีลักษณะพิเศษเพิ่มขึ้นสําหรับการเปรียบเทียบโดยมีเงื่อนไขสําหรับสัญญาณ ‘x’ หรือ ‘z’ เรียกวา Caseequality (inequality) โดยมีสัญลักษณเปน ‘===’ หรือ ‘!==’ โดยจะเปนการเปรียบเทียบคาของทั้งสองOperands โดยไมคํานึงถึงวาเปน ‘x’ หรือ ‘z’ ดังนั้นผลลัพธจะออกมาเปน ‘0’ หรือ ‘1’ เทานั้นแลวแตเงื่อนไขที่ใชในการเปรียบเทียบ เชน ถาเทากันทุกบิตไมวาแตละบิตจะเปนคา ‘0’ ‘1’ ‘x’ หรือ ‘z’ ผลลัพธของการเปรียบเทียบโดยใชเงื่อนไข ‘===’ จะเปนจริง ดังตัวอยางในรูปที่ 8.6ตัวกระทําทางตรรก (Logical Operators)รูปที่ 8.6 การเปรียบเทียบเทากับ ไมเทากับในภาษา Verilog ไดแบงตัวกระทําทางตรรก หรือทางลอจิกเปน 3 ประเภทใหญ ๆ ดวยกันคือ• Logical operators: จะทําการกระทําทางลอจิกกับ Operands สองตัว ที่ความยาวบิตใด ๆผลลัพธที่ไดจะเปน 1 บิต ที่มีคาเปนจริง (‘1’) หรือ เท็จ (‘0’) เทานั้น• Bit-wise operators: จะนําเอา Operands สองตัวที่ความยาวบิตใด ๆ มากระทําทางลอจิกบิตตอบิต ตามตําแหนง ตัวอยางเชน บิตที่ k ของตัว Operand ซาย จะกระทําทางลอจิกกับบิตที่ kของตัวขวา ดังนั้นผลลัพธจะไดความยาวบิตเทากับ ความยาวบิตของตัว Operand ที่ยาวที่สุดสําหรับตัว Operand ที่ยาวนอยกวาจะมีการทํา Left padding ในตําแหนงบิตที่ขาดไป กอนจะนํามากระทําทางลอจิกในแตละบิต153


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• Reduction operators: จะใชกับ Operand เพียงตัวเดียวที่เปนเวกเตอร โดยผลลัพธจะเทากับการนําเอาแตละบิตใน Operand ตัวนั้นมากระทําทางลอจิกกันในตัวมันเองจนครบ ดังนั้นผลลัพธที่ไดจะมีเพียงแคบิตเดียวตารางที่ x.7 สรุปการใชงานตัวกระทําทางตรรกในประเภทตาง ๆAND OR NOT XOR/XNORLogical⎯operatorsBit-wiseoperatorsReductionoperators⎯154


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตัวกระทําพิเศษ (Special Operators)ตัวกระทําที่เปน Shift Operatorsการใชงานจะประกอบดวย Operands สองตัว ตัวแรกจะเปนสัญญาณเวกเตอรที่ตองการใหเกิดการชิฟ และตัวที่สองจะเปนจํานวนของการชิฟ วาตองการชิฟไปกี่บิต เราสามารถทําการชิฟไดทั้งซาย และขวาโดยใชเครื่องหมาย ‘>>’ สําหรับการชิฟไปดานขวา และ ‘


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 8.9 ตัวอยางแสดงการสราง AggVec ขนาด 8 บิต จากเวกเตอร Data1, Data2, และสเกลาร BitOne โดยเลือกเอาบางสวนของ Data1 และ Data2 มาเรียงกัน (Part-select)การสงผานคา (Assignment)การสงผานคาแบบตอเนื่อง (The Continuous Assignment)เมื่อไหรก็ตามที่มีการกระทําของ Expressions ที่ประกอบดวย Operands และ Operators แลวไดผลลัพธออกมา เราจําเปนตองทําการสงผานคา (Assign) ผลลัพธนั้น ๆ ใหกับตัวแปรสัญญาณใด ๆ เพื่อใหสามารถนําสัญญาณไปใชงานตอไดในระบบการสงผานคาสามารถทําไดสองวิธีคือ Continuous assignment หรือ Procedural assignment ซึ่งในบทนี้เราจะพูดถึงวิธีแรกเทานั้น สวนอีกวิธีจะมีอยูในบทตอไปการใชงานในลักษณะของ Continuous assignment เปนการสงผานคาจากผลลัพธที่ไดจาก Expressionทางดานขวามือ ของสัญลักษณ Assignment symbol มายังตัวแปรสัญญาณที่อยูทางดานซายมือ ซึ่งเปนลักษณะของ Dataflow model โดย Continuous assignment จะมีสวนประกอบตาง ๆ ดังนี้คือ• คําสั่ง assign• คาดีเลย (มีหรือไมมีก็ได)• ตัวแปรสัญญาณทางซายมือ ซึ่งจะเปนปลายทางในการรับผลลัพธจาก Expression ทางดานขวามือที่จะเปนตนทาง โดยตัวรับสัญญาณนี้จะตองกําหนดเปน Nets (scalar or vector)เทานั้น จะกําหนดใหเปนประเภท Registers ไมได156


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตัวอยางเชน• สัญลักษณของการสงผานคา เราใชเครื่องหมายเทากับ ‘=’ ธรรมดาassign Out1 = A & B & C;assign Out2 = A + B;assign Out3 = {A, B, C};สําหรับการสงผานคาแบบ Continuous assignment จะมีการกระทําพรอม ๆ กันทันที ถามีการเปลี่ยนแปลงคาของ Operands ใด ๆ ที่อยูใน Expression ทางดานขวามือเกิดขึ้น โดยจะมีการหาผลลัพธที่เกิดขึ้นใหมจากการเปลี่ยนแปลงคาของตัว Operands กอนที่จะทําการสงผานคามายังตัวแปรทางดานซายมือการสงผานคาแบบแฝง (The Implicit Continuous Assignment)เราสามารถสงผานคาแบบ Continuous assignment ใหกับ Net ตอนที่เรากําหนดใชงาน (Net declaration)ไดทันที โดยไมตองมีคําสั่ง assign วิธีการนี้เรียกวา Implicit assignment หรือ Net declarationassignment เชน wire x = ………;ก) การสงผานคาแบบปกติโดยใชคําสั่ง Assign157


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ข) การสงผานคาแบบแฝง (Implicit Assignment)รูปที่ 8.10 แสดงการเปรียบเทียบการสงผานคาแบบตาง ๆรูป x.10 ก) เปนการกําหนดโดยวิธีการปกติที่เห็นการสงผานคาใหกับ X, Y ไดอยางชัดเจนโดยใชคําสั่งassign เรียกวา Explicit assignment สวนรูป x.10 ข) ดานลางจะเปนการสงผานคาใหกับ X, Y ทันทีหลังจากการกําหนดเปนตัวแปรสัญญาณแบบ wire โดยไมตองใชคําสั่ง assign เรียกวา Implicitassignmentการสงผานคาแบบมีเงื่อนไข (The Conditional Assignment)การกําหนดการทํางานแบบมีเงื่อนไข มีประโยชนมากในการอธิบายการทํางานของทั้งซอฟทแวร และฮารดแวร แตอยางไรก็ตามเราไมสามารถใชคําสั่ง if-then-else ในลักษณะการกําหนดคาที่เปน Continuousassignment ได ดังนั้นจึงมีตัวกระทําทางเงื่อนไข (Conditional operator) มาทดแทนการใชงานที่ไมซับซอน158


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 8.11 การสงผานคาแบบมีเงื่อนไขตัวอยางเชน assign Out = Sel ? In0 : In1; ในรูป x.11 เปนการสงผานคาใหกับ OUT โดยมีเงื่อนไขคือถา Sel เปนจริง คา In0 จะถูกกําหนดมาใหกับ Out แตถา Sel เปนเท็จ คา In1 จะถูกกําหนดมาใหแทน ซึ่งก็คือการทํางานของ Multiplexer ที่มีสองอินพุท และหนึ่งเอาทพุทนั่นเอง159


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Chapter9บทที่ 9. การเขียนอธิบายโครงสรางวงจร (Verilog Structural Design)หลังจากที่ทราบถึงการกําหนดการใชงานของภาษา Verilogรวมทั้งแนะนําใหรูจักสัญญาณตาง ๆ แลว ในบทนี้จะเปนการอธิบายการเขียนในสวนที่เปน Body และวิธีการสรางระบบที่ซับซอนจากสวนประกอบยอย ๆ ที่อาจเปนโมดูลหรืออุปกรณพื้นฐาน (Primitive) ตาง ๆ ทั้งที่เปนมาตรฐานที่สามารถเรียกใชไดเลย เชน ลอจิกเกตตาง ๆหรือที่เราสรางขึ้นมาเองที่เรียกวา UDP (User defined primitive) โดยในการเชื่อมตอนั้นจะใช nets เปนตัวเชื่อมตอ ซึ่งเปนการเขียนอธิบายลักษณะโครงสรางของวงจร หรือ Structural Design Style นั่นเองอุปกรณพื้นฐานใน Verilog (Verilog Primitives)เราสามารถมองไดวา ทุก ๆ ระบบประกอบดวยโมดูลหลาย ๆ โมดูล ที่ถูกเชื่อมตอกันสําหรับการติดตอสื่อสารระหวางกัน ในแตละโมดูลนี้ สามารถมีโมดูลยอย ๆ ภายในตัวมันเองที่ตอเชื่อมกัน ลักษณะการออกแบบระบบแบบนี้เราเรียกวา Hierarchy หรือลําดับชั้นนั่นเองการออกแบบระบบโดยดูจากโครงสรางนั้น มีลักษณะคลายกับการมองระบบในทางกายภาพที่ประกอบดวยสวนตาง ๆ และสวนตาง ๆ เหลานั้นก็สามารถแยกยอยลงไปอีก ดังตัวอยางในรูปของระบบคอมพิวเตอรที่ประกอบดวยสวนตาง ๆ เชน การด และในตัวการดเองก็ประกอบดวย IC โดยที่ใน IC ก็มีเกตอยูภายในรวมทั้งฟลิปฟลอป และในตัวฟลิปฟลอบเองก็มีเกตตอกันอยู ซึ่งถามองลึกลงไปอีกถึงชั้นลางสุด เกตก็จะประกอบดวยตัวทรานซิสเตอรตอกัน160


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 9.1 ตัวอยางระบบที่ประกอบดวยโครงสรางยอย ๆ ภายในสําหรับในตัวภาษา Verilog นั้น เราสามารถออกแบบเปนลักษณะโครงสรางได จากระดับลางที่เปนตัวทรานซิสเตอร จนกระทั่งเปนโมดูลยอย ๆ รวมกันเปนโมดูลหลัก และประกอบกันขึ้นมาเปนระบบที่ซับซอนไดในที่สุดเนื่องจากลอจิกเกต เปนอุปกรณพื้นฐานที่สุด และจําเปนที่สุดที่ประกอบกันเปนวงจรดิจิตอลขึ้นมา และในVerilog เองก็มีอยูในไลบรารี Primitive ซึ่งสามารถเรียกใชไดทันที ดังนั้นเราจะมาทําความรูจักกับอุปกรณพื้นฐานเหลานี้ และวิธีการเรียกใชงานดวยภาษา Verilog กอนเกตพื้นฐานที่สรางไวแลว (Predefined Gate Primitives)ใน Verilog เราสามารถเรียกใชเกตพื้นฐานที่มีอยูแลวได 14 ชนิดดวยกัน ทั้งหมดนี้เราสามารถแบงออกไดเปน 4 กลุมดวยกันคือ• Multiple-input gates ประกอบดวย 6 ลอจิกเกตดวยกันคือ and, nand, or, nor, xor, และxnor แตละตัวนั้นเปนตัวกระทําทางลอจิก โดยสามารถกําหนดอินพุทไดมากเทาไรก็ได โดยแตละตัวมีการทํางานสําหรับสองอินพุทตามตารางคาความจริงดังตอไปนี้161


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 9.2 รูปแสดงเกตพื้นฐาน และตารางคาความจริงตัวอยางเรียกใชงานของ nand gate แสดงดังรูป x.3 สังเกตวา พอรตแรกจะเปนเอาทพุทพอรต ตามดวยแตละอินพุทพอรตตามจํานวนที่ตองการ162


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 9.3 แสดงการเรียกใชงานเกตพื้นฐานที่มีหลายอินพุท• Multiple-output gates ไดแก buf และ not โดยที่สามารถมีไดหลาย ๆ เอาทพุท จากหนึ่งอินพุท ตัวอยางในรูป x.4 เชนรูปที่ 9.4 แสดงการใชงานเกตที่มีหลายเอาทพุท• Tri-state gates ไดแก bufif0, bufif1, notif0, notif1 ใชแทนบัฟเฟอรแบบสามสถานะ (Tristatebuffer) ไดแก ‘0’, ‘1’, และ ‘Z’ โดยมีสัญญาณควบคุมการปดเปดเกต เกตชนิดนี้มีหนึ่งอินพุท หนึ่งเอาทพุท และหนึ่งสัญญาณควบคุม ตัวอยางเชน163


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 9.5 แสดงการใชงานเกตในลักษณะของบัฟเฟอร (Tri-state buffer gate)การออกแบบโดยใชอุปกรณพื้นฐาน (Design with Primitives)สําหรับการออกแบบประเภทนี้ อันดับแรกเราจําเปนตองกําหนดชื่อของเกต (Gate instance declaration)และการเชื่อมตอของสัญญาณที่ขาของเกต (Interconnection signal declaration)การกําหนดการใชงานเกตนั้นจะตองกําหนดชื่อ (Primitive name) และรายการของสัญญาณที่ขาตาง ๆ(Signal list) อีกอยางคืออุปกรณพื้นฐานแตละตัวสามารถมีขอมูลเพิ่มเติมตาง ๆ ขึ้นมา เชน เกตดีเลย(Propagation delay) ความแรงของการขับ (Drive strength) จํานวนของอุปกรณที่ตอเรียงกันแบบอารเรยเปนตนตัวอยางของการสรางวงจร 1-bit full adder จากเกตพื้นฐานตาง ๆ แสดงไดในรูป x.6 โดยที่คาดีเลย ของแตละตัวสามารถกําหนดไดเปนตัวเลขหลังเครื่องหมาย # และในวงจรประกอบดวย XOR 2 ตัว ⎯ ที่มีชื่อ(Instance name) เปน HalfSum และ FullSum ⎯ AND 3 ตัว และ OR 1 ตัว เชื่อมตอกันดวย wire (internalnets) คือ AxorB, AandB, AandCin และ BandCin ตามจุดตาง ๆ ในวงจร164


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 9.6 แสดงการออกแบบโดยใชอุปกรณพื้นฐานเพื่อสราง 1-bit full adderการวางลําดับของตัวอุปกรณ (The Order of Instances)ในวงจรที่ใชงานจริงนั้น เราจะเห็นไดวาเกตแตละตัวสามารถทํางานไดพรอม ๆ กัน นั่นคือถามีการเปลี่ยนแปลงที่สัญญาณอินพุทเมื่อไหร คาของเกตตัวนั้น ๆ ก็จะมีการปรับปรุงตามอินพุทที่เขามาในขณะนั้นโดยไมจําเปนตองรอในการเขียนอธิบายวงจรเปนภาษา แนนอนวาจําเปนตองเขียนเปนบรรทัดเรียงลําดับจากบนลงลาง โดยที่เราไมสามารถเขียนไดพรอม ๆ กัน ดังนั้นสิ่งที่จะทําไดคือการกําหนดใหคอมไพลเลอร หรือตัวจําลองการทํางาน สามารถมองใหเปนลักษณะของการทํางานแบบขนาน ซึ่งเหมือนกันการทํางานจริง โดยไมจําเปนวาอุปกรณตัวไหนจะอยูในบรรทัดกอน หรือหลัง ดังนั้นถึงแมวาเราจะสลับตําแหนงกัน แตการทํางานก็ยังจะเหมือนเดิมดังตัวอยางในรูป x.7165


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูป x.7 แสดงการสลับบรรทัดในการเขียนอธิบายวงจรแบบโครงสรางโดยใชเกตพื้นฐานตาง ๆอุปกรณพื้นฐานที่กําหนดโดยผูออกแบบ (User-defined Primitives: UDP)ถึงแมวาเราจะมีเกตพื้นฐานที่ถูกกําหนดไวแลว และสามารถใชงานไดทันที (Predefined primitives) แตอาจไมเพียงพอกับการออกแบบที่ตองการอุปกรณหลาย ๆ ประเภท นอกเหนือจาก 14 ลอจิกเกตพื้นฐาน ดังนั้นภาษา Verilog จึงอนุญาตใหผูออกแบบสามารถกําหนดอุปกรณพื้นฐานของตัวเองได (User-definedPrimitives: UDP) โดยสามารถกําหนดฟงกชันการทํางานไดตามที่ตองการ สามารถทําไดทั้งCombinational logic หรือ Sequential logicUDP กับ Module สามารถเรียกใชไดเหมือนกัน ทั้งลักษณะของโครงสรางวิธีการเขียน และการเรียกใชงานแต UDP สามารถมีไดแคหนึ่งเอาทพุทเทานั้น ไมสามารถมีอินพุท หรือเอาทพุทเปนแบบเวกเตอรได และตองกําหนดการใชงานเปนตารางคาความจริง โดยมีรูปแบบที่แตกตางกันระหวางตารางคาความจริงของอุปกรณประเภท Combinational และ Sequential ดังตัวอยางของการสราง MUX2to1 และ T-Flip-flop ที่จะแสดงใหดูตอไป166


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>UDP Structureสําหรับโครงสรางจะประกอบดวย primitive UDP_name ซึ่งเปนสวนที่กําหนดชื่อของ Primitive ตามดวย (port list) ซึ่งจะเหมือนกับการกําหนดการใชงานในโมดูล แตพอรตแรกจําเปนตองเปนเอาทพุทพอรตและพอรตตอ ๆ ไปเปนอินพุท โดยที่แตละพอรตไมสามารถมีสัญญาณไดมากกวา หนึ่ง หรือไมสามารถเปนเวกเตอรได ตอมาคือ port declaration ซึ่งกําหนดทิศทางของพอรตวาเปนเขา หรือออกเทานั้น ไมมีbidirectional port เหมือนกับโมดูล และเราสามารถกําหนดคาเริ่มตนของสัญญาณไดที่สวนของ UDPinitialization มีเฉพาะวงจร Sequential logic โดยเริ่มตนดวยคําสงวนคือ initial แลวใชเครื่องหมายเทากับทําการกําหนดสัญญาณเริ่มตนที่เอาทพุท สวนของ truth- or state table เปนการกําหนดลักษณะการทํางานของตัว Primitive นั้น ๆ เริ่มตนดวยคําสงวน table และจบดวย endtable ซึ่งแสดงคาที่อาจเปนไปไดทั้งหมดของอินพุท และคาที่เอาทพุทที่จะเกิดขึ้น โดยลําดับของอินพุทจะเรียงตามที่กําหนดใน (port list)สวนทายสุดเปนการจบดวยคําวา endprimitiveรูปที่ 9.8 แสดงโครงสรางสําหรับการกําหนด UDPUDP: Mux2to1รูปที่ 9.9 เปนการสราง Multiplexer ที่มี 2 inputs ไดแก In0 และ In1 สวน output คือ Out โดยมีตัวเลือกคือ Sel สวนการกําหนดการทํางานจะอยูในตารางคาความจริงโดยที่สัญลักษณ ‘?’ หมายถึงเปนคาอะไรก็ไดอาจเปน ‘0’, ‘1’, ‘x’, หรือ ‘z’ สังเกตุวาจะไมมีการกําหนดคาเริ่มตน (Initial values) เนื่องจากเปนCombinational logic167


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 9.9 แสดงการสราง UDP ที่เปน Multiplexer 2-to-1UDP: TFFตัวอยางการสราง Primitive ที่เปน Sequential logic นี้จะเห็นไดวามีการกําหนดคาเริ่มตนของเอาทพุท Q =0; ในตารางที่เปน state table จะประกอบดวยสามคอลัมนดวยกันคือ Input, Present state และ Next stateที่เอาทพุท คาของเหตุการณที่เกิดขึ้นขอบขาขึ้น (Rising edge) หรือขอบขาลง (Falling edge) สามารถเขียนไดสั้น ๆ คือ ‘r’ และ ‘f’ ตามลําดับ สวน ‘-‘ หมายถึงการไมมีการเปลี่ยนแปลงของคาแตอยางใด168


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 9.10 แสดงการสราง UDP ที่เปน T-FFการใชงาน UDPs (Using UDPs)การใชงาน UDPs สามารถใชไดเหมือนกับ Predefined primitive หรืออุปกรณพื้นฐานที่กําหนดไวแลวในไลบรารี สิ่งที่ตองกระทําเพิ่มขึ้นมาคือ ตองสรางตัวอุปกรณนั้นกอน แลวทําการประกาศ (Declare) กอนใชงานเนื่องจาก UDP อยูในระดับเดียวกันกับโมดูล เราจึงไมสามารถสราง UDP ไดในตัวโมดูล ดังนั้นเราจะตองเขียนแยกไวกอน หรือหลังตัวโมดูลที่ตองการเรียก UDP มาใชงานโดยสามารถอยูในไฟลเดียวกันได หรือเแยกเขียนเปนไฟลสําหรับ UDP ตางหาก แลวใชคําสั่ง 'include สําหรับการนําไฟลนั้นมาใชงานUDP เปนการกําหนดการใชงานของอุปกรณพื้นฐานเทานั้น ซึ่งยังมีขอจํากัดตาง ๆ มากมาย เชนเราไมสามารถสรางตัวอุปกรณที่มีหลายเอาทพุท หรือที่มีอินพุท เอาทพุทเปนแบบเวกเตอรได ซึ่งเปนขอจํากัดที่สําคัญ แตขอจํากัดตาง ๆ เหลานี้สามารถหลีกเลี่ยงไดโดยการกําหนดเปนโมดูลยอยแทน169


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 9.11 แสดงตัวอยางการเรียกใชงาน UDP ที่เปน JKMSโมดูลใน Verilog (Module in Verilog)การเรียกใชงานโมดูล (Module Instantiation)การออกแบบแบบลําดับชั้น (Hierarchical <strong>design</strong>) ไมจําเปนตองใชแคอุปกรณพื้นฐานทั่วไป (Primitives)เทานั้น เรายังสามารถเรียกใชโมดูลที่เราออกแบบไวแลวมาประกอบกันเปนวงจร หรือระบบขนาดใหญที่ซับซอน วิธีการนี้ทําใหเราสามารถตรวจสอบ คนหา และทําความเขาใจไดงาย มากกวาการออกแบบโดยใหทุกอยางอยูในระดับเดียวกัน หรืออยูในโมดูล ๆ เดียว (Flattened <strong>design</strong>)การเรียกใชงานโมดูลใน Verilog มีวิธีการเหมือนกับการเรียกใชอุปกรณพื้นฐานตาง ๆ โดยที่ไมจําเปนตองใชการเรียนรูเพิ่มเติม นอกจากนี้การใชโมดูลยอย ในการออกแบบ จะมีความยืดหยุนในการออกแบบมากกวาอุปกรณพื้นฐาน เนื่องจากสามารถมีหลายอินพุท หลายเอาทพุท เปนตน อีกอยางคือ โมดูลสามารถเรียกใชอุปกรณพื้นฐานได แตในทางกลับกันอุปกรณพื้นฐานไมสามารถเรียกใชโมดูลได ดังนั้นการออกแบบโดยใชโมดูล ที่ประกอบดัวยโมดูลยอย จึงสามารถทําการออกแบบเปนลําดับชั้นไดโดยงาย และสะดวกกวาขอจํากัดที่สําคัญอยางหนึ่งในการใชงานโมดูลคือ เราไมสามารถออกแบบโมดูลภายในโมดูลใด ๆ ได ดังนั้นเราจะตองเขียนแยกไวกอน หรือหลังตัวโมดูลที่จะเรียกมาใชงาน โดยสามารถอยูในไฟลเดียวกันได หรือ170


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>เแยกเขียนเปนไฟลสําหรับโมดูลตางหาก แลวใชคําสั่ง 'include สําหรับการนําโมดูลนั้นมาใชงาน ดังเชนตัวอยางในรูป x.12 เปนการเรียกใชโมดูล Square ในโมดูล MyDesign โดยที่โมดูล Square นั้นถูกเขียนแยกไวขางลางรูปที่ 9.12 แสดงการเรียกใชงานโมดูลยอย Square ใน MyDesignหลักการตอเชื่อมพอรต (Port Connection Rules)สวนนี้จะอธิบายการเชื่อตอพอรตระหวางโมดูล กับสิ่งตาง ๆ รอบตัว แตละพอรตประกอบดวยสวนที่ตอเชื่อมภายในโมดูล (Internal part) และสวนที่อยูภายนอก (External part) โดยที่ชนิดของสัญญาณสวนภายใน และภายนอกโมดูลที่สามารถเปนไดทั้ง net และ reg มีขอกําหนดแสดงในตาราง x.13 ดังนี้Internal partExternal partInput net net, regOutput net, reg netInout net netตารางที่ x.13 แสดงการใชงาน net และ reg สําหรับการเชื่อมตอระหวางโมดูล171


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Internal partExternal partรูปที่ 9.14 ตัวอยางแสดงการเชื่อมตอสัญญาณดวย net และ regจากตัวอยางในรูป Internal part ที่อยูในโมดูล MyMod ก็คือ {P1, P2, P3, P4, P5} สวน External part คือ{S1, S2, S3, S4, S5} และสังเกตไดวา สัญญาณประเภท reg แทนดวยสี่เหลี่ยม สวนสัญญาณประเภท netจะแทนดวยวงกลมการเชื่อมตอพอรตโดยลําดับ (Connecting Ports by Ordered Port List)รูปที่ 9.15 แสดงการเชื่อมตอพอรตโดยลําดับ172


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การเชื่อมตอสัญญาณไปยังพอรตในโมดูลสามารถทําไดโดยใชภาษาทําการแมป (Map) ตามตําแหนงของขาที่กําหนดไวในโมดูล ดังตัวอยางในรูป x.15 ซึ่งจะเห็นวาเราเรียกใชโมดูล Hexagon มาใชงานในโมดูลMySyst และกําหนดใหมีการเชื่อมตอสัญญาณ A, B, C เขาไปที่พอรตตาง ๆ ของโมดูล Hexagon ที่ชื่อวาMyMod เนื่องจากโมดูล Hexagon กําหนดพอรตเรียงลําดับดังนี้คือ (Out1, In1, In2) ดังนั้นตอนที่นํามาใชงานใน MySyst ในบรรทัด Hexagon MyMod (A, B, C); นั่นหมายถึงวาตามตําแหนงแลว A จะตอเชื่อมกับOut1, B จะตอเชื่อมกับ In1, และ C จะตอเชื่อมกับ In2 ตามลําดับของพอรตในโมดูลนั้น ๆการเชื่อมตอพอรตโดยชื่อ (Connecting Ports by Name)สําหรับการเชื่อมตอดวยวิธีการนี้ เราสามารถสลับที่ของพอรตในโมดูลที่ถูกเรียกมาใชงานได แตเราจะตองกํากับชื่อของพอรตไปดวย ตัวอยางเชน Hexagon MyMod (.In1(B), .In2(C), .Out1(A)); โดยมีการเชื่อมตอของสัญญาณเหมือนกันกับตัวอยางในรูปขางบน เพียงแตวาเราสามารถสลับตําแหนงของพอรตโดยมีชื่อพอรตกํากับไวไดการกําหนดพอรตที่ไมมีการเชื่อมตอ (Unconnected Ports)นอกจากการกําหนดพอรตโดยอางอิงถึง Port list และอางอิงถึงชื่อแลว ภาษา Verilog มีการกําหนดพอรตที่ไมไดใชงาน โดยสามารถทําไดตามลักษณะการการกําหนดการเชื่อมตอพอรตดังนี้• เมื่อมีการเชื่อมตอโดยใชชื่อพอรต เราสามารถตัดพอรตที่ไมไดใชงานออกไดทันที ดังนั้นก็จะเหลือเพียงแคพอรตที่ใชงานแสดงไวเทานั้น ดังตัวอยางในรูป x.16• เมื่อมีการเชื่อมตอโดยอางถึงลําดับ Port list เนื่องจากเราตองรักษาตําแหนงลําดับของพอรตในโมดูล ดังนั้นเมื่อไมมีการใชงานของพอรตใด พอรตหนึ่ง เราจะตองเวนที่วางไวโดยใส Blankspace แทนชื่อของสัญญาณ เชน GoldBox (A, B, C, , E);173


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 9.16 การเวนชื่อพอรตที่ไมไดใชงาน174


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>175


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Chapter10บทที่ 10. การอธิบายพฤติกรรมวงจร(Verilog Behavioral Design)การอธิบายการทํางานของระบบดวยสมการบูลีน หรือDataflow style มีขอจํากัดตาง ๆ มากมาย เนื่องจากเปนการอธิบายการทํางานในระดับต่ํา สําหรับภาษา Verilog สามารถใชในการอธิบายการทํางานได ในระดับที่สูงขึ้นในการกําหนดการทํางานของระบบ โดยมีการอธิบายเปนพฤติกรรมของวงจร (Behavioral description) ทําใหงายขึ้น และสะดวกรวดเร็วในการออกแบบระบบ โดยที่หนาที่ของการสรางวงจรในระดับต่ํา ๆ เชน RTL หรือGate level ก็จะเปนหนาที่ของตัวสังเคราะหวงจรแทนจากที่ผานมา ในการเขียนในลักษณะของ Dataflow สามารถทําไดโดยใชคําสั่ง assign ซึ่งเปนการสงผานคาที่ไดจาก Expression ทางดานขวามือของเครื่องหมาย = มายังสัญญาณประเภท Nets เทานั้น ในทางกลับกัน สําหรับการเขียนในลักษณะของ Behavioral style จะมีการใชงานกับสัญญาณประเภท Registers ซึ่งมีหลาย ๆ ประเภทที่จะกลาวถึงตอไปในบทนี้การเขียนอธิบายการทํางานในลักษณะของ Behavioral style จะมีวิธีการเขียนที่คลายกับภาษาซี เปนอยางมากเชนมีการใชคําสั่ง if-then-else, case statement เปนตน ซึ่งในบทนี้เราจะไดเรียน ลักษณะของไวยากรณในการใชงานสําหรับการอธิบายการทํางานของฮารดแวรดวยภาษา Verilogตัวแปร และพารามิเตอร (Variables and Parameters)จากที่ทราบมาแลววา กรณีที่มีสัญญาณที่มีคา ๆ หนึ่งที่ตัวสง (หรือที่เราเรียกวา Source หรือ Driver) แลวตองการสงผานคานี้ไปยังอีกที่ ๆ หนึ่ง เราสามารถกําหนดใหเปนการทํางานในลักษณะของ Dataflow ไดโดยใช Nets ซึ่งถาสัญญาณที่ Driver ถูกตัดขาดแลว สถานะที่ Nets ที่ใชในการับคาจะเปน Highimpedance แตสําหรับ Registers แลวถึงแมวาสัญญาณที่ Driver จะถูกตัดออกไป แตมันก็ยังสามารถคงสถานะของคาสุดทายที่ไดรับอยูได176


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>คุณสมบัติในการคงคาไดของ Registers จําเปนตองใชในการอธิบายวงจรในแบบของ Behavioral style ที่สวนใหญเปนการเขียนอัลกอริทึมในการอธิบายพฤติกรรมการทํางาน และจําเปนตองมีการใชงานของตัวแปร (Variables) ตาง ๆ อยูภายใน คุณสมบัติของตัวแปรโดยทั่วไปคือ สามารถคงคาไดตราบเทาที่ไมมีการเปลี่ยนแปลงคาใหมเกิดขึ้น ดังนั้น Registers ในภาษา Verilog จึงเปรียบเสมือนตัวแปรที่ใชในการอธิบายวงจรลักษณะนี้ แทนที่จะเปน Netsรีจีสเตอร (Rergisters)ความหมายโดยทั่วไปของ Registers ในภาษา Verilog ก็คือเปนตัวที่ใชในการเก็บคาตาง ๆ ซึ่งเปรียบไดกับVeriables ในภาษาชั้นสูงทั่วไป เชน C หรือ Pascalวิธีการกําหนดการใชงานของ Registers จะใชคําสั่ง reg นําหนาชื่อของสัญญาณที่จะกําหนด สําหรับการใชงานปกติที่ใชเก็บคาตาง ๆ ของสัญญานลอจิก นอกจากนี้เรายังสามารถกําหนดการใชงานของตัวแปรรีจิสเตอรประเภทอื่น ๆ สําหรับการใชงานในภาษา Verilog เพื่อใหมีความสะดวกมากยิ่งขึ้น คือ integer,time, real, realtime ดังรายละเอียดตอไปนี้• reg: ใชในการเก็บคาลอจิก คลายกับ Filp-flop ในฮารดแวร แตไมจําเปนตองมีสัญญาณนาฬิกามาใชในการเก็บคา คาเริ่มตนของ register จะเปน ‘x’ (ไมเหมือนกับ Nets ที่เปน ‘z’) เชนo reg A;o reg [3:0] B, C;• time: เปนรีจิสเตอรประเภทพิเศษ ที่ใชสําหรับการจําลองการทํางาน (Simulation) การแกไข(Debugging) รวมทั้งการรายงาน (Reporting) เปนตัวแปรที่มีความกวาง 64 บิต เชนo time sim_time;o time setup_time;• integer: เปนรีจิสเตอรที่ใชในทางคณิตศาสตร สําหรับการเก็บคาจํานวนเต็ม สามารถเปนไปไดทั้งจํานวนบวก และลบ โดยตัวแปรรีจีสเตอรนี้มีขนาดเทากับ 32 บิต ตางกับ regคือถามีคาลบ และใชงานใน Expression คาของมันก็ยังเปนลบอยู (ตางกับ reg จะมีคาเปนบวกเสมอ) เชน177


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>o integer loop_count;o integer counter;• real, realtime: เปนรีจิสเตอรที่ใชในทางคณิตศาสตร สําหรับการเก็บคาจํานวนจริงที่มีจุดทศนิยม เขียนไดทั้งเปนเลขยกกําลังในแบบของ Scientific form หรือจุดทศนิยมธรรมดา โดยที่realtime จะใชในการแทนคาทางเวลา แตทั้งสองประเภทนี้สามารถใชแทนกันได เชนo real exact, average;o realtime exact_simtime;เวกเตอร และอารเรย (Vectors and Arrays)เราสามารถกําหนด reg เปนตัวแปรประเภทเวกเตอร (Vector) ได โดยกําหนดชวงบิตที่จะใชงาน (Indexing)อยูในเครื่องหมาย [ MSB: LSB] ที่อยูระหวางคําวา reg และ Instance name เชนreg [7:0] Data; //เปนเวกเตอรชื่อ Data ที่มีขนาดความกวาง 8 บิตอีกประเภทหนึ่งของรีจิสเตอรที่สามารถทําได คือตัวแปรแบบอารเรย (Array) ⎯ ที่ไมมีอยูในสัญญาณประเภท Nets ⎯ ความแตกตางที่ชัดเจนระหวางเวกเตอร และอารเรยคือ มิติ โดยที่เวกเตอรมีเพียงมิติเดียวนั้นคือความกวาง (Width) แตอารเรยมีสองมิติคือทั้งความกวาง (Width) และความลึก (Depth) หรืออาจมองอีกนัยหนึ่งคือ อารเรยเปนการนําเอาเวกเตอรมาเรียงซอน ๆ กันสําหรับวิธีการกําหนดอารเรย จะมีการกําหนดชวงความกวางอยูหลังจากคําวา reg และความลึกหลังจากInstance name เชนreg Data[7:0];//เปนการกําหนดอารเรยชื่อ Data ที่มีความกวาง 1 บิต และความลึก 8 ตําแหนงreg [7:0] MyMem [3:0];//เปนอารเรยชื่อ MyMem มีความกวาง 8 บิตและความลึก 4 ตําแหนง178


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ความแตกตางระหวางเวกเตอร และอารเรยอีกอยางคือ เวกเตอรสามารถเปนรีจีสเตอรประเภท reg เทานั้นแตอารเรยสามารถประกอบดวยรีจิสเตอรประเภทตาง ๆ เชน reg, integer หรือ time แตไมใช real หรือrealtimeสําหรับการอางอิงถึงในแตละตําแหนงของอารเรยนั้นสามารถกําหนดไดโดยตรง เชน MyMem[2]; เปนการอางอิงถึงตําแหนงที่สองของอารเรย MyMem (ดูรูป x.1) แตกรณีที่เราตองการอางอิงลึกลงถึงระดับบิต เราไมสามารถทําไดโดยตรง เราจําเปนจะตองมีตัวแปรเวกเตอรชั่วคราว (TempReg) มารับคาของอารเรยในตําแหนงที่ตองการกอน แลวจึงอางอิงถึงบิตที่ตองการในเวกเตอรชั่วคราวคาคงที่ในภาษา Verilog (Constants in Verilog)รูปที่ 10.1 ตัวอยางการอางอิงบิตของตัวแปรแบบอารเรยเหตุผลของการกําหนดตัวเลข ๆ หนึ่ง ใหเปนคาคงที่ที่มีชื่อ ๆ หนึ่งเพื่อใหงายในการทําความเขาใจ และสามารถเรียกใชงานไดหลาย ๆ ครั้ง นอกจากนี้ยังงายในการแกไขคา โดยที่เราสามารถเปลี่ยนแปลงคาไดจากที่เดียว แลวสวนอื่นของโปรแกรมที่ใชคาคงที่นั้น ๆ ก็จะเปลี่ยนแปลงตาม โดยที่เราไมตองเสียเวลาไปไลเปลี่ยนทีละบรรทัด ซึ่งงายในการผิดพลาด และชาคาคงที่จะไมสามารถเปลี่ยนแปลงคา หรือกําหนดคาใหใหมไดในโมดูล ดังนั้นเราจึงไมสามารถใชคาคงที่ในลักษณะของตัวแปรได ทําใหคาคงที่ในภาษา Verilog จึงไมถูกจัดอยูในประเภทของทั้ง Nets และ Registersแตมันถูกเรียกชื่อใหมวา parameter179


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 10.2 ตัวอยางการใชงาน parameterตัวอยางในรูป x.2 เราให BusSize เปนพารามิเตอร ที่ใชกําหนดขนาดของบัส DataBus นอกจากนี้มันยังใชเปนเงื่อนไขในการทําคําสั่ง for loop ในตัวโปรแกรมอีกดวย สมมุติวาเราตองการเปลี่ยนขนาดของบัส และเงื่อนไขจากตัวพารามิเตอร BusSize จาก 8 เปน 16 เราสามารถทําไดที่บรรทัด parameter BusSize = 16; ที่เดียวการกําหนด และการใชงานพารามิเตอร (The Declaration and Use of Parameters)การกําหนดพารามิเตอรสําหรับใชงานในโปรแกรมสามารถทําไดดังนี้• เริ่มตนดวยคําสั่ง parameter• ชื่อของพารามิเตอร• คาของพารามิเตอรที่กําหนดไวหลังจากเครื่องหมาย ‘=’• เครื่องหมาย ; (Semi colon) สําหรับการจบคําสั่งเราสามารถกําหนดคาคงที่ไดมากกวาหนึ่ง ในการกําหนดครั้งเดียว โดยใชเครื่องหมาย , (Comma) แยกชุดของคาคงที่แตละตัว (ชื่อพารามิเตอร พรอมคาที่กําหนด)สําหรับวิธีการใชงานพารามิเตอร สามารถใชไดในลักษณะตาง ๆ เชน• การกําหนดขนาดของเวกเตอร อารเรย เชน บัส หนวยความจํา180


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• การกําหนดคาของดีเลย หรือขอมูลเวลา เชน• การกําหนดจํานวนรอบในการวนคําสั่ง for-loop ดังตัวอยางการอธิบายพฤติกรรมเบื้องตน (Behavioral Basics)ในการอธิบายพฤติกรรมการทํางานของวงจร จําเปนจะตองกระทําเปนสวน ๆ ที่เราเรียกวา Block โดยมีคําสั่งตาง ๆ ที่เปน Procedure statements สําหรับการกําหนดการทํางานในแตละสวน ในโมดูลหนึ่ง อาจมีไดหลาย ๆ Blocks ซึ่งแตละ Block ทํางานเปนอิสระตอกันแบบขนาน (Concurrency) เหมือนกับ Continuousassignments ในบทที่ผานมา เมื่อสัญญาณใดสัญญาณหนึ่งใน Block มีการเปลี่ยนแปลง Block นั้นก็จะมีการทํางาน หรือถูกประมวลผล โดยคําสั่งภายในจะถูกแปลตามความหมาย แบบเรียงลําดับ (Sequential) ตามลักษณะของคําสั่ง181


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ชนิดของ Blocks สามารถแบงออกไดเปนสองลักษณะคือ• Initial blocks• Always blocksเมื่อ Block ใด ๆ มีคําสั่งหลาย ๆ คําสั่ง เราสามารถรวมเปนกลุมของชุดคําสั่งได ดวยคําวา begin แลวจบดวยend สําหรับการทํางานแบบเรียงลําดับ (Sequential statement execution) หรือคําวา fork และ jointสําหรับการทํางานแบบขนาน (Concurrent statement execution)รูปที่ 10.3 เปรียบเทียบการเขียนดวย Dataflow และ Behavioral styleตัวอยางดานซายมือ ในรูป x.3 จะเปนการเขียนดวย Continuous assignment สําหรับการอธิบายดวยDataflow style และดานขวามือจะเปนการอธิบายดวย Behavioral style โดยใชคําสั่ง initial และ alwaysซึ่งในแตละ Block จะทํางานพรอม ๆ กัน รวมทั้งพรอมกับ Continuous assignment (assign …;) ในบรรทัดสุดทายดวยBehavioral Blocksทั้งสองชนิดของ Behavioral blocks มีลักษณะการทํางานเหมือนกัน ยกเวน initial block จะถูกคอมไพลที่ตอนเริ่มตนของการจําลองการทํางาน (time 0) และกระทําเพียงครั้งเดียวเทานั้น สวน always block มีการเริ่มการทํางานที่เวลาเทากับ 0 เหมือนกัน แตจะวนรอบไปเรื่อย ๆ ไมมีสิ้นสุด (Infinite loop) ตราบเทาที่กระบวนการจําลองทํางานยังมีอยู โดยที่ทุก Blocks ในโมดูลจะทํางานพรอม ๆ กันจากเวลาเริ่มตน182


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 10.4 ลักษณะการทํางาน และการเขียนในแตละ Behavioral blockสําหรับคาโดยปริยาย (Default) ของรีจิสเตอร จะมีคาเปน High impedance (‘z’) ซึ่งในการจําลองการทํางานใหถูกตองจําเปนตองเซตคาเริ่มตนใหกอน อาจจะเปน ‘0’ หรือคาที่เหมาะสม โดยใชคําสั่ง initialนั่นเอง สวนหนาที่ของคําสั่ง always เปนการเริ่มตนการอธิบายพฤติกรรมการทํางานของวงจรในโมดูลถึงแมวาในแตละ Blocks จะทํางานพรอม ๆ กัน แตในการเขียนเปนโปรแกรม เราจําเปนตองเขียนเรียงกันลงมาทีละบรรทัด เนื่องจากเราไมสามารถเขียนทุก Blocks ไดพรอม ๆ กัน ดังรูปที่ 10.4การกําหนดคาตัวแปร (Variable Assignment)สิ่งสําคัญทีสุดในการกระทําในการอธิบายพฤติกรรมการทํางาน คือการสงผานคาจาก Expression ไปยังตัวแปร การสงผานคานี้เราเรียกวา Procedural assignment ซึ่งแตกตางจาก Continuous assignmentดังตอไปนี้• ตัวแปรทางดานซายมือของการสงผานคา (The target of assignment) จะตองเปน Registers(reg, integer, real, time), บิต หรือสวนหนึ่งของรีจิสเตอรเวกเตอร โดยที่ไมสามารถเปนNets ได183


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• ไมมีคําวา assign ในการสงผานคา• ตองกําหนดภายใน Behavioral block (initial or always)• ตองเปนสัญญาณชนิดเดียวกัน• การสงผานคาแบบ Continuous assignment จะมีการเปลี่ยนแปลงคาใหมเมื่อมีการเปลี่ยนแปลงคาของสัญญาณใดสัญญาณหนึ่งใน Expression ทางดานขวามือ แตสําหรับProcedural assignment ใน always จะมีการประมวลผลคาใหมเมื่อมีการเปลี่ยนแปลงคาของสัญญาณใดสัญญาณหนึ่งใน Sensitivity list ที่อยูขางหลัง alwaysรูปที่ 10.5 ตัวอยางการสงผานคาตัวแปรใน Initial blockการใชงานที่ซับซอนมากขึ้น (Complex Statements)การใชงานในลักษณะของการสงผานคา (Assignments) มักไมเพียงพอสําหรับการใชงานในการอธิบายพฤติกรรมการทํางานของระบบ เราอาจตองใชเงื่อนไขของการกระทํา (Conditional statements), เงื่อนไขที่มีหลาย ๆ ทางเลือก (Multi-branch choices), หรือ การวนรอบ (Loops) ที่คลาย ๆ กับที่มีอยูในภาษาซีConditional Operationsการกระทําบางอยางจะเกิดขึ้น เมื่อมีเงื่อนไขที่ถูกตองเกิดขึ้นกอน การกระทําลักษณะนี้ เราเรียกวาConditional operations ซึ่งในภาษา Verilog มีไวยากรณดังนี้คือ184


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การทํางานสามารถอธิบายไดดังนี้คือ เมื่อ expression_true มีคาเปนจริง true_statement จะมีการทํางาน แตถาเปนเท็จ false_statement จะมีการทํางานแทนแตถาคาจาก expression_true เปน ‘x’ หรือ ‘z’ จะมีการทํางานโดย false_statement โดยปริยายถา true(false)_statement ประกอบดวย Statements มากกวาหนึ่ง จะตองกําหนดจุดเริ่มตนของกลุมStatements นั้น ดวยคําสั่ง begin และจบทายดวย end แตถามีแคหนึ่ง Statement เราอาจไมจําเปนตองใชก็ไดรูปที่ 10.6 ตัวอยางเปนการสรางชิฟรีจิสเตอร โดยใชคําสั่ง เงื่อนไข แบบซอนกันหลาย ๆ ชั้นรูป x.6 เปนการสรางชิฟรีจิสเตอร โดยใชคําสั่ง เงื่อนไข แบบซอนกันหลาย ๆ ชั้น เนื่องจากมีหลาย ๆ เงื่อนไขคือ Clr, Set, Shr, Shl สําหรับการเคลียรคาเอาทพุท การเซตคาเอาทพุท การชิฟไปดานขวา และการชิฟไปดานซาย ตามลําดับ185


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การมีตัวเลือกหลายกรณี (Multiple Choice)การสรางเงื่อนไขแบบซอน ๆ กันหลาย ๆ กรณีโดยใชคําสั่ง if-else-if มีขอเสียคือซับซอน และยากในการทําความเขาใจ อีกทางเลือกหนึ่งสําหรับการเขียนอธิบายพฤติกรรมของวงจร ที่มีการกระทําแบบมีหลาย ๆเงื่อนไข คือการใชคําสั่ง caseสัญญาณที่เปนเงื่อนไขในแตละเงื่อนไข จะอยูภายในวงเล็บ ตามหลังคําสั่ง case โดยบรรทัดตอมาจะเปนคาในแตละกรณีที่เปนไปได ตามดวยการกระทํา (Statements) ถาเงื่อนไขในกรณีนั้นถูกตอง ดังตัวอยางรูป x.7รูปที่ 10.7 ตัวอยางการสรางชิฟรีจิสเตอร โดยการใชคําสั่ง caseจะเห็นไดวามีคําสั่ง default ที่เปนคาสําหรับการกระทํา (Outs = Ins) โดยปริยาย กรณีที่สัญญาณไมตรงกับเงื่อนไขใด ๆ ที่กําหนด ซึ่งเปนสิ่งที่ควรกระทําในการออกแบบวงจรนอกจากคําสั่ง case แลว เรายังมี casex และ casez โดยมีความแตกตางกันในแงของการแปลความหมายของบิตที่เปน ‘x’ และ ‘z’ ดังนี้• ในคําสั่ง case ความหมายของบิต ‘x’ หรือ ‘z’ ก็คือคาที่เปน Unknown และ High impedanceตามปกติ186


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>• สําหรับ casex จะมอง ‘x’ และ ‘z’ ในความหมายของ Don’t care ทั้งหมด• ในกรณีของ casez จะแปล ‘x’ เปน Unknown และ ‘z’ เปน Don’t careการวนรอบ (Loops)จุดประสงคของการใชคําสั่งในการวนรอบ เพื่อใหมีการทําซ้ํากันหลาย ๆ รอบตามจํานวนครั้งที่เราตองการซึ่งชวยใหเราเขียนโปรแกรมไดสั้นมากขึ้น และสามารถกําหนดจํานวนรอบของการทําซ้ําไดงายมากขึ้นดวยจํานวนรอบของการกระทํา กําหนดไดดวยเงื่อนไข (ในการหยุด) ในตัวคําสั่ง โดยที่การวนรอบจะเกิดขึ้นเรื่อยๆ จนกระทั่งเงื่อนไขนั้นเปนจริงภาษา Verilog มีคําสั่งที่ใชในการวนรอบดังนี้คือ forever, repeat, while และ for ซึ่งโครงสรางไวยากรณคลายกับภาษาซี โดยมีรายละเอียดการใชงานดังนี้• forever: เปนคําสั่งในการวนรอบแบบไมมีที่สิ้นสุด• repeat: เปนคําสั่งในการวนรอบวาตองการกี่ครั้ง โดยมีจํานวนครั้งกําหนดเปนคาคงที่เอาไว• while: เปนการวนรอบแบบมีเงื่อนไขสําหรับการเริ่มตนในการวน โดยไมมีจํานวนครั้งที่แนนอน และในแตละรอบจะมีการตรวจเงื่อนไขในการทํางานกอนทุกครั้ง• for: เปนคําสั่งที่นิยมใชกันมากที่สุด เนื่องจากมีความยืดหยุนสูง ในการใชงานจะมีการกําหนดเงื่อนไขเริ่มตน เงื่อนไขในการหยุด และการปรับปรุงคาตัวแปรที่ใชในการควบคุมการวนรอบ187


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 10.8 ตัวอยางการสรางตัวบวก โดยใชคําสั่ง for-loopในรูป x.8 เปนตัวอยางการใช for-loop ในการวนรอบเพื่อสรางตัวบวกที่มีจํานวนบิตเทากับการวนรอบ ซึ่งในที่นี้คือ 4-bit full adder สังเกตไดวาตัวแปร I จะเปนตัวควบคุมการวนรอบที่มีคาเริ่มตน เทากับ 0 และจะเพิ่มขึ้น 1 (I=I+1) เมื่อมีการวนรอบหนึ่งครั้ง จํานวนในการวนรอบ จํากัดอยูที่ I


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>posedge และ negedge เปนคําเริ่มตน (Prefix) ที่กําหนดเหตุการณในชวงขอบขาขึ้น หรือขอบขาลงของสัญญาณนั้น ๆ เชน จะทําการสงผานคา (Assignment) Q = D;ที่ขอบขาขึ้นของ CLK เปนตนคําสั่งรอ (Wait Statement)การควบคุมเหตุการณ (Event control) เปนการควบคุมการเปลี่ยนแปลงคาคาสัญญาณ หรือตัวแปร โดยอาจจะมีเงื่อนไข หรือชวงเวลามาเกี่ยวของคําสั่ง wait สามารถนํามาใชควบคุมการกระทําอยางมีเงื่อนไข เชนอาจใชสรางตัว 3-state buffer หรือตัวLevel-sensitive event control สําหรับการใชงานจะตองมีเงื่อนไขการรอ (Enable) อยูขางในวงเล็บหลังจากคําสั่ง wait แลวตามดวย Statementsเชน wait (EN) #5 C=A+B; สามารถแปลไดดังนี้คือ การกระทํา C = A+B; จะเกิดขึ้นภายหลัง 5หนวยเวลา หลังจากที่สัญญาณ EN เปน ‘1’แตถาใช wait; โดยไมมีเงื่อนไขใด ๆ ทั้งสิ้น จะเปนการใหรอโดยไมมีที่สิ้นสุด หรือเปนการหยุดการจําลองการทํางานนั่นเองSensitivity Listเมื่อไรก็ตามที่คําสั่งถูกกระทําโดยเหตุการณที่เกิดขึ้นในสัญญาณหนึ่ง เรากรณีนี้วาคําสั่งนั้นไว (Sensitive)ตอสัญญาณนั้น ๆ ซึ่งในภาษา Verilog เองไมจํากัดวาการไวตอสัญญาณจะเปนสัญญาณเดียว หรือหลาย ๆสัญญาณ ตามแตที่จะปรากฏในคําสั่ง หรือชุดคําสั่งนั้น ๆ และเราสามารถกําหนดรายชื่อของสัญญาณตาง ๆเหลานั้นได (โดยใช or เปนตัวกั้น) เรียกวา Sensitivity listการกํานด Sensitivity signals สวนมากจะใชในคําสั่ง always สําหรับการควบคุมการทํางานของชุดคําสั่งตาง ๆ ที่อยูระหวาง begin และ end ใน always block นั่นคือ ถาหากตัวใดตัวหนึ่งใน Sensitivity list เกิดการเปลี่ยนแปลง ตัว always block ก็จะมีการประมวลผล และปรับปรุงคาเกิดขึ้นตัวอยางเชน การสราง D-flipflop ทีมีขอบขาขึ้น (posedge) ของสัญญาณ CLK และ RST เปนตัวกําหนดการทํางาน ในคําสั่ง if-then-else สามารถเขียนไดดังนี้189


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 10.9 ตัวอยางการสราง DFFการสงผานคาแบบ Non-blocking (Non-blocking Assignment)การสงผานคาแบบ Non-blocking assignment เปนวิธีการกําหนดการสงผานคาในทุก ๆ บรรทัดที่เขียนเรียงกันนั้น เกิดขึ้นพรอม ๆ กัน การใชงานในลักษณะนี้จะใชเครื่องหมาย ‘


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ผลลัพธจากการใช Assignment ตางชนิดกัน บางครั้งจะเหมือนกันดังตัวอยางขางบน แตบางครั้งจะไมเหมือนกัน เชนตัวอยางตอไปนี้รูปที่ 10.10 เปรียบเทียบการใชงาน Blocking และ Non-blocking assignmentจากโปรแกรมในรูป x.10 จะเปนการสรางชิฟรีจิสเตอรใน always block โดยใชการสงผานคาในลักษณะของ Blocking และ Non-blocking assignment เปรียบเทียบกัน กรณีกําหนดโดยใช Blocking assignment‘=’ (ในโมดูลทางดานขวามือ) คาในแตละบรรทัดจะถูกปรบปรุงคาทันที นั่นคือ q1 = in; และหลังจากนั้นq2=q1; แตเนื่องจาก q1 ถูกปรับปรุงคาเปน in เรียบรอยแลวจากบรรทัดกอนหนานี้ ดังนั้น q2=q1=in;ทํานองเดียวกันในบรรทัดตอมา out = q2 = q1 = in; จะเห็นไดวาสัญญาณทุกตัวมีคาเทากันหมด ตัวสังเคราะหวงจรจึงแปลงเปนวงจรไดดังรูป x.11รูปที่ 10.11 ผลลัพธจากการสังเคราะหวงจรโดยใช Blocking assignment191


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>แตถาใช Non-blocking assignment ‘


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Chapter11บทที่ 11. ตัวอยางการออกแบบดวยภาษา <strong>HDL</strong> (Design Examples)ในบทนี้จะเปนการยกตัวอยางการใชงานในการออกแบบวงจรดิจิตอลดวยภาษา <strong>HDL</strong> โดยจะแบงตามประเภทของวงจรดิจิตอลไดเปน 2 ประเภทหลัก ๆ ดวยกันคือ วงจรเชิงผสม (Combinational circuit) และ วงจรเชิงลําดับ (Sequential circuit) ทั้งนี้การใชงานของทั้งภาษาV<strong>HDL</strong> และ ภาษา Verilog จะถูกเปรียบเทียบใหเห็นในตัวอยางวงจรที่ออกแบบ เชน ตัวประมวลผลทางคณิตศาสตรALU (Arithmetic Logic Unit), หนวยความจํา (Memory), ตัวควบคุมที่เปน FSM (FiniteState Machine) เปนตนวงจรเชิงผสม (Combinational logic)เปนลักษณะของวงจรที่คาของเอาทพุทขึ้นอยูกับสัญญาณอินพุทที่เขามา โดยไมมีลูปยอนกลับของสัญญาณหรือไมมีการนําสัญญาณเอาทพุทมาปอนกลับเปนอินพุทของวงจร ดังแสดงในรูปที่ 11.1inputsoutputsCombinational Circuitoutput = f (inputs)รูปที่ 11.1 ลักษณะของวงจรเชิงผสม (Combinational circuit)193


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตัวอยางที่เห็นไดชัดเจนที่สุดคือ เกตพื้นฐานตาง ๆ ทั้งหมด วงจรเขารหัส ถอดรหัส Multiplexer รวมทั้งวงจรบวก ลบ คูณหารปกติ ที่ไมมีเสนทางปอนกลับจากเอาทพุทมายังอินพุทการออกแบบหนวยคํานวณและตรรกะ (ALU)ตัวอยางที่จะนําเสนอตอไปนี้ เปนการสราง ALU (Arithmetic Logic Unit) ที่ใชงานเปนตัวคํานวนทางคณิตศาสตรและตรรกะ ที่มีอยูในตัวประมวลผล (Central Processing Unit) โดยสามารถทํางานไดหลาย ๆฟงกชัน ตามที่แสดงในตาราง 11.1 ซึ่งมีทั้งหมด 16 ฟงกชันที่กําหนดการใชงานไดดวยสัญญาณ s4, s3,s2, s1, s0ตารางที่ 11.1 รูปแบบการทํางานในฟงกชันตาง ๆ ของ ALU ที่จะออกแบบเราสามารถใชคําสั่ง case ในการทําฟงกชันตาง ๆ ในแตละกรณีของสัญญาณควบคุม s4..s0 โดยแยกเปนแตละกลุมของการใชงานดานตาง ๆ ที่เปนทางคณิตศาสตร ทางตรรกะ และเปนตัวเลื่อนบิต ทั้งนี้เพื่อใหการสังเคราะหวงจรเปนไปไดอยางมีประสิทธิภาพ แลวคอยนําเอาคาเอาทพุทในกลุมตาง ๆ มาเลือกใชงานผานMultiplexer เพื่อเปนเอาทพุทของระบบตอไป194


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>195


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 11.2 โครงสรางของระบบที่ไดจากการสังเคราะหวงจร ALUวงจรเชิงลําดับ (Sequential circuit)ลักษณะของวงจร Sequential circuit จะมีสวนของการนําเอาสัญญาณเอาทพุทมาใชงาน โดยการปอนกลับมาที่อินพุท ดังแสดงในรูปที่ 11.3 และตัวอยางที่เห็นไดชัดเจนที่สุด คือวงจร RS flipflop ในรูปถัดไปรูปที่ 11.3 ลักษณะของวงจรเชิงลําดับ (Sequential circuit)รูปที่ 11.4 วงจร RS flipflop196


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>สวนใหญของวงจรจะเปนหนวยความจํา ไมวาจะเปน Flipflop ชนิดตาง ๆ ที่สามารถนํามาใชงานเปนตัวเก็บขอมูล เปนตัวนับ ตัวรีจิสเตอรบัฟเฟอรทั้งแบบ FIFO หรือ FILO หรือประกอบรวมกันเปนหนวยความจําขนาดใหญการออกแบบตัวนับ (Counter)เปนตัวนับ (Counter) ที่สามารถควบคุมการทํางานใหนับขึ้นหรือลงไดทีละหนึ่ง มีสัญญาณรีเซต และสามารถโหลดคาการนับตอนเริ่มตนไดV<strong>HDL</strong>VerilogLibrary IEEE;Use IEEE.std_logic.1164.all,IEEE.Numeric_STD.allEntity up_down_counter isPort (clk, reset, load, count_up, counter_on: IN std_logic;Data_in : IN unsigned (2 downto 0);Count : OUT unsigned (2 downto 0));End entity up_down_counter;Architecture Bev of up_down_counter isSignal count : unsigned (2 downto 0);BeginProcess(reset, clk)BeginIf (reset’EVENT and reset = ‘1’) thenCount


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ตรวจสอบเงื่อนไขวาจะใหนับขึ้นหรือลงดวยสัญญาณ count_up ซึ่งพอรตตาง ๆ ของตัวนับที่ทําหนาที่ตางกันนี้แสดงไดในรูปที่ 11.5รูปที่ 11.5 สัญลักษณของตัวนับขึ้นลงวงจรเครื่องสถานะจํากัด (Finite state machine)เมื่อไหรก็ตามที่เราตองการออกแบบวงจรใหมีการทํางานแตกตางกัน เรียงลําดับตามเวลา ซึ่งอาจจะขึ้นอยูกับอินพุทในขณะนั้น หรือขอกําหนดของเวลา เราเรียกสถานะการทํางานที่แตกตางกันวาสเตท (State) ซึ่ง ณเวลาใดเวลาหนึ่งจะมีการทํางานเพียงสเตทเดียวเทานั้น โดยสเตทจะทํางานเปนอิสระตอกัน และใหคาเอาทพุทที่แตกตางกัน เราเรียกลักษณะของวงจรนี้วาวงจรแบบ FSM (Finite State Machine)สวนใหญการออกแบบวงจรนี้จะใชในงานคอนโทรล ที่อินพุทอาจมาจากตัวเซนเซอรตาง ๆ ที่อยูรอบ ๆ แลวมีการทํางานในสเตทหนึ่งที่มีคาสัญญาณเอาทพุทไปควบคุมการทํางานของตัวกระทํา (Actuators) ตาง ๆเชนมอเตอร หรืออื่นๆ หรือการตัดสินใจเปลี่ยนไปทํางานที่สถานะสเตทอื่น ตามเงื่อนไขอินพุทที่ไดวางไวตัวอยางการใชงานอื่น ๆ เชน ตัวตรวจจับรูปแบบขอมูลที่สงมา (Sequence detector) ตัวควบคุมไฟจราจร(Traffic light controller) เปนตนปกติเราสามารถแบงชนิดของ FSM ไดเปนสองลักษณะคือ Moore machine และแบบ Mealy machine โดยมีโครงสรางที่แตกตางกันดังรูปที่ 11.6 และ 11.7 ตามลําดับ198


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 11.6 ลักษณะของวงจร Moore machineรูปที่ 11.7 ลักษณะของวงจร Mealy machineโครงสรางของทั้ง Moore และ Mealy machine ประกอบดวยสามสวนหลัก ๆ ดวยกันคือ• สวนของวงจรเชิงผสม (Combinational Circuit) ที่อินพุท: คือวงจรอันแรกทางซายมือ ที่ทําหนาที่ในการตรวจสอบเงื่อนไขในการเปลี่ยนแปลงสถานะของสเตท โดยที่เงื่อนไขการเปลี่ยนจะขึ้นอยูกับ “อินพุท” (Inputs) ที่เขามา กับสถานะของ “สเตทปจจุบัน” (Current state)• สวนของวงจรหนวยความจํา (Memory): หลังจากที่มีการตรวจสอบเงื่อนไขการเปลี่ยนแปลงสถานะสเตทแลว สถานะใหม (Next state) จากสวนวงจรเชิงผสม ก็จะถูกสงมาเก็บพักคาไวที่รีจิสเตอรหรือหนวยความจํา โดยจะรอสัญญาณนาฬิกา เปนตัวกําหนดจังหวะของการเปลี่ยนหรือปรับปรุงคาของสถานะสเตทที่หนวยความจํา• สวนของวงจรเชิงผสม (Combinational Circuit) ที่เอาทพุท: เปนสวนที่จะกําหนดคาของเอาทพุทที่ไดมาจากสถานะของสเตทปจจุบัน (Current state) และอาจรวมทั้งจากสัญญาณอินพุทของระบบกรณีที่เปน Mealy machineจะเห็นไดวาในสวนของ Moore machine นั้นตางกับ Mealy machine ตรงที่ไมมีการนําเอาอินพุทมาเปนเงื่อนไขในการสรางเอาทพุท โดยที่เอาทพุทจะสรางมาจากสภาวะของสเตทปจจุบัน (Current state) เทานั้น199


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การออกแบบวงจร Sequence Detector แบบ Moore machine ดวยภาษา Verilogในตัวอยางนี้ เราจะใชภาษา Verilog ในการออกแบบ Moore machine ในการตรวจจับรูปแบบของขอมูลบิตที่สงมาแบบอนุกรม โดยวงจรจะสามารถตรวจจับและแสดงผล ถาขอมูลเปนแบบบิตศูนยสองตัวเรียงติดกันหรือขอมูลเปนบิตหนึ่งสองตัวเรียงติดกัน (Two successive 0s or 1s bits)ในขั้นตอนแรกกอนการเขียน Verilog ผูออกแบบควรวาด State diagram ของการทํางาน เพื่อใหสามารถตรวจสอบ และเขาใจการทํางานกอนลงมือเขียน ซึ่งแสดงไดดังรูปที่ 11.8รูปที่ 11.8 การทํางานของวงจร และ State diagramจาก State diagram จะเห็นวาเรามีอยูดวยกัน 5 สเตทดวยกันไดแก reset_state, read_1_one,read_1_zero, read_2_one และ read_2_zero แตละสเตทเชื่อมตอกันดวยลูกศร และคาบนลูกศรคือ “บิตอินพุทที่เขามา” แลวทําใหเกิดการเปลี่ยนสเตท ที่แตละสเตทเองจะมีเอาทพุทout_bit ที่กําหนดไวแลวขึ้นอยูกับคาสเตทนั้น ๆ (โดยไมขึ้นอยูกับคาอินพุท จึงเปน Moore machine)โดยเขียนคาเอาทพุทกํากับไวขาง ๆ200


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>สเตท reset_state เปนจุดเริ่มตนของการทํางานเมื่อมีสัญญาณรีเซตเขามา และหลังจากนั้นเมื่อเจอ‘1’ ตัวแรกก็จะไปที่ read_1_one แลวถาเจอตัวที่สอง ก็จะไปที่ read_2_one กรณีถาเจอ ‘0’ ตัวแรกก็จะไปที่ read_1_zero แลวถาเจอตัวที่สอง ก็จะไปที่ read_2_zero ตามลําดับ ซึ่งเอาทพุทที่สเตท read_2_one และ read_2_one ถูกกําหนดใหมีคาเปน out_bit = ‘1’ เพื่อเปนการแสดงวามีการพบรูปแบบของขอมูลที่กําหนดไว การทํางานนอกเหนือจากนี้ ก็จะเปนไปตาม State diagramที่กําหนดไวตอมาเปนการเขียนออกแบบวงจรดวยภาษา Verilog ซึ่งในการอธิบายการทํางานของวงจรนี้ที่เปน Mealymachine ก็จะประกอบดวยสวนตาง ๆ 3 สวนดวยกันตามที่เคยอธิบายไวแลวในรูปที่ 11.6module seq_detect (clock, reset, in_bit, out_bit);input clock, reset, in_bit;output out_bit;reg [2:0] state_reg, next_state;// State declarationparameter reset_state = 3'b000;parameter read_1_zero = 3'b001;parameter read_1_one = 3'b010;parameter read_2_zero = 3'b011;parameter read_2_one = 3'b100;// PART2: state register -----------------------always @ (posedge clock or posedge reset)if (reset == 1)state_reg


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>else if (in_bit == 1)next_state = read_1_one;else next_state = reset_state;read_1_one:if (in_bit == 0)next_state = read_1_zero;else if (in_bit == 1)next_state = read_2_one;else next_state = reset_state;read_2_one:if (in_bit == 0)next_state = read_1_zero;else if (in_bit == 1)next_state = read_2_one;else next_state = reset_state;default: next_state = reset_state;endcase//PART3: generate output -------------------assign out_bit = ((state_reg == read_2_zero) || (state_reg ==read_2_one)) ? 1 : 0;endmoduleการออกแบบวงจร Sequence Detector แบบ Mealy machine ดวยภาษา V<strong>HDL</strong>สําหรับตัวอยางนี้จะเปลี่ยนมาใช Mealy machine และเขียนออกแบบดวยภาษา V<strong>HDL</strong> โดยจะเปนการตรวจสอบรูปแบบของขอมูลอินพุทอนุกรม ที่มีคาเปน “10” เรียงกัน เราสามารถเขียนเปน State diagram ไดดังนี้รูปที่ 11.9 State diagramในการอานไดอะแกรม ตัวเลขที่อยูบนเสนลูกศรที่เชื่อมโยงในแตละสเตทจะมีสองตัวคั่นดวยเครื่องหมาย“/” ตัวแรกหมายถึงบิตอินพุทที่เขามา สวนตัวที่สองหมายถึงคาเอาทพุท ดังนั้นเอาทพุทของวงจรนี้จึงขึ้นอยู202


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>กับสถานะของสเตท และคาบิตอินพุทที่เขามา เปนลักษณะของวงจรแบบ Mealy machine และเขียนในรูปแบบของภาษา V<strong>HDL</strong> ไดดังนี้Library IEEE;Use IEEE.std_logic.1164.all;ENTITY seq_detect ISPort (clock, reset : IN std_logic;input : IN unsigned (2 downto 0);output : OUT unsigned (2 downto 0));END ENTITY seq_detect;ARCHITECTURE Bev OF seq_detect ISTYPE state IS (S0, S1);SIGNAL Mealy_state: state;-- PART1&2 Combinational logic and State registersU_Mealy: PROCESS(clock, reset)BEGINIF(reset = ‘1’) THENMealy_state IF input = ‘1’ THENMealy_state


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Chapter12บทที่ 12. การใชงานโปรแกรมXilinx ISE Webpackในบทนี้จะแนะนําการใชงานโปรแกรม Xilinx ISEWebpack ซึ่งเราสามารถดาวนโหลดมาใชงานไดฟรี สําหรับการออกแบบ การจําลองการทํางาน และการโปรแกรมลงในตัวชิฟ FPGA ของ Xilinx ในตระกูลที่ไมสูงเกินไปนัก ดวยโปรแกรม ISE เราสามารถออกแบบระบบไดทั้งในลักษณะของกราฟฟกเปน Schematic <strong>design</strong> (ซึ่งมีขอจํากัดในการออกแบบระบบใหญ ๆ) และการออกแบบระบบดวยภาษาชั้นสูง ทั้งที่เปนภาษา V<strong>HDL</strong> และ Verilogในบทนี้ เราจะใชภาษา V<strong>HDL</strong> ในการออกแบบระบบควบคุมสัญญาณไฟจราจร ซึ่งประกอบดวย• ตัวนับเวลา (counter.vhd) ที่เปนตัวกําหนดชวงเวลาปดเปดของไฟจราจร• ตัวสเตทเมชีน (state_mac.vhd) ที่จะเปนตัวกําหนดจังหวะตาง ๆ ของการปดเปดไฟจราจร โดยใชขอมูลจากตัวนับเวลามาประกอบการเปลี่ยนสเตท และการแสดงผลตาง ๆรูปที่ 12.1 โครงสรางระบบควบคุมไฟจราจร204


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ทั้งสองตัวนี้ถูกเรียกใชเปนอุปกรณ (Component) มาประกอบเปนระบบใหญขึ้น (top.vhd) เปนลักษณะของ Hierachical <strong>design</strong> ดังรูปที่ 12.1การออกแบบและจําลองการทํางานของตัวนับเวลาในหัวขอนี้จะกลาวถึงขั้นตอนการออกแบบวงจรอยางงายโดยใชโปรแกรม WebPACK ยกตัวอยาง การออกแบบวงจรนับเลข (Counter) ดวยภาษา V<strong>HDL</strong>เริ่มตนออกแบบ (Design Entry) ในการกําหนดคุณสมบัติของชิปที่ใช1). เริ่มตนการใชงาน WebPack ISE ดับเบิ้ลคลิกที่ไอคอนรูปที่ 12.2 หนาตางโปรแกรม WebPack2). สรางโปรเจ็คใหม โดยการเลือกไปที่เมนู File → New Project และเติมรายละเอียดดังนี้Project Name: Counter (ชื่อโปรเจคที่จะสราง)205


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Project Location: D:\Xilinx\Example (ไดเรคตอรี่ของโปรเจค)Top-Level Module Type: <strong>HDL</strong> (ชนิดของโมดูลที่ใช)3). เลือก Nextรูปที่ 12.3 หนาตาง New Project4). เติมรายละเอียดของชิปที่เลือกใชงาน ในรูป 12.4 ดังนี้Family : Spartan3EDevice : XC3S500EPackage : FG320Speed Grade : -4 (10 nano sec : ns.)Top-Level Module Type : <strong>HDL</strong>Synthesis Tool : XST (V<strong>HDL</strong>/Verilog)Simulator : ModelSim-XE V<strong>HDL</strong>206


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>5). เลือก Next จะไดผลดังรูปที่ 12.5รูปที่ 12.4 หนาตาง New Projectรูปที่ 12.5 หนาตาง New Project6). เลือก New Source จะปรากฏหนาตาง New Source ใชเมาสคลิกไปที่ V<strong>HDL</strong> Module และพิมพชื่อลงในชอง File Name ชื่อ counter207


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 12.6 หนาตาง New Source7). เลือก Next จะปรากฏหนาตาง Define V<strong>HDL</strong> Source ใหทําการกําหนด ชื่อพอรท ทิศทางของพอรทและการเรียงตําแหนงของบิต กรณีที่พอรทนั้นมีหลายบิต ดังรูป 12.7รูปที่ 12.7 หนาตาง Define V<strong>HDL</strong> Source8). เลือก Next จะรายงานคุณสมบัติเบื้องตนของ Source ที่สรางดังรูป 12.8208


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>9). เลือก Finish จะดังผลดังรูป 12.9รูปที่ 12.8 หนาตาง New Source Informationรูปที่ 12.9 หนาตาง New Project10). เลือก Next แลวจะเปนการเลือกไฟล <strong>HDL</strong> กรณีที่เราไดเขียนไวแลว (ซึ่งในตัวอยางการทดลองนี้ใหขามไป)11). เลือก Next จะดังผลดังรูป 12.10209


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 12.10 หนาตาง New Project Wizard Summary12).เลือก Finish จะปรากฏหนาตางของ Source File ชื่อ counter.vhd โดยที่จะประกาศ Library, entityname, Port ไวใหเรียบรอยแลว ดังรูป 12.11รูปที่ 12.11 หนาตางโปรแกรมที่กําหนดคาตางๆ เรียบรอยแลว13). ทําการเขียนโปรแกรมเพิ่มเขาไป โดยเขียนตอจาก begin ดังรูป เมื่อเขียนเสร็จเรียบรอยใหทําการ Save210


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การตรวจสอบความถูกตองของ Syntaxรูปที่ 12.12 ไฟลที่ทําการ edit เรียบรอยแลว1). คลิกเมาสไปที่เครื่องหมายบวก หนา Implement Design ในหนาตาง Processes for Source จะปรากฏดังรูป 12.13รูปที่ 12.13 หนาตาง Processes for Source: “counter-behavioral”211


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>2). ใหดับเบิ้ลคลิกไปที่คําวา Synthesize – XST เพื่อทําการสังเคราะห จะปรากฏดังรูป ถาโครงสรางภาษาผิดพลาดจะปรากฏเครื่องหมาย อยูขางหนาคําสั่ง ใหกลับไปแกไข ใหมใหถูกตอง แตถาถูกตองแลวจะมีเครื่องหมาย ซึ่งหลังจากเสร็จขั้นตอนนี้ เราจะสามารถดูรายงานการสังเคราะหไดโดยดับเบิ้ลคลิกที่View Synthesis Report และสามารถดูแผนภาพ Schematic ได โดยดับเบิ้ลคลิกที่ View RTL Schematicจะไดผลดังรูปที่ 12.14212


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 12.14 หนาตาง Design Summary, Schematic, และ Synthesis Report4). เราสามารถทําการสังเคราะหวงจร (Synthesis) ขั้นตอนตาง ๆ ในการ Implement (Translate, Map,Place & Route) และทําการสรางโปรแกรมไฟล (Generate Programming File) สําหรับการโปรแกรมลงในตัวชิฟได ตลอดกระบวนการโดยการดับเบิ้ลคลิ๊กที่ขั้นตอนสุดทายคือการสรางโปรแกรมไฟลไดเลยทีเดียว ดังรูป 12.15รูปที่ 12.15 หนาตาง Design Summary, Schematic, และ Synthesis Report213


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การจําลองการทํางานในสวนนี้จะพูดถึงการจําลองการทํางาน (Simulation) โดยใชโปรแกรม ModelSim โดยมีขั้นตอนตาง ๆดังตอไปนี้1). เลือกไปที่เมนู Project → New Source และใชเมาสคลิกไปที่ Test Bench Waveform พิมพชื่อลงในชอง File Name ชื่อ counter_tbรูปที่ 12.16 หนาตาง New Source2). เลือก Next สําหรับการเลือกไฟลที่ตองการจําลองการทํางานซึ่งก็คือ Counter.vhdรูปที่ 12.17 หนาตาง Select214


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>3). เลือก Next4). เลือก Finish5). กําหนดคาเวลาเริ่มตน ลงในแตละชองดังนี้Clock high time : 50 nsClock low time : 50 nsInput setup time : 10 nsOutput valid delay : 10 nsInitial Length of Test Bench : 1000 ns ดังรูป 12.186). เลือก Finish จะปรากฏดังรูป 12.19รูปที่ 12.18 หนาตาง Initialize Timing215


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 12.19 Input Simulation Waveform7). ตั้งคาเริ่มตนของสัญญาณ reset โดยเลือกให reset มีคาเปน 1 ใน clock 1 ลูกแรก และ clock ถัดไปเปน 0(ใชเมาสคลิ๊กซายสัญญาณที่บริเวณที่ตองการ จะทําใหมีการเปลี่ยนสถานะสลับกันไปจนสิ้นสุด หรือคลิกเมาสขวาแลวไปที่ Set Value ใสคา 1) ไดดังรูป 12.20รูปที่ 12.20 Input Simulation Waveform8). เราสามารถเปลี่ยนแปลงคาตาง ๆ ใน Waveform ได เชนคาสิ้นสุดของการจําลองการทํางาน (End ofsimulation time) โดยการคลิ๊กขวาในบริเวณวาง ๆ แลวเลือก Set End of Test Bench ดังรูป 12.21โดยเปลี่ยนคาเปน 1500 nsรูปที่ 12.21 การเปลี่ยนเวลาสิ้นสุดการจําลองการทํางาน9). ในหนาตาง Source ใหเลือก Behavioral Simulation view ซึ่งจะทําใหเราเห็นไฟล counter_tb.tbw เพิ่มเขาไปในตัวโปรเจคไฟลของเรา216


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 12.22 เลือก Behavioral Simulation View10). ขั้นตอนตอมา เราจะทําการจําลองการทํางาน โดยทําการเลือกไฟล counter_tb.tbw ในหนาตางProcess กอน แลวทําการดับเบิ้ลคลิ๊กที่ Generate Expected Simulation Results ในหนาตาง ModelSimSimulator (คลิ๊กที่เครื่องหมายบวก เพื่อทําการดูฟงกชันขางใน) เพื่อที่จะดูผลการจําลองการทํางานในตัวISE Webpack ไดเลย โดยกระบวนการจําลองการทํางานจะอยูใน Background Processรูปที่ 12.23 หนาตาง Simulation10). ทําการคลิ๊ก Yes ในหนาตางที่ popup ขึ้นมา สุดทายจะเห็นผลการจําลองการทํางานดังรูป 12.24217


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 12.24 หนาตางผลการจําลองการทํางาน counter_tb.tbw11). สําหรับการจําลองการทํางานในโปรแกรม ModelSim ทําไดโดยการคลิ๊กที่ Simulate BehavioralModel ใน ModelSim Simulator ซึ่งจะไดผลการจําลองการทํางานดังรูป 12.25รูปที่ 12.25 หนาตางผลการจําลองการทํางานใน ModelSimการออกแบบตัวควบคุมจังหวะไฟจราจรดวย STATE MACHINEในการออกแบบวงจรควบคุมสัญญาณไฟจราจร ที่ตองมีการควบคุมการเปลี่ยนสถานะ โดยเราจะใหใชState Diagram ในการออกแบบ State Machine กําหนดใหมี 4 สถานะ ซึ่งวงจรจะมีการควบคุมการติดของไฟ 3 สี ไดแก แดง เขียว เหลือง โดยกําหนดใหสถานะที่ 1 ไฟแดง => สถานะที่ 2 ไฟแดงและเหลือง => สถานะที่ 3 ไฟเขียว => สถานะที่ 4 ไฟเหลือง218


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>ขั้นตอนการออกแบบ1) ไปที่ Project Menu เลือก New Source ใชเมาสคลิกไปที่ State Diagram และ พิมพชื่อไฟลในชอง FileName ใสชื่อ stat_mac2) เลือก Nextรูปที่ 12.26 หนาตาง New Source3) เลือก Finish จะปรากฏหนาตาง StateCAD ขึ้นมาดังรูปรูปที่ 12.27 หนาตาง StateCAD219


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>4) จากนั้นใหคลิกที่ State Machine Wizard ที่ปุม จะปรากฏหนาตางดังรูปรูปที่ 12.28 หนาตาง State Machine Wizard5) กําหนดใหจํานวนสถานะเทากับ 4 ในชอง Number of state: แลวเลือก Next ไดหนาตางตอไปดังรูปที่12.29รูปที่ 12.29 หนาตาง Design Wizard : Reset The State Machine220


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>6) คลิก Next จะปรากฏหนาตาง Setup Transition จากนั้นใหพิมพ TIMER ลงในชอง Set condition toดังรูป7) คลิก Finish จะได State Diagram ดังรูปรูปที่ 12.30 หนาตาง Design Wizard : Setup Transitionรูปที่ 12.31 State Diagram221


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>8) ดับเบิ้ลคลิกที่ STATE0 สีเหลือง จะปรากฏหนาตางในการแกไขชื่อของ state ดังรูป9) ใหแกไข State Name จาก STATE0 เปน REDรูปที่ 12.32 หนาตาง Edit State10) คลิก OK จะไดดังนี้รูปที่ 12.23 หนาตาง Edit State กำหนด State Name222


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>11) ทําการเปลี่ยนชื่อ State อื่นๆดังนี้State1 เปลี่ยนเปน REDAMBState2 เปลี่ยนเปน GREENState3 เปลี่ยนเปน AMBERรูปที่ 12.24 State Diagramรูปที่ 12.35 State Diagram223


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>12) ทําการกําหนดคา output ของแตละ state เริ่มที่ Sate RED โดยดับเบิ้ลคลิกไปที่ RED และคลิกไปที่ปุม จะปรากฏหนาตาง Logic Wizard ใหกําหนดคาที่ DOUT ของ RED State มีคาเปนRD = 1 ดังรูป และคลิก OKรูปที่ 12.36 หนาตาง Logic Wizardรูปที่ 12.37 หนาตาง Edit State224


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>13) ทําการกําหนดคา State อื่นดังนี้State REDAMB ตั้งคา RD = 1 และ AMB = 1State GREEN ตั้งคา GRN = 1State AMBER ตั้งคา AMB = 1รูปที่ 12.38 State Diagram14) กําหนดเงื่อนไข Transition line ระหวาง State โดยดับเบิ้ลคลิกไปที่ TIMER ตางๆ โดยใหระหวางState RED กับ State REDAMB กําหนดให TIME = “1111”รูปที่ 12.39 หนาตาง Edit Condition225


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>15) ทําซ้ําที่ Transition อื่นๆ ดังนี้ระหวาง State REDAMB กับ State GREEN กําหนดให TIME = “0100”ระหวาง State GREEN กับ State AMBER กําหนดให TIME = “0011”ระหวาง State AMBER กับ State RED กําหนดให TIME = “0000”รูปที่ 12.40 State Diagram16) กําหนดเวกเตอร TIMER โดยคลิกที่ปุม ทางดานซายมือ และนํามาวงลงหนาจอแลวดับเบิ้ลคลิกเพื่อเปลี่ยนชื่อเปน TIMER[3..0]รูปที่ 12.41 หนาตาง Edit Vector226


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>17) แลวคลิก OK จะปรากฏดังรูปรูปที่ 12.42 State Diagram18) คลิกที่ปุม เพื่อสราง <strong>HDL</strong> ขึ้นมา ดังรูป 2.17รูปที่ 12.43 หนาตาง Results227


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>19) ใหคลิก โปรแกรมจะสรางไฟล V<strong>HDL</strong> จาก State Machine ที่ออกแบบไว ดังรูป 2.18รูปที่ 12.44 Text ไฟล State Diagram ของ STAT_MAC20) ทําการ Save และ Close หนาตาง StateCAD <strong>HDL</strong> Browerการจําลองการทํางาน1) ดูการทํางานของ State Diagram คลิกที่ปุม ไดหนาตางดังรูป 2.19228


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 12.45 หนาตาง StateBench2) คลิกที่ปุม จะไดหนาตางที่แสดงการตั้งคาอัตโนมัติไวแลว ใหคลิกที่ปุม Beginรูปที่ 12.46 หนาตาง Automatic Test Bench229


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>3) จะไดรูปสัญญาณและการทํางานของ state diagram ดังรูปรูปที่ 12.47 หนาตาง StateBench4) กลับไปยังหนาตางหลักของโปรแกรม WebPACK ISE project เพื่อทําการ Add Source โดยทําการเลือก Project → Add Source เลือกไฟลชื่อ stat_mac.vhd และ stat_mac.dia เขาไปใน Project เดียวกันกับ ไฟลของ counter ดังรูปรูปที่ 12.48 หนาตาง Source in Project230


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การออกแบบ Top Level ดวย V<strong>HDL</strong> และการโปรแกรมลงชิพในการออกแบบ Top Level ดวย V<strong>HDL</strong> คือการนําไฟล V<strong>HDL</strong> ที่ออกแบบไวแลวหลายๆ ไฟลมาตอรวมกัน ยกตัวอยางเชน V<strong>HDL</strong> ไฟลที่เราไดทําการออกแบบไวแลว คือ counter.vhd จากการทดลองที่ 1และ stat_mac.vhd จากการทดลองที่ 2 โดยทั้งสองไฟลจะตอง save อยูในไดเรกทอรี่เดียวกันกอนจึงจะทําการออกแบบ แบบ Top Level ไดการออกแบบ Top Level ดวย V<strong>HDL</strong>1). เริ่มตนการออกแบบ ใหทําการ copy files ที่ไดออกแบบไวแลวไดแก counter.vhd และ stat_mac.vhdไปไวอีกที่หนึ่ง เชน ./Lab3/Top แลวไปที่เมนูบารเลือก File → New Project ตั้งชื่อโปรเจคเปน Topบริเวณที่ทําการเก็บไฟลของ counter.vhd และ stat_mac.vhdรูปที่ 12.49 หนาตาง Sources in Project2). คลิ๊ก Next จนกระทั่งไปถึง Add Source เพื่อทําการเพิ่มไฟลทั้งสองลงในโปรเจคดังรูป หลังจากนั้นใหคลิ๊ก Next จนกระทั่ง Finish231


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 12.50 หนาตาง Add Existing Sources3). ไปที่เมนูบารเพื่อสรางไฟลใหม Project → New Source เลือกไปที่ V<strong>HDL</strong> Module ชื่อไฟลวา top ดังรูปรูปที่ 12.51 หนาตาง New Source4). คลิก Next ไดหนาตาง Define V<strong>HDL</strong> Source กําหนดคาตางๆ ดังรูป232


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>5). คลิก Next และ Finish จะไดไฟล top.vhd ดังรูปรูปที่ 12.52 หนาตาง Define V<strong>HDL</strong> Sourceรูปที่ 12.53 ไฟลตั้งตั้นของ top.vhd6). ที่หนาตาง Sources in Project คลิกเลือกไปที่ counter.vhd จากนั้นไปที่หนาตาง Processes for Source:ดับเบิ้ลคลิกไปที่ View V<strong>HDL</strong> Instantiation Template ที่อยูใน Design Entry Utilities จะไดไฟลที่กําหนดคาเริ่มตนของ counter ออกมาแลว copy สวนของคําสั่งดังรูป233


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>7). นําสวนที่ copy ไปวางในไฟลของ top.vhdรูปที่ 12.54 การกําหนดการใชงานอุปกรณ8). ทําซ้ํากับสวนของไฟล stat_mac หรือใหไปดูที่ไฟล Stat_Mac.vhd แลวนํามาวางในไฟลของ topเชนเดียวกันและพิมพคําสั่งตางๆ ใหสมบรูณแลว saveรูปที่ 12.55 การเรียกใช และ เชื่อมตออุปกรณตางๆ ใน top architecture ดวยคําสั่ง Port map234


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>9). ตรวจสอบความถูกตองของไฟล top.vhd แลวทําการ simulate การทํางาน โดยไปที่ Project → NewSource เลือก Test Bench Waveform ใสชื่อ top_tb แลวเลือก Source File เปน top ไดสัญญาณดังรูป ทําการกําหนดคาของสัญญาณตาง ๆ ดังรูป 12.56 คลิกเมาสขวาเลือกไปที่ ‘Set end of testbench’ แลวทําการsaveรูปที่ 12.56 หนาตาง Waveform Diagram235


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>10). ทําการจําลองการทํางานโดยไปที่ Simulate Behavioral V<strong>HDL</strong> Model ในหนาตาง Processes forSource ไดหนาตางของผลการ simulate ดวยโปรแกรม ModelSim ดังรูป (ใหพิมพคําสั่ง run 10us ในหนาตางของ ModelSim กรณีที่โปรแกรมจําลองการทํางานไมครบ)รูปที่ 12.57 หนาตาง wave ของโปรแกรม ModelSimจะเห็นไดวา ในการจําลองการทํางาน เพื่อใหสามารถดูผลลัพธไดรวดเร็ว เราอาจใชความถี่สัญญาณนาฬิกาที่สูงเปน MHz แตในการใชงานจริง ๆ ความถี่จะตองเปนไปตามที่กําหนด เชนในการทํางานเราตองการสัญญาณนาฬิกาที่ 1 วินาที ดังนั้นกอนที่จะโปรแกรมลงบนชิฟเพื่อใชงานจริง เราจะตองสรางตัวหารความถี่เพิ่มขึ้นมาอีกหนึ่งตัว236


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>การโปรแกรมลงบนชิฟ FPGAในสวนนี้จะแสดงการโปรแกรมระบบที่ไดออกแบบไว ลงในตัวชิฟ FPGA จริง ๆ โดยเราจะใชบอรดพัฒนาSpartan 3E starter kit ของ Xilinx มาทําการทดสอบ โดยจะตองมีการกําหนดการแสดงผลดวย LEDs ที่อยูบนบอรด แทนการแสดงผลของไฟจราจรสีตาง ๆ ซึ่งจะตองมีการกําหนดการใชงานขาของชิฟที่ตออยูกับLEDs ใหเชื่อมตอกับขาเอาทพุทของไฟล top.vhd ที่ออกแบบได1) ออกแบบวงจรหารความถี่ ClkDiv1Hz.vhd สําหรับการหารความถี่ 50 MHz ใหเหลือประมาณ 1 Hzโดยใหเปลี่ยนแปลงไฟล counter.vhd โดยใหหาขนาดของ Counter Register วาควรจะใชกี่บิต แลวใหเอาทพุทที่เปนความถี่ที่หารออกมาแลว เปน MSB บิตของ Counter Register)2). หลังจากที่ไดออกแบบ ClkDiv1Hz.vhd เพื่อใหหารความถี่เปน 1Hz แลว ใหทําการเพิ่มลงในไฟลtop.vhd โดยใหมีการตอกันดวยคําสั่ง Port map ใหเปนดังรูป 12.58 และใหเพิ่มพอรตเอาทพุท blinkสําหรับการแสดงไฟกระพริบขณะทํางาน โดยจะใหตอกับสัญญาณความถี่ขาออกที่ 1Hz ที่เปนเอาทพุทของClkDiv1Hz.vhdรูปที่ 12.58 โครงสรางการเชื่อมตอของทั้งระบบ2). ใหทําการกําหนดขาที่จะนําสัญญาณเอาทพุทตาง ๆ คือ blink, amber_light, green_light และ red_lightไปที่ขาที่ตอกับ LED0-LED7 ในบอรด Spartan3E (ดูรายละเอียดในรูป 12.59 หรือคูมือการใชงานบอรด)สวนอินพุทที่เปน clk จะตอเขากับสัญญาณนาฬิกา 50 MHz ในบอรด และ reset จะตอเขากับ SW0 (SlideSwitch) ในบอรด Spartan3E ซึ่งเราสามารถทําการกําหนดไดดวยไฟล .ucf (User constraint file) ที่เขียนขึ้นมาใน Text editor ใด ๆ ก็ได ตามรายละเอียดดังนี้237


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>NET "blink" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;NET "green_light" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;NET "amber_light" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;NET "red_light" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8;NET "CLK" LOC = "C9" | IOSTANDARD = LVCMOS33;NET "reset" LOC = "L13" | IOSTANDARD = LVTTL | PULLUP;ทําการ save เปนชื่อ top.ucf แลวทําการ add เขาไปในโปรเจค จะไดดังรูป 12.60รูปที่ 12.59 การตอเชื่อมระหวางขา FPGA กับ LED[7:0] และ SW[3:0]รูปที่ 12.60 ผลลัพธจากการเพิ่ม ucf file เขาไปในโปรเจคปจจุบัน238


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>3). ทําการสราง configuration file (.bit) โดยดับเบิ้ลคลิ๊กที่ Generate Programming File ในหนาตางProcess ตามรูปที่ 3.9 หลังจากนั้นใหทําการโปรแกรมไฟลที่ได (คือ top.bit) ลงในชิพ โดยดับเบิ้ลคลิ๊กที่ตัวโปรแกรม iMPACT เพื่อเรียกใชงานรูปที่ 12.61 สราง Configuration file พรอมทั้งเรียกโปรแกรม iMPACT มาใชงาน4). ขอควรระวังคือ ในบอรดจะตอง set jumper J30 ใหเปนลักษณะของ JTAG ทําการSwitch On ใหเรียบรอย พรอมทั้งตอ USB Download Cable กับเครื่อง PC ซึ่งอาจจะมีการ Install Driver กอนใชงาน หลังจากนั้นให iMPACT ทําการคนหา ชิพ FPGA ที่จะทําการโปรแกรมอัตโนมัติ ซึ่งจะไดผลดังรูปที่ 12.62 ซึ่งจะเห็นเปนชิพ 3 ตัวเรียงกัน โดยที่ตัวแรกจะเปนFPGA สวนอีกสองตัวถัดมาจะเปน Config ROM239


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>รูปที่ 12.62 ทําการเลือกไฟลที่จะโปรแกรมลงในชิพ FPGA5). กําหนดไฟลที่จะโปรแกรมลงในชิพ FPGA XC3S500E ตัวแรก ซึ่งไดแก top.bit สวนชิพ ConfigROM ที่เหลืออีกสองตัวใหทําการ Bypass6). ทําการคลิ๊กขวาที่ตัว FPGA ชิพ แลวเลือก Program… ดังรูปรูปที่ 12.63 คําสั่งโปรแกรมลงชิพ7). ทําการรีเซตระบบ โดยใชเลื่อนปุม SW0 ขึ้นแลวลงมาที่เดิม จะเห็นการทํางานของสัญญาณเอาทพุทที่กําหนดไวที่ LED ตาง ๆ240


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>241


การออกแบบระบบดิ จิ ตอลด วยภาษา<strong>HDL</strong>Indexabove, 4background, 4border, 6bullet, 4caption, 5color, 5drawing, 5drop cap, 4footer, 6frame, 6graphic, 5group, 5header, 6help, 6link, 7margins, 5number, 7picture, 5, 6, 7re-size, 6section break, 5shading, 5style, 5, 6, 7, 8symbol, 4Table of Contents, 6template, 7ungroup, 6Wingdings, 4242

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!