การพัฒนาไมโครโปรเซสเซอร์บน FPGA by kantida

VIEWS: 722 PAGES: 119

More Info
									                                                รายงานโครงการหมายเลข COE2006-02




         การพัฒนาไมโครโปรเซสเซอรบนเอฟพีจีเอ




                                         โดย

                  นางสาวธัญญาภรณ จิระดํารงค รหัส 463040523-6
                  นายสุคลยุทธ เตียนพลกรัง    รหัส 463040559-5




       รายงานนี้เปนรายงานงานโครงการของนักศึ กษาชั้ นป ที่ 4 ซึ่ งเสนอเปนสวนหนึ่งใน
หลักสูตรวิศวกรรมศาสตรบันฑิต



                           ภาควิชาวิศวกรรมคอมพิวเตอร
                      คณะวิศวกรรมศาสตร มหาวิทยาลัยขอนแกน
                                                   Project Report No. COE2006-02




       Implementing a Microprocessor Using FPGA




                                       By

                Miss Thanyaporn Jiradumrong      I.D. 463040523-6
                Mr. Sukonyut Tianpongrang        I.D. 463040559-5




        This is the report of fourth year project assignment submitted in partial
fulfillment of the requirement for the Degree of Bachelor of Engineering



                      Department of Computer Engineering
                   Faculty of Engineering, Khon Kaen University
                                                     เรื่อง



              การพัฒนาไมโครโปรเซสเซอรบนเอฟพีจีเอ

โดย                 นางสาวธัญญาภรณ จิระดํารงค                            รหัส 463040523-6
                    นายสุคลยุทธ เตียนพลกรัง                               รหัส 463040559-5




อาจารยที่ปรึกษาโครงการ

                                     .......................................
                                        (ผศ.ดร. ดารณี หอมดี)

อาจารยผูรวมประเมินโครงการ
                        1. ........................................
                            (อ.ดร. วรินทร สุวรรณวิสูตร)

                              2. ........................................
                                    (อ.รุจชัย อึ้งอารุณยะวี)



                          ประเมินผล ณ วันที่ 12 กุมภาพันธ พ.ศ. 2550
                                                                                                  ก
                                     กิตติกรรมประกาศ

        โครงการ "การพัฒนาไมโครโปรเซสเซอรบนเอฟพีจีเอ (Implementing a Microprocessor using FPGA)"
เปนโครงการที่จัดทําขึ้นโดยไดรับการสนับสนุนจากภาควิชาวิศวกรรมคอมพิวเตอร คณะวิศวกรรมศาสตร
มหาวิทยาลัยขอนแกน เพื่อเผยแพรเทคนิคและเทคโนโลยีการใชภาษาคอมพิวเตอรชวยในการพัฒนา
ไมโครโปรเซสเซอร และเพื่อนําไมโครโปรเซสเซอร ซึ่งอยูในรูปของโปรแกรมภาษาคอมพิวเตอรไปใชเปน
หนวยประมวลผล และใชในการพัฒนาระบบอื่นที่ใหญกวาตอไป

       คณะผู พั ฒ นาขอขอบพระคุ ณ คณาจารย ภ าควิ ช าวิ ศ วกรรมคอมพิว เตอร ที่ใ ห คํ า ปรึ ก ษาและ
ขอเสนอแนะในการจัดทําโครงการ

       ขอขอบคุณ คุณจักรี วิญญาณ ที่ใหยืมเอกสารและหนังสือสําหรับการศึกษาและคนควา ขอบคุณ
คุณธนะพัฒน เชี่ยวชาญวัฒนา ที่ใหซอสโคดภาษาแอสแซมบลีสําหรับการจัดเรียงขอมูล เพื่อใชในการ
ทดสอบความสามารถในการทํางานของไมโครโปรเซสเซอรที่สรางขึ้น ขอบคุณ คุณเกรียงไกร ประทุมพร
และคุณอัษนัย ปนจอม ที่ไดใหคําปรึกษาและขอเสนอแนะในการแกปญหาที่เกิดขึ้นระหวางการดําเนิน
โครงการ

        และขอขอบคุณโครงการการแขงขันพัฒนาโปรแกรมคอมพิวเตอรแหงประเทศไทยครั้งที่ 9 โดย
ศูนยเทคโนโลยีอิเล็กทรอนิกสและคอมพิวเตอรแหงชาติ สํานักงานพัฒนาวิทยาศาสตรและเทคโนโลยี
แหงชาติ ที่มอบทุนอุดหนุนการพัฒนาโครงการเปนคาใชจายของโครงการนี้
                                                                                              ข

                                           บทคัดยอ

         โครงงานนี้นําเสนอการพัฒนาไมโครโปรเซสเซอรขนาด 8 บิต ที่มีคํ าสั่งการทํางานเหมือนกับ
(Compatible) ไมโครโปรเซสเซอรตระกูล Z80 เพื่อชวยใหการพัฒนาไมโครโปรเซสเซอรทําไดงายและ
รวดเร็วมากยิ่งขึ้น โครงงานนี้จึงไดพัฒนาโดยใชภาษา VHDL ซึ่งเปนภาษาคอมพิวเตอรอธิบายฮารดแวร
(Hardware Description Language: HDL) ประเภทหนึ่ง และทําการทดสอบการทํางานบนชิปเอฟพีจีเอ
(FPGA Chip) วัตถุประสงคหลักของการพัฒนาครั้งนี้คือการไดมาซึ่งโคดภาษา (Source code) เพื่อ
นําไปใชเปนแบบจําลองพื้นฐานของไมโครโปรเซสเซอรในการประมวลผล หรือเพื่อใชในการออกแบบระบบ
อื่นตอไป นอกจากนี้ยังสามารถใชโคดภาษานี้เพื่อศึกษาการทํางานภายในของไมโครโปรเซสเซอรไดโดย
การจําลองผานซอฟตแวรทางคอมพิวเตอร ผลที่ไดจากโครงงานนี้คือไมโครโปรเซสเซอรที่ผานการทดสอบ
ดวยซอฟตแวรจําลองการทํางานแลววาสามารถทํางานตามคําสั่งในกลุมคําสั่งการคัดลอกขอมูลขนาด 8
และ 16 บิต การคํานวณผลทางคณิตศาสตรขอมูลขนาด 8 และ 16 บิต การจัดการควบคุมระบบ การเลื่อน
และการหมุนขอมูล การจัดการขอมูลระดับบิต และการประมวลผลแบบขามกระโดดของ Z80 ได โดย
ยกเวนคําสั่งที่สัมพันธกับการขัดจังหวะ การทํางานโปรแกรมประจํายอย การสับเปลี่ยนขอมูลระหวางสอง
ตําแหนง และการติดตออินพุต/เอาตพุต เมื่อทดสอบการทํางานบนบอรดทดลองอิเล็กทรอนิกส (Xilinx
Spartan III (XC3S200F)) พบวาผลงานสามารถทํางานไดจริงและถูกตอง
                                                                                                ค
                                           Abstract

        This project proposes an implementing of an 8-bit microprocessor, compatible with the
Z80 microprocessor family. In order to simplify and speed up the implementation process, this
project employs a hardware description language (HDL), called Very high speed integrated
circuit Hardware Description Language (VHDL) and utilizes Field Programmable Gate Arrays
(FPGA) chip to test the functionalities of this microprocessor. The main objective of this project
is to obtain the implemented code design as a basic core model in other designs. Furthermore,
this design can also be used for academic purpose to study the internal process of the
microprocessor via a computer software simulation. The outcome of this project is a
microprocessor which has been fully functional tested by simulator software proving it can
perform most basic Z80 instructions; 8- and 16-bit data transfer group, 8- and 16-bit arithmetic
group, rotate and shift group, bit manipulation group, jump group; except exchange, block
transfer and search group, call and return group and input and output group. When tested on
an electronics board Xilinx Spartan III (XC3S200F), the microprocessor can also correctly
perform its functionalities.
                                                                                       ง
                                         สารบัญ

กิตติกรรมประกาศ                                                                        ก
บทคัดยอ                                                                               ข
Abstract                                                                               ค
สารบัญ                                                                                 ง
สารบัญรูปภาพ                                                                           ช
สารบัญตาราง                                                                           ญ
บทที่ 1 บทนํา                                                                          1
         1.1 ความสําคัญและที่มาของโครงการ                                              1
         1.2 วัตถุประสงคของโครงการ                                                    2
         1.3 ขอบเขตของโครงการ                                                          2
         1.4 แผนการดําเนินงาน                                                          2
         1.5 ประโยชนที่คาดวาจะไดรับ                                                 2
                           ั
บทที่ 2 ทฤษฎีและงานวิจยทีเ่ กี่ยวของ                                                  4
         2. 1 ทฤษฏีที่เกี่ยวของ                                                       4
                2.1.1 ไมโครโปรเซสเซอร Z80 (Z80 Microprocessor)                        4
                2.1.2 เทคโนโลยี FPGA (FPGA Technology)                                25
         2.2 งานวิจัยทีเ่ กี่ยวของ                                                   26
                2.2.1 MCS-51                                                          26
                2.2.2 PIC                                                             26
                2.2.3 Z80                                                             27
บทที่ 3 การออกแบบไมโครโปรเซสเซอร                                                     28
         3.1 รูปแบบของไมโครโปรเซสเซอร                                                28
                3.1.1 สัญญาณของไมโครโปรเซสเซอร                                       28
                                  ั
                3.1.2 ฟงกชนของไมโครโปรเซสเซอร                                      29
         3.2 หนาที่ของสวนประกอบตางๆภายในไมโครโปรเซสเซอร                           29
                3.2.1 รีจิสเตอร (CPU Registers)                                      30
                3.2.2 หนวยคํานวณทางคณิตศาสตรและลอจิก (Arithmetic Logic Unit: ALU)   30
                3.2.3 หนวยควบคุม (Control Unit)                                      31
         3.3 การกระทําการคําสั่งของไมโครโปรเซสเซอร                                   31
                                                                        จ
         3.4 ขั้นตอนการพัฒนา                                           32
         3.5 เครื่องมือที่ใช                                          32
         3.6 การทดสอบ                                                  33
บทที่ 4 การพัฒนาไมโครโปรเซสเซอรดวยภาษา VHDL                          36
         4.1 วงจรระดับบนสุด (Top Level)                                36
         4.2 วงจรภายในไมโครโปรเซสเซอร                                 37
                 4.2.1 ALU                                             39
                 4.2.2 Control Unit                                    41
                 4.2.3 Instruction Register                            44
                 4.2.4 Register arrays                                 45
                 4.2.5 Program Counter                                 46
                 4.2.6 PC Increment Module                             46
                 4.2.7 Flag Register                                   47
                 4.2.8 Latch A                                         47
                 4.2.9 Latch B                                         48
                 4.2.10 Latch C                                        48
                 4.2.11 Address Bus Control                            49
                 4.2.12 Data-out Bus Control                           49
                 4.2.13 Data-in Bus Control                            50
         4.3 วงจรที่สังเคราะหไดจากซอฟตแวรสังเคราะหวงจร            51
บทที่ 5 ผลการทดลอง                                                     53
         5.1 ผลการทดลองโดยใชโปรแกรม Xilinx ISE Webpack 8.1i           53
                                               ่
                 5.1.1 ผลการทํางานคําสัง LD (HL), A และ LD (BC), A     53
                                                 ่
                 5.1.2 ผลการทํางานคําสัง LD (0004), A                  54
                                                   ่
                 5.1.3 ผลการทํางานคําสัง LD D, 045h และ LD A, D        55
                 5.1.4 ผลการทํางานคําสัง LD A, (HL)  ่                 56
                                       ่
                 5.1.5 ผลการทํางานคําสัง ADD A, D และ SUB B            56
                 5.1.6 ผลการทํางานคําสั่ง AND B, OR C และ XOR D        58
                                         ่
                 5.1.7 ผลการทํางานคําสัง SLA A, SRA B และ SRL C        59
                                           ่
                 5.1.8 ผลการทํางานคําสัง RLC A, RRC B, RR C และ RL D   59
                                             ่
                 5.1.9 ผลการทํางานคําสัง INC A และ DEC A               62
                                                                    ฉ
                 5.1.10 ผลการทํางานคําสั่ง RES 1, H และ SET 2, H    62
                 5.1.11 ผลการทํางานคําสั่ง ADC A, C และ SBC A, B    63
                 5.1.12 ผลการทํางานคําสั่ง CP C และ JP 0004h        64
                 5.1.13 ผลการทํางานคําสั่ง ADD HL, DE               65
         5.2 ผลการทดลองจากการเขียนลงบนบอรดทดลอง                    65
                 5.2.1 การทดลองโดยใชสัญญาณนาฬิกาของบอรดทดลอง      65
                 5.2.2 การทดลองโดยใชสัญญาณนาฬิกาจากการกดปุม       66
บทที่ 6 สรุปและขอเสนอแนะ                                           67
         6.1 สรุปผลการทํางาน                                        67
         6.2 ปญหาและอุปสรรค                                        67
         6.3 แนวทางในการพัฒนาและประยุกตใช                         68
         6.4 ขอสรุปและขอเสนอแนะ                                   68
ภาคผนวก ก โปรแกรมภาษา VHDL                                          69
ภาคผนวก ข ชุดคําสั่งของไมโครโปรเซสเซอร Z80                        101
บรรณานุกรม                                                         106
                                                                                         ช
                                      สารบัญรูปภาพ

รูปที่ 2.1 แผนภาพระบบคอมพิวเตอร                                                         4
รูปที่ 2.2 โครงสรางและสัญญาณตางๆ ของไมโครโปรเซสเซอร Z80                               6
รูปที่ 2.3 การทํางานวางเลขที่อยูลงบนบัสที่อยู                                          7
รูปที่ 2.4 แสดงการเพิ่มคา PC Counter และสัญญาณรองขอการอานคาจากหนวยความจํา           8
               ้
รูปที่ 2.5 ขันตอนการนํารหัสคําสั่ง                                                       8
รูปที่ 2.6 การนํารหัสคําสั่ง และการวางขอมูลลงบนบัสขอมูล                                9
รูปที่ 2.7 การถอดรหัสคําสั่ง                                                             9
             ้
รูปที่ 2.8 ขันตอนการโหลดคาจากรีจิสเตอร A ไปเพื่อเตรียมการทํางาน                       10
                 ้
รูปที่ 2.9 ขันตอนการวางขอมูลจากรีจิสเตอร HL เพื่อเตรียมการโหลดขอมูลจากหนวยความจํา   10
รูปที่ 2.10 การนําขอมูลจากหนวยความจํา และนําขอมูลไปเตรียมการทํางาน                   11
รูปที่ 2.11 การทํางาน ADD แลวนําคาที่ไดไปเก็บในรีจิสเตอร                            12
รูปที่ 2.12 ขั้นตอนการวางบัสที่อยู                                                     12
รูปที่ 2.13 การเพิ่มคา PC Counter                                                      13
รูปที่ 2.14 ขั้นตอนการนํารหัสคําสั่ง                                                    14
รูปที่ 2.15 ขั้นตอนการนํารหัสคําสั่ง (ตอ)                                              14
รูปที่ 2.16 การถอดรหัสคําสั่ง                                                           15
                             ิ
รูปที่ 2.17 การนําคาจากรีจสเตอร HL ไปวางบนบัสขอมูล                                   15
รูปที่ 2.18 การโหลดคาจาก รีจิสเตอร A ไปรอการทํางานบนบัสขอมูล                         16
                                           
รูปที่ 2.19 การเขียนคาจากบัสขอมูลลงสูหนวยความจํา                                     17
รูปที่ 2.20 การทํางานของคําสั่ง OUT                                                     17
รูปที่ 2.21 แมชชีนไซเคิล ที่เวลา T1 และ T2 ของการเขียนขอมูลออกทางอุปกรณเอาตพุต       18
รูปที่ 2.22 แมชชีนไซเคิล ระหวางเวลา T2 ของการสงขอมูลออกทางอุปกรณเอาตพต ุ           19
รูปที่ 2.23 การทํางานของคําสั่ง IN                                                      19
รูปที่ 2.24 แมชชีนไซเคิล ระหวางเวลา T2 ของการรับขอมูลจากอุปกรณอินพุต                 20
รูปที่ 2.25 แมชชีนไซเคิล ระหวางเวลา T4 ของการรับขอมูลจากอุปกรณอินพุต                 21
รูปที่ 2.26 การดําเนินการขัดจังหวะของ Z80 เชิงเวลา                                      21
รูปที่ 2.27 การสุมสัญญาณการขอขัดจังหวะ                                                 22
รูปที่ 2.28 การสงสัญญาณตอบรับการขอขัดจังหวะ M1 และ IORQ                                22
                                                          ่
รูปที่ 2.29 การรับขอมูลที่บัสขอมูลและเก็บเลขที่อยูคําสังถัดไปไวในแสตก               23
                                                                                         ซ
รูปที่ 2.30 การตีความขอมูลจากบัสขอมูลและรีจิสเตอรที่เกี่ยวของ                       24
รูปที่ 2.31 การถายโอนโปรแกรมไปยังเลขที่อยูโปรแกรมบริการ                               24
                                                                          ่
รูปที่ 2.32 การนําเลขที่อยูคําสั่งถัดไปจากแสตกและโอนยายการทํางานกลับมาทีโปรแกรมหลัก   25
รูปที่ 3.1 สัญญาณของ Z80                                                                29
รูปที่ 3.2 โครงสรางภายในของไมโครโปรเซสเซอร                                            30
                             ่
รูปที่ 3.3 การกระทําการหนึงรอบคําสั่งของไมโครโปรเซสเซอร                                32
             ้
รูปที่ 3.4 ขันตอนการออกแบบและพัฒนาไมโครโปรเซสเซอร                                      33
รูปที่ 3.5 การใชโปรแกรมจําลองผลการทํางาน                                               34
รูปที่ 3.6 การจําลองการทํางานโดยใชโปรแกรม ISE Simulator                                34
รูปที่ 3.7 การทดสอบผลการทํางาน                                                          35
รูปที่ 4.1 การออกแบบระดับ Top Level ของระบบไมโครโปรเซสเซอร                             37
รูปที่ 4.2 วงจรภายในไมโครโปรเซสเซอร                                                    38
รูปที่ 4.3 ขาสัญญาณของ ALU                                                              39
รูปที่ 4.4 ขาสัญญาณของ Control Unit                                                     44
รูปที่ 4.5 ขาสัญญาณของ Instruction Register                                             45
รูปที่ 4.6 ขาสัญญาณของ Register arrays                                                  45
รูปที่ 4.7 ขาสัญญาณของ Program Counter                                                  46
รูปที่ 4.8 ขาสัญญาณของ PC Increment Module                                              47
รูปที่ 4.9 ขาสัญญาณของ Flag Register                                                    47
รูปที่ 4.10 ขาสัญญาณของ Latch A                                                         48
รูปที่ 4.11 ขาสัญญาณของ Latch B                                                         48
รูปที่ 4.12 ขาสัญญาณของ Latch C                                                         48
รูปที่ 4.13 ขาสัญญาณของ Address Bus Control                                             49
รูปที่ 4.14 ขาสัญญาณของ Data-out Bus Control                                            50
รูปที่ 4.15 ขาสัญญาณของ Data-in Bus Control                                             50
รูปที่ 4.16 วงจรระดับบนสุดที่สามารถสังเคราะหไดจากซอฟตแวรสังเคราะหวงจร              51
รูปที่ 4.16 วงจรภายในไมโครโปรเซสเซอรที่สามารถสังเคราะหไดจากซอฟตแวรสังเคราะหวงจร   52
                                         ่
รูปที่ 5.1 ผลการจําลองการทํางานคําสัง LD (HL), A และ LD (BC), A                         54
                                           ่
รูปที่ 5.2 ผลการจําลองการทํางานคําสัง LD (HL), A และ LD (BC), A (ตอ)                   54
                         ่
รูปที่ 5.3 การทํางานคําสัง LD (0004), A                                                 55
                           ่
รูปที่ 5.4 การทํางานคําสัง LD D, 045h และ LD A, D                                       55
                                                                                  ฌ
                         ่
รูปที่ 5.5 การทํางานคําสัง LD C, (HL)                                             56
                                        ่
รูปที่ 5.6 ผลการจําลองการทํางานในคําสัง ADD A, D และ SUB B                        57
                                          ่
รูปที่ 5.7 ผลการจําลองการทํางานในคําสัง ADD A, D และ SUB B โดยใช Z80 Simulator   57
                             ่
รูปที่ 5.8 ผลการทํางานคําสัง AND B, OR C และ XOR D                                58
รูปที่ 5.9 การทํางานของคําสั่ง SLA A และ SRA B                                    60
รูปที่ 5.10 การทํางานคําสั่ง SRL C                                                60
รูปที่ 5.11 ผลการทํางานคําสั่ง RLC A และ RRC B                                    61
รูปที่ 5.12 ผลการทํางานคําสั่ง RR C และ RL D                                      61
รูปที่ 5.13 ผลการทํางานคําสั่ง INC A และ DEC A                                    62
รูปที่ 5.14 ผลการทํางานคําสั่ง SET 1, H และ RES 2, H                              63
รูปที่ 5.15 ผลการทํางานคําสั่ง ADC A, C และ SBC A, B                              64
รูปที่ 5.16 ผลการทํางานคําสั่ง CP C และ JP 0004h                                  64
รูปที่ 5.17 การทํางานคําสั่ง ADD HL, DE                                           65
รูปที่ 5.18 บอรดทดลอง FPGA                                                       66
รูปที่ ก แผนผังโมดูลและไฟลของโครงการการพัฒนาไมโครโปรเซสเซอร                     69
                                                                           ญ
                                     สารบัญตาราง

ตารางที่ 1.1 แผนการดําเนินงานโครงการ                                        3
ตารางที่ 2.1 รายละเอียดของการขัดจังหวะโหมดตางๆ                            20
ตารางที่ 4.1 คําสั่งและการดําเนินการของ ALU                                40
ตารางที่ 4.2 การกําหนดตําแหนงรีจิสเตอรโดยสัญญาณ sel                      45
ตารางที่ 4.3 การกําหนดการเขียนคาลงสู Program Counter โดยสัญญาณ sel       46
ตารางที่ 4.4 การกําหนดการเขียนคาลงสู Address Bus Control โดยสัญญาณ sel   49
ตารางที่ 5.1 คําสั่งที่สามารถทํางานได                                     53
                                                                                                            1
                                                  บทที่ 1
                                                  บทนํา

      รายงานบทนี้นําเสนอความสําคัญของโครงการ วัตถุประสงค ขอบเขต แผนการดําเนินงาน และ
สุดทายไดกลาวถึงประโยชนที่คาดวาจะไดรับจากการพัฒนาโครงการ

1.1. ความสําคัญและที่มาของโครงการ
       เมื่อกลาวถึงไมโครโปรเซสเซอร สิ่งแรกที่คนสวนใหญนึกถึงคือเปน CPU ภายในเครื่องคอมพิวเตอร
(PC) แต แ ท จ ริ ง แล ว มี ไ มโครโปรเซสเซอร อ ยู ม ากมายนอกเหนื อ จากในเครื่ อ งคอมพิ ว เตอร เพราะ
ไมโครโปรเซสเซอรเปนหัว ใจหลักของอุปกรณทุกชนิดที่ มีความฉลาด ไมว าจะเปนเครื่องใชไฟฟาหรื อ
อุ ป กรณ อ่ื น ๆ ความฉลาดของอุ ป กรณ เ หล า นี้ มี ผ ลมาจากการคํ า นวณและการควบคุ ม ของ
ไมโครโปรเซสเซอรทั้งสิ้น ดังนั้นความกาวหนาในการพัฒนาไมโครโปรเซสเซอรจึงมีความสําคัญตอการ
พัฒนาเทคโนโลยีอื่นๆ ผูออกแบบและพัฒนาไมโครโปรเซสเซอรจึงตางแขงขันกันทั้งในดานประสิทธิภาพ
ความสามารถของไมโครโปรเซสเซอร และวิธีการออกแบบพัฒนาตนแบบ เพราะแตเดิมผูออกแบบตองมี
ความรูทางดานไอซีตางๆอยางมาก เพื่อนํามาประกอบบนลายวงจรพิมพ (Print Circuit Board : PCB)
ตองรองขอไปยัง ผูผลิตรายใหญให ทําเปน ASIC              ซึ่ง ตองทําเปน จํานวนมาก มี คา ใชจายสูง แกไข
ขอผิดพลาดไดยาก เพราะตองผลิตฮารดแวรใหมตั้งแตตน จึงทําใหใชระยะเวลาในการพัฒนานาน
          แตปจจุบันขั้นตอนการออกแบบใชวิธีเดียวกับการพัฒนาโปรแกรม คือสามารถใชภาษาอธิบาย
ฮารดแวร (Hardware Description Language : HDL) เพื่อเขียนแสดงฟงกชันขององคประกอบแตละตัวที่
ประกอบขึ้นเปนระบบได และนําเอาฟงกชันเหลานั้นไปเขียนลงบนอุปกรณ FPGA (Filed Programmable
Gate Arrays) ซึ่งเปนอุปกรณที่สามารถโปรแกรมใหทํางานตามฟงกชันที่ไดโปรแกรมไว เพื่อพัฒนาเปนไอซี
ทํางานตามตองการได โดยวิธีการนี้ผูออกแบบสามารถตรวจสอบการทํางานของฮารดแวรได โดยการ
จําลองการทํางานบน PC ทําใหแกไขเปลี่ยนแปลงไดตลอดเวลา ลดคาใชจายในการพัฒนา เพราะไมตอง
ใชไอซี และ PCB สามารถพัฒนาไดแมเพียงชิ้นเดียว (ตนแบบ) ระยะเวลาในการพัฒนาก็สั้นลง นอกจากนี้
ยังสามารถปกปดโครงสรางของวงจร/ระบบไวภายใน FPGA ได
          ดวยขอดีของการใชเทคโนโลยี FPGA ในการพัฒนาไมโครโปรเซสเซอรมีมากมายดังที่กลาวขางตน
ทําใหวิธีการออกแบบนี้มีความแพรหลายมากขึ้น และในอนาคตการผลิตชิป FPGA จะมากขึ้น ราคาก็จะ
ถูกลง จึงมีแนวคิดที่จะพัฒนาไมโครโปรเซสเซอร โดยการใชเทคโนโลยี FPGA และการเขียนโปรแกรม
ภาษา HDL ซึ่งไมโครโปรเซสเซอรนั้นสามารถประมวลผลตามคําสั่งไดอยางถูกตอง โดยทดสอบและจําลอง
การทํางานผานเครื่องคอมพิวเตอร นอกจากนี้ยังเปนการนําความรูจากการเรียนมาประยุกตใชใหเกิด
ประโยชนอีกดวย
                                                                                           2
1.2. วัตถุประสงคของโครงการ
     1. เพื่อพัฒนาไมโครโปรเซสเซอรบน FPGA
     2. เพื่อศึกษาการพัฒนาระบบสมองกลฝงตัว Embedded System บน FPGA
     3. เพื่อพัฒนาทักษะทางดานเทคโนโลยีระบบสมองกลฝงตัว

1.3. ขอบเขตของโครงการ
     โครงการนี้เปนการศึกษาและพัฒนาไมโครโปรเซสเซอร โดยใชวิธีการเขียนโปรแกรมภาษา VHDL ลง
                                                       ่
บน FPGA ไมโครโปรเซสเซอรที่ถูกพัฒนาขึ้นจะทํางานตามคําสัง โดยมีฟงกชันการทํางานหลักๆ ดังนี้
     1. การโอนยายขอมูล (Data Copy Operations)
     2. การคํานวณผลทางคณิตศาสตร (Arithmetic Operations)
     3. การคํานวณผลทางตรรกศาสตร (Logic Operations)
     4. การจัดการขอมูลระดับบิต (Bit manipulations)
     5. การดําเนินการแบบแยก (Branch Operations)
    โดยสามารถทดสอบและจําลองการทํางานของฟงกชันดังกลาวไดบนคอมพิวเตอร

1.4. แผนการดําเนินงาน
                                                                                         ี
       1. ศึกษาและรวบรวมขอมูลเกี่ยวกับการพัฒนาไมโครโปรเซสเซอร โดยใชเทคโนโลยี FPGA ที่มอยู
ในปจจุบัน
       2. ศึกษาการนําเทคโนโลยี FPGA มาใช และการเขียนภาษา VHDL ลงบน FPGA
                                     ั
       3. ออกแบบและกําหนดฟงกชนตางๆ ของไมโครโปรเซสเซอร
                               ่
       4. เขียน VHDL Code เพือกําหนดฟงกชันการทํางานของไมโครโปรเซสเซอร
                        ั
       5. ทดสอบฟงกชนการทํางานของไมโครโปรเซสเซอรบน FPGA
       6. สรุปผลการดําเนินการ และจัดทํารายงาน
                                                                           ุ
          การดําเนินการเปนไปตามแผนการดําเนินการขางตน โดยเริมตนเดือนมิถนายน พ.ศ.2549 และ
                                                                ่
สิ้นสุดเดือนกุมภาพันธ พ.ศ.2550 ซึ่งสามารถเขียนเปนตารางไดดังตารางที่ 1.1

1.5. ประโยชนที่คาดวาจะไดรับ
      1. ไดนําความรูที่ไดจากการเรียนมาประยุกตใชใหเกิดประโยชน
      2. ไดพัฒนาทักษะทางดานเทคโนโลยีระบบสมองกลฝงตัว
      3. ไดไมโครโปรเซสเซอร ซึ่งเขียนโดยภาษา VHDL บน FPGA
                                                                                                                3
                                      ตารางที่ 1.1 แผนการดําเนินงานโครงการ
                                                                          2006                         2007
       ID            แผนการดําาเนินการ
                         แผนการดํ เนิการ
                                                    มิ.ย.   ก.ค.   ส.ค.   ก.ย. ต.ค.   พ.ย.   ธ.ค.   ม.ค. ก.พ.
            ศึกษาและรวบรวมขอมูลเกี่ยวกับการพัฒนา
        1   ไมโครโปรเซสเซอร โดยใชเทคโนโลยี FPGA
            ที่มีอยูในปจจุบัน
        2   ศึกษาทฤษฎีและหลักการที่เกี่ยวของ

        3   ศึกษาการเขียนภาษา VHDL ลงบน FPGA

        4
            ออกแบบและกําหนดฟงกชันตางๆ
            ของไมโครโปรเซสเซอร

        5
            เขียนVHDL Codeเพื่อกําหนดฟงชชัน
            การทํางานของไมโครโปรเซสเซอร

        6
            ทดสอบฟงกชันการทํางานของ
            ไมโครโปรเซสเซอรบน FPGA
        7   สรุปผลการดํานินการ และจัดทํารายงาน



       สํา หรั บเนื้ อ หาในบทถั ด ไปของรายงานจะเป น การนํา เสนอทฤษฎี แ ละงานวิ จัย ที่เ กี่ ย วข อ งกั บ
โครงการ รายงานบทที่ 3 เป น การนํ า เสนอการออกแบบไมโครโปรเซสเซอร ส ว นการพั ฒ นา
ไมโครโปรเซสเซอร และผลการทดลองที่ไดจะอยูในรายงานบทที่ 4 และบทที่ 5 ตามลําดับ และบทสุดทาย
คือ บทที่ 6 จะเปนการสรุปผลการดําเนินโครงการ และขอเสนอแนะสําหรับการนําโครงการไปพัฒนาตอ
                                                                                                  4
                                       บทที่ 2
                              ทฤษฎีและงานวิจัยที่เกี่ยวของ

       รายงานบทนี้นําเสนอทฤษฎีและงานวิจัยที่เกี่ยวของกับการพัฒนาไมโครโปรเซสเซอรบน FPGA
โดยแบงการนําเสนอแบงเปน 2 สวน คือ สวนที่ 1 ทฤษฎีที่เกี่ยวของ เชน ความหมายและหลักการทํางาน
ของ Z80 ไมโครโปรเซสเซอร ขั้นตอนการกระทําการคําสั่ง และเทคโนโลยี FPGA รวมถึงการใชภาษา
VHDL และสวนที่ 2 งานวิจัยที่เกี่ยวของ จะกลาวถึงงานวิจัยที่มีลักษณะใกลเคียงกันและไดมีผูพัฒนาไว
กอนหนาซึ่งไดนํามาศึกษาเพื่อประกอบการพัฒนาโครงการ

2. 1 ทฤษฏีที่เกี่ยวของ
     ประกอบดวยเนื้อหาดังตอไปนี้
     - ไมโครโปรเซสเซอร Z80 (Z80 Microprocessor)
     - เทคโนโลยี FPGA (FPGA Technology)

2.1.1 ไมโครโปรเซสเซอร Z80 (Z80 Microprocessor)
      ไมโครโปรเซสเซอร คือ อุปกรณที่สามารถโปรแกรมได และเปนหนวยประมวลผลกลาง (CPU) ของ
ระบบคอมพิวเตอร [5] กลาวคือ ไมโครโปรเซสเซอรสามารถทํางานไดตามคําสั่งภายใตความสามารถที่
ไดรับการออกแบบมา และเมื่อนําไมโครโปรเซสเซอรมาประกอบกับหนวยความจํา และอุปกรณอินพุต/
เอาตพต ก็จะไดไมโครคอมพิวเตอร ดังแสดงในรูปที่ 2.1 โดยหนาตาของไมโครโปรเซสเซอรจะเปนวงจรรวม
       ุ
(Integrated Circuit: IC) ซึ่งประกอบดวย ALU รีจิสเตอร และหนวยควบคุมบนชิปเดียว




                      รูปที่ 2.1 แผนภาพระบบคอมพิวเตอร (ดัดแปลงจาก : [5])
                                                                                             5
     Z80 เปนไมโครโปรเซสเซอรขนาด 8 บิต โดยจะประกอบดวย 3 สวน คือ
• รีจิสเตอร (CPU Registers)
       ใชเก็บขอมูลระหวางการกระทําการคําสั่ง โดยรีจิสเตอรของ Z80 แบงเปน
 - รีจิสเตอรใชงานทั่วไป (General Purpose Registers) ไดแก รีจิสเตอร B C D E H และ L
 - ตัวสะสม และรีจิสเตอรแฟลก (Accumulator and Flag Registers) ไดแก รีจิสเตอร A และ F
 - รีจิสเตอรสํารอง (Alternate Registers) ไดแก รีจิสเตอร B’ C’ D’ E’ H’ L’ A’ และ F’
 - รีจิสเตอรใชงานเฉพาะอยาง (Special-Purpose Registers ) ไดแก ตัวนับโปรแกรม (PC) ตัวชี้
 - แสตก (SP) รีจิสเตอรดัชนี IX และ IY รีจิสเตอร I และ R
• หนวยคํานวณทางคณิตศาสตรและลอจิก (Arithmetic Logic Unit: ALU)
     ทําหนาที่กระทําการคําสั่งคํานวณทางคณิตศาสตรและทางลอจิก เชน
 - การบวก - การลบ
 - การดําเนินการลอจิกแอนด (Logical AND) - ลอจิกออร (Logical OR)
 - การดําเนินการลอจิกเอกคลูซีฟ (Logical Exclusive OR)
 - การหมุนหรือการเลื่อนบิตไปทางซายหรือทางขวา
 - การเปรียบเทียบ
 - การเพิ่มคา - การลดคา
 - การเซ็ตบิต - การรีเซ็ตบิต
 - การทดสอบบิต
• หนวยควบคุม (Control Unit)
      ทําหนาที่ในการควบคุมการทํางานทั้งหมดของ Z80 โดยการแปลคําสั่งที่ไปนํามาจากหนวยความจํา
และทําการสรางและสงสัญญาณควบคุมตางๆ ที่เหมาะสมกับคําสั่งนั้น เพื่อควบคุมการทํางานของ ALU
และอุปกรณภายนอก ซึ่งสัญญาณของ Z80 แบงออกเปน 6 กลุม ดังรูปที่ 2.2
 - บัสเลขที่อยู (Address Bus) ใชเพื่อสงเลขที่อยูรีจิสเตอรของหนวยความจําหรืออุปกรณอินพุต/
     เอาตพุต
 - บัสขอมูล (Data Bus) ใชเพื่อถายโอนขอมูลระหวาง Z80 กับหนวยความจําหรืออุปกรณอินพุต/
     เอาตพุต
 - สัญญาณควบคุม (Signal Controls) ใชเพื่อควบคุมการทํางานในการดําเนินการตางๆ
 - สัญญาณการขอจากภายนอก (External Request) เกิดจากแหลงกําเนิดภายนอก ใชเพื่อขัดจังการ
     ทํางานของ Z80 เพื่อใหทํางานอื่นแทน
 - สัญญาณตอบรับการขอและสัญญาณพิเศษ (Request Acknowledge and Special Signals) ใช
     เพื่อตอบรับการรองขอการขัดจังหวะจากสัญญาณในกลุมขางตน
                                                                                                     6
  - กําลังไฟฟาและสัญญาณความถี่ (Power and Frequency Signal) ใชเพื่อจายไฟเลี้ยง และปอน
    สัญญาณนาฬิกาให Z80 ทํางานไดอยางถูกตอง




                  รูปที่ 2.2 โครงสรางและสัญญาณตางๆ ของไมโครโปรเซสเซอร Z80
                                         (ดัดแปลงจาก: [5])

          Z80 มีขั้นตอนในการกระทําการคําสั่งใดๆ ในหนึ่งรอบคําสั่งเหมือนกันคือ
            1. การไปนํารหัสคําสั่ง
            2. การถอดรหัสคําสั่ง
            3. การปฏิบัติการตามคําสั่ง
โดยจะเปนวงจรตามขั้นตอนที่ 1-3 อยางนี้ไปเรื่อย ๆ จนกวาจะสิ้นสุดโปรแกรม
       ตัวอยางตอไปนี้เปนการแสดงขั้นตอนขณะ Z80 กระทําการคําสั่ง ADD A, (HL) ซึ่งจะเปนการ
ทํางานของการนํารหัสคําสั่ง (ขั้นตอนที่ 1-4) การถอดรหัสคําสั่ง (ขั้นตอนที่ 5) และการปฏิบัติตามคําสั่ง ใน
สวนนี้จะประกอบดวยการทํางานกับหนวยความจําไดแก การอานหนวยความจํา (ขั้นตอนที่ 6)
       1. สัญญาณควบคุม M1 จะแอกทีฟ ตัวนับโปรแกรม (PC) จะวางเลขที่อยู 2000H ลงบนบัสเลขที่อยู
ดังรูปที่ 2.3
       2. ตัวนับโปรแกรม (PC) จะเพิ่มคาของขอมูลที่เก็บอยูภายในขึ้น 1 เพื่อชี้ไปที่เลขที่อยูถัดไปของ
รีจิสเตอรในหนวยความจํา โดยหนวยควบคุมจะสราง และสงสัญญาณควบคุม MREQ และ RD ซึ่งเปน
Active Low เพื่อบอกวาเปนการอานหนวยความจําดังรูปที่ 2.4
       3. เมื่อวงจรถอดรหัสเลขที่อยู และสัญญาณควบคุมได หนวยความจําก็จะวางขอมูลลงบนบัสขอมูล
(86H) ดังรูปที่ 2.6
                                                                                                    7
        4. Z80 จะอานขอมูลเขามาสูบัสขอมูลภายใน เมื่อขอมูลครบแลว สัญญาณควบคุม MREQ และ
RD จะไมแอกทีฟ หนวยควบคุมจะสงสัญญาณควบคุม RFSH และ MREQ เพื่อทําการรีเฟรชบัสเลขที่อยู
        5. ขอมูลไบตแรกนี้จะเปนรหัสดําเนินการ (Opcode) ซึ่งตองถูกแปลโดยวงจรถอดรหัสคําสั่ง ซึ่งเมื่อ
แปลคําสั่งนี้ Z80 ก็จะทราบวาเปนประเภทคําสั่ง 1 ไบต และเปนหนาที่ของหนวยควบคุม ที่ควบคุมการ
ทํางานของ ALU และการถายโอนขอมูลไปยังที่ตางๆ ที่จําเปนในการปฏิบัติการตามคําสั่งนี้ แสดงไดดังรูป
ที่ 2.7
        6. คาที่ถูกเก็บอยูภายในรีจิสเตอร A (76H) จะถูกสําเนามาไวในวงจรแลตช รอตัวดําเนินการอีกตัว
ดังรูปที่ 2.8




                               รูปที่ 2.3 การทํางานวางเลขที่อยูลงบนบัสที่อยู
                                                                             8




รูปที่ 2.4 การเพิ่มคา PC Counter และสัญญาณรองขอการอานคาจากหนวยความจํา




                                   ้
                      รูปที่ 2.5 ขันตอนการนํารหัสคําสั่ง
                                                            9




รูปที่ 2.6 การนํารหัสคําสั่ง และการวางขอมูลลงบนบัสขอมูล




               รูปที่ 2.7 การถอดรหัสคําสั่ง
                                                                                        10




                         ้
            รูปที่ 2.8 ขันตอนการโหลดคาจากรีจิสเตอร A ไปเพื่อเตรียมการทํางาน




             ้
รูปที่ 2.9 ขันตอนการวางขอมูลจากรีจิสเตอร HL เพื่อเตรียมการโหลดขอมูลจากหนวยความจํา
                                                                                                    11
       7. คาที่ถูกเก็บอยูในคูรีจิสเตอร HL (2050H) จะถูกวางบนบัสเลขที่อยู เพื่อไปนําขอมูลที่อยูใน
รีจิสเตอรของหนวยความจําที่ตําแหนง 2050H โดยสัญญาณควบคุม MREQ และ RD เปน Active Low
ดังรูปที่ 2.9
       8. Z80 อานขอมูลจากบัสขอมูลที่หนวยความจําสงออกมา (A2H) สัญญาณควบคุม MREQ และ
RD ไมแอกทีฟ แลวนําขอมูลนั้นวางในแลตชกอนเขาปฏิบัติการใน ALU ดังรูปที่ 2.10
       9. เมื่อมีตัวดําเนินการพรอมแลว หนวยควบคุมจะสั่งให ALU บวกขอมูลทั้งสองเขาดวยกัน และสง
ผลลัพธที่ไดไปที่รีจิสเตอร A และทําการปรับปรุงคาในรีจิสเตอรแฟลก F ดังรูปที่ 2.11 เปนอันเสร็จสิ้นการ
กระทําการคําสั่ง ADD A, (HL)




                 รูปที่ 2.10 การนําขอมูลจากหนวยความจํา และนําขอมูลไปเตรียมการทํางาน

      ตัวอยางตอไปเปนการกระทํางานคําสั่ง LD (HL), A
            Address           Machine Code                 Instruction
            2003h             01110111 => 77H              LD (HL), A
      โดย HL เก็บคา 2350H สามารถแสดงขั้นตอนตางๆไดดังนี้
                                                                                         12
     1. สัญญาณควบคุม M1 จะแอกทีฟ ตัวนับโปรแกรม (PC) จะวางเลขที่อยู 2003H ลงบนบัสเลขที่อยู
ตามรูปที่ 2.12




                     รูปที่ 2.11 การทํางาน ADD แลวนําคาที่ไดไปเก็บในรีจิสเตอร




                                  รูปที่ 2.12 ขั้นตอนการวางบัสที่อยู
                                                                                                  13


       2. ตัวนับโปรแกรม (PC) จะเพิ่มคาของขอมูลที่เก็บอยูภายในขึ้น 1 เพื่อชี้ไปที่เลขที่อยูถัดไปของ
รีจิสเตอรในหนวยความจํา โดยหนวยควบคุมจะสราง และสงสัญญาณควบคุม MREQ และ RD ซึ่งเปน
Active Low เพื่อบอกวาเปนการอานหนวยความจํา ดังรูปที่ 2.13
       3. เมื่อวงจรถอดรหัสเลขที่อยู และสัญญาณควบคุมได หนวยความจําก็จะวางขอมูลลงบนบัสขอมูล
(77H) ดังรูปที่ 2.14
       4. Z80 จะอานขอมูลเขามาสูบัสขอมูลภายใน เมื่อขอมูลครบแลว สัญญาณควบคุม MREQ และ
RD จะไมแอกทีฟ หนวยควบคุมจะสงสัญญาณควบคุม RESH และ MREQ เพื่อทําการรีเฟรชบัสเลขที่อยู
แสดงไดดังรูปที่ 2.15
       5. ขอมูลไบตแรกนี้จะเปนรหัสดําเนินการ (Opcode) ซึ่งตองถูกแปลโดยวงจรถอดรหัสคําสั่ง ซึ่งเมื่อ
แปลคําสั่งนี้ Z80 ก็จะทราบวาเปนประเภทคําสั่ง 1 ไบต และเปนหนาที่ของหนวยควบคุม ที่ควบคุมการ
ทํางานของ ALU และการถายโอนขอมูลไปยังที่ตางๆ ที่จําเปนในการปฏิบัติการตามคําสั่งนี้ แสดงดังรูปที่
2.16




                                 รูปที่ 2.13 การเพิ่มคา PC Counter
                                             14




  รูปที่ 2.14 ขั้นตอนการนํารหัสคําสั่ง




รูปที่ 2.15 ขั้นตอนการนํารหัสคําสั่ง (ตอ)
                                                                                                                                                    15




                                                      รูปที่ 2.16 การถอดรหัสคําสั่ง


                                                                                                                    Data In/Out
  NMI/    Interrupt                                                        8                                                      8       D0 – D7
                                                                                                                      Buffer
  INT/     Control
                                                                                                 8




         Instruction
                       8                                                   Accumulator A        Flag F          Accumulator A’        Flag F’
          Register
                                                                                   B               C                   B’               C’
            8




                                                       8                           D               E                   D’               E’
                                                                                H ( 20 )        L ( 50 )               H’               L’
                           Internal Data Bus 8




         Instruction
          Decoder                                                                          Interrupt Vector          Memory
                                                                                                   I                Refresh R
                                                             ALU                                    Index Register IX              CPU
            8




   M1/
                                                                                                    Index Register IY             Register
MREQ/                                                                                               Stack Pointer SP
 IORQ/
                                                     8



                                                                   8




   RD/                                                                                                 PC Counter
   WR/                                               Latch
         Control                                                   Latch
                                                                                                            2050h




 WAIT/                                                76h
RESET/
BUSRQ/
          Logic
                                                 8                                                         Address
                                                                                                                        2050h A0 – A15
BUSAK/                                                                                                      Buffer
 RFSH/
 HALT/                                                 8
                                                                               + 5V GND Clock



                       รูปที่ 2.17 การนําคาจากรีจิสเตอร HL ไปวางบนบัสขอมูล
                                                                                                    16
                                                                                    ่
       จะเห็นไดวาขั้นตอนในสวนที่ผานมา จะมีลักษณะเหมือนกันตัวอยางกอนหนา นันเพราะเปนสวนของ
การไปนํารหัสคําสั่ง และการถอดรหัส ซึ่งจะมีรูปแบบเหมือนๆ กัน แตหลังจากที่ถอดรหัสมาแลวตอจากนั้น
จะเปนการทํางานตามคําสั่งที่ถอดรหัสมาได ซึ่งก็จะแตกตางกันไปตามรหัสนั้นๆ ในสวนนี้เมื่อถอดรหัสมา
พบวาเปนการโหลดคาลงสูหนวยความจํา
       6.คาที่ถูกเก็บอยูในคูรีจิสเตอร HL (2050H) จะถูกวางบนบัสเลขที่อยู เพื่อไปนําขอมูลที่อยูใน
รีจิสเตอรของหนวยความจําที่ตําแหนง 2050H โดยสัญญาณควบคุม เปน Active Low ดังรูปที่ 2.17
       7.คาที่ถูกเก็บอยูภายในรีจิสเตอร A (ในที่นี้สมมติใหเปน 18H) จะถูกนํามาวางไวบนบัสขอมูล เพื่อ
รอการเขียนลงหนวยความจํา สัญญาณ MREQ ยังคงแอคทีฟ เพื่อเปนการเตรียมการเขียนขอมูลใหแก
บัสขอมูล ดังรูปที่ 2.18
       8.เมื่อเตรียมการพรอมแลว จะมีสัญญาณ MREQ และ WR แอคทีฟ เพื่อทําการเขียนขอมูลจาก
บัสขอมูล ลงสูหนวยความจําตําแหนงที่อยูบนบัสที่อยู ดังรูปที่ 2.19



                                                                  18h
                8




                            Internal Data Bus 18h
                8




                                                    8



                                                        8




                                                                        2000H




                     รูปที่ 2.18 การโหลดคาจากรีจิสเตอร A ไปรอการทํางานบนบัสขอมูล
                                                                                    17




                                                                       8
         8




                   Internal Data Bus 18h
         8




                                           8



                                                   8




                                                                            2050h
                                                          
                   รูปที่ 2.19 การเขียนคาจากบัสขอมูลลงสูหนวยความจํา

ตอไปเปนตัวอยางการทํางานสงขอมูลออกทางอุปกรณเอาตพุต




                                           รูปที่ 2.20 การทํางานของคําสั่ง OUT
                                                                                               18
                Address            Machine Code                    Instruction
                    2050h          11010011 => D3H                 OUT (07H) , A
                    2051h          00000111 => 07H
      จากรูปที่ 2.20 แสดงการทํางานของคําสั่ง OUT (07H) , A ซึ่งใน 2 แมชชีนไซเคิลแรกจะเปนการไป
นํารหัสคําสั่ง และการอานหนวยความจําตามลําดับ ซึ่งไดอธิบายไปแลว ในที่นี้จึงขออธิบายในสวนแมชชีน
ไซเคิลที่ 3 ซึ่งเปนการเขียนขอมูลออกไปยังอุปกรณเอาตพุต เปนตามขั้นตอนดังนี้
      1.ที่ T1 Z80 จะวางเลขที่อยูพอรตเอาตพุตลงบนบัสเลขที่อยูลําดับต่ํา (ในที่นี้คือพอรต 07H)
      2.ที่ขอบขาขึ้นของของ T2 Z80 จะวางคาที่อยูภายในตัวสะสม A ลงในบัสขอมูล ดังรูปที่ 2 .21




           รูปที่ 2.21 แมชชีนไซเคิล ที่เวลา T1 และ T2 ของการเขียนขอมูลออกทางอุปกรณเอาตพุต

      3.ระหวางชวง T2 ตัว Z80 จะสงสัญญาณควบคุม IORQ และ WR เพื่อบอกวาเปนการสงขอมูลไป
ยังอุปกรณ โดยขอมูลที่อยูบนบัสเลขที่อยูและบัสขอมูลจะตองไมมีการเปลี่ยนแปลง ดังรูปที่ 2.22
      4.หลังจาก T2 - T3 จะมีการเพิ่มสภาวะการรอเขาไปโดยอัตโนมัติ เพื่อรอการตอบสนองของอุปกรณ
      5.ระหวาง T4 Z80 จะทําใหสัญญาณควบคุมเหลานั้นไมแอกทีฟ
                                                                                         19




                                                                             8
            8




                      Internal Data Bus (8)
            8




                                               8



                                                        8




     รูปที่ 2.22 แมชชีนไซเคิล ระหวางเวลา T2 ของการสงขอมูลออกทางอุปกรณเอาตพต
                                                                               ุ

                                     ิ
ตัวอยางการทํางานรับขอมูลจากอุปกรณอนพุต
      Address              Machine Code                                    Instruction
      2065h                       DBH                                      IN A, (84H)
      2066h                       84H




                                              รูปที่ 2.23 การทํางานของคําสั่ง IN
                                                                                                    20
      จากรูปที่ 2.23 แสดงการทํางานของคําสั่ง IN A, (84H) ซึ่งขั้นตอนการทํางานจะเหมือนกับการ
ทํางานของคําสั่ง OUT แตจะตางกันตรงสัญญาณควบคุม WR ที่สงไปในแมชชีนไซเคิลที่ 2 ถาเปนคําสั่ง
IN สัญญาณที่สงไปจะเปนสัญญาณ RD ดังรูปที่ 2.24 และขอมูลที่วางบนบัสขอมูลเปนขอมูลที่รับจาก
อุปกรณภายนอก ซึ่งจะถูกวางระหวางเวลา T4 ดังรูปที่ 2.25




                รูปที่ 2.24 แมชชีนไซเคิล ระหวางเวลา T2 ของการรับขอมูลจากอุปกรณอินพุต

การขัดจังหวะของ Z80
      การขัดจังหวะแบงไดเปน 2 แบบคือแบบที่สามารถกําบังได และแบบที่ไมสามารถกําบังได แบบแรก
สามารถทําใหทํางาน (Enable) หรือทําใหไมทํางานได (Disable) Z80 อาจไมตอบสนองการขอขัดจังหวะ
ประเภทนี้ได ถาหากกําลังทํางานที่สําคัญอยู แต Z80 ตองตอบสนองการขัดจังหวะแบบที่ไมสามารถกําบัง
ไดทันที ไมวามันจะทํางานอะไรอยูก็ตาม (Disable ไมได)
      การขัดจังหวะแบบสามารถกําบังไดมี 3 โหมด คือ โหมด 0 1 และ 2 อธิบายไดดังตารางที่ 2.1

                          ตารางที่ 2.1 รายละเอียดของการขัดจังหวะโหมดตางๆ
          โหมด           ตําแหนงหนวยความจําที่ถาย     ใชเลขที่อยูในรีจิสเตอร   ใชฮารดแวร
                              โอนไปกระทําการ            เวคเตอรการขัดจังหวะ (I)      ภายนอก
            0            0000H,0008 H,0010 H,0018 H,
                          0020 H,0028 H,0030 H,0038 H
            1                        0038 H
            2                     ตําแหนงใดๆ
                                                                                             21




              รูปที่ 2.25 แมชชีนไซเคิล ระหวางเวลา T4 ของการรับขอมูลจากอุปกรณอินพุต

   การทํางานในเชิงเวลาของการขัดจังหวะแสดงไดดังรูปที่ 2.26 ซึ่งกระบวนการ จะเปนตามขั้นตอนดังนี้




                         รูปที่ 2.26 การดําเนินการขัดจังหวะของ Z80 เชิงเวลา

    1. ถาการขัดจังหวะถูก Enable ไว Z80 จะสุมสัญญาณการขอขัดจังหวะ INT ที่ T-State สุดทายของ
แตละคําสั่ง สัญญาณการขอขัดจังหวะที่สุมไดเปน High แสดงวาไมมีการขอขัดจังหวะ แตถาเปน Low
แสดงวามีการขอขัดจังหวะ ตามรูป 2.27 แตถาการขัดจังหวะถูก Disable ไว จะไปนําคําสั่งถัดไป
    2. Z80 จะทําการ Disable การขัดจังหวะ และตอบรับการขอขัดจังหวะโดยการสงสัญญาณ M1 และ
IORQ สําหรับการขัดจังหวะโหมด 0 ทั้งสองสัญญาณจะถูกนําไปสรางเปนสัญญาณ INTA เพื่อ Enable
                                                                                                                                                                                                 22
ฮารดแวรภายนอกใหวางรหัสคําสั่ง RST ลงบนบัสขอมูลตามรูปที่ 2.28 แตการขัดจังหวะโหมด 1 เราจะได
รหัสคําสั่ง RST 38H ทันที สวนการขัดจังหวะโหมด 2 จะใชฮารดแวรภายนอกเหมือนโหมด 0

                                                                                                                                                    Data In/Out
         NMI/           Interrupt                                                                        8                                                                     8       D0 – D7
                                                                                                                                                      Buffer
         INT/            Control


                       Instruction
                                     8                                                                   Accumulator A            Flag F       Accumulator A’                      Flag F’
                        Register
                                                                                                                B                   C                     B’                         C’
                                                                            8                                   D                   E                     D’                         E’

                    Instruction                                                                                 H                   L                     H’                         L’
                                                                                                                           Interrupt Vector          Memory
                     Decoder                                                                                                       I                Refresh R
                                                                                  ALU                                                Index Register IX                          CPU
        M1/
                                                                                                                                     Index Register IY                         Register
     MREQ/                                                                                                                           Stack Pointer SP
      IORQ/
        RD/                                                                                                                        Program Counter PC
        WR/
                      Control                                             Latch           Latch
     WAIT/
    RESET/
    BUSRQ/
                       Logic
                                                                    8                                                                      Address                        A0 – A15
                                                                                                                                                               16
    BUSAK/                                                                                                                                  Buffer
     RFSH/
     HALT/                                                                  8
                                                                                                             + 5V GND Clock

                                                             รูปที่ 2.27 การสุมสัญญาณการขอขัดจังหวะ

                                                                                                                                            Data In/Out
  NMI/           Interrupt                                                                        8                                                                 8       D0 – D7
                                                                                                                                              Buffer
  INT/            Control
                                                                                                                          8




                Instruction
                                8                                                                 Accumulator A          Flag F         Accumulator A’                  Flag F’
                 Register
                                                                                                         B                 C                   B’                         C’
                   8




                                                                    8                                    D                 E                   D’                         E’
                                                                                                         H                 L                   H’                         L’
                                     Internal Data Bus (8)




           Instruction
                                                                                                                    Interrupt Vector        Memory
            Decoder                                                                                                         I              Refresh R
                                                                          ALU                                               Index Register IX                        CPU
                   8




   M1/
                                                                                                                            Index Register IY                       Register
MREQ/                                                                                                                       Stack Pointer SP
 IORQ/
                                                                  8



                                                                                  8




   RD/                                                                                                                    Program Counter PC
   WR/
                Control                                           Latch           Latch
 WAIT/
RESET/
BUSRQ/
                 Logic
                                                              8                                                                   Address                      A0 – A15
                                                                                                                                                     16
BUSAK/                                                                                                                             Buffer
 RFSH/
 HALT/                                                              8
                                                                                                      + 5V GND Clock

                              รูปที่ 2.28 การสงสัญญาณตอบรับการขอขัดจังหวะ M1 และ IORQ
                                                                                                        23
       3.Z80 จะรับขอมูลจากบัสขอมูลมาตีความ และเก็บเลขที่อยูของคําสั่งถัดไปไวในแสตกที่ตําแหนง
แสตก-1 และแสตก-2 สําหรับเลขที่อยูลําดับสูงและเลขที่อยูลําดับต่ําตามลําดับ ตามรูปที่ 2.29
       4. สําหรับการขัดจังหวะโหมด 2 ขอมูลขนาด 8 บิตที่ไดจากฮารดแวรภายนอกเปนเลขที่อยูลาดับต่ํา ํ
                                                                                                        ่
จะถูกนํามารวมกับเลขที่อยูลําดับสูงซึ่งอยูในรีจิสเตอรเวคเตอรการขัดจังหวะ (I) เปนตําแหนงที่เก็บเลขทีอยู
ของโปรแกรมบริการ ตามรูปที่ 2.30
       5. โปรแกรมจะถูกโอนยายไปที่โปรแกรมบริการตามเลขที่อยู ซึ่งถูกกําหนดไวในตําแหนงดังกลาว
และกระทําการตามคําสั่งที่อยูในโปรแกรมนั้น ตามรูปที่ 2.31
       6. เมื่อสิ้นสุดคําสั่งในโปรแกรมบริการจะมีคําสั่ง EI เพื่อ Enable การขัดจังหวะขึ้นมาใหม และคําสั่ง
RET จะนําเลขที่อยูคําสั่งถัดไปของโปรแกรมหลักจากแสตกมาไวที่ PC และไปนําคําสั่งที่ตําแหนงนั้นมา
ดําเนินการตอไป ตามรูปที่ 2.32




                                                                          ่
                รูปที่ 2.29 การรับขอมูลที่บัสขอมูลและเก็บเลขที่อยูคําสังถัดไปไวในแสตก
                                                                                                                                      24




                 รูปที่ 2.30 การตีความขอมูลจากบัสขอมูลและรีจิสเตอรที่เกี่ยวของ



                                                                                                   Data In/Out
  NMI/     Interrupt                                          8                                                     8       D0 – D7
                                                                                                     Buffer
  INT/      Control


          Instruction
                          8                                   Accumulator A        Flag F        Accumulator A’         Flag F’
           Register
                                                                     B               C                 B’                 C’
                                          8                          D               E                 D’                 E’

         Instruction                                                 H               L                 H’                 L’
                                                                              Interrupt Vector      Memory
          Decoder                                                                     I            Refresh R
                                                ALU                                   Index Register IX              CPU
   M1/
                                                                                      Index Register IY             Register
MREQ/                                                                                 Stack Pointer SP
 IORQ/
   RD/                                                                              Program Counter PC
   WR/
 WAIT/
          Control                       Latch         Latch
RESET/
BUSRQ/
           Logic
                                    8                                                       Address               A0 – A15
                                                                                                            16
BUSAK/                                                                                       Buffer
 RFSH/
 HALT/                                    8
                                                                  + 5V GND Clock


                       รูปที่ 2.31 การถายโอนโปรแกรมไปยังเลขที่อยูโปรแกรมบริการ
                                                                                                                              25

                                                                                           Data In/Out
  NMI/     Interrupt                                  8                                                     8       D0 – D7
                                                                                             Buffer
  INT/      Control


          Instruction
                        8                             Accumulator A        Flag F        Accumulator A’         Flag F’
           Register
                                                             B               C                 B’                 C’
                                  8                          D               E                 D’                 E’

         Instruction                                         H               L                 H’                 L’
                                                                      Interrupt Vector      Memory
          Decoder                                                             I            Refresh R
                                        ALU                                   Index Register IX              CPU
   M1/
                                                                              Index Register IY             Register
MREQ/                                                                         Stack Pointer SP
 IORQ/
   RD/                                                                      Program Counter PC
   WR/
          Control               Latch         Latch
 WAIT/
RESET/
BUSRQ/
           Logic
                            8                                                       Address               A0 – A15
                                                                                                    16
BUSAK/                                                                               Buffer
 RFSH/
 HALT/                            8
                                                          + 5V GND Clock

                                                                               ่
     รูปที่ 2.32 การนําเลขที่อยูคําสั่งถัดไปจากแสตกและโอนยายการทํางานกลับมาทีโปรแกรมหลัก

2.1.2 เทคโนโลยี FPGA (FPGA Technology)
      FPGA (Field Programmable Gate Array) เปนอุปกรณที่สามารถโปรแกรมใหเปนวงจรดิจิตอลได
ตามตองการ การโปรแกรม FPGA สามารถทําไดโดยการโหลดขอมูลวงจร (Configuration data) ลงไปยัง
หนวยความจําแรมภายใน FPGA ทําใหสามารถโปรแกรมซ้ําได โดยแบงขั้นตอนการพัฒนาวงจรดิจิตอล
ดวย FPGA เปน 5 ขั้นตอนหลักๆ ดังนี้
       1. การออกแบบวงจร
       2. การตรวจสอบวงจรที่ออกแบบ
       3. การสังเคราะหวงจรที่ออกแบบ
       4. การอิมพลีเมนตวงจร
       5. การโปรแกรมขอมูลลงบนชิป
      สําหรับขั้นตอนในการออกแบบวงจรสามารถนั้น ใชวิธีการเขียนโปรแกรมภาษา VHDL (VHIC
Hardware Description Language) ซึ่งเปนภาษาบรรยายฮารดแวรประเภทหนึ่ง ที่ถูกพัฒนาขึ้นเพื่อขยาย
ขีดความสามารถในการออกแบบวงจรรวมใหสูงขึ้น และสามารถทําไดงายมากยิ่งขึ้น ไมวาการออกแบบ
วงจรจะซับซอนมากนอยเพียงใด ทําใหการพัฒนาวงจรมีความสะดวก และยืดหยุนมากขึ้น
                                                                                                             26
2.2 งานวิจัยที่เกี่ยวของ
        เนื้ อ หาในส ว นนี้ ป ระกอบด ว ยการนํ า ทฤษฎี ที่ ก ล า วในส ว นที่ 1 มาประยุ ก ต ใ ช ใ นการพั ฒ นา
ไมโครโปรเซสเซอร ซึ่งไดแกไมโครโปรเซสเซอรตระกูล MCS-51 PIC และ Z80 ซึ่งในโครงการนี้จะใช Z80
เปนตนแบบในการพัฒนา
        ในประเทศไทยเพิ่งจะมีความสนใจในการพัฒนาไมโครโปรเซสเซอรโดยใชเทคนิคของ FPGA เมื่อไม
นานนัก สวนใหญเปนการพัฒนาเพื่อสรางไมโครโปรเซสเซอรที่มีลักษณะการทํางานเหมือน (Compatible)
กับการทํางานของไมโครโปรเซสเซอรที่นิยมใชกันในประเทศ เชน PIC และ MCS51 เนื่องจากความคุนเคย
ในการใชงาน สําหรับงานวิจัยในประเทศสามารถยกตัวอยางการพัฒนาแบงตามไมโครโปรเซสเซอรที่
พัฒนาเชน
2.2.1 MCS-51
        ไดมีการพัฒนาชิป 8051 High Speed Microcontroller โดยนายชํานาญ ปญญาใส เปนหัวหนา
กลุมผูวิจัย [2] เปนการออกแบบ High Speed Microcontroller ขนาด 8 บิต ในตระกูล MCS51 ซึ่งเปน
ของบริษัท intel เปนไมโครคอนโทลเลอรตระกูลที่ไดรับความนิยมกันมาก ในการทํางานนั้นจะตองใช
สัญญาณ 12 สัญญาณนาฬิกาตอ 1 แมชชีนไซเคิลแตในงานวิจัยนี้จะไดออกแบบใหทํางานที่สัญญาณ
นาฬิกา 4 สัญญาณตอ 1 แมชชีนไซเคิล ในการออกแบบและพัฒนานั้นไดทดสอบบนชิป FPGA โดยมี
จุดประสงคเพื่อใหเปนตนแบบในการพัฒนาไมโครคอนโทลเลอรที่มีความเร็วสูง
        สําหรับผลของการพัฒนาไดพบวาสามารถที่จะรองรับคําสั่งบน 8051 ไดครบทุกคําสั่ง ยกเวนแตสวน
ที่ตองมีการอินเทอรรัป โดยไดทดสอบโดยเขียนโปรแกรมในรูปแบบตางๆ สําหรับแตละคําสั่ง แลวสง
ผลลัพธไปแสดงที่ Acc LED display และตรวจสอบ Flag ที่ PSW LED แตจากการประมวลผลที่ได ยังมี
ความเร็วไมเปนที่นาพอใจ สวนหนึ่ง ทางผูพัฒนาบอกวาเปนเพราะเปนการจําลองการทํางานลงบน FPGA
ยังไมไดสรางลงบนแผนวงจรรวมจริงๆ ซึ่งจะทําใหความเร็วของการประมวลผลสูงขึ้น
        จากงานวิจัยชิ้นนี้จะพบวา เปนการสรางไมโครคอนโทลเลอรขนาด 8 บิต เชนเดียวกับ Z80 แต
ขณะเดียวกันก็ไดออกแบบใหสามารถทํางานที่ความเร็วสูงขึ้นดวย โดยการออกแบบใหใชสัญญาณนาฬิกา
นอยลง ทําใหการพัฒนาซับซอนกวา สําหรับโครงการที่เราจะพัฒนาเปนการทํางานของ Z80 โดยใช FPGA
ใหมีความสมบูรณมากที่สุด
2.2.2 PIC
        สําหรับการพัฒนาไมโครโปรเซสเซอรที่อยูในตระกูล PIC นั้นไดพบตัวอยางของการพัฒนาโดยใช
FPGA ที่นาสนใจอยูเชนกันโดยที่จะยกมาเปนการพัฒนาโดย คุณ ธีรยศ เวียงทอง ซึ่งเปนอาจารยประจํา
ภาควิชาอิเล็กทรอนิกส มหาวิทยาลัยเทคโนโลยีมหานคร [3] โดยเปนการวิจัยเพื่อทดลองทําแลปสราง
ไมโครคอนโทลเลอร โดยใช FPGA ในการทดลองใชชิป SPARTAN II XC2S100 (Total Block RAM
40Kbits:256x12) ทํางานเปน PIC               ไมโครคอนโทลเลอร การทํางานของสวนโครงสรางภายใน PIC
                                                                                                27
Microcontroller ตระกูล PIC16C5X จะมีโครงสรางภายในประกอบดวย ALU ขนาด 8 บิต Working
register (W) ขนาด 8 บิต ที่ใชงานสําหรับ ALU ROM ขนาด 256x12 มีรีจิสเตอรที่ใชงานได ตั้งแต R8-
R31 และมีพอรตอินพุต คือ Port A และ Port C และมี พอรทเอาทพุท คือ Port B
        ในการทดลองจะเปนการทดลองสรางไมโครคอนโทลเลอรเพื่อทําการบวกคาแลวแสดงออกที่ Port B
        โดยทดลองใชการทํางานจาก PIC ไมโครคอนโทลเลอรที่สรางโดยใชภาษา VHDL
        จากงานวิจัยนี้จะเปนการสรางและทดลอง ไมโครคอนโทลเลอรบนชิปของ FPGA โดยใชการเขียน
โปรแกรมทดลองเพื่อใหทํางานจริง ซึ่งจะเปนการทํา VHDL ที่มีอยูแลวมาทดสอบการทํางาน ซึ่งตัว VHDL
เวอรชั่นที่ทดสอบไดเขียนขึ้นโดย Viktor Fischer แหง University of St-Etienne ในป 2003 แตสําหรับ
โครงการของเราจะเปนการเขียน VHDL ของไมโครโปรเซสเซอรขึ้นมาเอง
2.2.3 Z80
        ไดมีงานวิจัยที่ทําโดยนารีนาถ รักสุนทร และ กรกฏ วัฒนวิเชียร ภาควิชาวิศวกรรมไฟฟา คณะ
วิศวกรรมศาสตร มหาวิทยาลัยเกษตรศาสตร [1] ไดทําการออกแบบไมโครโปรเซสเซอรขนาด 8 บิตโดยใช
ชิป FPGA มีการทํางานคําสั่ง 80 คําสั่ง ประกอบดวยบัสขอมูลขนาด 8 บิต และ บัสที่อยู 16 บิต โดยการ
ทํางานไดยึดตามการทํางานของ Z80
        ในงานวิจัยนี้ไดนําเสนอถึงการอกแบบไมโครโปรเซสเซอรที่จะใชควบคุมการหมุนของ ดีซีมอเตอร ทํา
การทดสอบโดยใช FPGA โดยใชโปรแกรม OrCAD SDT&VST 386+ ในการพัฒนา ใชสัญญาณนาฬิกาที่
ความเร็ว 1 MHz ในการทํางาน ไดผลการทดลองวาสามารถทํางานไดครบตามที่ออกแบบ แตการทํางาน
จะแบงการทํางานลงเปน 3 สวนแลวแบงลงบน ชิป 2 ตัว
                                                                                        ํ
        จากงานวิจัย จะเห็นวาเปนการพัฒนาของ ไมโครโปรเซสเซอรตระกูล Z80 แตจะเนนใหทางานเฉพาะ
คําสั่งที่ตองการสําหรับการทํางานควบคุมดีซีมอเตอรเทานั้น และการทํางานยังไดแบงลงบนชิป 2 ตัวจึงทํา
ใหมีเวลาหนวงในการสงมูลระหวางชิปอีกดวย ในสวนของโครงการเราจะเปนการสรางการทํางานของ Z80
ใหครอบคลุมการทํางานของ Z80 มากที่สุดโดยไมเฉพาะเจาะจงวาเพื่องานใดงานหนึ่ง
        ในสวนของงานวิจัยจากตางประเทศพบวามีงานที่พฒนาที่สราง CPU Z80 โดยใชชื่อวา T80 [5] โดย
                                                       ั
มีความสามารถในการทํางานสมบูรณเกือบ 100 % สามารถทํางานที่ความเร็ว 35 MHz ใน บอรดของ
Spartan2 -5 รองรับการทํางานสวนอินเตอรรัปทั้งหมด ลักษณะการทํางานของรีจิสเตอรและตารางเวลา
ถูกตองตามการทํางานของตัว Z80 สามารถทํางานไดทั้งแบบเขาจังหวะและแบบไมเขาจังหวะ
                                                                                                 28
                                      บทที่ 3
                             การออกแบบไมโครโปรเซสเซอร

      รายงานบทนี้เปนการนําเสนอการออกแบบไมโครโปรเซสเซอรที่จะทําการพัฒนา โดยแบงเนื้อหาเปน
5 สวน จะกลาวถึงรูปแบบของไมโครโปรเซสเซอรที่พัฒนา สวนประกอบตางๆ วิธีการกระทําคําสั่ง ขั้นตอน
การพัฒนา เครื่องมือที่ใชทดสอบ และวิธีการทดสอบตามลําดับ

3.1 รูปแบบของไมโครโปรเซสเซอร
       รูปแบบของไมโครโปรเซสเซอรที่พัฒนา เปนไมโครโปรเซสเซอรขนาด 8 บิตโดยอางอิงการทํางานมา
จากไมโครโปรเซสเซอรตระกูล Z80 ประกอบไปดวยสัญญาณทั้งหมดแบงได 5 กลุม ดังรูปที่ 2.2
ไมโครโปรเซสเซอรที่ออกแบบสามารถกระทําคําสั่งเบื้องตนของ Z80 แบงตามลักษณะการทํางานได 5
กลุม ประกอบดวยสวนตาง ๆ 3 สวนหลักคือ หนวยควบคุม หนวยคํานวณ และสวนที่ทําหนาที่เก็บคา
3.1.1 สัญญาณของไมโครโปรเซสเซอร
       การทํางานของไมโครโปรเซสเซอรจะตอ งมีก ารติดต อกับอุ ปกรณภายนอก เชน หนว ยความจํา
สัญญาณนาฬิกา เปนตน การติดตอตางๆ จะกระทําในรูปแบบของสัญญาณ สามารถแบงกลุมสัญญาณ
ตางๆ ได 5 กลุม ดังนี้
       1.บัสเลขที่อยู (Address Bus) มีขนาด 16 บิต ใชเพื่อสงเลขที่อยูรีจิสเตอรของหนวยความจําหรือ
อุปกรณอินพุต/เอาตพุต
       2.บัสขอมูล (Data Bus) มีขนาด 8 บิต ใชเพื่อถายโอนขอมูลระหวาง Z80 กับหนวยความจําหรือ
อุปกรณอินพุต/เอาตพุต
       3.สัญญาณควบคุม (Control Signals) ใชเพื่อควบคุมการทํางานในการดําเนินการตางๆ เชน การอาน
หนวยความจําหรืออุปกรณอินพุต การเขียนคาลงหนวยความจําหรืออุปกรณเอาทพุต สัญญาณรองขอการ
ทํางานกับอุปกรณตางๆ เปนตน
       4.กําลังไฟฟาและสัญญาณความถี่ (Power and Frequency Signal) ใชเพื่อจายไฟเลี้ยง และปอน
สัญญาณนาฬิกาใหไมโครโปรเซสเซอรสามารถทํางานได ในการออกแบบ ไมโครโปรเซสเซอรที่พัฒนาจะ
เปนการจําลองการทํางานบนเครื่องคอมพิวเตอร จึงไมจําเปนตองมีการจายไฟเลี้ยง บอรดที่ใชทําการ
ทดลองก็มีการออกแบบสวนของไฟเลี้ยงไวแลวเชนกัน
       5.สัญญาณการรองจากภายนอก (External Request) จะใชเพื่อควบคุมการทํางานของ
ไมโครโปรเซสเซอรอีกที เชน สัญญาณเพื่อรอการทํางานของอุปกรณอ่น สัญญาณรีเซต เปนตน
                                                                 ื
     อนึ่ง นอกเหนือจากสัญญาณดังที่กลาวแลว ตัวไมโครโปรเซสเซอร Z80 จะประกอบไปดวยสัญญาณ
ขัดจังหวะ ซึ่งจะเปนการรองขอจากภายนอก เพื่อขัดจังหวะการทํางานโดยปกติของไมโครโปรเซสเซอร ใหยาย
                                                                                                  29
การทํางานไปทํางานในสวนที่มีการขัดจังหวะ หลังจากนั้นจึงกลับไปทําในสวนปกติตอไป สวนนี้จะเปนการ
ทํางานในสวนที่ซับซอนยิ่งขึ้นไป ในเบื้องตนจึงยังไมนําการทํางานในสวนนี้มาทํางานดวย นอกจากนี้ยังมี
สัญญาณควบคุมการทํางานเฉพาะทาง เชน สัญญาณรีเฟรชเพื่อใหคาในหนวยความจําคงอยู เปนตน
                                                                    
3.1.2 ฟงกชันของไมโครโปรเซสเซอร
       ไมโครโปรเซสเซอรที่พัฒนา จะสามารถทํางานในฟงกชันการทํางานหลักๆ ได 5 ประเภท โดยจะ
               ่
อางอิงชุดคําสังของ Z80 ไดแก
       1. การคัดลอกขอมูล (Data Copy Operations) เชน คําสั่ง โหลดคาเขาสูรีจิสเตอร เปนตน
       2. การคํานวณผลทางคณิตศาสตร (Arithmetic Operations) เชน คําสั่งบวกคา ลบคา เปนตน
                                                                  ่
       3. การคํานวณผลทางตรรกะ (Logic Operations) เชน คําสัง AND คําสั่ง OR เปนตน
       4. การจัดการขอมูลระดับบิต (Bit Manipulations) เชน การเลื่อนบิตทางซาย ทางขวา เปนตน
       5. การทํางานแบบกาวกระโดด (Branch Operations) เชน การยายตําแหนงการทํางาน เปนตน
                                                                          ั      ่
       การทํางานนอกเหนือจากนี้ เชน การขัดจังหวะ จะตองใชความรูที่ซบซอนยิงขึ้น ในเบื้องตนจึงยังไม
ออกแบบใหไมโครโปรเซสเซอรทํางานในสวนนี้

3.2 สวนประกอบภายในไมโครโปรเซสเซอร
     การทํางานของอุปกรณอิเล็กทรอนิกสโดยทั่วไปจะประกอบไปดวย สวนรับขอมูลเขา สวนสงขอมูล
                                 ํ
ออก สวนหนวยความจํา และสวนที่ทาการคํานวณการทํางานตางๆ ซึ่งก็คือไมโครโปรเซสเซอร ภายใน
ไมโครโปรเซสเซอรจะประกอบไปดวยสวนประกอบยอยๆภายในหลายสวน ในแตละสวนทําหนาที่ตางๆกัน
ไป โครงสรางภายในจะประกอบดวยสวนประกอบหลักดังรูปที่ 3.2 คือประกอบดวย รีจิสเตอร หนวย
คํานวณทางคณิตศาสตรและลอจิก และหนวยควบคุม




                          รูปที่ 3.2 โครงสรางภายในของไมโครโปรเซสเซอร
                                                                                                    30
3.2.1 รีจิสเตอร (Registers)
                                                                       ่               ํ
       รีจิสเตอรเปนสวนที่ใชเก็บสํารองขอมูลระหวางการกระทําการคําสัง เก็บคาที่ใชทาการคํานวณ โดย
แบงเปน
                             ่
       1. รีจิสเตอรใชงานทัวไป (General Purpose Registers) ใชเพื่อเก็บคาในระหวางการทํางาน ไดแก
รีจิสเตอร B C D E H และ L รีจิสเตอรเหลานี้สามารถที่จะนํามาจับคูกันเพื่อทํางานในลักษณะของ 16 บิต
ได ไดแกคูรีจิสเตอร BC HL DE
       2. ตัวสะสม และรีจิสเตอรแฟลก (Accumulator and Flag Registers) ไดแก รีจิสเตอร A และ F จะ
เปนรีจิสเตอรที่สามารถทํางานรวมกับสวนคํานวณหรือ ALU ได โดย รีจิสเตอร A จะเปนตัวทีทําการ    ่
คํานวณ สวนรีจิสเตอร F เปนตัวที่เก็บคาสถานะของการทํางานคําสั่ง เชน คาเปนศูนย คาเปนลบ เปนตน
       ในไมโครโปรเซสเซอร Z80 จะประกอบไปดวยรีจิสเตอรอีก 8 ตัว คือ รีจิสเตอรสํารอง A’ B’ C’ D’ E’
H’ L’ และ F’ เพื่อทํางานเสริมหากจํานวนรีจิสเตอรไมเพียงพอ แตในไมโครโปรเซสเซอรที่ไดทําการออกแบบ
ไดตัดสวนนี้ออกไป เพื่อใหการชอบเขตการทํางานเหมาะสมแกเวลา
       3. รีจิสเตอรใชงานเฉพาะอยาง (Special-Purpose Registers) ไดแก ตัวนับโปรแกรม (PC) เพือชี้   ่
ตําแหนงของการทํางาน ตัวชี้แสตก (SP)
        นอกจากนี้ ในไมโครโปรเซสเซอร Z80 จะประกอบไปดวยรีจิสเตอรอื่นๆ อีกเชน รีจิสเตอร IX IY ซึ่ง
เปนรีจิสเตอรขนาด 16 บิตที่จะใชชี้ตําแหนงในหนวยความจํา รีจิสเตอร I ซึ่งจะทํางานรวมกับการขัดคําสั่ง
          ่
ในสวนทีกลาวนี้ ไมโครโปรเซสเซอรที่พัฒนาไดตัดทอนออก เพื่อใหการพัฒนาเหมาะสมแกเวลา และการ
ทํางานไมซับซอนมากเกินไป
3.2.2 หนวยคํานวณทางคณิตศาสตรและลอจิก (Arithmetic Logic Unit: ALU)
                                                 ่
       หนวยคํานวณจะทําหนาที่กระทําการคําสังคํานวณทางคณิตศาสตรและทางลอจิก ไดแก การบวก
การลบ การดําเนินการทางตรรกะ การเปรียบเทียบ การจัดการในเชิงบิตเชน เลื่อนบิต การเพิ่มคา ลดคา
                               ้       ่                                            ้
เปนตน การทํางานในสวนนีบางคําสังจะประกอบไปดวย ตัวดําเนินการ 2 ตัว สวนนีจึงตองมีตัวเก็บคาเพื่อ
รอทําการคํานวณ 1 ตัว สวนอีกตัว ก็ทําการอานจากบัสขอมูลโดยตรง แลวจึงทําการคํานวณ การทํางาน
ภายในของหนวยคํานวณนี้ผลที่ไดจะมีการแกไขไปยังรีจิสเตอรที่เก็บคาสถานะทํางาน (รีจิสเตอร F) เพื่อ
                                                                           ่
บอกถึงคาสถานะที่เกิดจากการทํางาน คาเหลานี้จะถูกนําไปใชในบางคําสังการทํางาน เชน การยาย
                                 ่
ตําแหนงการทํางานแบบมีเงือนไข เปนตน
3.2.3 หนวยควบคุม (Control Unit)
       หนวยควบคุมเปนสวนที่จะสงสัญญาณควบคุมการทํางานทั้งหมดของไมโครโปรเซสเซอร ทําใหการ
ทํางานตางๆ ดําเนินไปได หนวยควบคุมจะแปลคําสั่งที่ไปนํามาจากหนวยความจํา ทําการสรางและสง
สัญญาณควบคุมตางๆ ที่เหมาะสมกับคําสั่งนั้น เพื่อควบคุมการทํางานของ ALU หนวยความจํา รีจิสเตอร
ตางๆ และอุปกรณภายนอก ดวยเหตุนี้ สวนประกอบตางๆ สวนใหญจึงมีสวนที่เชื่อมตอกับหนวยควบคุม
                                                                                                           31

3.3 การกระทําการคําสั่งของไมโครโปรเซสเซอร
      การแสดงขั้นตอนการทํางานในการกระทําการคําสั่งใดๆของไมโครโปรเซสเซอรในหนึ่งรอบคําสั่ง จะ
ประกอบไปดวยการทํางานเปนขั้นตอนดังนี้
      1.การไปนํารหัสคําสั่ง ไมโครโปรเซสเซอรจะทําการอานคาคําสั่งมาจากสวนหนวยความจํา ตาม
ตําแหนงที่ ตัวนับโปรแกรม (PC) เก็บคาอยู โดยจะทําการอานคามาทีละ 8 บิต
      2.การแปลรหัสคําสั่ง ไมโครโปรเซสเซอรจะทําการแปลรหัสคําสั่งที่ไดนํามา วาเปนการทํางานใด
แลวสวนควบคุมก็จะสงสัญญาณไปควบคุมการทํางานนั้นๆตอไป
      3.การทํางานตามคําสั่ง หลังจากที่รูวาเปนการทํางานใด ไมโครโปรเซสเซอรก็จะทําการดําเนินการ
ตามคําสั่งที่ไดแปลรหัสมา
      รูปที่ 3.3 แสดงการทํางานของไมโครโปรเซสเซอรซึ่งขนาดของคําสั่งอาจจะมี 1 ไบต 2 ไบต หรือ 3
ไบต ขึ้นอยูกับความตองการขอมูลเพิ่มเติม หรือเวลาที่ตองใชบัส การทํางานในไมโครโปรเซสเซอรที่
ออกแบบจะเปนสวนภายใน 3 ขั้นตอนแรกเทานั้น หลังจากการทํางานเสร็จสิ้นก็จะไปดําเนินการอานคา
จากหน ว ยความจํ า นํ า คํ า สั่ ง ต อ ไปมาดํ า เนิน การ ในขั้ น ตอนส ว นที่เ หลื อ จะเป น การทํ า งานของการ
ขัดจังหวะ โดยจะเปนการตรวจสอบวามีการขัดจังหวะเกิดขึ้นหรือไมทุกครั้งที่ทํางานเสร็จสิ้นคําสั่ง หากมี
การขัดจังหวะ ก็จะโอนการทํางานไปทํางานสวนที่มีการขัดจังหวะ ไว แตหากไมมีการขัดจังหวะ ก็จะทํางาน
ตอไปตามปกติ เพื่อใหการพัฒนางายและสมควรแกเวลา ไมโครโปรเซสเซอรที่ไดออกแบบจึงไดทําการตัด
การทํางานในสวนนี้ออก




                                                          ่
                      รูปที่ 3.3 การกระทําการหนึ่งรอบคําสังของไมโครโปรเซสเซอร
                                                                                               32
3.4 ขั้นตอนการพัฒนา
        การพัฒนาแบงออกเปน 2 สวน คือ สวน Data Path และ สวน Control Unit ซึ่งทําการพัฒนาทั้งสอง
สวนไปพรอมๆ กัน ผลที่ไดนําไปเขียนเปน VHDL code และทําการทดสอบความถูกตองของฟงกชันการ
ทํางานแตละสวนโดยใชโปรแกรมจําลองการทํางานบนคอมพิวเตอร เมื่อทั้งสองสวนสามารถทํางานได
อยางถูกตองแลวจึงนํามารวมเขาดวยกัน ทําการจําลองการทํางานอีกครั้ง จากนั้นจึงทําการโปรแกรมโคดที่
ไดทั้งหมดลงบนชิป FPGA หรือที่เรียกวาการ Place & Route และทําการทดสอบการทํางานเชิงฮารดแวร
อีกครั้ง โดยสามารถเขียนขั้นตอนการออกแบบและพัฒนาไดดังรูปที่ 3.4

3.5 เครื่องมือที่ใช
3.5.1 ซอฟตแวรและภาษาที่ใช
     1. Xilinx ISE Webpack 8.1i
     2. C16 Compiler
     3. Z80 simulator
     4. ภาษา Assembly
     5. ภาษา VHDL
3.5.2 ฮารดแวรที่ใช
     1. เครื่องคอมพิวเตอร (Windows XP RAM 512 Mbytes)
     2. บอรดทดลองอิเล็กทรอนิกส Z80 ET-Board
     3. บอรดทดลองอิเล็กทรอนิกส Xilinx Spartan III
                                                                                          33




                   รูปที่ 3.4 ขั้นตอนการออกแบบและพัฒนาไมโครโปรเซสเซอร

3.6 การทดสอบ
        วิธีการในการทดสอบทําไดโดยการเปรียบเทียบผลการทํางานของไมโครโปรเซสเซอรที่ไดพัฒนาขึ้น
กับผลการทํางานของ Z80 โดยมีขั้นตอนดังนี้
3.6.1 ทดสอบโดยใชบอรดทดลอง Z80 ET-Board
        ทําการทดสอบโดยเขียนโปรแกรมภาษาแอสแซมบลี ใชคอมไพลเลอรคือ C16 แปลงไปเปนไฟล .hex
แลวทําการประมวลผลบนบอรดทดลอง ในที่นี้คือ ET-Board แลวบันทึกผลการทํางาน
3.6.2 ทดสอบโดยใชโปรแกรม Z80 Simulator
        ทําการทดสอบโดยเขียนโปรแกรมภาษาแอสแซมบลี ใช คอมไพลเลอรคือ C16 แปลงไปไฟล .hex
แลวทําการประมวลผลบนโปรแกรมจําลองการทํางานในที่น้คือ Z80 Simulator แลวบันทึกผลการทํางาน
                                                   ี
3.6.3 ทดสอบโดยใช โปรแกรม ISE Simulator
        ทําการเขียนโปรแกรมภาษาแอสแซมบลี แลวใชคอมไพลเลอรคือ C16 แปลงไปไฟล .hex หลังจาก
นั้นใชโปรแกรมเปลี่ยนไฟล .hex เปน ROM ในภาษา VHDLจากนั้นทําการเขียนไฟล Test bench เชื่อม
                                                                                               34
ไมโครโปรเซสเซอรที่สรางขึ้น และ ROM เขาดวยกัน จากนั้นใชโปรแกรม ISE Simulator ดังรูปที่ 3.5 และ
3.6 ซึ่งเปนโปรแกรมสําหรับจําลองการทํางานภายในโปรแกรม บันทึกผลการทํางาน


                                                 VHDL
                                                            memory
                                                  file



                        ASM                       HEX                      ISE
                         file                      file              Simulation   Result




                                                          Miroprocessor
                             cpu "z80.tbl"
                               hof "INT8"
                          org        2000h
                        ----------------------------
                        ld           b,04h ;
                        ld           a,b ;
                        end




                                รูปที่ 3.5 การใชโปรแกรมจําลองผลการทํางาน

3.6.4 ทดสอบโดยใชบอรดทดลอง Xilinx Spartan III
     ทําการเขียนโปรแกรมภาษาแอสแซมบลี ใชคอมไพลเลอรคือ C16 แปลงไปไฟล .hex แลวทําการ
ประมวลผลโดยดาวนโหลดลงบนบอรดทดลอง ซึ่งไดทําการ Synthesis และ Place & Route
ไมโครโปรเซสเซอรที่ไดสรางลงไปไวแลว จากนั้นทําการบันทึกผลการทํางาน




                   รูปที่ 3.6 การจําลองการทํางานโดยใชโปรแกรม ISE Simulator
                                                                                            35
      จากรูปที่ 3.7 แสดงถึงการทดสอบการทํางาน ซึ่งจะมี 4 ขั้นตอนดังไดอธิบายกอนหนา โดยจะนําผล
ของการทํางานที่ไดในแตละวิธีมาเปรียบเทียบ ซึ่งผลการทํางานที่ยึดเปนหลักจะเปนการทํางานในขอที่
3.6.1 คือทําการทดสอบโดยใชการทํางานของ Z80 บนบอรดจริงๆ แลวนํามาตรวจสอบกับสวนที่ไดจาก
การพัฒนา คือขอที่ 3.6.3 และขอที่ 3.6.4 สําหรับการทดลองในขอที่ 3.6.2 จะเปนการนําการทํางานของ
Z80 มาศึกษาโดยใชโปรแกรมที่ไดมีผูพัฒนามากอนหนาแลว คือ Z80 Simulator ซึ่งเปนโปรแกรมที่จะ
จําลองและแสดงการทํางานของ Z80 ออกมาทางหนาจอคอมพิวเตอร เพื่อใหสะดวกแกการศึกษาการ
ทํางานภายในของ Z80




                               รูปที่ 3.7 การทดสอบผลการทํางาน
                                                                                               36
                                  บทที่ 4
                   การพัฒนาไมโครโปรเซสเซอรดวยภาษา VHDL

         รายงานบทนี้นําเสนอการพัฒนาไมโครโปรเซสเซอรโดยการเขียนบรรยายวงจรดวยภาษา VHDL
ซึ่งแบงออกเปน 3 ขั้นตอนดังตอไปนี้
         4.1 วงจรระดับบนสุด (Top Level)
         4.2 วงจรภายในไมโครโปรเซสเซอร
         4.3 วงจรที่สังเคราะหไดจากซอฟตแวรสังเคราะหวงจร
         เนื่องจากวงจรไมโครโปรเซสเซอรเปนระบบที่มีความซับซอนสูงไมสามารถที่จะพัฒนาไดเพียง
บล็อกเดียว ทําใหจําเปนตองแบงวงจรออกเปนบล็อกยอยๆ ซึ่งภาษา VHDL ก็มีความสามารถในการเขียน
แบบลําดับชั้น (Hierarchy) ได [2] โดยเขียนบรรยายวงจรตั้งแตระดับบนสุด (Top Level) ดังหัวขอที่ 4.1
และ 4.2 ที่มีแตความสัมพันธของการเชื่อมตอในแตละบล็อกยอย โดยยังไมมีรายละเอียดของวงจรในแตละ
บล็อก สวนรายละเอียดของวงจรระดับลางของแตละบล็อกยอยนั้นจะเขียนอธิบายแยกออกมา ดังหัวขอที่
4.2.1 ถึงหัวขอที่ 4.2.13 ซึ่งสามารถศึกษาโปรแกรมภาษา VHDL ของโครงการเพิ่มเติมไดในภาคผนวก ก

4.1 วงจรระดับบนสุด (Top Level)
      วงจรระดับบนสุดของระบบประกอบไปดวยไมโครโปรเซสเซอร และหนวยความจํา ดังแสดงในรูปที่
4.1 คือมีสัญญาณควบคุมจากภายนอก ซึ่งไดแก
 - CLOCK ใชเปนสัญญาณนาฬิกาเพื่อควบคุมระบบ
 - RESET ใชเพื่อบอกไมโครโปรเซสเซอรใหเริ่มตนทํางานคําสั่งแรกของโปรแกรมและภายในมี
     การเชื่อมทั้งสองสวนดวยสัญญาณดังตอไปนี้
 -   M1 ใชเพื่อบอกวาไมโครโปรเซสเซอรกําลังอานรหัสคําสั่งจากหนวยความจํา
 -   MREQ ใชเพื่อบอกวาไมโครโปรเซสเซอรกําลังตองการติดตอกับหนวยความจํา
 -   RD ใชเพื่อบอกวาไมโครโปรเซสเซอรตองการรับขอมูลจากหนวยความจํา
 -   WR ใชเพื่อบอกวาไมโครโปรเซสเซอรตองการสงขอมูลออกไปยังหนวยความจํา
 -   Data Bus หรือบัสขอมูลใชเพื่อถายโอนขอมูลระหวางไมโครโปรเซสเซอรกับหนวยความจํา
 -   Address Bus หรือบัสเลขที่อยู ใชเพื่อสงเลขที่อยูของหนวยความจําจากไมโครโปรเซสเซอร
 -   WAIT ใชเพื่อบอกไมโครโปรเซสเซอรใหรอจนกวาหนวยความจําทํางานเสร็จสิ้น
                                                                                                37
         การทํางานเริ่มจากการที่ไมโครโปรเซสเซอรสงสัญญาณควบคุม M1 MREQ และ RD เพื่ออาน
รหัสคําสั่งจากตําแหนงรีจิสเตอรของหนวยความจํา ซึ่งกําหนดโดยเลขที่อยูที่สงมาทาง Address Bus เพื่อ
ถอดรหัส และดําเนินการตามคําสั่งนั้น โดยอาจจะมีการอานหรือเขียนหนวยความจํา จึงมีสัญญาณ WR
เพื่อใชเปนสัญญาณควบคุมการเขียน และสัญญาณควบคุมการทํางานของไมโครโปรเซสเซอรเอง เชน
สัญญาณนาฬิกา โดยวงจรภายในไมโครโปรเซสเซอรที่รวมกันทํางานตามคําสั่งไดจะกลาวไวในหัวขอที่ 4.2

                                                        M1
                                                       MREQ
                 CLOCK                                  RD
                                                        WR
                 RESET




                                                       WAIT

                รูปที่ 4.1 การออกแบบระดับ Top Level ของระบบไมโครโปรเซสเซอร

4.2 วงจรภายในไมโครโปรเซสเซอร
       ภายในไมโครโปรเซสเซอรประกอบดวยวงจรบล็อกยอยดังรูปที่ 4.2 ซึ่งไดแก
   •   ALU ใชคํานวณผลทางคณิตศาสตรและตรรกศาสตร
   •   Latch A ใชเก็บคาตัวถูกดําเนินการตัวแรกของ ALU สําหรับการดําเนินการที่ตองมีตัวถูก
       ดําเนินการ 2 ตัว
   •   Control Unit ใชควบคุมการทํางานทั้งหมดภายในไมโครโปรเซสเซอร
   •   Register arrays ใชเก็บขอมูลระหวางการประมวลผล
   •   Address Bus Control ใชควบคุมการวางเลขที่อยูของหนวยความจําบนบัสเลขที่อยู
   •   Data-out Bus Control ใชควบคุมการนําขอมูลจากบัสขอมูลภายในวางลงสูบัสขอมูลภายนอก
   •   Data-in Bus Control ใชควบคุมการนําขอมูลจากบัสขอมูลภายนอกวางสูบัสขอมูลภายใน
   •   PC Increment Module ใชเพิ่มคาใหกับ Program Counter
   •   Instruction Register ใชในการเก็บรหัสคําสั่งที่ไปนํามาจากหนวยความจําเพื่อถอดรหัส
                                                                                             38
    •  Flag Register ใชเก็บคาสถานะการทํางานของไมโครโปรเซสเซอร
    •  Program Counter ใชเก็บคาเลขที่อยูถัดไปของรหัสคําสั่งในหนวยความจําที่ตองไปนํามา
    •  Latch B ใชเก็บขอมูลไบตลาง สําหรับ Program Counter
    •  Latch C ใชเก็บขอมูลไบตลาง สําหรับ Address Register
       สําหรับรายละเอียดของวงจรแตละบล็อกยอยไดนําเสนอไวในหัวขอที่ 4.1.1 ถึง หัวขอที่ 4.1.13
และสวนของโคดภาษา VHDL อยูท่ภาคผนวก ก
                                 ี




CLOCK


RESET


 WAIT


   M1


 MREQ


  RD


   WR




                            รูปที่ 4.2 วงจรภายในไมโครโปรเซสเซอร
                                                                                                39
4.2.1 ALU
      ALU มีสัญญาณดังรูปที่ 4.3 สามารถแบงไดเปน 2 ประเภทคือ
สัญญาณอินพุต ไดแก
    • sel ใชควบคุมการดําเนินการ โดยมีจํานวน 5 บิต ตามตารางที่ 4.1
    • bit_sel ใชควบคุมการดําเนินการรวมกับสัญญาณ sel ในกรณีที่มีการดําเนินการระดับบิต เชน
      คําสั่ง BIT SET RES ตามตารางที่ 4.1
    • en ใชควบคุมการสงผลลัพธวางลงสูบัสขอมูล
    • a_in ใชรับตัวถูกดําเนินการตัวแรกจาก Latch_A เขาสู ALU
    • b_in ใชรับตัวถูกดําเนินการตัวที่สองจากบัสขอมูลเขาสู ALU
    • f_in ใชรับคาจาก Flag Register เขาสู ALU
สัญญาณเอาตพุต ไดแก
    • d_out ใชสงผลลัพธที่ไดจาก ALU สูบัสขอมูล
    • f_out ใชสงคาที่ไดรับการปรับปรุงแลวไปเก็บไวที่ Flag Register
    • cc ใชสงคา Flag ที่ตองการในคําสั่งที่มีเงื่อนไขขึ้นอยูกับคาใน Flag Register




                                  รูปที่ 4.3 ขาสัญญาณของ ALU

       ALU จะทําการดําเนินการใดๆ กับตัวถูกดําเนินการที่เขามาที่ a_in และ b_in เมื่อไดรับคําสั่งจาก
สัญญาณ sel และ bit_sel ซึ่งคําสั่งและการดําเนินการของแตละคําสั่งเปนดังตารางที่ 4.1 เมื่อสัญญาณ
en แอกทีฟ (‘0’) ผลลัพธที่ไดจะถูกสงออกมาที่ d_out และคาของ Flag Register จะถูกปรับปรุงตามคําสั่ง
แตละประเภท แลวถูกสงออกมาที่ f_out ทันที
                                                                                                   40
                        ตารางที่ 4.1 คําสั่งและการดําเนินการของ ALU
bit_sel    sel        การ                                      คําอธิบาย
                  ดําเนินการ
  0       00000   RLC           หมุนคาทีเ่ ขามาที่ b_in ไปทางซายโดยผาน Flag C
  0       00001   RRC           หมุนคาทีเ่ ขามาที่ b_in ไปทางขวาโดยผาน Flag C
  0       00010   RL            หมุนคาทีเ่ ขามาที่ b_in ไปทางซาย
  0       00011   RR            หมุนคาทีเ่ ขามาที่ b_in ไปทางขวา
  0       00100   SLA           เลื่อนคาที่เขามาที่ b_in ไปทางซาย และ ‘0’ แทนบิต 0
  0       00101   SRA           เลื่อนคาที่เขามาที่ b_in ไปทางขวา และบิต 7 ยังคงเดิม
  0       00110   PASSED สงคาทีเ่ ขามาที่ b_in ออกไปยัง d_out
  0       00111   SRL           เลื่อนคาที่เขามาที่ b_in ไปทางขวา และ ‘0’ แทนบิต 7
  0       01XXX   BIT XXX       ทดสอบวาบิตที่ xxx ของคาที่เขามาที่ b_in วาเทากับ ‘0’ หรือไม ถา
                                เทาใหเซต Flag Z
  0       10XXX   RES XXX รีเซตบิตที่ xxx ของคาที่เขามาที่ b_in
  0       11XXX   SET XXX เซตบิตที่ xxx ของคาที่เขามาที่ b_in
  1       00100   INC                                                 ่
                                เพิ่มคาที่สงเขามาที่ขา b_in ขึ้นหนึงคา
  1       00101   DEC           ลดคาที่สงเขามาที่ขา b_in ลงหนึ่งคา
  1       00110   PASSED สงคาทีเ่ ขามาที่ b_in ออกไปยัง d_out
  1       10000   ADD           บวกคาที่เขามาที่ a_in และ b_in เขาดวยกัน
  1       10001   ADC           บวกคาที่เขามาที่ a_in b_in และคาใน Flag C เขาดวยกัน
  1       10010   SUB           ลบคาที่เขามาที่ a_in ดวย b_in
  1       10011   SBC           ลบคาที่เขามาที่ a_in ดวย b_in และคาใน Flag C
  1       10100   AND           แอนดคาที่เขามาที่ a_in กับ b_in
  1       10101   XOR           เอกซคลูซีฟออรคาที่เขามาที่ a_in กับ b_in
  1       10110   OR            ออรคาที่เขามาที่ a_in กับ b_in
  1       10111   CP            เปรียบเทียบคาที่เขามาที่ a_in กับ b_in
  1       11000   CC = NZ เปรียบเทียบคาที่ flag Z ถาเปน ‘0’ cc เปน ‘1’
  1       11001   CC = Z        เปรียบเทียบคาที่ flag Z ถาเปน ‘1’ cc เปน ‘1’
  1       11010   CC = NC เปรียบเทียบคาที่ flag C ถาเปน ‘0’ cc เปน ‘1’
  1       11011   CC = C        เปรียบเทียบคาที่ flag C ถาเปน ‘1’ cc เปน ‘1’
  1       11100   CC = PO เปรียบเทียบคาที่ flag P/V ถาเปน ‘0’ cc เปน ‘1’
                                                                                                    41
  1        11101 CC = PE เปรียบเทียบคาที่ flag P/V ถาเปน ‘1’ cc เปน ‘1’
  1        11110 CC = NS เปรียบเทียบคาที่ flag S ถาเปน ‘0’ cc เปน ‘1’
  1        11111 CC = S                เปรียบเทียบคาที่ flag S ถาเปน ‘1’ cc เปน ‘1’
หมายเหตุ   คา XXX คือบิตที่ถูกดําเนินการ โดย 000 คือบิตที่ 0, 001 คือบิตที่ 1, 010 คือบิตที่ 2, 011 คือ
           บิตที่ 3, 100 คือบิตที่ 4, 101 คือบิตที่ 5, 110 คือบิตที่ 6 และ 111 คือบิตที่ 7

4.2.2 Control Unit
      Control Unit มีสัญญาณดังรูปที่ 4.4 คือ
สัญญาณอินพุต ไดแก
    • opcode ใชรับรหัสคําสั่งจาก Instruction Register เพื่อถอดรหัสคําสั่งสําหรับการดําเนินการตอไป
    • cc ใชรับคาของ Flag ที่เปนเงื่อนไขสําหรับตัดสินใจดําเนินการใดๆ
    • clk ใชรับสัญญาณนาฬิกาจากภายนอก เพื่อควบคุมการสงสัญญาณไปควบคุมสวนตางๆ ภายใน
      ไมโครโปรเซสเซอรเขาจังหวะกับสัญญาณนาฬิกานั้น
    • reset ใชเพื่อบอกให Control Unit สงสัญญาณไปยังสวนที่เกี่ยวของทําการรีเซตคาใหม
    • wait_n ใชเพื่อบอกให Control Unit เพิ่มเวลาการรอที่จะสงสัญญาณการทํางานสถานะตอไป
      เนื่องจากยังทํางานในสถานะเดิมไมแลวเสร็จ
สัญญาณเอาตพุต ไดแก
    • reg_sel ใชเพื่อระบุตําแหนงรีจิสเตอรที่ตองการติดตอ (A B C D E H และ L)
    • reg_rd ใชเพื่อควบคุมการอานคาขอมูลจากรีจิสเตอร (A B C D E H และ L)
    • reg_wr ใชเพื่อควบคุมการเขียนคาขอมูลลงสูรีจิสเตอร (A B C D E H และ L)
    • alu_opcode ใชเพื่อสงคําสั่งควบคุมการทํางานของ ALU
    • bit_sel ใชเพื่อสงคําสั่งควบคุมการทํางานแบบบิตของ ALU
    • alu_rd ใชเพื่อควบคุมการอานคาผลลัพธจาก ALU
    • latchA_wr ใชเพื่อควบคุมการสงผานคาขอมูลของ Latch A
    • latchB_wr ใชเพื่อควบคุมการสงผานคาขอมูลของ Latch B
    • latchC_wr ใชเพื่อควบคุมการสงผานคาขอมูลของ Latch C
    • inst_wr ใชเพื่อควบคุมการเก็บคารหัสคําสั่งของ Instruction Register
    • inc_pc ใชเพื่อควบคุมการเก็บเพิ่มคา PC ของ PC Increment Module
    • flag_en ใชเพื่อควบคุมการอานคาขอมูลจาก Flag Register
    • flag_wr ใชเพื่อควบคุมการเขียนคาขอมูลลงสู Flag Register
                                                                                                         42
    •   pc_rd ใชเพื่อควบคุมการอานคาขอมูลจาก Program Counter
    •   pc_wr ใชเพื่อควบคุมการเขียนคาขอมูลลงสู Program Counter
    •   addr_rd ใชเพื่อควบคุมการอานคาขอมูลจาก Address Bus Control
    •   addr_wr ใชเพื่อควบคุมการเขียนคาขอมูลลงสู Address Bus Control
    •   din_rd ใชเพื่อควบคุมการอานคาขอมูลจาก Data-in Bus Control
    •   din_wr ใชเพื่อควบคุมการเขียนคาขอมูลลงสู Data-in Bus Control
    •   dout_rd ใชเพื่อควบคุมการอานคาขอมูลจาก Data-out Bus Control
    •   dout_wr ใชเพื่อควบคุมการเขียนคาขอมูลลงสู Data-out Bus Control
    •   m1 ใชสงออกไปภายนอกไมโครโปรเซสเซอร เพื่อบอกวาไมโครโปรเซสเซอรกําลังอานรหัสคําสั่ง
        จากหนวยความจํา
     • mreq ใชสงออกไปภายนอกไมโครโปรเซสเซอร เพื่อบอกวาไมโครโปรเซสเซอรกําลังติดตอกับ
        หนวยความจํา
     • rd ใชสงออกไปภายนอกไมโครโปรเซสเซอร เพื่อบอกวาไมโครโปรเซสเซอรกําลังอานขอมูลจาก
        หนวยความจํา
     • wr ใชสงออกไปภายนอกไมโครโปรเซสเซอร เพื่อบอกวาไมโครโปรเซสเซอรกําลังเขียนขอมูลไปยัง
        หนวยความจํา
          Control Unit ทํางานเปนลักษณะที่เรียกวาไฟไนตสเตทแมชชีน (Finite State Machine: FSM)
คือการทํางานในแตละชวงเวลาขึ้นอยูกับคาของสถานะ (State) ซึ่งเก็บภายใน Control Unit และจะ
เปลี่ยนเปนสถานะถัดไปเมื่อมีสัญญาณ Clock เขามา โดยมีสถานะการทํางานดังตอไปนี้
     • เมื่อเริ่มตนทํางานจะมีสถานะแรกเปน Reset คือทําการกําหนดคาเริ่มตนให Register และสวน
        ตางๆที่เกี่ยวของ
     • สถานะถัดไปคือ fetch1 (การไปนํารหัสคําสั่งแมชชีนไซเคิลที่ 1) สงสัญญาณควบคุมเพือนําคาจาก ่
        PC มาไวที่ Address Bus Control เพื่อวางลงบน Address Bus ขณะเดียวกันก็สงสัญญาณ M1
        บอกว า เป น การอ า นรหั ส คํ า สั่ ง สั ญ ญาณ MREQ และ RD เพื่ อ อ า นข อ มู ล จากตํ า แหน ง ใน
        หนวยความจําที่กําหนดโดยคาใน Address Bus
     • สถานะ fetch2 (การไปนํารหัสคําสั่งแมชชีนไซเคิลที่ 2) รอขอมูลจากหนวยความจํา โดยคงคา
        สัญญาณควบคุมในสถานะ fetch2 ไว และทําการตรวจสอบสัญญาณ WAIT ถาแอกทีฟจะเพิ่ม
        เวลาการรออีก 1 คาบเวลา แตถาไมแอกทีฟจะทํางานสถานะถัดไปคือ fetch3
     • สถานะ fetch3 (การไปนํารหัสคําสั่งแมชชีนไซเคิลที่ 3) รับรหัสคําสั่งเขามาแปลความ (Decode)
        โดยการสงสัญญาณควบคุมไปยัง Data-in Bus Control และ Instruction Register กอนที่จะสั่ง
                                                                                             43
    ใหสัญญาณควบคุมตางๆ ในสถานะ fetch2 ไมแอกทีฟ และการกระทําการคําสั่ง (Execute) จะ
    เริ่มที่สถานะนี้ดวย
•   สถานะ fetch4 (การไปนํารหัสคําสั่งแมชชีนไซเคิลที่ 4) ใชเตรียมการสําหรับการกระทําการคําสั่งที่
    มีขนาดมากกวา 1 ไบต หรือมีการทํางานที่มากกวา 4 T-states
•   สถานะ loadr1 ใชดําเนินการคัดลอกคาจากรีจิสเตอรหนึ่งไปยังอีกรีจิสเตอรหนึ่ง ซึ่งเปนคําสั่ง
    สําเนาคาขอมูลขนาด 8 บิต หรือถาคําสั่งสําเนาคาขอมูลขนาด 16 บิต จะเปนการคัดลอกคาขอมูล
    8 บิตแรก
•   สถานะ loadr2 ใชดําเนินการคัดลอกคาจากรีจิสเตอรหนึ่งไปยังอีกรีจิสเตอรหนึ่ง ซึ่งเปนชวง T-
    state สุดทายของคําสั่งคัดลอกคาขอมูลขนาด 16 บิต
•   สถานะ mem_rd1 ใชวางคาตําแหนงรีจิสเตอรของหนวยความจําลงบนบัสเลขที่อยู และสง
    สัญญาณ MREQ และ RD เพื่ออานขอมูล โดยสถานะถัดไปถูกกําหนดเปน mem_rd2 เนื่องจาก
    ไมสามารถอานขอมูลจากหนวยความจําไดภายในสัญญาณนาฬิกาคาบเดียว
•    สถานะ mem_rd2 รอการอานขอมูลจากหนวยความจํา ซึ่งจะวางลงบนบัสขอมูล โดยการคงคา
    สัญญาณควบคุมในสถานะ mem_rd1 ไว
•    สถานะ mem_rd3 อานคาขอมูลจากบัสขอมูลผานทาง data-in Bus Control และเก็บไวยง            ั
    รีจิสเตอรที่เกี่ยวของ
•   สถานะ mem_rd4 mem_rd5 และ mem_rd6 ใชสถานะเหลานี้ในกรณีที่มีการอานขอมูลจาก
    หนวยความจําเปนไบตที่ 3 ซึ่งจะดําเนินการเหมือนกับสถานะ mem_rd1           mem_rd2 และ
    mem_rd3 ตามลําดับ
•   สถานะ loadr_HL ใชดําเนินการคําสั่งคัดลอกคาระหวางรีจิสเตอรและคาในหนวยความจําที่ชี้โดย
    คูรีจิสเตอร HL
•   สถานะ mem_wr1 mem_wr2 และ mem_wr3 ใชสถานะเหลานี้ในกรณีที่มีการเขียนขอมูลไปยัง
    หนวยความจํา ซึ่งจะดําเนินการเหมือนกับสถานะ mem_rd1 mem_rd2 และ mem_rd3
    ตามลําดับ แตจะเปลี่ยนสัญญาณควบคุมจาก RD เปน WR และวางคาที่ตองการเขียนบน data-
    out Bus Control กอนนําออกสูบัสขอมูลภายนอก
•   สถานะ alu_to_reg ใชนําผลลัพธที่ไดจากการคํานวณโดย ALU ไปเก็บยังรีจิสเตอรที่เกี่ยวของ เชน
    ถาเปนการบวก หรือการลบ รีจิสเตอรที่เก็บผลลัพธคือ รีจิสเตอร A เปนตน
•   สถานะ nop ไมโครโปรเซสเซอรไมมีการทํางานใดๆเปนเวลา 4 T-states เพื่อดําเนินการตามคําสั่ง
    NOP
                                                                                                    44




                                รูปที่ 4.4 ขาสัญญาณของ Control Unit

4.2.3 Instruction Register
       Instruction Register มีสัญญาณดังรูปที่ 4.5 คือ
สัญญาณอินพุต ไดแก
    • din ใชรับรหัสคําสั่งจากบัสขอมูลมาเก็บไว และสงตอไปยังขา dout
    • clk ใชควบคุมการนํารหัสคําสั่งมาเก็บไว และการสงรหัสคําสั่งออกไปที่ขา dout
    สัญญาณเอาตพุต ไดแก
    • dout ใชสงรหัสคําสั่งจากขา din ออกไปยัง Control Unit
        การทํางานเริ่มตนดวยการที่สัญญาณ clk มีคาเปน ‘0’ คารหัสคําสั่งที่อยูบนบัสขอมูลจะถูกสงผาน
ทางขา din ไปยัง dout เพื่อสงตอไปถอดรหัสคําสั่งที่ Control Unit
                                                                                                      45



                            รูปที่ 4.5 ขาสัญญาณของ Instruction Register

4.2.4 Register arrays
      Register arrays มีสัญญาณดังรูปที่ 4.6 คือ
สัญญาณอินพุต ไดแก
    • data ใชรับคาจากบัสขอมูลมาเก็บไว
    • sel ใชกําหนดตําแหนงรีจิสเตอรที่ตองการอานหรือเขียนคา ซึ่งเปนดังตารางที่ 4.2
    • clk ใชควบคุมการเขียนคาลงสูรีจิสเตอร คือ ถา clk เปน ‘0’ คาที่ data จะถูกเก็บไวในรีจิสเตอรที่
      กําหนดโดย sel
    • en ใชควบคุมการอานคาในรีจิสเตอรออกไปยังบัสขอมูล คือ ถา en เปน ‘0’ คาในรีจิสเตอรที่
      กําหนดโดย sel จะถูกนําไปวางบนบัสขอมูล
สัญญาณเอาตพุต ไดแก
    • q ใชคาในรีจิสเตอรที่กําหนดโดย sel ออกไปยังบัสขอมูล




                               รูปที่ 4.6 ขาสัญญาณของ Register arrays

                          ตารางที่ 4.2 การกําหนดตําแหนงรีจิสเตอรโดยสัญญาณ sel
                            sel                                  รีจิสเตอร
                           000                                        B
                           001                                        C
                           010                                        D
                           011                                        E
                           100                                        H
                           101                                        L
                           110                                      ไมใช
                           111                                        A
                                                                                               46
4.2.5 Program Counter
      Program Counter มีสัญญาณดังรูปที่ 4.7 คือ
สัญญาณอินพุต ไดแก
    • dinA_8 ใชรับคาจากบัสขอมูลมาเก็บไวเปนขอมูลไบตบนของรีจิสเตอร
    • dinB_8 ใชรับคาจากบัสขอมูลมาเก็บไวเปนขอมูลไบตลางของรีจิสเตอร
    • din_16 ใชรับคาจาก PC Increment Module ซึ่งเปนคา PC + 1 มาเก็บไว
    • sel ใชควบคุมการเขียนคาลงสู Program Counter เปนตามตารางที่ 4.3
    • reset ใชรีเซตคาใน Program Counter ใหชี้ไปยังตําแหนงเริ่มตนของโปรแกรม
สัญญาณเอาตพุต ไดแก
    • dout ใชสงคาใน Program Counter ออกไปยัง Address Bus Control




                           รูปที่ 4.7 ขาสัญญาณของ Program Counter

           ตารางที่ 4.3 การกําหนดการเขียนคาลงสู Program Counter โดยสัญญาณ sel
           sel                           การเขียนคาลงสู Program Counter
           00             PC <- din_16
           01             PC(H) <- dinA_8
           10             PC(L) <- dinB_8
           11             PC <- PC

4.2.6 PC Increment Module
      PC Increment Module มีสัญญาณดังรูปที่ 4.8 คือ
สัญญาณอินพุต ไดแก
    • din ใชรับคาจาก Program Counter
    • clk ใชควบคุมการทํางานของ PC Increment Module คือ ถา clk เปน ‘0’ คาที่ din จะถูกเพิมขึน 1
                                                                                            ่ ้
      และเก็บไว (PC + 1)
                                                                                                 47
สัญญาณเอาตพุต ไดแก
   • dout ใชสงคาใน PC Increment Module ออกไปเก็บยัง Program Counter




                          รูปที่ 4.8 ขาสัญญาณของ PC Increment Module

4.2.7 Flag Register
      Flag Register มีสัญญาณดังรูปที่ 4.9 คือ
สัญญาณอินพุต ไดแก
    • din ใชรับคาที่ไดรับการปรับปรุงจาก ALU มาเก็บไว
    • clk ใชควบคุมการเขียนคาลงสู Flag Register คือ ถา clk เปน ‘0’ คาที่ din จะถูกเก็บไวใน Flag
      Register และสงไปยัง ALU ทันที
    • en ใชควบคุมการอานคาใน Flag Register ออกไปยังบัสขอมูล คือ ถา en เปน ‘0’ คาใน Flag
      Register จะถูกนําไปวางบนบัสขอมูล
สัญญาณเอาตพุต ไดแก
    • dout_to_ALU ใชสงคาใน Flag Register ออกไปยัง ALU
    • dout_to_Databus ใชสงคาใน Flag Register ออกไปยังบัสขอมูล




                              รูปที่ 4.9 ขาสัญญาณของ Flag Register

4.2.8 Latch A
      Latch A มีสัญญาณดังรูปที่ 4.10 คือ
สัญญาณอินพุต ไดแก
    • din ใชรับคาจากบัสขอมูล
    • clk ใชควบคุมการทํางานของ Latch A คือ ถา clk เปน ‘0’ คาที่ din จะถูกสงผานไปยัง dout
สัญญาณเอาตพุต ไดแก
    • dout ใชสงคาจา din ออกไปยัง ALU
                                                                                                 48



                                รูปที่ 4.10 ขาสัญญาณของ Latch A

4.2.9 Latch B
      Latch B มีสัญญาณดังรูปที่ 4.11 คือ
สัญญาณอินพุต ไดแก
    • din ใชรับคาจากบัสขอมูล
    • clk ใชควบคุมการทํางานของ Latch B คือ ถา clk เปน ‘0’ คาที่ din จะถูกสงผานไปยัง dout
สัญญาณเอาตพุต ไดแก
    • dout ใชสงคาจา din ออกไปยัง Program Counter




                                รูปที่ 4.11 ขาสัญญาณของ Latch B

4.2.10 Latch C
       Latch C มีสัญญาณดังรูปที่ 4.12 คือ
สัญญาณอินพุต ไดแก
    • din ใชรับคาจากบัสขอมูล
    • clk ใชควบคุมการทํางานของ Latch C คือ ถา clk เปน ‘0’ คาที่ din จะถูกสงผานไปยัง dout
สัญญาณเอาตพุต ไดแก
    • dout ใชสงคาจาก din ออกไปยัง Address Bus Control




                                รูปที่ 4.12 ขาสัญญาณของ Latch C
                                                                                           49
4.2.11 Address Bus Control
       Address Bus Control มีสัญญาณดังรูปที่ 4.13 คือ
สัญญาณอินพุต ไดแก
    • dinA_8 ใชรับคาจากบัสขอมูลมาเก็บไวเปนขอมูลไบตบนของ Address Bus Control
    • dinB_8 ใชรับคาจากบัสขอมูลมาเก็บไวเปนขอมูลไบตลางของ Address Bus Control
    • din_16 ใชรับคาจาก PC Increment Module ซึ่งเปนคา PC + 1 มาเก็บไว
    • sel ใชควบคุมการเขียนคาลงสู Address Bus Control ซึ่งเปนตามตารางที่ 4.4
    • en ใชควบคุมการอานคาลงสูบัสเลขที่อยู
สัญญาณเอาตพุต ไดแก
    • dout ใชสงคาใน Address Bus Control ออกไปยังบัสเลขที่อยู




                        รูปที่ 4.13 ขาสัญญาณของ Address Bus Control

         ตารางที่ 4.4 การกําหนดการเขียนคาลงสู Address Bus Control โดยสัญญาณ sel
          sel                          การเขียนคาลงสู Address Bus Control
           00               Address Bus Control <- din_16
           01               Address Bus Control (H) <- dinA_8
           10               Address Bus Control (L) <- dinB_8
           11               Address Bus Control <- Address Bus Control

4.2.12 Data-out Bus Control
       Data-out Bus Control มีสัญญาณดังรูปที่ 4.14 คือ
สัญญาณอินพุต ไดแก
    • din ใชรับคาจากบัสขอมูลภายในมาเก็บไว
    • clk ใชควบคุมการเขียนคาจากบัสขอมูลภายในลงสู Data-out Bus Control คือ ถา clk เปน ‘0’
       คาที่ din จะถูกเก็บไวใน Data-out Bus Control
                                                                                           50
   • en ใชควบคุมการอานคาจาก Data-out Bus Control ออกไปยังบัสขอมูลภายนอก คือ ถา en เปน
     ‘0’ คาใน Data-out Bus Control จะถูกนําไปวางบนบัสขอมูลภายนอก
สัญญาณเอาตพุต ไดแก
   • dout ใชสงคาใน Data-out Bus Control ออกไปยังบัสขอมูลภายนอก




                        รูปที่ 4.14 ขาสัญญาณของ Data-out Bus Control

4.2.13 Data-in Bus Control
       Data-in Bus Control มีสัญญาณดังรูปที่ 4.15 คือ
สัญญาณอินพุต ไดแก
    • din ใชรับคาจากบัสขอมูลภายนอกมาเก็บไว
    • clk ใชควบคุมการเขียนคาจากบัสขอมูลภายนอกลงสู Data-in Bus Control คือ ถา clk เปน ‘0’
       คาที่ din จะถูกเก็บไวใน Data-in Bus Control
    • en ใชควบคุมการอานคาจาก Data-in Bus Control ออกไปยังบัสขอมูลภายใน คือ ถา en เปน ‘0’
       คาใน Data-in Bus Control จะถูกนําไปวางบนบัสขอมูลภายใน
สัญญาณเอาตพุต ไดแก
    • dout ใชสงคาใน Data-in Bus Control ออกไปยังบัสขอมูลภายใน




                        รูปที่ 4.15 ขาสัญญาณของ Data-in Bus Control
                                                                                      51
4.4 วงจรที่สังเคราะหไดจากซอฟตแวรสังเคราะหวงจร
   วงจรที่ไดจากการใชซอฟตแวร [6] ในการสังเคราะหวงจรเปนดังรูปที่ 4.16 และ 4.17




         รูปที่ 4.16 วงจรระดับบนสุดที่สามารถสังเคราะหไดจากซอฟตแวรสังเคราะหวงจร
                                                        52




รูปที่ 4.17 วงจรภายในไมโครโปรเซสเซอรที่สังเคราะหได
                                                                                                     53
                                            บทที่ 5
                                          ผลการทดลอง

      เนื้อหาบทนี้จะเปนผลที่ไดเกิดจากการดําเนินการตามขั้นตอนในบทที่ 4 โดยจะกลาวถึงการทํางาน
โปรแกรมในสวนที่ไดทําลุลวงไปแลวแบงเปน 2 สวนคือผลจากการใชโปรแกรมจําลอง และ ผลจากการ
เขียนลงบนบอรดทดลอง

5.1 ผลการทดลองโดยใชโปรแกรม Xilinx ISE Webpack 8.1i
     การทดลองหลัก ๆ ที่ไดทําไปจะเปนการจําลองการทํางานโดยใชโปรแกรมจําลองการทํางาน ผลจาก
การพัฒนาสามารถทํางานในคําสั่งตาง ๆ ไดดังนี้

                                 ตารางที่ 5.1 คําสั่งที่สามารถทํางานได
LD r , r’                 LD r , 8-bit               LD (HL) , r                LD (BC) , A
LD (DE) , A               LD r,(HL)                  LD (nn),A                  SUB r
AND r                     OR r                       XOR r                      CP r
RLC r                     RL r                       RRC r                      RR r
ADD A , r                 SRA r                      SRL r                      JP nn
SLA r                     NOP                        SBC A,r                    ADC A,r
INC r                     DEC r                      SET b,r                    RES b,r
ADD HL,rr’


ตัวอยางผลการจําลองการทํางานแสดงไดนี้
5.1.1 ผลการทํางานคําสั่ง LD (HL),A และ LD (BC),A
       ที่ตําแหนง 0 ไมโครโปรเซสเซอรถอดรหัสคําสั่ง (77h) ไดเปนคําสั่ง LD (HL),A (7 T-states) การ
ทํางานภายในไมโครโปรเซสเซอรจะเริ่มตนดวยการคัดลอกคาในรีจิสเตอร H (00h) และ L (03h) ไปไวที่
รีจิสเตอรเลขที่อยู (address register) ซึ่งควบคุมการวางเลขที่อยูบนบัสเลขที่อยู (address[15:0]) จากนั้น
ในแมชชีนไซเคิลที่ 2 จะเปนการเขียนขอมูลที่คัดลอกจากรีจิสเตอร A (80h) ลงบนตําแหนงหนวยความจํา
                        ่ ่
(0004h) หลังจากคําสังนี้ ทีตําแหนงตอมา ไมโครโปรเซสเซอรอานคาที่ตําแหนง 1 ไดเปน (02h) ถอดรหัส
ไดเปน LD (BC),A ก็จะทํางานการคัดลอกคาในรีจิสเตอร B (00h)และ C (02h) ไปไวที่รีจิสเตอรเลขที่อยู
                            ่                                                        ้
แลวจึงทําการเขียนขอมูลทีคัดลอกมาจากรีจิสเตอร A ลงบนตําแหนงหนวยความจํานัน ดังรูปที่ 5.1
                                                                                                     54
     รูป 5.2 เปนการทํางานตอเนื่องจากรูปที่ 5.1 สังเกตไดวาที่เวลาประมาณ 500 ns ที่ตําแหนง 0002h
                                                                            ่
และ 0003h ไดคาเปน 80h ซึ่งคา 80h ก็คือคาที่ไดเขียนไปจากการทํางานคําสัง LD (HL),A และ LD
(BC),A นั่นเอง




                     รูปที่ 5.1 ผลการจําลองการทํางานคําสั่ง LD (HL), A และ LD (BC),A




                  รูปที่ 5.2 ผลการจําลองการทํางานคําสั่ง LD (HL), A และ LD (BC),A (ตอ)

5.1.2 ผลการทํางานคําสั่ง LD (0004),A
         การทํางานคําสั่ง LD (0004),A โดยใหรีจิสเตอร A เก็บคา F0h แสดงไดดังรูปที่ 5.3
         ที่ตําแหนง 0 ไมโครโปรเซสเซอรอานคาไดเปน 32h ทราบวาเปนคําสั่งโหลดคาจากรีจิสเตอร A ไป
ยังตําแหนงในหนวยความจํา เปนคําสั่งขนาด 3 ไบต ตองอานตําแหนงตอไปอีก เพื่อบอกถึงตําแหนงใน
หนวยความจําที่ตองการจะเขียน อานไดคา 04h และ 00h ตามลําดับ เนื่องจากการทํางานจะอานคาไบต
สูงกอน ดังนั้นตําแหนงที่จะเขียนคาคือตําแหนง 0004h ที่ชวงเวลา indirect_write จะทําการเขียนคาที่อยู
                                                             
ในรีจิสเตอร A ซึ่งคือคา F0h ลงสูหนวยความจําที่ตําแหนง 0004 หลังจากนั้นจําอานคําสั่งตอมา คือคําสั่ง
ที่ตําแหนง 3 สังเกตไดวาที่ตําแหนง 4 จะอานคาไดเปน F0h ซึ่งเปนคาที่ไดเขียนจากการทํางานกอนหนา
                                                                                                  55




                                                        ่
                               รูปที่ 5.3 การทํางานคําสัง LD (0004),A

5.1.3 ผลการทํางานคําสั่ง LD D,045h และ LD A,D
          ผลการทํางานคําสั่ง LD D,045h และ LD A,D สามารถแสดงไดดังรูปที่ 5.4
          ที่ตําแหนง 0 ไมโครโปรเซสเซอรอานคาไดเปน 16h ทราบวาเปนคําสั่งโหลดขนาด 2 ไบต ตองอาน
คาที่ตําแหนงตอมาไดคา 45h ถอดรหัสไดเปนคําสั่ง LD D,45h ที่ชวงเวลา direct_read3จะเขียนคาที่อาน
ไดลงสูรีจิสเตอร D
          ที่ตําแหนง 2 ไมโครโปรเซสเซอรอานคาไดเปน 7A ทราบวาเปนคําสั่ง LD A,D ที่ชวงเวลา fetch3
จะทําการอานคาจากรีจิสเตอร D แลวทําการเขียนคานั้นลงสูรีจิสเตอร A
          ที่ตําแหนง 3 ไมโครโปรเซสเซอรอานคาไดเปน 84h ทราบวาเปนคาสั่ง ADD A,H สังเกตไดวา คา
                                                                                                  
A ที่อานมารอที่ a_in เปน 45h ซึ่งเปนคาที่ไดทําการเขียนในคําสั่งกอนหนา




                                                  ่
                         รูปที่ 5.4 การทํางานคําสัง LD D,045h และ LD A,D
                                                                                                     56
5.1.4 ผลการทํางานคําสั่ง LD A,(HL)
         การทํางานของคําสั่ง LD A,(HL) โดยใหที่รีจิสเตอร H เก็บคา 00h และใหรีจิสเตอร L เก็บคา 00h
แสดงไดดังรูปที่ 5.5
         ที่ตําแหนง 0 ไมโครโปรเซสเซอร อานคาได 7Eh ทราบวาเปนคําสั่ง LD A,HL ในจะทําการอานคา
จากรีจิสเตอร H และรีจสเตอร L ไปเก็บไวที่รีจิสเตอรคาที่อยู ในชวงเวลา indirect_read3 จะอานคาที่
                          ิ
ตําแหนง 0000h นั้นลงสูรีจิสเตอร A สังเกตวาคาที่อานจะเปน 7E ซึ่งเปนคาที่ตําแหนงปจจุบัน
         ที่ตําแหนง 1 ไมโครโปรเซสเซอรอานคาไดเปน 80h เปนคาสั่ง ADD A,B จะทําการอานคาจาก
รีจิสเตอร A ไดเปนคา 7Eh




                                                         ่
                                รูปที่ 5.5 การทํางานคําสัง LD C,( HL)

5.1.5 ผลการทํางานคําสั่ง ADD A,D และ SUB B
                                                                                         ีิ
        การทํางานของคําสั่ง ADD A,D และ SUB B โดยใหรีจิสเตอร A เก็บคา F0h ใหรจสเตอร B เก็บคา
72h ใหรีจิสเตอร D เก็บคา 86h แสดงไดดังรูปที่ 5.6
        ที่ตําแหนง 0 ไมโครโปรเซสเซอรอานคาได 82h ถอดรหัสไดเปนคําสั่ง ADD A,D ในชวงเวลา
fetch3 ในชวงแรกจะอานคาในรีจิสเตอร A ไดคาเปน F0h ไปเก็บไวตัวเก็บคาชั่วคราวเพื่อรอการคํานวณที่
                                                                                  ้ ่
a_in ตอมาจะทําการอานขอมูลจากรีจิสเตอร D เก็บไวที่ b_in ไดคา 86h จากนันทีชวง alu_to_reg จะทํา
การบวกคาที่ไดเก็บไวได 76h จากนั้นเขียนคาที่ไดลงในรีจิสเตอร A ไดคาแฟลกเปน 5
                                                                           ่
        ที่ตําแหนง 1 ไมโครโปรเซสเซอรถอดรหัสคําสั่งคา 94h เปนคําสัง SUB B ในชวงเวลา fetch3
ในชวงแรกจะอานคาในรีจิสเตอร A ไดคาเปน 76h ไปเก็บไวตัวเก็บคาชั่วคราวเพื่อรอการคํานวณที่ a_in
                                                                             ้ 
ตอมาจะทําการอานขอมูลจากรีจิสเตอร B เก็บไวที่ b_in ไดคา 72h จากนันที่ชวง alu_to_reg จะทําการลบ
                             ้
คาที่ไดเก็บไวได 04h จากนันเขียนคาที่ไดลงในรีจิสเตอร A สังเกตวาคาของรีจิสเตอร A ที่นํามาคํานวณจะ
เปนคา 76h ซึงเปนคาที่ไดจากการทํางานคําสั่งกอนหนา สิ้นสุดการทํางาน ไดคาแฟลกเปน 2
                 ่
                                                                                                57
        การทํางานในคําสั่งประเภทนี้จะทํางานภายใน ALU ซึ่งจะมีการเกี่ยวของกับรีจิสเตอรแฟลก
กลาวคือ ผลจากการทํางานจะไปมีผลตอรีจิสเตอรแฟลกที่ทําหนาที่เก็บสถานการทํางาน เชน คาเปนลบ
คาเปนศูนย เปนตน จากการทํางาน 2 คําสั่งขางตนใหคาแฟลกเปน 5 และ 2 ตามลําดับดังรูปที่ 5.3 การ
ตรวจสอบการทํางานของแฟลกอางอิงมาจากการจําลองการทํางานโดยใชโปรแกรม Z80 Simulator ISE
ซึ่งไดผลดังรูปที่ 5.7 ก. และ ข.




                    รูปที่ 5.6 ผลการจําลองการทํางานในคําสั่ง ADD A,D และ SUB B




              (ก) การทํางานคําสั่ง ADD A,D               (ข) การทํางานคําสั่ง SUB B
       รูปที่ 5.7 ผลการจําลองการทํางานในคําสั่ง ADD A,D และ SUB B โดยใช Z80 Simulator
                                                                                               58

5.1.6 ผลการทํางานคําสั่ง AND B, OR C และ XOR D
        การทํางานของคําสั่ง AND B, OR C และ XOR D เมื่อใหรีจิสเตอร A เก็บคา 78h รีจิสเตอร B
เก็บคา 2Dh รีจิสเตอร C เก็บคา 20h รีจิสเตอร D เก็บคา 12h แสดงไดดังรูปที่ 5.8
        ที่ตําแหนง 0 ไมโครโปรเซสเซอรอานคาได A0h ถอดรหัสคําสั่งไดเปน AND B ที่เวลาชวง fetch3
จะทําการอานคาของ รีจิสเตอร A มาเก็บไวรอการทํางานที่ขา A_in ของ ALU และอานคาริจิสเตอร B มาที่
ขา B_in แลวทําการ AND ที่ ALU ที่ชวงเวลา alu_to_reg จะทําการเขียนคาที่คํานวณไดเก็บเขาสู
หนวยความจําไดคาเปน 28h (เกิดจาก A AND B : 01111000b AND 00101101b = 00101000b) ไดคา
แฟลกเปน 14
        ที่ตําแหนง 1 ไมโครโปรเซสเซอร อานคาไดเปน B1h ถอดรหัสไดเปน OR C ที่เวลาชวง fetch3 จะ
ทําการอานคาจาก รีจิสเตอร A มาเก็บไวรอการทํางานที่ขา A_in ของ ALU สังเกตไดวาคาเปน 28h คือ
คาที่เกิดจากการทํางานกอนนี้ และอานคาริจิสเตอร C มาที่ขา B_in แลวทําการ OR ที่ ALU ที่ชวงเวลา
alu_to_reg จะทําการเขียนคาที่คํานวณไดเก็บเขาสูหนวยความจําไดคาเปน 28h (เกิดจาก A OR C :
00101000b OR 00100000b = 00101000b) ไดคา แฟลกเปน 04h
        ที่ตําแหนง 2 ไมโครโปรเซสเซอรอานคาได AAh ถอดรหัสคําสั่งไดเปน XOR B ที่เวลาชวง fetch3
จะทําการอานคาของ รีจิสเตอร A มาเก็บไวรอการทํางานที่ขา A_in ของ ALU และอานคาริจิสเตอร B มาที่
ขา B_in แลวทําการ XOR ที่ ALU ที่ชวงเวลา alu_to_reg จะทําการเขียนคาที่คํานวณไดเก็บเขาสู
หนวยความจําไดคาเปน 3Ah (เกิดจาก A XOR D : 00101000b XOR 00010010b = 00111010b) ไดคา
แฟลกเปน 04h




                      รูปที่ 5.8 ผลการทํางานคําสั่ง AND B, OR C และ XOR D
                                                                                                        59
5.1.7 ผลการทํางานคําสั่ง SLA A , SRA B , SRL C และ NOP
         การทํางานของคําสั่ง SLA A , SRA B และ SRL C เมื่อใหรีจิสเตอร A เก็บคา 2Dh
รีจิสเตอร B เก็บคา 91h รีจิสเตอร C เก็บคา 49h แสดงไดดังรูปที่ 5.9 และ 5.10
         ที่ตําแหนง 0 ไมโครโปรเซสเซอรอานคาได CBh ถอดรหัสคําสั่งจะทราบวาเปนคําสั่งขนาด 2 ไบต
จึงทําการอานคาไบตตอมาไดเปน 27h ถอดรหัสแลวจะทราบวาเปนคําสั่ง SLA                 A       ที่เวลาชวง
direct_read3 จะทําการอานคาของรีจิสเตอร A มาทางขา B_in ของ ALU ไดเปน 2Dh เนื่องจากการ
ทํางานเปนการเลื่อนบิต ตองการตัวดําเนินการเพียงตัวเดียว ที่ขา A_in จึงไมมีสัญญาณใด ที่ชวงเวลา
alu_to_reg จะทําการเลื่อนบิตและนําคาที่คํานวณไดเก็บเขาสูหนวยความจําไดคาเปน 5Ah (เกิดจาก A
เลื่อนบิตไปทางซาย 1 บิต : 00101101b => 01011010b) ไดคา แฟลกเปน 4
         ที่ตําแหนง 2 ไมโครโปรเซสเซอรอานคาได CBh ถอดรหัสคําสั่งจะทราบวาเปนคําสั่งขนาด 2 ไบต
จึงทําการอานคาไบตตอมาไดเปน 28h ถอดรหัสแลวจะทราบวาเปนคําสั่ง SRA                 B ที่เวลาชวง
direct_read3 จะทําการอานคาของรีจิสเตอร B มาทางขา B_in ของ ALU ไดเปน 91h เนื่องจากการ
ทํางานเปนการเลื่อนบิต ตองการตัวดําเนินการเพียงตัวเดียว ที่ขา A_in จึงไมมีสัญญาณใด ที่ชวงเวลา
alu_to_reg จะทําการเลื่อนบิตและนําคาที่คํานวณไดเก็บเขาสูหนวยความจําไดคาเปน C8h (เกิดจาก B
เลื่อนบิตไปทางขวา 1 บิต : 10010001b => 11001000) ไดคา แฟลกเปน 129 สังเกตวา carry แฟลก จะ
เปนคาที่บิต 0 ของขอมูลที่นํามาดําเนินการ
         ที่ตําแหนง 4 ไมโครโปรเซสเซอรอานคาได CBh ถอดรหัสคําสั่งจะทราบวาเปนคําสั่งขนาด 2 ไบต
จึงทําการอานคาไบตตอมาไดเปน 39h ถอดรหัสแลวจะทราบวาเปนคําสั่ง SRL                 C ที่เวลาชวง
direct_read3 จะทําการอานคาของรีจิสเตอร C มาทางขา B_in ของ ALU ไดเปน 49h เนื่องจากการ
ทํางานเปนการเลื่อนบิต ตองการตัวดําเนินการเพียงตัวเดียว ที่ขา A_in จึงไมมีสัญญาณใด ที่ชวงเวลา
alu_to_reg จะทําการเลื่อนบิตและนําคาที่คํานวณไดเก็บเขาสูหนวยความจําไดคาเปน 24h (เกิดจาก A
เลื่อนบิตไปทางขวา 1 บิต : 01001001b => 00100100b ) ไดคา แฟลกเปน 5 สังเกตวา carry แฟลก จะ
เปนคาที่บิต 0 ของขอมูลที่นํามาดําเนินการ
         ที่ตําแหนง 6 ไมโครโปรเซสเซอรอานคาไดเปน 00h ถอดรหัสไดเปนคําสั่ง NOP จะไมมีการทํางาน
ใดๆ ภายใตคําสั่งนี้ คาทุกอยางจะคงเหมือนเดิม เชนคาภายในแฟลก การทํางานคําสั่งนี้จะเปนเพียงการ
ทํางานเพิ่มเติมเพื่อหนวงเวลาการทํางานเทานั้น
5.1.8 ผลการทํางานคําสั่ง RLC A, RRC B, RR C และ RL D
         การทํางานของคําสั่ง RLC A, RRC B, RR C และ RL D เมื่อใหรีจิสเตอร A เก็บคา 2Dh
รีจิสเตอร B เก็บคา 91h รีจิสเตอร C เก็บคา 49h รีจิสเตอร D เก็บคา 64h แสดงไดดังรูปที่ 5.11 และ 5.12
         ที่ตําแหนง 0 ไมโครโปรเซสเซอรอานคาได CBh เปนคําสั่งขนาด 2 ไบตจึงทําการอานคาไบตตอมา
ไดเปน 07h ถอดรหัสแลวจะทราบวาเปนคําสั่ง RLC A ที่เวลาชวง direct_read3 จะทําการอานคาของ
                                                                                                  60
รีจิสเตอร A มาทางขา B_in ของ ALU ไดเปน F0h ที่ชวงเวลา alu_to_reg จะทําการเลื่อนบิตและนําคาที่
คํานวณไดเก็บเขาสูหนวยความจําไดคาเปน E1h (เกิดจาก A เลื่อนบิตวนไปทางซาย 1 บิต : 11110000b
=> 11100001b ) ไดคาแฟลกเปน 133 สังเกตวา carry แฟลก เปนคาที่บิต 7 ของขอมูลที่นํามาดําเนินการ




                         รูปที่ 5.9 การทํางานของคําสั่ง SLA A และ SRA B




                                 รูปที่ 5.10 การทํางานคําสั่ง SRL C

         ที่ตําแหนง 2 ไมโครโปรเซสเซอรอานคาได CBh เปนคําสั่งขนาด 2 ไบตจึงทําการอานคาไบตตอมา
ไดเปน 07h ถอดรหัสแลวจะทราบวาเปนคําสั่ง RRC B ทีเ่ วลาชวง direct_read3 จะทําการอานคาของ
                                                    
รีจิสเตอร B มาทางขา B_in ของ ALU ไดเปน 91h ที่ชวงเวลา alu_to_reg จะทําการเลื่อนบิตและนําคาที่
คํานวณไดเก็บเขาสูหนวยความจําไดคาเปน C8h (เกิดจาก A เลื่อนบิตวนไปทางขวา 1 บิต : 10010001b
                                                                                        ํ
=> 11001000b ) ไดคาแฟลกเปน 129 สังเกตวา carry แฟลก เปนคาที่บิต 1 ของขอมูลที่นามาดําเนินการ
                                                                                                  61
         ที่ตําแหนง 4 ไมโครโปรเซสเซอรอานคาได CBh เปนคําสั่งขนาด 2 ไบตจึงทําการอานคาไบตตอมา
ไดเปน 11h ถอดรหัสแลวจะทราบวาเปนคําสั่ง RR C ที่เวลาชวง direct_read3 จะทําการอานคาของ
                                                    
รีจิสเตอร C มาทางขา B_in ของ ALU ไดเปน 49h ที่ชวงเวลา alu_to_reg จะทําการเลื่อนบิตและนําคาที่
คํานวณไดเก็บเขาสูหนวยความจําไดคาเปน 93h (เกิดจาก A เลื่อนบิตวนไปทางขวา 1 บิต : 01001001b
                            ิ
=> 10010011b โดยคาที่บตที่ 1 เปนคาจาก Carry แฟลก ) ไดคา แฟลกเปน 132 สังเกตวา carry แฟลก
               ิ              ํ
จะเปนคาที่บต 7 ของขอมูลที่นามาดําเนินการ
         ที่ตําแหนง 6 ไมโครโปรเซสเซอรอานคาได CBh เปนคําสั่งขนาด 2 ไบตจึงทําการอานคาไบตตอมา
ไดเปน 07h ถอดรหัสแลวจะทราบวาเปนคําสั่ง RL D ที่เวลาชวง direct_read3 จะทําการอานคาของ
รีจิสเตอร D มาทางขา B_in ของ ALU ไดเปน 8Bh ที่ชวงเวลา alu_to_reg จะทําการเลื่อนบิตและนําคาที่
คํานวณไดเก็บเขาสูหนวยความจําไดคาเปน 45h (เกิดจาก A เลื่อนบิตวนไปทางขวา 1 บิต : 10001011b
=> 01000101b ) ไดคา แฟลกเปน 1 สังเกตวา carry แฟลก จะเปนคาที่บิต 0 ของขอมูลที่นามาํ
ดําเนินการ




                        รูปที่ 5.11 ผลการทํางานคําสั่ง RLC A และ RRC B




                          รูปที่ 5.12 ผลการทํางานคําสั่ง RR C และ RL D
                                                                                                 62
5.1.9 ผลการทํางานคําสั่ง INC A และ DEC A
          การทํางานของคําสั่ง INC A และ DEC A เมื่อใหรีจิสเตอร A เก็บคา F0h ไดผลดังรูปที่ 5.13
          ที่ตําแหนง 0 ไมโครโปรเซสเซอรอานคาไดเปน 3Ch ถอดรหัสไดเปนคําสั่ง INC A ในชวงเวลา
Fetch3 จะอานคาจากรีจิสเตอร A ผานมาทาง b_in ไดคาเปน F0h ชวงเวลา alu_to_reg จะทําการเพิ่ม
คาไปอีก 1 เปน F1h และทําการเขียนลงสูรีจิสเตอร A
                                          
          ที่ตําแหนง 1 ไมโครโปรเซสเซอรอานคาไดเปน 3Dh ถอดรหัสไดเปนคําสั่ง DEC A ในชวงเวลา
                                                                                      ํ
Fetch3 จะอานคาจากรีจิสเตอร A ผานมาทาง b_in ไดคาเปน F1h สังเกตวาเปนคาที่ไดทาการเขียนใน
คําสั่งกอนหนา ชวงเวลา alu_to_reg จะทําการลดคาลง 1 และทําการเขียนคาลงสูรีจิสเตอร A




                          รูปที่ 5.13 ผลการทํางานคําสั่ง INC A และ DEC A

                            ่
5.1.10 ผลการทํางานคําสัง RES 1,H และ SET 2,H
        การทํางานคําสั่ง RES 1,H และ SET 2,H โดยใหรีจิสเตอร H เก็บคา 72h เปนดังรูปที่ 5.14
        ที่ตําแหนง 0 ไมโครโปรเซสเซอรอานคาไดเปน CBh เปนคําสั่งขนาด 2 ไบต จะอานคาที่ตําแหนง
ตอไปไดคา 8C ถอดรหัสไดเปนคําสั่ง RES 1,H เปนการตั้งใหบิตที่ 1 ของรีจิสเตอร H มีคาเปน 0 ที่
ชวงเวลา direct_read3 อานคารีจิสเตอร H ผานทาง b_in ไดคาเปน 72h ชวงเวลา alu_to_reg ทําการ
เซ็ตบิตไดคาเปน 70h (ไดจาก H : 01110010 =>01110000) แลวทําการเขียนคาลงสูรีจิสเตอร H
        ที่ตําแหนง 2 ไมโครโปรเซสเซอรอานคาไดเปน CBh เปนคําสั่งขนาด 2 ไบต จะอานคาที่ตําแหนง
ตอไปไดคา D4 ถอดรหัสไดเปนคําสั่ง SET 2,H เปนการตั้งใหบิตที่ 2 ของรีจิสเตอร H มีคาเปน 1 ที่
ชวงเวลา direct_read3 อานคารีจิสเตอร H ผานทาง b_in ไดคาเปน 70h สังเกตไดวาเปนคาที่ไดจากการ
ทํางานกอนหนา ชวงเวลา alu_to_reg ทําการเซ็ตบิตไดคาเปน 74h (ไดจาก H : 01110000
=>01110100) แลวทําการเขียนคาลงสูรีจิสเตอร H
                                                                                                   63




                        รูปที่ 5.14 ผลการทํางานคําสั่ง SET 1,H และ RES 2 ,H

                             ่
5.1.11 ผลการทํางานคําสัง ADC A,C และ SBC A,B
         การทํางานคําสั่ง ADC A,C และ SBC A,B โดยใหรีจิสเตอร A เก็บคา 0FFh ใหรีจิสเตอร B
เก็บคา 01h ใหรีจิสเตอร C เก็บคา 00h แสดงไดดังรูปที่ 5.15
         ที่ตําแหนง 4 และ 5 ไมโครโปรเซสเซอรอานคาได CB 08 ไดเปนคําสั่ง RRC B ซึ่งจะเปนการเลื่อน
บิตที่ 0 ของรีจิสเตอร B ไปเก็บไวใน Carry แฟลก สังเกตไดวาแฟลกมีคาเปน 129 และคารีจิสเตอร A
เปลี่ยนเปน 80h
         ที่ตําแหนง 6 ไมโครโปรเซสเซอรอานคาไดเปน 89h เปนคําสั่ง ADC A,C เปนการบวกคาของ
รีจิสเตอร A กับ รีจิสเตอร C รวมกับคาใน Carry แฟลก ที่ชวงเวลา fetch3 จะอานคารีจิสเตอร A ไดคา
FFh มารอการทํางานที่ a_in แลวอานคารีจิสเตอร C ไดคา 00h และทําการบวกกันในชวงเวลา
alu_to_reg ไดคาเปน 00h แลวทําการเขียนลงรีจิสเตอร A สังเกตไดวาคา Carry แฟลกเปน 1 จากการ
ทํางานคําสั่งกอนหนา ไดนํามาคํานวณดวย ไดคาแฟลกหลังการทํางานเปน 65
         ที่ตําแหนง 7 ไมโครโปรเซสเซอรอานคาไดเปน 98h เปนคําสั่ง SBC A,B เปนการลบคาของ
รีจิสเตอร A กับ รีจิสเตอร B ลบกับคาใน Carry แฟลก ที่ชวงเวลา fetch3 จะอานคารีจิสเตอร A ไดคา 00h
มารอการทํางานที่ a_in แลวอานคารีจิสเตอร B ไดเปน 80h (จากการทําการเลื่อนบิตในคําสั่งที่ตําแหนง 4)
และทําการลบกันในชวงเวลา alu_to_reg ไดคาเปน 7Fh แลวทําการเขียนลงรีจิสเตอร A สังเกตไดวาคา
Carry แฟลกเปน 1 จากการทํางานคําสั่งกอนหนา ไดนํามาคํานวณดวย ไดคาแฟลกหลังการทํางานเปน 3
                                                                                                 64




                     รูปที่ 5.15 ผลการทํางานคําสั่ง ADC A,C และ SBC A,B

                           ่
5.1.12 ผลการทํางานคําสัง CP C และ JP 0005h
        การทํางานคําสั่ง JP 0005h และ CP C โดยใหรีจิสเตอร A เก็บคา 49h และรีจิสเตอร C เก็บคา
49h แสดงไดดังรูปที่ 5.16
        ที่ตําแหนง 0 ไมโครโปรเซสเซอรอานคาไดเปน C3 ทราบวาจะเปนการยายการทํางานไปยัง
ตําแหนงคาทีจะอานตอไป อานคาตอมาไดเปน 05h และ 00h ไดเปนคําสั่ง JP 0005h จึงยายการทํางาน
              ่
                ่
ไปทํางานตอทีตําแหนง 0005h
        ที่ตําแหนง 5 ไมโครโปรเซสเซอรอานคาไดเปน B9h ถอดรหัสไดคําสั่ง CP C เปนการทํางาน
                                                      
เปรียบเทียบคาระหวางรีจิสเตอร A กับรีจิสเตอร C ที่ชวงเวลา fetch3 จะอานคาจากรีจิสเตอร A มารอการ
ทํางานที่ a_in ไดคา 49h แลวอานคาจากรีจิสเตอร C มารอการทํางานที่ b_in ชวงเวลา alu_to_reg จะนํา
คามาลบกัน หาเทากันไดคาเปน 0 จะเซ็ตคาที่ Zero แฟลก แตจะไมเปลี่ยนแปลงคาใดๆในรีจิสเตอร หลัง
การทํางานไดคาแฟลกเปน 66 โดยที่คา Zero แฟลกเปน 1




                        รูปที่ 5.16 ผลการทํางานคําสั่ง CP C และ JP 0005h
                                                                                                  65
                            ่
5.1.13 ผลการทํางานคําสัง ADD HL,DE
         การทํางานคําสั่ง ADD HL,DE โดยใหรีจิสเตอร H เก็บคา 16h ใหรีจิสเตอร L เก็บคา F0h ให
รีจิสเตอร D เก็บคา 86h ใหรีจิสเตอร E เก็บคา 18h แสดงไดดังรูปที่ 5.17
        ที่ตําแหนง 0 ไมโครโปรเซสเซอรอานคาไดเปน 19h เปนคําสั่ง ADD HL,DE ในชวงเวลา Fetch3
และ arith_16b จะทําการบวกคาระหวางรีจิสเตอร L กับรีจิสเตอร E ไดคาเปน 08h และเก็บไวในรีจิสเตอร
L ตอมาในชวง arith_16_2 และ arith_16_3 จะทําการบวกคาระหวางรีจิสเตอร H กับรีจิสเตอร D และ
Carry แฟลกไดคาเปน 9D และทําการเขียนคาสูรีจิสเตอร H ไดแฟลกหลังการทํางานเสร็จเปน 0
                                                                           ํ  ้
         การทํางานของไมโครโปรเซสเซอร Z80 จะใชการทํางานคําสั่งนี้จานวนทั้งสิน 11 T-state แตใน
การพัฒนานี้จะใชการทํางานเพียง 6 T-state เทานัน เนืองจากจะไดการทํางานที่รวดเร็วกวา แตการทํางาน
                                                    ้ ่
ไดผลเชนเดียวกัน




                              รูปที่ 5.17 การทํางานคําสั่ง ADD HL,DE

5.2 ผลการทดลองจากการเขียนลงบนบอรดทดลอง
        การทดลองมี 2 การทดลองคือใชสัญญาณนาฬิกาของบอรด และใหสัญญาณนาฬิกาโดยการกด
ปุม
5.2.1 ผลการทดลองโดยใชสัญญาณนาฬิกาของบอรดทดลอง
       นําโปรแกรมที่ไดพัฒนามาทําการเขียนลงบอรดทดลองโดยใชบอรดทดลองตามรูปที่ 5.18 โดยการ
เชื่อมตอขาบัสขอมูลกับ LED เพื่อตรวจสอบคาการทํางานของบัสจากหลอด LED ใชปุมกดเพื่อให
สัญญาณรีเซ็ต และใชสัญญาณนาฬิกาของบอรด
       ผลการทดลอง ไมสามารถสังเกตการณทํางานไดโดยหลอด LED ไมติดไฟ เนื่องจากการทํางานที่เร็ว
จนสังเกตไมทันเพราะสัญญาณนาฬิกามีคาที่สูง การทํางานเสร็จภายในเวลาเสี้ยววินาทีจึงมองไมเห็นไฟ
LED ติด
                                                                                           66
5.2.2 ผลการทดลองโดยใชมือกดปุมใหสัญญาณนาฬิกา
         เปลี่ยนจากการใชสัญญาณนาฬิกาของบอรดเปนการใชการกดปุมใหสัญญาณแทน ผลการทดลอง
พบวาสามารถสังเกตเห็นคาที่อยูในหนวยความจําที่ตําแหนงสุดทายไดบน LED เนื่องจากสัญญาณนาฬิกา
มีคาต่ําจนสังเกตการณทํางานไดทัน แตการทํางานที่ไดยังไมถูกตองตามผลที่ไดจากการจําลอง




                      รูปที่ 5.18 บอรดทดลอง FPGA ที่ใช (FPGA D3 XC3S200)
                                                                                                   67
                                          บทที่ 6
                                    สรุปและขอเสนอแนะ

      เนื้อหาบทนี้จะสรุปผลการทํางานโครงการที่ผานมา ปญหาและอุปสรรคที่พบ แนวทางในการพัฒนา
ตอ และขอเสนอแนะของโครงการ

6.1 สรุปผลการทํางาน
        การพัฒนาโครงการดําเนินงานไปตามแผนที่ไดวางไว สามารถพัฒนาไมโครโปรเซสเซอรประกอบ
ไปดวยสวนตาง ๆ ดังนี้คือ
    - ALU_unit ทําหนาที่ประมวลผลการทํางานทางคณิตศาสตร ทางตรรกะ การทํางานเชิงบิต
    - control_unit เปนสวนที่ทําหนาที่สงสัญญาณควบคุมการทํางานของสวนอื่น ๆ เพื่อใหการทํางาน
        เปนไปตามตองการ
    - Instruction Register เปนตัวที่ทําหนาที่เก็บคําสั่งทํางาน
    - Register arrays เปนสวนของรีจิสเตอร ทําหนาที่เก็บคาตาง ๆ
   - Program counter ทําหนาที่เก็บคาตําแหนงของคําสั่งที่ตองการทํางาน
   - PC Increment Module ทําหนาที่เพิ่มคาของตัวนับการตําแหนงการทํางาน
   - Flag Register ทําหนาที่เก็บคาแฟลก ซึ่งเปนคาสถานะของการทํางาน
   - Latch A ทําหนาที่เก็บคาที่จะนําไปดําเนินการกับ ALU
   - Latch B ทําหนาที่เก็บคาที่จะนําไปดําเนินการกับ Program Counter
    - Latch C ทําหนาที่เก็บคาที่จะนําไปดําเนินการกับ Address Bus Control
   - Address Bus control ทําหนาที่ควบคุมการติดตอกับตําแหนงในหนวยความจํา
    - Data-out Bus control เปนตัวที่ทําหนาที่ควบคุมการนําขอมูลสงออกภายนอกไมโครโปรเซสเซอร
    - Data-in Bus control                  เปนตัวที่ทําหนาที่ควบคุมการนําขอมูลเขามาจากภายนอก
        ไมโครโปรเซสเซอร
    - SP สวนของแสตกพอยตเตอร
      คําสั่งการทํางานของไมโครโปรเซสเซอรสามารถแสดงไดดังตารางที่ 5.1

6.2 ปญหาและอุปสรรค
   - เครื่องมือที่ใชพัฒนา มีขอผิดพลาดหลายอยาง เชน โปรแกรมเดียวกันที่เคยทํางานได แตตอมาไม
     สามารถทํ า งานได ต อ งทํ า การสร า งโปรเจคขึ้ น มาใหม หรื อ การจํ า ลองการทํ า งานแล ว ค า ง
     จําเปนตองปดแลวเปดใหม เปนตน
                                                                                                68
   - การทํางานยังคงเปนการทํางานภายในของไมโครโปรเซสเซอร จึงไมสามารถสังเกตการทํางานบน
     บอรดทดลองได
   - เมื่อทดลองเขียนลงบอรดทดลอง การสังเกตผลทําไดยากเนื่องจากการทํางานเร็วมาก แมจะใช
     สัญญาณนาฬิกาจากการกดปุมก็ยังคงสังเกตไดเพียงคําสั่งการทํางานสุดทายเทานั้น

6.3 แนวทางในการพัฒนาและประยุกตใช
         พัฒนาเพิ่มใหสามารถทํางานคําสั่งเบื้องตนเพื่อใหทํางานพื้นฐานได เพื่อใหสามารถนํามาใชงาน
ไดจริง สามารถนํามาประยุกตใชโดยการนํามาประกอบการเรียนการสอนที่เกี่ยวกับไมโครโปรเซสเซอร
เพราะจะมีโครงสรางภายในเบื้องตนของไมโครโปรเซสเซอรใหสามารถศึกษาได นอกจากนี้ยังมีการจําลอง
การทํางานในเชิงเวลาใหสามารถศึกษาไดอีกเชนกัน

6.4 ขอสรุปและขอเสนอแนะ
         ไมโครโปรเซสเซอรที่ไดสามารถทํางานไดอยางถูกตองโดยใชการจําลองผานทางคอมพิวเตอร แต
ในขั้นตอนการนํามาเขียนลงบน FPGA ยังไมสามารถตรวจสอบการทํางานไดเต็มที่นัก เนื่องจากขอจํากัด
ของจํานวนคําสั่งที่สามารถทํางานได
         ตัวไมโครโปรเซสเซอรไดทําการพัฒนาในสวนหลักๆไดเปนสวนใหญ การพัฒนาที่เหลือจะเปนการ
เขียนโปรแกรมเพิ่มเติมในสวนของ สวนควบคุม และ สวน ALU ทําใหในการพัฒนาตอๆไป จะสามารถทํา
ไดรวดเร็วยิ่งขึ้น
                                                                                  69
                                  ภาคผนวก ก
                              โปรแกรมภาษา VHDL

       รายงานบทนี้นําเสนอโปรแกรมภาษา VHDL ทั้งหมดของโครงการ โดยแบงเนื้อหาตามโมดูลและ
ไฟลในโครงการดังรูปที่ ก.1




            รูปที่ ก.1 แผนผังโมดูลและไฟลของโครงการการพัฒนาไมโครโปรเซสเซอร
                                                                           70
ก.1 ไฟล top.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity top is
Port (clock : in STD_LOGIC;
      reset : in STD_LOGIC;
      wait_n : out STD_LOGIC;
      m_cycle1 : out STD_LOGIC;
      mreq : out STD_LOGIC;
      rd : out STD_LOGIC;
      wr : out STD_LOGIC;
      address : out STD_LOGIC_VECTOR (15 downto 0);
      data : out STD_LOGIC_VECTOR (7 downto 0));
end top;

architecture rtl of top is
component cpu is
Port ( clk : in STD_LOGIC;
      reset : in STD_LOGIC;
      m1 : out STD_LOGIC;
      mreq : out STD_LOGIC;
      rd : out STD_LOGIC;
      wr : out STD_LOGIC;
      wait_n : in STD_LOGIC;
      ad_bus : out STD_LOGIC_VECTOR (15 downto 0);
      da_bus : inout STD_LOGIC_VECTOR (7 downto 0));
end component;

component Z80_mem is
port ( addr : in std_logic_vector (15 downto 0);
      data : inout std_logic_vector (7 downto 0);
      sel, rd, wr : in std_logic;
      ready : out std_logic);
end component;

signal mem_sel,read,write,ready : std_logic;
signal a_bus : std_logic_vector (15 downto 0);
signal d_bus : std_logic_vector (7 downto 0);

begin
Z80 : cpu
      port map (clock, reset, m_cycle1 ,mem_sel,read,write,ready, a_bus,
               d_bus);

mem : Z80_mem
      port map (a_bus, d_bus, mem_sel, read,write,ready);

wait_n <= ready;
mreq <= mem_sel;
rd <= read;
wr <= write;
address <= a_bus;
data <= d_bus;
end rtl;
                                                       71
ก.2 ไฟล cpu.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity cpu is
Port ( clk : in STD_LOGIC;
      reset : in STD_LOGIC;
      m1 : out STD_LOGIC;
      mreq : out STD_LOGIC;
      rd : out STD_LOGIC;
      wr : out STD_LOGIC;
      wait_n : in STD_LOGIC;
      ad_bus : out STD_LOGIC_VECTOR (15 downto 0);
      da_bus : inout STD_LOGIC_VECTOR (7 downto 0));
end cpu;

architecture rtl of cpu is
component control is
port ( clk : in std_logic;
      reset : in std_logic;
      wait_n : in std_logic;
      opcode : in std_logic_vector(7 downto 0);
      cc : in STD_LOGIC;
      m1 : out std_logic;
      mreq : out std_logic;
      rd : out std_logic;
      wr : out std_logic;
      alu_opcode : out std_logic_vector(4 downto 0);
      bit_sel : out STD_LOGIC;
      alu_rd : out std_logic;
      latchA_wr : out std_logic;
      flag_wr : out std_logic;
      flag_en : out std_logic;
      latchB_wr : out std_logic;
      latchC_wr : out std_logic;
      sp_rd : out std_logic;
      sp_wr : out std_logic_vector (1 downto 0);
      reg_sel : out std_logic_vector(2 downto 0);
      reg_rd : out std_logic;
      reg_wr :out std_logic;
      inst_wr : out std_logic;
      pc_rd : out std_logic;
      pc_wr :out std_logic_vector(1 downto 0);
      inc_pc : out std_logic;
      addr_rd : out std_logic;
      addr_wr : out std_logic_vector(1 downto 0);
      din_rd : out std_logic;
      din_wr : out std_logic;
      dout_rd : out std_logic;
      dout_wr : out std_logic);
end component;

component dabuff is
Port ( clk : in STD_LOGIC;
      en : in STD_LOGIC;
      din : in STD_LOGIC_VECTOR (7 downto 0);
      dout : out STD_LOGIC_VECTOR (7 downto 0));
end component;
                                                              72
component latch is
Port ( din : in STD_LOGIC_VECTOR (7 downto 0);
      dout : out STD_LOGIC_VECTOR (7 downto 0);
      clk : in std_logic);
end component;

component pc_reg is
Port ( reset : in STD_LOGIC;
      en : in STD_LOGIC;
      sel : in STD_LOGIC_VECTOR (1 downto 0);
      dinA_8 : in STD_LOGIC_VECTOR (7 downto 0);
      dinB_8 : in STD_LOGIC_VECTOR (7 downto 0);
      din_16 : in STD_LOGIC_VECTOR (15 downto 0);
      dout : out STD_LOGIC_VECTOR (15 downto 0));
end component;

component incPC is
Port ( clk : in STD_LOGIC;
      din : in STD_LOGIC_VECTOR (15 downto 0);
      dout : out STD_LOGIC_VECTOR (15 downto 0));
end component;

component regarray is
port (data : in std_logic_vector (7 downto 0);
      sel : in std_logic_vector (2 downto 0);
      en : in std_logic;
      clk : in std_logic;
      q : out std_logic_vector (7 downto 0));
end component;

component addReg is
Port ( en : in STD_LOGIC;
      sel : in STD_LOGIC_VECTOR (1 downto 0);
      dinA_8 : in STD_LOGIC_VECTOR (7 downto 0);
      dinB_8 : in STD_LOGIC_VECTOR (7 downto 0);
      din_16 : in STD_LOGIC_VECTOR (15 downto 0);
      dout : out STD_LOGIC_VECTOR (15 downto 0));
end component;

component alu is
Port ( sel : in STD_LOGIC_VECTOR (4 downto 0);
      bit_sel : in STD_LOGIC;
      en : in STD_LOGIC;
      a_in : in STD_LOGIC_VECTOR (7 downto 0);
      b_in : in STD_LOGIC_VECTOR (7 downto 0);
      f_in : in STD_LOGIC_VECTOR (7 downto 0);
      cc : out STD_LOGIC;
      f_out : out STD_LOGIC_VECTOR (7 downto 0);
      d_out : out STD_LOGIC_VECTOR (7 downto 0));
end component;

component Flag is
Port ( clk : in std_logic;
      en : in std_logic;
      din : in STD_LOGIC_VECTOR (7 downto 0);
      dout_to_ALU : out STD_LOGIC_VECTOR (7 downto 0);
      dout_to_Databus : out STD_LOGIC_VECTOR (7 downto 0));
end component;
                                                                           73
component reg_16 is
port (data : in std_logic_vector (7 downto 0);
      en : in std_logic;
      sel : in std_logic_vector (1 downto 0);
      q : out std_logic_vector (15 downto 0));
end component;

signal pc_in,to_addr_reg: std_logic_vector (15 downto 0);
signal inst_to_cont, databus, latch_to_alu ,alu_to_flag ,
       flage_to_alu,latch_to_pc, latch_to_addrControl: std_logic_vector (7
       downto 0);
signal alusel : std_logic_vector (4 downto 0);
signal regsel : std_logic_vector (2 downto 0);
signal addrbuff_wr, pcwr ,spwr: std_logic_vector (1 downto 0);
signal regrd, regwr, instwr,increse,addrbuff_rd,di_rd, di_wr ,do_rd,
       do_wr,alu_en,pcrd,latchA_en,flag_wr,flag_en, latchB_en,
       latchC_en,cc,bit_sel,sprd: std_logic;

begin
control_u : control
      -- Create control signal for another modules
      port map ( clk, reset, wait_n, inst_to_cont, cc,m1, mreq, rd,
                 wr,alusel,bit_sel,alu_en,latchA_en,flag_wr,flag_en,
                 latchB_en, latchC_en,sprd,spwr,regsel, regrd,
                 regwr,instwr,pcrd,pcwr,increse,addrbuff_rd,addrbuff_wr,
                 di_rd, di_wr ,do_rd, do_wr);

din_control : dabuff
      -- latch 8-bits data from external to internal
      port map ( di_wr, di_rd,da_bus,databus);

dout_control : dabuff
      -- latch 8-bits data from internal to external
      port map ( do_wr, do_rd,databus,da_bus);

IR : latch
      port map ( databus, inst_to_cont,instwr);

INC_forpc : incPC
      Port map( increse,to_addr_reg,pc_in);

PC : pc_reg
      port map ( reset, pcrd, pcwr,databus,latch_to_pc,pc_in,to_addr_reg);

REG_A_to_L : regarray
      port map ( databus, regsel, regrd, regwr, databus);

address_control : addReg
      port map (addrbuff_rd,addrbuff_wr,databus,latch_to_addrControl,
                 to_addr_reg, ad_bus );

ALU_unit : alu
      port map (alusel, bit_sel, alu_en,latch_to_alu,databus, flage_to_alu,
                 cc, alu_to_flag, databus);

latch_A : latch
      port map ( databus, latch_to_alu,latchA_en);

latch_B : latch
      port map ( databus, latch_to_pc,latchB_en);
latch_C : latch
                                                                       74
      port map ( databus, latch_to_addrControl,latchC_en);

flag_reg : Flag
      port map (flag_wr,flag_en,alu_to_flag, flage_to_alu, databus);

SP : reg_16
      port map (databus, sprd, spwr, to_addr_reg);

end rtl;



ก.3 ไฟล Z80_mem.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Z80_mem is
port ( addr : in std_logic_vector (15 downto 0);
      data : inout std_logic_vector (7 downto 0);
      sel, rd, wr : in std_logic;
      ready : out std_logic);
end Z80_mem;

architecture rtl of Z80_mem is
begin
      memproc: process(addr, sel, rd, wr)
      type t_mem is array(0 to 7) of std_logic_vector (7 downto 0);
      variable mem_data : t_mem :=
      (
      -- "00000001", -- LD BC,5000h
      -- "00000000", -- 00h
      -- "01010000", -- 50h
      -- "00111110", -- LD A,50h
      -- "01010000", -- 50h
      -- "00000010", -- LD (BC),A
      -- "00010010", -- LD (DE),A
      -- "01111110", -- LD A,(HL)
      -- "00110010", -- LD (0005h),A
      -- "00000101", -- 05h
      -- "00000000", -- 00h
      -- "01000111", -- LD B,A
      -- "01111110", -- LD A,(HL)
      -- "01110111", -- LD (HL),A
      -- "00111010", -- LD A,0000h
      -- "00000000", -- 00h
      -- "00000000", -- 00h
      -- "01111110", -- LD A,(HL)
      -- "00001010", -- LD A,(BC)
      -- "00011010", -- LD A,(DE)
      -- "00000001", -- LD BC,0005h
      -- "00000101", -- 05h
      -- "00000000", -- 00h
      -- "00010001", -- LD DE,0005h
      -- "00000101", -- 05h
      -- "00000000", -- 00h
      -- "00100001", -- LD HL,0005h
      -- "00000101", -- 05h
      -- "00000000", -- 00h
      -- "00110001", -- LD SP,0005h
                                                                        75
        -- "00000101", -- 05h
        -- "00000000", -- 00h
        -- "10000001", -- ADD A,C
        -- "10010001", -- SUB A,C
        -- "00001100", -- INC C
        -- "00001101", -- DEC C
        -- "11001011", -- CB
        -- "01000001", -- BIT 0,C
        -- "11001011", -- CB
        -- "10001001", -- RES 1,C
        -- "11000011", -- JP 0002h
        -- "00000010", -- 02h
        -- "00000000", -- 00h
        -- "11000010", -- JP NZ,0005h
        -- "00000101", -- 05h
        -- "00000000", -- 00h
        -- "11001010", -- JP Z,0005h
        -- "00000101", -- 05h
        -- "00010000", -- DJNZ 0Ch
        -- "00001100", -- 0Ch
        "11000110", -- ADD A,0Ch
        "00001100", -- 0Ch
        "00000000", -- 00h
        "00000000", -- 0Ch
        "00000000", -- 00h
        "00000000", -- 0Ch
        "00000000", -- 00h
        "00000000" -- 00h
        );
begin
      data <= "ZZZZZZZZ";
      ready <= '1';
      if sel = '0' then
            if rd = '0' then
              data <= mem_data(CONV_INTEGER(addr(15 downto 0)))after 1 ns;
              ready <= '0';
              ready <= '1' after 10 ns;
            elsif wr = '0' then
              mem_data(CONV_INTEGER(addr(15 downto 0))) := data;
            end if;
      else
            data <= "ZZZZZZZZ" after 1 ns;
      end if;
end process;
end rtl;



ก.4 ไฟล control.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity control is
port ( clk : in std_logic;
      reset : in std_logic;
      wait_n : in std_logic;
      opcode : in std_logic_vector(7 downto 0);
      cc : in STD_LOGIC;
      m1 : out std_logic;
                                                                        76
      mreq : out std_logic;
      rd : out std_logic;
      wr : out std_logic;
      alu_opcode : out std_logic_vector(4 downto 0);
      bit_sel : out STD_LOGIC;
      alu_rd : out std_logic;
      latchA_wr : out std_logic;
      flag_wr : out std_logic;
      flag_en : out std_logic;
      latchB_wr : out std_logic;
      latchC_wr : out std_logic;
      sp_rd : out std_logic;
      sp_wr : out std_logic_vector (1 downto 0);
      ix_rd : out std_logic;
      ix_wr : out std_logic_vector (1 downto 0);
      iy_rd : out std_logic;
      iy_wr : out std_logic_vector (1 downto 0);
      arith_16 : out std_logic ;
      reg_sel : out std_logic_vector(2 downto 0);
            -- select register A,B,C,D,E,H or L
      reg_rd : out std_logic; -- read data from register
      reg_wr :out std_logic; -- write data to register
      inst_wr : out std_logic;
             -- write instruction from databus to control unit
      pc_rd : out std_logic; -- read content of PC
      pc_wr :out std_logic_vector(1 downto 0); -- write data to PC
      inc_pc : out std_logic; -- increse PC by one
      addr_rd : out std_logic; -- write address to address bus
      addr_wr : out std_logic_vector(1 downto 0);
             -- write address to address register
      din_rd : out std_logic; -- place data on internal data bus
      din_wr : out std_logic; -- read data from external data bus
      dout_rd : out std_logic; -- place data on external data bus
      dout_wr : out std_logic); -- read data from internal data bus
end control;

architecture rtl of control is
      type state is (reset1,fetch1,fetch2,fetch3,fetch4,loadr1,loadr2,
            direct_read1,direct_read2,direct_read3,direct_read4,
            direct_read5,direct_read6,indirect_read1,indirect_read2,
            indirect_read3,loadHL_to_r,loadr_to_HL,indirect_write1,
            indirect_write2,indirect_write3,alu_to_reg,alu_to_regA,nop,
            arith_16b,arith_16b_2,arith_16b_3,
            loadBC_to_a,loadDE_to_a,loada_to_BC,loada_to_DE,djnz);
      type prefix is (NON,CB);
      signal current_state, next_state : state;
      signal first_opcode : prefix;
      signal NumberOfOpcode : integer range 1 to 3 ;
begin
      process (current_state, opcode,wait_n,first_opcode,cc,NumberOfOpcode)
      begin -- initialize control signals
            m1 <= '1';
            mreq <= '1';
            rd <= '1';
            wr <= '1';
            alu_opcode <= "11111";
            alu_rd <= '1';
            latchA_wr <= '1';
            flag_wr <= '1';
            flag_en <= '1';
            bit_sel <= '1';
                                                                        77
            latchB_wr <= '1';
            latchC_wr <= '1';
            sp_rd <= '1';
            sp_wr <= "11";
            ix_rd <= '1';
            ix_wr <= "11";
            iy_rd <= '1';
            iy_wr <= "11";
            reg_sel <= "ZZZ";
            reg_rd <= '1';
            reg_wr <= '1';
            inst_wr <= '1';
            pc_rd <= '1';
            pc_wr <= "11";
            inc_pc <= '1';
            addr_rd <= '1';
            addr_wr <= "11";
            din_rd <= '1';
            din_wr <= '1';
            dout_rd <= '1';
            dout_wr <= '1';
      case current_state is
            when reset1 =>
                  m1 <= '1';
                  mreq <= '1';
                  rd <= '1';
                  wr <= '1';
                  alu_opcode <= "11111";
                  alu_rd <= '1';
                  latchA_wr <= '1';
                  flag_wr <= '0';
                  bit_sel <= '1';
                  latchB_wr <= '1';
                  latchC_wr <= '1';
                  sp_rd <= '1';
                  sp_wr <= "11";
                  reg_sel <= "ZZZ";
                  reg_rd <= '1';
                  reg_wr <= '1';
                  inst_wr <= '1';
                  pc_rd <= '1';
                  pc_wr <= "11";
                  inc_pc <= '1';
                  addr_rd <= '1';
                  addr_wr <= "11";
                  din_rd <= '1';
                  din_wr <= '1';
                  dout_rd <= '1';
                  dout_wr <= '1';
                  first_opcode <= non;
                  next_state <= fetch1;
---------------------------------------------------------------------------
----------------------- Instruction Fetch Cycle ---------------------------
---------------------------------------------------------------------------
-- fetch1 : m1 is actived, the PC is placed on address bus. Mreq,rd are
actived to indicatethat the memory read data should be enabled onto the CPU
data bus.
            when fetch1 =>
                  m1 <= '0' ;
                  pc_rd <= '0' ;
                  addr_wr <= "00" ; -- write address to addr_Register.
                                                                        78
                   addr_rd <= '0' ; -- read contents of addr_Register to
                                       address bus.
                   mreq <= '0' after 20 ns; -- memory request an rd is
                                                active
                   rd <= '0' after 20 ns;
                   first_opcode <= non;
                   NumberOfOpcode <= 1;
                   next_state <= fetch2;
-- fetch2 : Holds control signals for enable memory and check wait signal
from memory
            when fetch2 =>
                   m1 <= '0' ;
                   pc_rd <= '0' ;
                   inc_pc <= '0' ;
                   pc_rd <= '1' after 10 ns;
                   pc_wr <= "00" after 20 ns;
                   mreq <= '0' ;
                   rd <= '0' ;
                   next_state <= fetch3;
-- fetch3 : read data from data bus before memory read is inactived and
decode the fetched
instruction.
             when fetch3 =>
                   mreq <= '0' ;
                   rd <= '0' ;
                   din_rd <= '0';
                   din_wr <= '0';
                   inst_wr <= '0' after 10 ps;
                   rd <= '1' after 1 ns;
---------------------------------------------------------------------------
---------------------------- Decode ---------------------------------------
---------------------------------------------------------------------------
case opcode is
---------------------------------------------------------------------------
------------------------- 8-bit Load Group --------------------------------
---------------------------------------------------------------------------
-------- LD r,r' 1 byte
      when "01111111"|"01111000"|"01111001"|"01111010"|"01111011"|
             "01111100"|"01111101"|"01000111"|"01000000"|"01000001"|
             "01000010"|"01000011"|"01000100"|"01000101"|"01001111"|
             "01001000"|"01001001"|"01001010"|"01001011"|"01001100"|
             "01001101"|"01010111"|"01010000"|"01010001"|"01010010"|
             "01010011"|"01010100"|"01010101"|"01011111"|"01011000"|
             "01011001"|"01011010"|"01011011"|"01011100"|"01011101"|
             "01100111"|"01100000"|"01100001"|"01100010"|"01100011"|
             "01100100"|"01100101"|"01101111"|"01101000"|"01101001"|
             "01101010"|"01101011"|"01101100"|"01101101" =>
             din_rd <= '1' after 1 ns;
             reg_sel <= opcode (2 downto 0);
             reg_rd <= '0' after 5 ns;
             alu_opcode <= "00110" after 20 ns;
             next_state <= loadr1;
----LD r,n 2 bytes
      when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|
             "00101110"|"00111110" =>
             NumberOfOpcode <= 2;
             next_state <= fetch4;
----LD A,(nn)/3 bytes or LD (nn),A/3 bytes
      when "00111010"|"00110010" =>
             NumberOfOpcode <= 3;
             next_state <= fetch4;
                                                                        79
----LD r,(HL) 1 bytes
      When "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|
            "01101110"|"01111110" =>
            din_rd <= '1' after 10 ns;
            reg_sel <= "101"; -- Load L to latchC for
            reg_rd <= '0' after 15 ns; -- Low byte of addr_control.
            latchC_wr <= '0' after 20 ns;
            next_state <= loadHL_to_r;
----LD (HL),r 1 byte
      When "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|
            "01110101"|"01110111" =>
            din_rd <= '1' after 10 ns;
            reg_sel <= "101"; -- Load L to latchC for
            reg_rd <= '0' after 15 ns; -- Low byte of addr_control.
            latchC_wr <= '0' after 20 ns;
            next_state <= loadr_to_HL;
----LD A,(BC)/1 byte
      when "00001010" =>
            din_rd <= '1' after 10 ns;
            reg_sel <= "001"; -- Load C to latchC for
            reg_rd <= '0' after 15 ns; -- Low byte of addr_control.
            latchC_wr <= '0' after 20 ns;
            next_state <= loadBC_to_a ;
----LD A,(DE)/1 byte
      when "00011010" =>
            din_rd <= '1' after 10 ns;
            reg_sel <= "011"; -- Load E to latchC for
            latchC_wr <= '0' after 20 ns;
            next_state <= loadDE_to_a ;
---LD (BC),A/1 byte
      when "00000010" =>
            din_rd <= '1' after 10 ns;
            reg_sel <= "001"; -- Load C to latchC for
            reg_rd <= '0' after 15 ns; -- Low byte of addr_control.
            latchC_wr <= '0' after 20 ns;
            next_state <= loada_to_BC ;
----LD (DE),A/1 byte
      when "00010010" =>
            din_rd <= '1' after 10 ns;
            reg_sel <= "011"; -- Load E to latchC for
            reg_rd <= '0' after 15 ns; -- Low byte of addr_control.
            latchC_wr <= '0' after 20 ns;
            next_state <= loada_to_DE ;
---------------------------------------------------------------------------
------------------------- 16-bit Load Group -------------------------------
---------------------------------------------------------------------------
----LD BC,nn or LD DE,nn or LD HL,nn or LD SP,nn / 3bytes
      when "00000001"|"00010001"|"00100001"|"00110001" =>
            NumberOfOpcode <= 3;
            next_state <= fetch4;
---------------------------------------------------------------------------
------------------------- 8-bit Arithmatic Group --------------------------
---------------------------------------------------------------------------
----ADD A,r / 1 byte
      When "10000111"|"10000000"|"10000001"|"10000010"|"10000011"|
            "10000100"|"10000101" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            reg_sel <= opcode (2 downto 0)after 20 ns;
                                                                     80
            alu_opcode <= opcode (7 downto 3)after 25 ns;
            next_state <= alu_to_regA;
----ADD A,n / 2 bytes
      when "11000110" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            NumberOfOpcode <= 2;
            next_state <= fetch4;
----ADC A,r / 1 byte
      When "10001111"|"10001000"|"10001001"|"10001010"|"10001011"|
            "10001100"|"10001101" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            reg_sel <= opcode (2 downto 0)after 20 ns;
            alu_opcode <= opcode (7 downto 3)after 25 ns;
            next_state <= alu_to_regA;
----ADC A,n / 2 bytes
      when "11001110" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            NumberOfOpcode <= 2;
            next_state <= fetch4;
----SUB A,r / 1 byte
      When "10010111"|"10010000"|"10010001"|"10010010"|"10010011"|
            "10010100"|"10010101" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            reg_sel <= opcode (2 downto 0) after 20 ns;
            alu_opcode <= opcode (7 downto 3)after 25 ns;
            next_state <= alu_to_regA;
----SUB A,n / 2 bytes
      when "11010110" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            NumberOfOpcode <= 2;
            next_state <= fetch4;
----SBC A,r / 1 byte
      When "10011111"|"10011000"|"10011001"|"10011010"|"10011011"|
            "10011100"|"10011101" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            reg_sel <= opcode (2 downto 0) after 20 ns;
            alu_opcode <= opcode (7 downto 3)after 25 ns;
            next_state <= alu_to_regA;
----SUB A,n / 2 bytes
      when "11011110" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
                                                                     81
            latchA_wr <= '0' after 2 ns;
            NumberOfOpcode <= 2;
            next_state <= fetch4;
----AND r / 1 byte
      When "10100111"|"10100000"|"10100001"|"10100010"|"10100011"|
            "10100100"|"10100101" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            reg_sel <= opcode (2 downto 0) after 20 ns;
            alu_opcode <= opcode (7 downto 3)after 25 ns;
            next_state <= alu_to_regA;
----AND n / 2 bytes
      when "11100110" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            NumberOfOpcode <= 2;
            next_state <= fetch4;
----OR r / 1 byte
      When "10110111"|"10110000"|"10110001"|"10110010"|"10110011"|
            "10110100"|"10110101" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            reg_sel <= opcode (2 downto 0) after 20 ns;
            alu_opcode <= opcode (7 downto 3)after 25 ns;
            next_state <= alu_to_regA;
----OR n / 2 bytes
      when "11110110" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            NumberOfOpcode <= 2;
            next_state <= fetch4;
----XOR r / 1 byte
      When "10101111"|"10101000"|"10101001"|"10101010"|"10101011"|
            "10101100"|"10101101" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            reg_sel <= opcode (2 downto 0) after 20 ns;
            alu_opcode <= opcode (7 downto 3)after 25 ns;
            next_state <= alu_to_regA;
----XOR n / 2 bytes
      when "11101110" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            NumberOfOpcode <= 2;
            next_state <= fetch4;
----CP r / 1 byte
      When "10111111"|"10111000"|"10111001"|"10111010"|"10111011"|
            "10111100"|"10111101" =>
            din_rd <= '1' after 1 ns;
                                                                        82
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            reg_sel <= opcode (2 downto 0) after 20 ns;
            alu_opcode <= opcode (7 downto 3)after 25 ns;
            next_state <= alu_to_regA;
----CP n / 2 bytes
      when "11111110" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "111";
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            NumberOfOpcode <= 2;
            next_state <= fetch4;
----INC r / 1 byte
      When "00111100"|"00000100"|"00001100"|"00010100"|"00011100"|
            "00100100"|"00101100" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= opcode (5 downto 3) ;
            reg_rd <= '0' after 1 ns;
            alu_opcode <= "00100" after 5 ns;
            next_state <= alu_to_reg;
----DEC r / 1 byte
      When "00111101"|"00000101"|"00001101"|"00010101"|"00011101"|
            "00100101"|"00101101" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= opcode (5 downto 3) ;
            reg_rd <= '0' after 1 ns;
            alu_opcode <= "00101" after 5 ns;
            next_state <= alu_to_reg;
------------------------------------------------------------------------
-------- 16 Bit Arithmatic Group ----------------------------------------
------------------------------------------------------------------------
---- ADD HL,rr'
      when "00001001"|"00011001"|"00101001"|"00111001" =>
            din_rd <= '1' after 1 ns;
            reg_sel <= "101" ;
            reg_rd <= '0' after 1 ns;
            latchA_wr <= '0' after 2 ns;
            if opcode (5 downto 4 ) = "00" then
                   reg_sel <= "001" after 10 ns; --register BC
            elsif opcode (5 downto 4 ) = "01" then
                   reg_sel <= "011" after 10 ns; --register DE
            elsif opcode (5 downto 4 ) = "10" then
                   reg_sel <= "101" after 10 ns; --register HL
            elsif opcode (5 downto 4 ) = "11" then
            -- reg_sel <= after 10 ns; --register SP
            end if;
            arith_16 <= '0' after 20 ns;
            alu_opcode <= "10000" after 20 ns;
            next_state <= arith_16b;
------------------------------------------------------------------------
--------General-Purpose Arithmetic and CPU Control Groups---------------
------------------------------------------------------------------------
----NOP 1 byte
      when "00000000" =>
            NumberOfOpcode <= 1;
            next_state <= fetch4;
-----------------------------------------------------------------------
-------- Bit Set, Reset, and Test Group -------------------------------
----------- And Rotate & Shift Group ----------------------------------
                                                                          83
-----------------------------------------------------------------------
----Prefix CB 1 byte
      when "11001011" => -- CB
             NumberOfOpcode <= 2;
             first_opcode <= CB;
             next_state <= fetch4;
-----------------------------------------------------------------------
----------------------- Jump Group ------------------------------------
-----------------------------------------------------------------------
----JP nn
      when "11000011" => -- C3
             NumberOfOpcode <= 3;
             next_state <= fetch4;
----JP cc,nn
      When "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|
             "11101010"|"11110010"|"11111010" =>
             NumberOfOpcode <= 3;
             next_state <= fetch4;
----DJNZ,e
      when "00010000" => -- 10
             din_rd <= '1' after 1 ns;
             reg_sel <= "000" ; -- Decrese B reg.
             reg_rd <= '0' after 1 ns;
             alu_opcode <= "00101" after 5 ns;
             next_state <= djnz;
      when others => NULL;
      end case ;
-----------------------------------------------------------------------
----------------------- Instruction Execution ------------------------
-----------------------------------------------------------------------
      when fetch4 =>
             if NumberOfOpcode > 1 then
                   pc_rd <= '0' ; -- LD r,n / LD A,nn
                   addr_wr <= "00" ; -- LD dd,nn / CB / JP nn
                   next_state <= direct_read1; -- ADD A,n
             elsif NumberOfOpcode = 1 then -- NOP
                   next_state <= fetch1;
             end if;
      when loadr1 =>
             if opcode (7) = '1' then
                   reg_sel <= "101"; -- Load L to Low-byte of SP
                   reg_rd <= '0';
                   sp_wr <= "01" after 1 ns;
                   next_state <= loadr2;
             else -- Load r to r'
                   reg_sel <= opcode (5 downto 3) ;
                   reg_wr <= '0' after 5 ns;
                   alu_rd <= '0' ;
                   next_state <= fetch1;
             end if;
      when loadr2 =>
             reg_sel <= "100"; -- Load H to High-byte of SP
             reg_rd <= '0';
             sp_wr <= "10" after 1 ns;
             next_state <= fetch1;
      when loadHL_to_r =>
             reg_sel <= "100"; -- Load H to latchC for
             reg_rd <= '0' ; -- High byte of addr_control.
             addr_wr <= "01" after 1 ns;
             next_state <= indirect_read1;
      when loadBC_to_a =>
                                                                        84
            reg_sel <= "000"; -- Load B to latchC for
            reg_rd <= '0' ; -- High byte of addr_control.
            addr_wr <= "01" after 1 ns;
            next_state <= indirect_read1;
      when loadDE_to_a =>
            reg_sel <= "010"; -- Load D to latchC for
            reg_rd <= '0' ; -- High byte of addr_control.
            addr_wr <= "01" after 1 ns;
            next_state <= indirect_read1;
      when loadr_to_HL =>
            reg_sel <= "100"; -- Load L to latchC for
            reg_rd <= '0' ; -- High byte of addr_control.
            addr_wr <= "01" after 1 ns;
            next_state <= indirect_write1;
      when loada_to_BC =>
            reg_sel <= "000"; -- Load B to latchC for
            reg_rd <= '0' ; -- High byte of addr_control.
            addr_wr <= "01" after 1 ns;
            next_state <= indirect_write1;
      when loada_to_DE =>
            reg_sel <= "010"; -- Load D to latchC for
            reg_rd <= '0' ; -- High byte of addr_control.
            addr_wr <= "01" after 1 ns;
            next_state <= indirect_write1;
-----------------------------------------------------------------------
----------------------- Memory Read Cycle -----------------------------
-----------------------------------------------------------------------
      when direct_read1 =>
            addr_rd <= '0' ;
            -- read contents of addr_Register to address bus.
            mreq <= '0' after 20 ns; -- memory request an rd is active
            rd <= '0' after 20 ns;
            pc_rd <= '0' ;
            next_state <= direct_read2;
      when direct_read2 =>
            pc_rd <= '0' ;
            inc_pc <= '0' ;
            pc_rd <= '1' after 10 ns;
            pc_wr <= "00" after 20 ns;
            mreq <= '0' ; -- memory request an rd is active
            rd <= '0' ;
            next_state <= direct_read3;
      when direct_read3 =>
            mreq <= '0' ; -- memory request an rd is active
            rd <= '0' ;
            din_rd <= '0';
            din_wr <= '0';
            mreq <= '1' after 1 ns;
            rd <= '1' after 1 ns;
            if first_opcode = CB then -- Bit, Set, Reset and Rotate & Shift
                  inst_wr <= '0' after 10 ps; -- Prefix is CB
                  din_rd <= '1' after 1 ns;
                  reg_sel <= opcode (2 downto 0) ;
                  reg_rd <= '0' after 1 ns;
                  bit_sel <= '0';
                  alu_opcode <= opcode (7 downto 3)after 10 ns;
                  next_state <= alu_to_reg;
            end if;
      case opcode is
            when "00111010"|"00110010" =>
                  pc_rd <= '0' ; -- LD A,(nn) or LD (nn),A
                                                            85
      addr_wr <= "00" ;
      latchC_wr <= '0' after 10 ns;
      next_state <= direct_read4;
when "00000001"|"00010001"|"00100001" =>
-- LD BC,nn or LD DE,nn
      reg_sel <= opcode (5 downto 4) & '1'; -- LD HL,nn
      reg_wr <= '0' after 10 ns;
      pc_rd <= '0' ;
      addr_wr <= "00" ;
      next_state <= direct_read4;
when "00110001" =>
      sp_wr <= "01" after 10 ns; -- LD SP,nn
      pc_rd <= '0' ; -- Load n to low byte of SP
      addr_wr <= "00" ;
      next_state <= direct_read4;
when "11000011" =>
      latchB_wr <= '0' after 10 ns; -- JP nn
      pc_rd <= '0' ; -- Load n to low byte of PC
      addr_wr <= "00" ;
      next_state <= direct_read4;
when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|
      "11101010"|"11110010"|"11111010" =>
      latchB_wr <= '0' after 10 ns; -- JP cc,nn
      pc_rd <= '0' ; -- Load n to low byte of PC
      addr_wr <= "00" ;
      next_state <= direct_read4;
when "00010000" => -- 10
      alu_opcode <= "11001"; -- Checks Z flag
      if cc = '1' then -- If B = 0 jump to PC + e
            next_state <= direct_read4;
      else
            next_state <= fetch1;
      end if;
when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|
      "00101110"|"00111110" =>
      reg_sel <= opcode (5 downto 3); -- load n to any register
      reg_wr <= '0' after 10 ns;
      next_state <= fetch1;
when "11000110" =>
      alu_opcode <= "10000" after 10 ps; -- ADD n to reg.A
      din_rd <= '1' after 10 ns;
      reg_sel <= "111" after 10 ns;
      reg_wr <= '0' after 20 ns;
      alu_opcode <= "11111" after 10 ns;
      alu_rd <= '0' after 10 ns;
      flag_wr <= '0' after 10 ns;
      next_state <= fetch1;
when "11001110" =>
      alu_opcode <= "10001" after 10 ps; -- ADC n to reg.A
      din_rd <= '1' after 10 ns;
      reg_sel <= "111" after 10 ns;
      reg_wr <= '0' after 20 ns;
      alu_opcode <= "11111" after 10 ns;
      alu_rd <= '0' after 10 ns;
      flag_wr <= '0' after 10 ns;
      next_state <= fetch1;
when "11010110" =>
      alu_opcode <= "10010" after 10 ps; -- SUB n from reg.A
      din_rd <= '1' after 10 ns;
      reg_sel <= "111" after 10 ns;
      reg_wr <= '0' after 20 ns;
                                                                         86
              alu_opcode <= "11111" after 10   ns;
              alu_rd <= '0' after 10 ns;
              flag_wr <= '0' after 10 ns;
              next_state <= fetch1;
     when    "11011110" =>
              alu_opcode <= "10011" after 10   ps; -- SBC n from reg.A
              din_rd <= '1' after 10 ns;
              reg_sel <= "111" after 10 ns;
              reg_wr <= '0' after 20 ns;
              alu_opcode <= "11111" after 10   ns;
              alu_rd <= '0' after 10 ns;
              flag_wr <= '0' after 10 ns;
              next_state <= fetch1;
      when   "11100110" =>
              alu_opcode <= "10100" after 10   ps; -- AND n with reg.A
              din_rd <= '1' after 10 ns;
              reg_sel <= "111" after 10 ns;
              reg_wr <= '0' after 20 ns;
              alu_opcode <= "11111" after 10   ns;
              alu_rd <= '0' after 10 ns;
              flag_wr <= '0' after 10 ns;
              next_state <= fetch1;
      when   "11110110" =>
              alu_opcode <= "10110" after 10   ps; -- OR n with reg.A
              din_rd <= '1' after 10 ns;
              reg_sel <= "111" after 10 ns;
              reg_wr <= '0' after 20 ns;
              alu_opcode <= "11111" after 10   ns;
              alu_rd <= '0' after 10 ns;
              flag_wr <= '0' after 10 ns;
              next_state <= fetch1;
      when   "11101110" =>
              alu_opcode <= "10101" after 10   ps; -- XOR n with reg.A
              din_rd <= '1' after 10 ns;
              reg_sel <= "111" after 10 ns;
              reg_wr <= '0' after 20 ns;
              alu_opcode <= "11111" after 10   ns;
              alu_rd <= '0' after 10 ns;
              flag_wr <= '0' after 10 ns;
              next_state <= fetch1;
     when    "11111110" =>
              alu_opcode <= "10111" after 10   ps; -- CP n with reg.A
              din_rd <= '1' after 10 ns;
              reg_sel <= "111" after 10 ns;
              reg_wr <= '0' after 20 ns;
              alu_opcode <= "11111" after 10   ns;
              alu_rd <= '0' after 10 ns;
              flag_wr <= '0' after 10 ns;
              next_state <= fetch1;
      when   others => NULL;
end case;

when direct_read4 =>
      addr_rd <= '0';
      -- read contents of addr_Register to address bus.
      mreq <= '0' after 20 ns; -- memory request an rd is active
      rd <= '0' after 20 ns;
      next_state <= direct_read5;

when direct_read5 =>
      pc_rd <= '0' ;
                                                                   87
      inc_pc <= '0' after 1 ns;
      pc_rd <= '1' after 10 ns;
      pc_wr <= "00" after 20 ns;
      mreq <= '0' ; -- memory request an rd is active
      rd <= '0' ;
      next_state <= direct_read6;
when direct_read6 =>
      mreq <= '0' ; -- memory request an rd is active
      rd <= '0' ;
      din_rd <= '0';
      din_wr <= '0';
      mreq <= '1' after 1 ns;
      rd <= '1' after 1 ns;
      case opcode is
            when "00111010" => -- LD A,(nn)
                  addr_wr <= "01" after 10 ns;
                  next_state <= indirect_read1;
            when "00110010" => -- LD (nn),A
                  addr_wr <= "01" after 10 ns;
                  next_state <= indirect_write1;
            when "00000001"|"00010001"|"00100001" =>
            -- LD BC,nn or LD DE,nn
                  reg_sel <= opcode (5 downto 4) & '0'; -- LD HL,nn
                  reg_wr <= '0' after 10 ns;
                  next_state <= fetch1;
            when "00110001" =>
                  sp_wr <= "10" after 10 ns; -- LD SP,nn
                  next_state <= fetch1; -- Load n to High byte of SP
            when "11000011" =>
                  pc_wr <= "01" after 25 ns; -- JP nn
                  next_state <= fetch1; -- Load n to High byte of PC
            when "11000010"|"11001010"|"11010010"|"11011010"|
                  "11100010"|"11101010"|"11110010"|"11111010" =>
                  alu_opcode <= opcode(7 downto 3);
                  -- JP cc,nn /Checks condition cc
                  if cc = '1' then -- If cc true then jump to nn
                        pc_wr <= "01" after 25 ns;
                        -- Load n to High byte of PC
                  end if;
                  next_state <= fetch1;
            when others => NULL;
      end case ;

when indirect_read1 =>
      addr_rd <= '0' ;
      -- read contents of addr_Register to address bus.
      mreq <= '0' after 20 ns; -- memory request an rd is active
      rd <= '0' after 20 ns;
      next_state <= indirect_read2;
when indirect_read2 =>
      mreq <= '0' ; -- memory request an rd is active
      rd <= '0' ;
      next_state <= indirect_read3;
when indirect_read3 =>
      mreq <= '0' ; -- memory request an rd is active
      rd <= '0' ;
      din_rd <= '0';
      din_wr <= '0';
      mreq <= '1' after 1 ns;
      rd <= '1' after 1 ns;
      case opcode is
                                                                        88
                  when  "00000110"|"00001110"|"00010110"|"00011110"|
                        "00100110"|"00101110"|"00111110"|"01000110"|
                        "01001110"|"01010110"|"01011110"|"01100110"|
                        "01101110"|"01111110"=>
                        reg_sel <= opcode (5 downto 3);
                        -- load n to any register
                        reg_wr <= '0' after 10 ns;
                        next_state <= fetch1;
                  when "00111010"|"00001010"|"00011010" =>
                        -- load (nn)|(BC)|(DE) to reg.A
                        reg_sel <= "111";
                        reg_wr <= '0' after 10 ns;
                        next_state <= fetch1;
                  when others => NULL;
            end case;
---------------------------------------------------------------------------
-----------------------------Memory Write Cycle----------------------------
---------------------------------------------------------------------------
      when indirect_write1 =>
            if opcode (6) = '1' then -- LD(hl),r
                  reg_sel <= opcode (2 downto 0);
                  reg_rd <= '0' ;
            else
                  reg_sel <= "111"; -- LD (bc),A /LD(de),A/ LD (nn),A
                  reg_rd <= '0' ;
            end if;
            addr_rd <= '0';
            mreq <= '0' after 20 ns;
            dout_wr <= '0' after 5 ns;
            dout_rd <= '0' after 20 ns;
            next_state <= indirect_write2;
      when indirect_write2 =>
            mreq <= '0' ;
            dout_rd <= '0';
            wr <= '0' after 20 ns;
            next_state <= indirect_write3;
      when indirect_write3 =>
            mreq <= '0' ;
            dout_rd <= '0';
            wr <= '0' ;
            mreq <= '1' after 20 ns;
            wr <= '1' after 20 ns;
            next_state <= fetch1;
---------------------------------------------------------------------------
-------------End Memory-Write Cycle----------------------------------------
---------------------------------------------------------------------------
      when alu_to_reg =>
            if first_opcode = CB then
                  reg_sel <= opcode (2 downto 0) ;
            else
                  reg_sel <= opcode (5 downto 3) ;
            end if;
            reg_wr <= '0' after 5 ns;
            alu_rd <= '0' ;
            flag_wr <= '0';
            next_state <= fetch1;

      when alu_to_regA =>
            reg_sel <= "111" ;
            reg_wr <= '0' after 5 ns;
            alu_rd <= '0' ;
                                                               89
           flag_wr <= '0';
           next_state <= fetch1;

     when arith_16b =>
           reg_sel <= "101" ;
           reg_wr <= '0' after 5 ns;
           alu_rd <= '0';
           flag_wr <= '0';
           -- addr_wr <= "00";
           next_state <= arith_16b_2;

     when arith_16b_2 =>
           m1 <= '0' ;
           din_rd <= '1' after 1 ns;
           reg_sel <= "100" ;
           reg_rd <= '0' after 1 ns;
           latchA_wr <= '0' after 2 ns;
           if opcode ( 5 downto 4 ) = "00" then
                 reg_sel <= "000" after 10 ns; --register BC
           elsif opcode ( 5 downto 4 ) = "01" then
                 reg_sel <= "010" after 10 ns; --register DE
           elsif opcode ( 5 downto 4 ) = "10" then
                 reg_sel <= "100" after 10 ns; --register HL
           elsif opcode ( 5 downto 4 ) = "11" then
           -- reg_sel <= after 10 ns; --register SP
           end if;
           arith_16 <= '0' after 20 ns;
           alu_opcode <= "10001" after 20 ns;
           next_state <= arith_16b_3;

      when arith_16b_3 =>
            m1 <= '0' ;
            reg_sel <= "100" ;
            reg_wr <= '0' after 5 ns;
            alu_rd <= '0';
            flag_wr <= '0';
            addr_wr <= "00";
            next_state <= fetch1;

      when djnz =>
            reg_sel <= "000" ; -- Result to Reg. B
            reg_wr <= '0' after 5 ns;
            alu_rd <= '0' ;
            flag_wr <= '0';
            pc_rd <= '0' ;
            addr_wr <= "00" ;
            next_state <= direct_read1;

      when others => NULL;
      end case;
end process;
----------------------------------------------------------
--Check Reset signal & Update to next state --------------
----------------------------------------------------------
process (clk,reset)
begin
      if reset = '0' then
            current_state <= reset1 after 1 ns;
      elsif rising_edge (clk) then
            current_state <= next_state after 1 ns;
      end if;
                                                     90
end process;
end rtl;



ก.5 ไฟล latch.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity latch is
Port (din : in STD_LOGIC_VECTOR (7 downto 0);
      dout : out STD_LOGIC_VECTOR (7 downto 0);
      clk : in std_logic);
end latch;

architecture rtl of latch is
begin
      process
      begin
            wait until clk'event and clk = '0';
            dout <= din ;
      end process;
end rtl;



ก.6 ไฟล dabuff.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity dabuff is
Port (clk : in STD_LOGIC;
      en : in STD_LOGIC;
      din : in STD_LOGIC_VECTOR (7 downto 0);
      dout : out STD_LOGIC_VECTOR (7 downto 0));
end dabuff;

architecture rtl of dabuff is
      signal temp : STD_LOGIC_VECTOR (7 downto 0);
begin
      process (clk)
      begin
            if clk'event and clk = '0' then
                  temp <= din ;
            end if;
      end process;

      process (en,temp)
      begin
            if en = '0' then
                  dout <= temp ;
            else
                  dout <= "ZZZZZZZZ" ;
            end if;
      end process;
end rtl;
                                                                        91
ก.7 ไฟล incPC.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity incPC is
Port (clk : in STD_LOGIC;
      din : in STD_LOGIC_VECTOR (15 downto 0);
      dout : out STD_LOGIC_VECTOR (15 downto 0));
end incPC;

architecture rtl of incPC is
begin
      process (clk)
      begin
            if clk = '0' then
                  dout <= din + 1;
            else
                  dout <= (others => 'Z');
            end if;
      end process;
end rtl;



ก.8 ไฟล pc_reg.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity pc_reg is
Port (reset : in STD_LOGIC;
      en : in STD_LOGIC;
      sel : in STD_LOGIC_VECTOR (1 downto 0);
      dinA_8 : in STD_LOGIC_VECTOR (7 downto 0);
      dinB_8 : in STD_LOGIC_VECTOR (7 downto 0);
      din_16 : in STD_LOGIC_VECTOR (15 downto 0);
      dout : out STD_LOGIC_VECTOR (15 downto 0));
end pc_reg;

architecture rtl of pc_reg is
      signal pc_temp: STD_LOGIC_VECTOR(15 downto 0):=(others => '0');
begin
      process (reset,sel,dinA_8,dinB_8,din_16,pc_temp,en)
      begin
            if reset = '0' then
                  pc_temp <= (others => '0');
            elsif sel = "00" then
                  pc_temp <= din_16 ;
            elsif sel = "01" then
                  pc_temp(15 downto 8) <= dinA_8;
                  pc_temp(7 downto 0) <= dinB_8;
            end if;

            if en = '0' then
                  dout <= pc_temp ;
            else
                  dout <= (others => 'Z') ;
                                                                       92
            end if;
      end process;
end rtl;



ก.9 ไฟล regarray.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity regarray is
port (data : in std_logic_vector (7 downto 0);
      sel : in std_logic_vector (2 downto 0);
      en : in std_logic;
      clk : in std_logic;
      q : out std_logic_vector (7 downto 0));
end regarray;

architecture Behavioral of regarray is
      type t_ram is array (0 to 7) of std_logic_vector (7 downto 0);
      signal temp_data : std_logic_vector (7 downto 0);
begin
      process(clk,sel)
            variable ramdata : t_ram :=
            ("00000000",      -- ramdata(0) is Reg B 000
            "00000010",       -- ramdata(1) is Reg C 001
            "00000000",       -- ramdata(2) is Reg D 010
            "00000000",       -- ramdata(3) is Reg E 011
            "00000000",       -- ramdata(4) is Reg H 100
            "00000000",       -- ramdata(5) is Reg L 101
            "00000000",       -- ramdata(6) is not used,
            "00000000");      -- ramdata(7) is Reg A 111
      begin
            if sel /= "110" then
                  if clk'event and clk = '0' then
                        ramdata (conv_integer(sel)) := data;
                  end if;
      -- Load data to register when Clock = 1.
                  temp_data <= ramdata(conv_integer(sel)) ;
      -- If clock is not occured and is zero, data in reg(i)
      -- is passed to temp_data signal. For using in 2nd process.

            end if;
      end process;

      process (en, temp_data)
      begin
            if en = '0' then
                  q <= temp_data ;
            else
                  q <= "ZZZZZZZZ" ;
            end if;
      end process;
end Behavioral;
                                                                93
ก.10 ไฟล addrReg.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity addReg is
Port (en : in STD_LOGIC;
      sel : in STD_LOGIC_VECTOR (1 downto 0);
      dinA_8 : in STD_LOGIC_VECTOR (7 downto 0);
      dinB_8 : in STD_LOGIC_VECTOR (7 downto 0);
      din_16 : in STD_LOGIC_VECTOR (15 downto 0);
      dout : out STD_LOGIC_VECTOR (15 downto 0));
end addReg;

architecture rtl of addReg is
      signal temp : STD_LOGIC_VECTOR (15 downto 0);
begin
      process (sel,dinA_8,dinB_8,din_16)
      begin
            if sel = "00" then
                  temp <= din_16 ;
            elsif sel = "01" then
                  temp(7 downto 0)<= dinB_8 ;
                  temp(15 downto 8)<= dinA_8 ;
            end if;
      end process;

      process (en,temp)
      begin
            if en = '0' then
                  dout <= temp ;
            end if;
      end process;
end rtl;



ก.11 ไฟล reg_16.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity reg_16 is
port (data : in std_logic_vector (7 downto 0);
      en : in std_logic;
      sel : in std_logic_vector (1 downto 0);
      q : out std_logic_vector (15 downto 0));
end reg_16;

architecture rtl of reg_16 is
      signal temp_data : std_logic_vector (15 downto 0);
begin
      process(sel)
            variable ramdata : std_logic_vector (15 downto 0)
                  := "0000000010000000"; --80h
      begin
            if sel = "01" then
                   ramdata (7 downto 0):= data;
                                                                        94
            elsif sel = "10" then
                  ramdata (15 downto 8):= data;
            end if;
                  temp_data <= ramdata;
      end process;

      process (en, temp_data)
      begin
            if en = '0' then
                  q <= temp_data ;
            else
                  q <= (others => 'Z') ;
            end if;
      end process;
end rtl;



ก.12 ไฟล alu.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity alu is
Port ( sel : in STD_LOGIC_VECTOR (4 downto 0);
      bit_sel : in STD_LOGIC;
      en : in STD_LOGIC;
      a_in : in STD_LOGIC_VECTOR (7 downto 0);
      b_in : in STD_LOGIC_VECTOR (7 downto 0);
      f_in : in STD_LOGIC_VECTOR (7 downto 0);
      cc : out STD_LOGIC;
      arith_16 : in std_logic ;
      f_out : out STD_LOGIC_VECTOR (7 downto 0);
      d_out : out STD_LOGIC_VECTOR (7 downto 0));
end alu;

architecture rtl of alu is
      signal alu_temp : STD_LOGIC_VECTOR (7 downto 0);
      signal flag_temp : STD_LOGIC_VECTOR (7 downto 0) := "00000000";
      signal data_HC1,data_HC2 : std_logic_vector ( 4 downto 0 ) :="00000";
begin
---------------------------------------------------------------------------
-----ALU have two processes. ----------------------------------------------
-----The first updates alu_temp which is the result from ALU processing.---
-----The second updates flag_temp which is data in Flag register. ---------
---------------------------------------------------------------------------
process (sel,bit_sel,a_in,b_in,f_in)
begin
      if bit_sel = '1' then
            case sel is
                  when "00100" =>
                        alu_temp <= b_in + "00000001"; -- INC
                  when "00101" =>
                        alu_temp <= b_in - "00000001"; -- DEC
                  when "00110" => -- PASSED***
                        alu_temp <= b_in;
                  when "10000" => -- ADD
                        alu_temp <= a_in + b_in ;
                  when "10001" => -- ADC
                        alu_temp <= a_in + b_in + f_in(0);
                                                                   95
             when "10010" => -- SUB
                   alu_temp <= a_in - b_in ;
             when "10011" => -- SBC
                   alu_temp <= a_in - b_in - f_in(0);
             when "10100" => -- AND
                   alu_temp <= a_in and b_in ;
             when "10101" => -- XOR
                   alu_temp <= a_in xor b_in ;
             when "10110" => -- OR
                   alu_temp <= a_in or b_in ;
             when "10111" => -- CP
                   alu_temp <= a_in - b_in ;
             when "11000" => -- compare NZ
                   cc <= not (f_in(6));
             when "11001" => -- compare Z
                   cc <= f_in(6);
             when "11010" => -- compare NC
                   cc <= not f_in(0);
             when "11011" => -- compare C
                   cc <= f_in(0);
             when "11100" => -- compare PO
                   cc <= not f_in(2);
             when "11101" => -- compare PE
                   cc <= f_in(2);
             when "11110" => -- compare NS
                   cc <= not f_in(7);
             when "11111" => -- compare S
                   cc <= f_in(7);
             when others => NULL;
       end case;
else
       case sel is
             when "00000" => -- RLC
                   alu_temp <= b_in(6 downto 0) & b_in(7) ;
             when "00001" => -- RRC
                   alu_temp <= b_in(0) & b_in(7 downto 1);
             when "00010" => -- RL
                   alu_temp <= b_in(6 downto 0) & f_in(7) ;
             when "00011" => -- RR
                   alu_temp <= f_in(0) & b_in(7 downto 1);
             when "00100" => -- SLA
                   alu_temp <= b_in(6 downto 0) & '0' ;
             when "00101" => -- SRA
                   alu_temp <= b_in(7) & b_in(7 downto 1);
             when "00110" => -- PASSED***
                   alu_temp <= b_in;
             when "00111" => -- SRL
                   alu_temp <= '0' & b_in(7 downto 1);
             when "01000"|"01001"|"01010"|"01011"|"01100"|"01101"|
                   "01110"|"01111" =>-- BIT
                   alu_temp <= b_in;
             when "10000" => -- RES bit 0
                   alu_temp <= b_in(7 downto 1)& '0';
             when "10001" => -- RES bit 1
                   alu_temp <= b_in(7 downto 2)& '0'& b_in(0);
             when "10010" => -- RES bit 2
                   alu_temp <= b_in(7 downto 3)&'0'& b_in(1 downto 0);
             when "10011" => -- RES bit 3
                   alu_temp <= b_in(7 downto 4)&'0'& b_in(2 downto 0);
             when "10100" => -- RES bit 4
                   alu_temp <= b_in(7 downto 5)&'0'& b_in(3 downto 0);
                                                                         96
                  when "10101" => -- RES bit 5
                         alu_temp <= b_in(7 downto 6)&'0'& b_in(4 downto 0);
                   when "10110" => -- RES bit 6
                         alu_temp <= b_in(7)&'0'& b_in(5 downto 0);
                   when "10111" => -- RES bit 7
                         alu_temp <= '0'& b_in(6 downto 0);
                   when "11000" => -- SET bit 0
                         alu_temp <= b_in(7 downto 1)& '1';
                   when "11001" => -- SET bit 1
                         alu_temp <= b_in(7 downto 2)& '1'& b_in(0);
                   when "11010" => -- SET bit 2
                         alu_temp <= b_in(7 downto 3)&'1'& b_in(1 downto 0);
                   when "11011" => -- SET bit 3
                         alu_temp <= b_in(7 downto 4)&'1'& b_in(2 downto 0);
                   when "11100" => -- SET bit 4
                         alu_temp <= b_in(7 downto 5)&'1'& b_in(3 downto 0);
                   when "11101" => -- SET bit 5
                         alu_temp <= b_in(7 downto 6)&'1'& b_in(4 downto 0);
                   when "11110" => -- SET bit 6
                         alu_temp <= b_in(7)& '1'& b_in(5 downto 0);
                   when others => -- SET bit 7
                         alu_temp <= '1'& b_in(6 downto 0);
            end case;
      end if;
end process;
---------------------------------------------------------------------------
-------The second process for updated Flag register------------------------
---------------------------------------------------------------------------
process (alu_temp,flag_temp,sel,b_in,f_in,bit_sel)
 -- resetting flag register S Z X H X P/V N C
begin
      if sel /= "00110" then -- data is passed
        if bit_sel = '1' then
          case sel (4 downto 3)is
            when "00" => --INC, DEC
              flag_temp <= f_in;
              flag_temp(7) <= alu_temp(7);
              if alu_temp = "00000000" then
                flag_temp(6) <= '1';
              else
                flag_temp(6) <= '0';
              end if;
              if b_in(3 downto 0) = "1111" then
                flag_temp(4) <= '1';
              else
                flag_temp(4) <= '0';
              end if;
              if b_in = "01111111" then
                flag_temp(2) <= '1';
              else
                flag_temp(2) <= '0';
              end if;
                flag_temp(1) <= '0';
            when "10" => --ADD,SUB,AND,OR,XOR
              flag_temp <= f_in;
              if arith_16 /='0' then
              -- 16 bit add op. dosen't effect this bit
                flag_temp(7) <= alu_temp(7);
                if alu_temp = "00000000" then
                   flag_temp(6) <= '1';
                else
                                                                         97
                  flag_temp(6) <= '0';
                end if;
              end if;
--------------ADD SUB------------------------------------------------
              if sel( 2 downto 0 )= "000" or sel(2downto0)= "001" then
                  -- ADD , ADC
                  -- bit N Add/Subtract flag
                  flag_temp ( 1 ) <= '0';
                  -- Half carry flag
-- set when bit 0 - 3 of 2 number add together have result greater then 15
                  data_HC1( 3 downto 0 ) <= a_in (3downto0);
                  data_HC2( 3 downto 0 ) <= b_in (3downto0);
                  if sel( 2 downto 0 ) = "001" then
                     if ( (data_HC1 + data_HC2 + f_in(0)) > 15 ) then
                       flag_temp ( 4 ) <= '1';
                     else
                       flag_temp ( 4 ) <= '0';
                     end if;
                  else
                     if ( ( data_HC1 + data_HC2 )> 16 ) then
                       flag_temp ( 4 ) <= '1';
                     else
                       flag_temp ( 4 ) <= '0';
                     end if;
                  end if;
-- Carry Flag
-- if 2 positive add together result less than one operand ,carry flag set
                  if ( a_in ( 7 ) = '1' or b_in ( 7 ='1' )and ( alu_temp <
                      a_in or alu_temp < b_in ) then
                      flag_temp ( 0 ) <= '1';
                  else
                       flag_temp ( 0 ) <= '0';
                  end if;
-- P / V flag
-- set if over flow
-- operation between the same sign result difference sign parity flag set
                  if arith_16 /= '0' then
                     if ( a_in ( 7 ) = '0' and b_in ( 7 ) = '0' and alu_temp
                         ( 7 ) = '1' )or ( a_in ( 7 ) = '1' and b_in ( 7 ) =
                         '1' and alu_temp ( 7 ) = '0' )then
                         flag_temp ( 2 ) <= '1';
                     else flag_temp ( 2 ) <= '0';
                    end if;
                  end if;
-- SUB , SBC , CP
              elsif sel( 2 downto 0 ) = "010" or sel( 2 downto 0 ) = "011"
                     or sel(2 downto 0)= "111" then
-- bit N Add/Subtract flag
                flag_temp ( 1 ) <= '1';
-- P / V flag
                if(a_in( 7 )='0' and b_in(7) = '1' and alu_temp (7) = '1')
                   or (a_in(7) = '1' and b_in(7) = '0' and alu_temp(7) =
                   '0') then --operation between difference sign flag not
                   set
                  flag_temp ( 2 ) <= '1';
                else
                  flag_temp ( 2 ) <= '0';
                end if;
-- Half carry flag and Carry flag
                data_HC1 ( 3 downto 0 ) <= a_in ( 3 downto 0 );
                data_HC2 ( 3 downto 0 ) <= b_in ( 3 downto 0 );
                                                                        98
                 if sel( 2 downto 0 ) = "011" then -- SBC
                   if ( data_HC1 < data_HC2 + f_in(0)) then
                   -- Half carry flag
                     flag_temp ( 4 ) <= '1';
                   else
                     flag_temp ( 4 ) <= '0';
                   end if;
                   if a_in < b_in + f_in(0) then -- Carry flag
                     flag_temp ( 0 ) <= '1';
                   else
                     flag_temp ( 0 ) <= '0';
                   end if;
                 else -- SUB
                   if ( data_HC1 < data_HC2 ) then
                     flag_temp ( 4 ) <= '1';
                   else
                     flag_temp ( 4 ) <= '0';
                   end if;
                   if a_in < b_in then
                     flag_temp ( 0 ) <= '1';
                   else
                     flag_temp ( 0 ) <= '0';
                   end if;
                 end if;
-- AND , XOR , OR
            elsif sel( 2 downto 0 ) ="100" or sel( 2 downto 0 ) = "101" or
                   sel( 2 downto 0 ) = "110" then
               if sel ( 2 downto 0 ) = "100" then
                 flag_temp ( 0 ) <= '0'; -- Carry flag
                 flag_temp ( 1 ) <= '0'; -- N add /subtract flag
                 flag_temp ( 4 ) <= '1'; -- Half Carry flag
               else
                 flag_temp ( 0 ) <= '0';
                 flag_temp ( 1 ) <= '0';
                 flag_temp ( 4 ) <= '0';
               end if;
-- P/V flag
-- set if even parity otherwise reset
      case alu_temp ( 3 downto 0 ) is
        when "0000"|"0011"|"0101"|"0110"|"1001"|"1010"|"1100"|"1111" =>
          case alu_temp ( 7 downto 4 ) is
            when "0000" | "0011" | "0101" | "0110" | "1001" | "1010" |
                   "1100" |"1111" =>
                   flag_temp ( 2 ) <= '1';
            when others =>
                   flag_temp ( 2 ) <= '0';
            end case;
        when "0001" | "0010" | "0100" | "0111" | "1000" | "1011" | "1101" |
              "1110" =>
          case alu_temp ( 7 downto 4 ) is
            when "0001" | "0010" | "0100" | "0111" | "1000" | "1011" |
                  "1101" |"1110" =>
                  flag_temp ( 2 ) <= '1';
             when others =>
                  flag_temp ( 2 ) <= '0';
          end case;
        when others => null;
      end case;
      end if;
      when others => NULL;
      end case;
                                                                        99
      else
        case sel (4 downto 3)is
           when "00" => --rotate and shift
             flag_temp <= f_in;
             flag_temp(1) <= '0';
-- PV is parity flag_temp(2)
        case alu_temp ( 3 downto 0 ) is
          when "0000"|"0011"|"0101"|"0110"|"1001"|"1010"|"1100"|"1111" =>
             case alu_temp ( 7 downto 4 ) is
               when "0000" | "0011" | "0101" | "0110" | "1001" | "1010" |
                    "1100" |"1111" =>
                   flag_temp ( 2 ) <= '1';
               when others =>
                   flag_temp ( 2 ) <= '0';
             end case;
          when "0001" | "0010" | "0100" | "0111" | "1000" | "1011" | "1101"
                | "1110" =>
             case alu_temp ( 7 downto 4 ) is
               when "0001" | "0010" | "0100" | "0111" | "1000" | "1011" |
                    "1101" |"1110" =>
                   flag_temp ( 2 ) <= '1';
               when others =>
                   flag_temp ( 2 ) <= '0';
             end case;
          when others => null;
      end case;
--------------------------------
      flag_temp(4) <= '0';
      flag_temp(7) <= alu_temp(7);
      if alu_temp = "00000000" then
        flag_temp(6) <= '1';
      else
        flag_temp(6) <= '0';
      end if;
      if (conv_integer(sel(2 downto 0)) mod 2) = 0 then
        flag_temp(0) <= b_in(7);
      else
        flag_temp(0) <= b_in(0);
      end if;

      when "01" => --BIT
        flag_temp <= f_in;
        flag_temp(6) <= not( b_in(CONV_INTEGER(sel(2 downto 0)))) ;
        flag_temp(4) <= '1';
        flag_temp(1) <= '0';
      when others => NULL;
      end case;
end if;
else
      flag_temp <= f_in;
end if;
end process;

process (en,alu_temp)
begin
  if en = '0' then
    d_out <= alu_temp ;
  else
    d_out <= (others => 'Z');
  end if;
end process;
                                                              100
      f_out <= flag_temp;
end rtl;



ก.13 ไฟล Flag.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Flag is
Port (clk : in std_logic;
      en : in std_logic;
      din : in STD_LOGIC_VECTOR (7 downto 0);
      dout_to_ALU : out STD_LOGIC_VECTOR (7 downto 0);
      dout_to_Databus : out STD_LOGIC_VECTOR (7 downto 0));
end Flag;

architecture rtl of Flag is
begin
      process (clk,en,din)
      begin
            if clk = '0' then
                  dout_to_ALU <= din ;
            end if;

            if en = '0' then
                  dout_to_Databus <= din;
            else
                  dout_to_Databus <= "ZZZZZZZZ";
            end if;
      end process;
end rtl
                                                                                                  ภาคผนวก ข
                                                                                      ชุดคําสั่งของไมโครโปรเซสเซอร Z80

                                                                                                                                                                                                               01 011 111        5F                                  after it is
8 bit Load Group                                                                                                                                                                                                                                                     increased.
                                                                                            Number of                        LD I, A            I←A               •   •     •      •      •    •     •     •   11 101 101        ED         2         2         9
                                                                                     Byte      M       T-                                                                                                      01 000 111        47
                  Symbolic
  Mnemonic        Operation
                                             Flags                  Opcode
                                                                               Hex           Cycle    State    Comments
                                                                                                                             LD R, A            R←A               •   •     •      •      •    •     •     •   11 101 101        ED         2         2         9    R is written
                                                                                                                                                                                                               01 001 111        4F                                  after it is
                                S   Z   F5   H   F3   P/V   N   C 76 543 210                                                                                                                                                                                         increased.
D r, r’          r ← r’         •   •    •   •    •    •    •   • 01 r    r’         1       1        4       r, r’   Reg.   Notes:                     r, r’ means any of the registers A, B, C, D, E, H, L.
LD p, p’*        p ← p’         •   •    •   •    •    •    •   • 11 011 101   DD    2       2        8       000     B                                 p, p’ means any of the registers A, B, C, D, E, IXH, IXL.
                                                                  01 p p’                                     001     C                                 q, q’ means any of the registers A, B, C, D, E, IYH, IYL.
LD q, q’*        q ← q’         •   •    •   •    •    •    •   • 11 111 101   FD    2       2        8       010     D                                 ddL, ddH refer to high order and low order eight bits of the register respectively.
                                                                  01 q q’                                     011     E                                 * means unofficial instruction.
LD r, n          r←n            •   •    •   •    •    •    •   • 00 r 110           2       2        7       100     H      Flag Notation:             • = flag is not affected, 0 = flag is reset, 1 = flag is set,
                                                                  ← n →                                       101     L                                 b = flag is set according to the result of the operation, IFF2 = the interrupt flip-flop 2 is copied.
LD p, n*         p←n            •   •    •   •    •    •    •   • 11 011 101   DD    3       3        11      111     A
                                                                  00 p 110
                                                                  ← n →                                       p, p’   Reg.
LD q, n*         q←n            •   •    •   •    •    •    •   • 11 111 101   FD    3       3        11      000     B      16 bit Load Group
                                                                  00 q 110                                    001     C                                                                                                                            Number of
                                                                  ← n →                                       010     D
                                                                                                                                                                                                                                            Byte      M       T-
LD r, (HL)       r ← (HL)       •   •    •   •    •    •    •   • 01 r 110           1       2        7       011     E                         Symbolic
                                                                                                                                                                                  Flags                          Opcode                             Cycle    State
LD r, (IX + d)   r ← (IX + d)   •   •    •   •    •    •    •   • 11 011 101   DD    3       5        19      100     IXH     Mnemonic          Operation                                                                         Hex                                 Comments
                                                                  01 r 110                                    101     IXL                                         S   Z    F5     H    F3     P/V    N     C 76 543 210
                                                                  ← d →                                       111     A      LD dd, nn        dd ← nn             •   •     •     •     •      •     •     • 00 dd0 001                     3         3         10   dd      Pair
LD r, (IY + d)   r ← (IY + d)   •   •    •   •    •    •    •   • 11 111 101   FD    3       5        19                                                                                                     ← n →                                                   00      BC
                                                                  01 r 110                                    q, q’   Req.                                                                                   ← n →                                                   01      DE
                                                                  ← d →                                       000     B      LD IX, nn        IX ← nn             •   •     •     •     •      •     •     • 11 011 101          DD         4         4         14   02      HL
LD (HL), r       (HL) ← r       •   •    •   •    •    •    •   • 01 110 r           1       2        7       001     C                                                                                      00 110 001          21                                  03      SP
LD (IX + d), r   (IX + d) ← r   •   •    •   •    •    •    •   • 11 011 101   DD    3       5        19      010     D                                                                                      ← n →
                                                                  01 110 r                                    011     E                                                                                      ← n →
                                                                  ← d →                                       100     IYH    LD IY, nn        IY ← nn             •   •     •     •     •      •     •     • 11 111 101          FD         4         4         14
LD (IY + d), r   (IY + d) ← r   •   •    •   •    •    •    •   • 11 111 101   FD    3       5        19      101     IYL                                                                                    00 110 001          21
                                                                  01 110 r                                    111     A                                                                                      ← n →
                                                                  ← d →                                                                                                                                      ← n →
LD (HL), n       (HL) ← n       •   •    •   •    •    •    •   • 00 110 110   36    2       3        10                     LD HL, (nn)      L ← (nn)            •   •     •     •     •      •     •     • 00 101 010          2A         3         5         16
                                                                  ← n →                                                                                                                                      ← n →
                                                                                                                                              H ← (nn+1)
LD (IX + d), n   (IX + d) ← n   •   •    •   •    •    •    •   • 11 011 101   DD    4       5        19
                                                                                                                                                                                                             ← n →
                                                                  00 110 110   36
                                                                                                                             LD dd, (nn)      ddL ← (nn)          •   •     •     •     •      •     •     • 11 101 101          ED         4         6         20
                                                                  ← d →
                                                                                                                                              ddH ← (nn+1)                                                   01 dd1 011
                                                                  ← n →                                                                                                                                      ← n →
LD (IY + d), n   (IY + d) ← n   •   •    •   •    •    •    •   • 11 111 101   FD    4       5        19
                                                                                                                                                                                                             ← n →
                                                                  00 110 110   36
                                                                                                                             LD IX, (nn)      IXL ← (nn)          •   •     •     •     •      •     •     • 11 011 101          DD         4         6         20
                                                                  ← d →
                                                                                                                                              IXH ← (nn+1)                                                   00 101 010          2A
                                                                  ← n →                                                                                                                                      ← n →
LD A, (BC)       A ← (BC)       •   •    •   •    •    •    •   • 00 001 010   0A    1       2        7
                                                                                                                                                                                                             ← n →
LD A, (DE)       A ← (DE)       •   •    •   •    •    •    •   • 00 011 010   1A    1       2        7                      LD IY, (nn)      IYL ← (nn)          •   •     •     •     •      •     •     • 11 111 101          FD         4         6         20
LD A, (nn)       A ← (nn)       •   •    •   •    •    •    •   • 00 111 010   3A    3       4        13
                                                                                                                                              IYH ← (nn+1)                                                   00 101 010          2A
                                                                  ← n →                                                                                                                                      ← n →
                                                                  ← n →                                                                                                                                      ← n →
LD (BC), A       (BC) ← A       •   •    •   •    •    •    •   • 00 000 010   02    1       2        7                      LD (nn), HL      (nn) ← L            •   •     •     •     •      •     •     • 00 100 010          22         3         5         16
LD (DE), A       (DE) ← A       •   •    •   •    •    •    •   • 00 010 010   12    1       2        7                                       (nn+1) ← H                                                     ← n →
LD (nn), A       (nn) ← A       •   •    •   •    •    •    •   • 00 110 010   32    3       4        13                                                                                                     ← n →
                                                                  ← n →                                                      LD (nn), dd      (nn) ← ddL          •   •     •     •     •      •     •     • 11 101 101          DD         4         6         20
                                                                  ← n →                                                                       (nn+1) ← ddH                                                   01 dd0 011
LD A, I          A←I            b   b    b   0    b IFF2    0   • 11 101 101   ED    2       2        9                                                                                                      ← n →




                                                                                                                                                                                                                                                                                    101
                                                                  01 010 111   57                                                                                                                            ← n →
LD A, R          A←R            b   b    b   0    b IFF2    0   • 11 101 101   ED    2       2        9       R is read
LD (nn), IX      (nn) ← IXL             •       •        •       •        •        •       •       •   11 011 101    DD       4        6        20                               DE ← DE + 1                                                          10 110 000       B0        2          4         16             if BC = 0
                 (nn+1) ← IXH                                                                          00 100 010    22                                                          HL ← HL + 1
                                                                                                       ← n →                                                                     BC ← BC - 1
                                                                                                       ← n →                                                                     repeat until:
LD (nn), IY      (nn) ← IYL             •       •        •       •        •        •       •       •   11 111 101    FD       4        6        20                               BC = 0
                 (nn+1) ← IYH                                                                          00 100 010    22                                             LDD          (DE) ← (HL)           •   •     b1 0        b2 b3 0            •     11 101 101       ED        2          4         16
                                                                                                       ← n →                                                                     DE ← DE - 1                                                          10 101 000       A8
                                                                                                       ← n →                                                                     HL ← HL - 1
LD SP, HL        SP ← HL                •       •        •       •        •        •       •       •   11 111 001    F9       1        1        6                                BC ← BC - 1
LD SP, IX        SP ← IX                •       •        •       •        •        •       •       •   11 011 101    DD       2        2        10                  LDDR         (DE) ← (HL)           •   •     b1 0        b2 0         0     •     11 101 101       ED        2          5         21           if BC ≠ 0
                                                                                                       11 111 001    F9                                                          DE ← DE - 1                                                          10 111 000       B8        2          4         16           if BC = 0
LD SP, IY        SP ← IY                •       •        •       •        •        •       •       •   11 111 101    FD       2        2        10                               HL ← HL - 1
                                                                                                       11 111 001    F9                                                          BC ← BC - 1
PUSH qq          SP ← SP - 1           •   •      •      •    •      •      •     •                    11 qq0 101  1         3         11            qq      Pair                repeat until:
                 (SP) ← qqH                                                                                                                          00      BC                  BC = 0
                 SP ← SP - 1                                                                                                                         01      DE     CPI          A - (HL)              b4 b4 b5 b4 b6 b3 1                      •     11 101 101       ED        2          4         16
                 (SP) ← qqL                                                                                                                          10      HL
                                                                                                                                                                                 HL ← HL + 1                                                          10 100 001       A1
PUSH IX          SP ← SP - 1           •   •      •      •    •      •      •     • 11 011 101          DD         2         4         15            11      AF                  BC ← BC -1
                 (SP) ← IXH                                                          11 100 101         E5                                                          CPIR         A - (HL)              b4 b4 b5 b4 b6 b3 1                      •     11 101 101       ED        2          5         21           if BC ≠ 0 and
                 SP ← SP - 1                                                                                                                                                     HL ← HL + 1                                                          10 110 001       B1                                             A ≠ (HL).
                 (SP) ← IXL                                                                                                                                                      BC ← BC -1                                                                                      2          4         16           if BC = 0
PUSH IY          SP ← SP - 1           •   •      •      •    •      •      •     • 11 111 101          FD         2         4         15                                        Repeat until:                                                                                                                     or
                 (SP) ← IYH                                                          11 100 101         E5                                                                       A = (HL) or                                                                                                                          A = (HL)
                 SP ← SP - 1                                                                                                                                                     BC = 0
                 (SP) ← IYL                                                                                                                                         CPD          A - (HL)              b4 b4 b5 b4 b6 b3 1                      •     11 101 101       ED        2          4         16
POP qq           (SP) ← qqL            •   •      •      •    •      •      •     • 11 qq0 001                     1         3         10                                        HL ← HL - 1                                                          10 101 001       A9
                 SP ← SP + 1                                                                                                                                                     BC ← BC -1
                 (SP) ← qqH                                                                                                                                         CPDR         A - (HL)              b4 b4 b5 b4 b6 b3 1                      •     11 101 101       ED        2          5         21           if BC ≠ 0 and
                 SP ← SP + 1                                                                                                                                                     HL ← HL - 1                                                          10 111 001       B9                                             A ≠ (HL).
POP IX           (SP) ← IXL SP         •   •      •      •    •      •      •     • 11 011 101          DD         2         4         14                                        BC ← BC -1                                                                                      2          4         16           if BC = 0
                 ← SP + 1                                                            11 100 001         E1                                                                       Repeat until:                                                                                                                     or
                 (SP) ← IXH                                                                                                                                                      A = (HL) or                                                                                                                          A = (HL)
                 SP ← SP + 1                                                                                                                                                     BC = 0
                                                                                                                                                                                 1
POP IY           (SP) ← IYL SP         •   •      •      •    •      •      •     • 11 111 101          FD         2         4         14                           Notes:           F5 is a copy of bit 1 of A + last transferred byte, thus (A + (HL))1
                                                                                                                                                                                 2
                 ← SP + 1                                                            11 100 001         E1                                                                           F3 is a copy of bit 3 of A + last transferred byte, thus (A + (HL))3
                                                                                                                                                                                 3
                                                                                                                                                                                     P/V flag is 0 if the result of BC - 1 = 0, otherwise P/V = 1.
                 (SP) ← IYH                                                                                                                                                      4
                                                                                                                                                                                     These flags are set as in CP (HL)
                 SP ← SP + 1                                                                                                                                                     5
                                                                                                                                                                                     F5 is copy of bit 1 of A - last compared address - H, thus (A - (HL) - H)1. H is as in F after the comparison.
Notes:             dd is any of the register pair BC, DE, HL, SP.                                                                                                                6
                                                                                                                                                                                     F3 is copy of bit 3 of A - last compared address - H, thus (A - (HL) - H)3. H is as in F after the comparison.
                   qq is any of the register pair BC, DE, HL, AF.                                                                                                   Flag         • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.
Flag Notation:     • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.                          Notation:


Exchange, Block Transfer and Search Groups                                                                                                                          8 bit Arithmetic and Logical Group
                                                                                                                                  Number of                                                                                                                                               Number of
                  Symbolic                                                                                                Byte       M       T-                                                                                                                                  Byt        M               T-
                                                             Flags                                       Opcode                    Cycle    State                                Symbolic
Mnemonic          Operation                                                                                         Hex                              Comments                                                         Flags                            Opcode           He        e        Cycle           State          Com
                                                                                                                                                                    Mnemonic     Operation
                                                                                                                                                                                                                                                                         x                                                ments
                                    S       Z       F5       H       F3       P/V      N       C       76 543 210                                                                                S    Z   F5      H    F3     P/V   N     C         76 543 210
EX DE, HL        DE ↔ HL            •       •        •       •        •        •       •       •       11 101 011   EB    1        1        4                       ADD A, r     A←A+r           b    b    b      b     b      V    0     b         10 000 r                       1          1             4           r Reg.
EX AF, AF’       AF ↔ AF’           •       •        •       •        •        •       •       •       00 001 000   08    1        1        4                       ADD A, p*    A←A+            b    b    b      b     b      V    0     b         11 011 101         DD          2          2             8           000   B
EXX              BC ↔ BC’           •       •        •       •        •        •       •       •       11 011 001   D9    1        1        4                                        p                                                              10 000 p                                                            001   C
                 DE ↔ DE’                                                                                                                                           ADD A, q*    A←A+            b    b     b     b     b      V    0     b         11 111 101         FD          2          2             8           010   D
                 HL ↔ HL’                                                                                                                                                            q                                                              10 000 q                                                            011   E
EX (SP),         (SP+1) ↔ H         •       •        •       •        •        •       •       •       11 100 011   E3    1        5        19                      ADD A, n     A←A+            b    b     b     b     b      V    0     b         11 000 110                     2          2             8           100   H
HL               (SP) ↔ L                                                                                                                                                            n                                                              ← n →                                                               101   L
EX (SP), IX      (SP+1) ↔           •       •        •       •        •        •       •       •       11 011 101   DD    2        6        23                      ADD A,       A←A+            b    b     b     b     b      V    0     b         10 000 110                     1          2             7           111   A
                 IXH                                                                                   11 100 011   E3                                              (HL)            (HL)
                 (SP) ↔ IXL                                                                                                                                         ADD A, (IX   A←A+            b    b     b     b     b      V    0     b         11 011 101         DD          3          5             19
EX (SP), IY      (SP+1) ↔           •       •        •       •        •        •       •       •       11 111 101   FD    2        6        23                      + d)          (IX + d)                                                          10 000 110
                 IYH                                                                                   11 100 011   E3                                                                                                                              ← d →
                 (SP) ↔ IYL                                                                                                                                         ADD A, (IY    A←A+           b    b     b     b     b      V    0     b         11 111 101         FD          3          5             19          p Reg.
LDI              (DE) ← (HL)        •       •        b1      0        b2       b3      0       •       11 101 101   ED    2        4        16                      + d)          (IY + d)                                                          10 000 110                                                          000  B
                 DE ← DE + 1                                                                           10 100 000   A0                                                                                                                              ← d →                                                               001  C
                 HL ← HL + 1                                                                                                                                        ADC A, s      A←A+           b    b     b     b     b      V    0     b            001                                                              010  D
                 BC ← BC - 1                                                                                                                                                                                                                                                                                            011  E




                                                                                                                                                                                                                                                                                                                                   102
                                                                                                                                                                                  s + CY
LDIR             (DE) ← (HL)        •       •        b1      0        b2       0       0       •       11 101 101   ED    2        5        21       if BC ≠ 0      SUB A, s      A←A-           b    b     b     b     b      V    1     b             010                                                             100
                   s                                                                                                                                               IX   DEC IY         IY ← IY - 1       •    •       •           •           •           •           •
                                                                                                                                                                                                                                                               11 111 101       FD•     2         2         10
SBC A, s        A←A-           b        b       b        b        b        V        1   b             011                                               H                                                                                                      00 101 011       2B
                s - CY                                                                                                                                  101             Notes:       The V symbol in the P/V flag c                                       ags
                                                                                                                                                                                                                      column indicates that the P/V fla contains the overflow of the operation.
AND s           A←A            b        b       b        1        b        P        0   0             100                                                          IX                ss means any of the registers BC, DE, HL, SP.
                AND s                                                                                                                                   L                            pp means any of the registers BC, DE, IX, SP.
                                                                                                                                                                                                                      s
OR s            A←A            b        b       b        0        b        P        0   0             110                                               111        A                 rr means any of the registers BC, DE, IY, SP.
                 OR s                                                                                                                                                                16 bit additions are performed by first adding the two low orde eight bits, and then the two high order eight bits.
                                                                                                                                                                                                                      d                                   er
                                                                                                                                                                                     1
XOR s           A←A            b        b       b        0        b        P        0   0             101                                                                                                             ed
                                                                                                                                                                                         Indicates the flag is affecte by the 16 bit result of the ope   eration.
                                                                                                                                                                                     2
                XOR s                                                                                                                                                                                                 ed                                  gh
                                                                                                                                                                                         Indicates the flag is affecte by the 8 bit addition of the hig order eight bits.
CP s             A-s           b        b       b1       b        b1       V        1   b              111                                              q Reg.                       CY means the carry flip-flop.
INC r          r←r+1           b        b       b        b        b        V        0   •           00 r 100              1         1          4        000  B          Flag         • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result o the operation.
                                                                                                                                                                                                                      g                                                                    of
                                                                                                                                                        001  C          Notation:
INC p*         p←p+1           b        b       b        b        b        V        0   •           11 011 101   DD       2         2          8
                                                                                                    00 p 100                                            010  D
INC q*         q ←q+1          b        b       b        b        b        V        0   •           11 111 101   FD       2         2          8        011  E
                                                                                                                                                        100
      L)
INC (HL           (HL) ←
                                                                                                    00 q 100
                                                                                                    00 110 100    1          3           11                  IY
                                                                                                                                                                            ral           hmetic and CPU C
                                                                                                                                                                        Gener Purpose Arith              Control Groups
                                b b         b     b    b      V    0     •
                 (HL) + 1                                                                                                                          H                                                                                                                                                                                    Number of
INC (IX + d)     (IX + d)                                                           11 011 101         DD         3          6           23        101
                                b b         b     b    b     V     0     •                                                                                                                 Symbolic                                                                                                                H         Byte
                                                                                                                                                                                                                                                                                                                             B             M       T-
                    ←                                                               00 110 100                                                             IY                                                                                 Flags                                                Opcode                                Cycle    State
                                                                                                                                                                        Mnemonic           Operation                                                                                                               e                                            omments
                                                                                                                                                                                                                                                                                                                                                               Co
                (IX + d) +                                                          ← d →                                                          L
                                                                                                                                                                                                                                                                                                                   x
                     1                                                                                                                             111     A                                                 S    Z       F5              H       F3          P/V             N           C       76 543 210
INC (IY + d)     (IY + d)       b b         b     b    b     V     0     •          11 111 101         FD         3          6           23                             DAA           Converts A into        b    b        b              b        b           P              •           b       00 100 111       27        1           1         4
                    ←                                                               00 110 100                                                                                        packed BCD
                (IY + d) +                                                          ← d →                                                                                             following add or
                     1                                                                                                                                                                subtract with
DEC m            m←m-           b b         b     b    b     V     1     •                  101                                                                                       BCD operands.
                     1                                                                                                                                                  CPL
                                                                                                                                                                                      A←                     •    •           b1          1           b1          •           1           •       00 101 111       2F        1           1         4       1’s
Notes:           s is any of r, n, (HL), (                                or
                                         (IX+d), (IY+d), p, q as shown fo the ADD instruction. The unde                                        ed
                                                                                                             erlined bits replace the underline bits in the
                                                                                                                                                                                             A                                                                                                                                                             commplement.
                                                                                                                                                                                      A←0–A
                                                                                                                                                                              4
                                                                                   ADD set.                                                                             NEG                                  b    b           b           b           b           V           1           b       11 101 101       ED        2           2         8       2’s
                 m is any of r, p, q, (HL), (IX+d), (IY+d), as shown for the INC instruction. DEC same format and states as INC. Repl          lace 100 with                                                                                                                                      01 000 100       44                                      commplement.
                                                                                101 in opcode.                                                                          CCF
                                                                                                                                                                                      CY ←                   •    •           b1          b2          b1          •           0           b       00 111 111       3F        1           1         4       Complement
                                               1
                                                                           om                                e
                                                 F5 and F3 are copied fro the operand (s), not from the result of (A - s).
                                                                                                                                                                                              CY                                                                                                                                                           car flag.
                                                                                                                                                                                                                                                                                                                                                              rry
                   The V symbol in the P/V flag column indicates that t P/V flags contains the overflow of the operation. Similarly th P symbol
                                                                           the                                                                he                        SCF           CY ← 1                •  •       b1 0       b1 •       0   1       00 110 111      37       1      1          4
                                                                               indicates parity.                                                                        NOP           No operations         •  •       •    •     •     •    •   •       00 000 000      00       1      1          4
                                                              r means any of the registers A, B, C, D, E, H, L.
                                                                                                             H                                                          HALT          CPU halted            •  •       •    •     •     •    •   •       01 110 110      76       1      1          4
                                                           p means any o the registers A, B, C, D, E, IXH, IXL.
                                                                          of                                                                                            DI3           IFF1 ← 0              •  •       •    •     •     •    •   •       11 110 011      F3       1      1          4
                                                           q means any o the registers A, B, C, D, E, IYH, IYL.
                                                                          of                                                                                                          IFF2 ← 0
                                                                           and
                                             ddL, ddH refer to high order a low order eight bits of the re   egister respectively.                                      EI3           IFF1 ← 1              •  •       •    •     •     •    •   •       11 111 011      FB       1      1          4
                                                                        CY means the carry flip-flop.
                                                                          Y                                                                                                           IFF2 ← 1
                                                                       * means unofficial instruction.                                                                  IM 04         Set interrupt         •  •       •    •     •     •    •   •       11 101 101      ED       2      2          8
Flag                        • = flag is no affected, 0 = flag is reset, 1 = flag is set, b = flag is set accor
                                         ot                                                                                                    on.
                                                                                                             rding to the result of the operatio                                      mode 0                                                             01 000 110      46
Notation
       n:                                                                                                                                                               IM 14         Set interrupt         •  •       •    •     •     •    •   •       11 101 101      ED       2      2          8
                                                                                                                                                                                      mode 1                                                             01 010 110      56
                                                                                                                                                                        IM 24         Set interrupt         •  •       •    •     •     •    •   •       11 101 101      ED       2      2          8
   b                oup
16 bit Arithmetic Gro                                                                                                                                                   Notes:
                                                                                                                                                                                      mode 2
                                                                                                                                                                                                                  g
                                                                                                                                                                                                                                                         01 011 110      5E
                                                                                                                                                                                                                                                                                  he                             mbol
                                                                                                                                                                                       The V symbol in the P/V flag column indicates that the P/V flags contains the overflow of th operation. Similarly the P sym
                                                                                                                              Number of                                                indicates parity.
                                                                                                                                                                                       1
                                                                                                                                                        Com                                F5 and F3 are a copy of bit 5 and 3 of register A
               Symbolic                                                                                          H
                                                                 Flags                                Opcode                                            ments
Mnemonic       Operation                                                                                         e
                                                                                                                                                                                       2
                                                                                                                                                                                          H contains the previous carry state (after instruction H ↔ C)
                                                                                                                 x    Byte        M        T-                                          3
                                S       Z       F5       H        F3       P/V      N       C       76 543 210                                                                            No interrupts are issued directly after a DI or EI.
                                                                                                                                Cycle     State                                        4
                                                                                                                                                                                                                    er
                                                                                                                                                                                          This instruction has othe unofficial opcodes, see Opcod list. des
ADD HLL,       HL ← HL +        •       •        b2      b2        b2       •       0       b1      00 ss1 001        1         3         11       s Reg.
                                                                                                                                                   ss                                  CY means the carry flip-flop p.
ss             ss                                                                                                                                                       Flag                                         flag is reset, 1 = flag is set, b = flag is set according to the resu of the operation.
                                                                                                                                                                                       • = flag is not affected, 0 = f                                                                   ult
ADC HLL,       HL ← HL +        b   1
                                        b   1
                                                 b   2
                                                         b   2
                                                                   b   2
                                                                            V   1
                                                                                    0       b   1
                                                                                                    11 101 101   ED   2         4         15       00
                                                                                                                                                   0          BC        Notation:
ss             ss + CY                                                                              01 ss1 010                                     01
                                                                                                                                                   0          DE
SBC HLL,       HL ← HL -        b1 b1            b2      b2        b2       V1      1       b1      11 101 101   ED   2         4         15       10         HL
ss             ss - CY                                                                              01 ss0 010                                     11         SP             e               p
                                                                                                                                                                        Rotate and Shift Group
ADD IX, pp     IX ← IX +        •       •        b2      b2        b2       •       0       b1      11 011 101   DD   2         4         15
               pp                                                                                   00 pp1 001                                     p Reg.
                                                                                                                                                   pp                                                                                                                                                                                        Number of
ADD IY, rr     IY ← IY + rr     •       •        b2      b2        b2       •       0       b1      11 111 101   FD   2         4         15       00
                                                                                                                                                   0    BC                                    Symbolic                                                                                                                  H           Byte        M       T-
                                                                                                    00 rr1 001                                     0
                                                                                                                                                   01   DE                                                                                            Flags                                             Opcode                                Cycle    State      Com
                                                                                                                                                                          Mnemonic            Operation                                                                                                                 e
                                                                                                                                                                                                                                                                                                                                                                  ments
INC ss         ss ← ss + 1      •       •        •       •         •        •       •       •       00 ss0 011        1         1         6        10   IX                                                                                                                                                              x
                                                                                                                                                                                                                  S       Z        F5             H        F3         P/V             N       C       76 543 210
INC IX         IX ← IX + 1      •       •        •       •         •        •       •       •       11 011 101   DD   2         2         10       11   SP
                                                                                                    00 100 011   23                                                     RLCA                                      •       •         b             0         b          •              0       b       00 000 111        07          1         1        4
INC IY         IY ← IY + 1      •       •        •       •         •        •       •       •       11 111 101   FD   2         2         10       r Reg.
                                                                                                                                                   rr                   RLA                                                                                                                           00 010 111        17          1         1        4
                                                                                                    00 100 011   23                                00
                                                                                                                                                   0    BC                                                        •       •           b           0           b           •           0       b
DEC ss         ss ← ss - 1      •       •        •       •         •        •       •       •       00 ss1 011        1         1         6        0
                                                                                                                                                   01   DE              RRCA                                      •       •           b           0           b           •           0       b       00 001 111        0F          1         1        4




                                                                                                                                                                                                                                                                                                                                                                          103
DEC IX         IX ← IX - 1      •       •        •       •         •        •       •       •       11 011 101   DD   2         2         10       10   IY
                                                                                                    00 101 011   2B                                11   SP
RRA                                     •           •       b           0       b           •           0       b        00 011 111    1F       1       1         4                                                                                                                                          11 b 110                                   010
                                                                                                                                                                                                                                                                                                                                                        0          2
                                                                                                                                                                                     SET b, (IX + d)         (IX + d)b ← 1           •       •           •         •           •       •        •       •    11 011 101   DD   4        6       23      011
                                                                                                                                                                                                                                                                                                                                                        0          3
RLC r                                   b           b       b           0       b           P           0       b        11 001 011    CB       2       2         8       r Reg.                                                                                                                             11 001 011   CB                            1
                                                                                                                                                                                                                                                                                                                                                        100        4
                                                                                                                         00 000 r                                         000    B                                                                                                                           ← d →                                      1
                                                                                                                                                                                                                                                                                                                                                        101        5
      L)
RLC (HL                                 b           b       b           0       b           P           0       b        11 001 011    CB       2       4         15      001    C                                                                                                                           11 b 110                                   1
                                                                                                                                                                                                                                                                                                                                                        110        6
                                                                                                                         00 000 110                                       010    D   SET b, (IY + d)         (IY + d)b ← 1           •       •           •         •           •       •        •       •    11 111 101   FD   4        6       23      1
                                                                                                                                                                                                                                                                                                                                                        111        7
      X
RLC (IX + d)                            b           b       b           0       b           P           0       b        11 011 101    DD       4       6         23      011    E                                                                                                                           11 001 011   CB
                                                                                                                         11 001 011    CB                                 100    H                                                                                                                           ← d →
                                                                                                                         ← d →                                            101    L                                                                                                                           11 b 110
                                                                                                                         00 000 110                                       111    A   LD r,SET b, (IX +       r ← (IX + d)            •       •           •         •           •       •        •       •    11 011 101   DD   4        6       23
      Y
RLC (IY + d)                            b           b       b           0       b           P           0       b        11 111 101    FD       4       6         23                 d)*                     rb ← 1                                                                                          11 001 011   CB
                                                                                                                         11 001 011    CB                                                                                                                                                                    ← d →
                                                                                                                                                                                                             (IX + d) ← r
                                                                                                                         ← d →                                                                                                                                                                               11 b r
                                                                                                                         00 000 110                                                  LD r,SET b, (IY +       r ← (IY + d)            •       •           •         •           •       •        •       •    11 111 101   FD   4        6       23
LD r,RLC (IX +
       C           r ← (IX + d)         b           b       b           0       b           P           0       b        11 011 101    DD       4       6         23                 d)*                     rb ← 1                                                                                          11 001 011   CB
d)*                RLC r                                                                                                 11 001 011    CB                                                                                                                                                                    ← d →
                                                                                                                                                                                                             (IY + d) ← r
                   (IX + d) ← r                                                                                          ← d →                                                                                                                                                                               11 b r
                                                                                                                         00 000 r                                                    RES b, m                mb ← 0                •    •      •    •     •     •      •    •                              To form new opcode replace 11 of
                                                                                                                                                                                                                                                                                                             10
LD r,RLC (IY +
       C           r ← (IY + d)         b           b       b           0       b           P           0       b        11 111 101    FD       4       6         23                                         m ≡ r, (HL),                                                                                  SET b, s with 10. Flags and s
                                                                                                                                                                                                                                                                                                                                       states are
d)*                RLC r                                                                                                 11 001 011    CB                                                                    (IX+d), (IY+d)                                                                                the same.
                   (IY + d) ← r                                                                                          ← d →                                                       Notes:                  The notation mb indicates bit b (0 to 7) of location m.
                                                                                                                         00 000 r                                                                            BIT instructions are p performed by an bitwise AND.
RL m                                    b           b       b           0       b           P           0       b           010                                        Instruction                           1
                                                                                                                                                                                                               S is set if b = 7 and Z = 0
                                                                                                                                                                       format                                2
                                                                                                                                                                                                                                    d
                                                                                                                                                                                                               F5 is set if b = 5 and Z = 0
RRC m                                   b           b       b           0       b           P           0       b          001                                         and states                            3
                                                                                                                                                                                                                                    d
                                                                                                                                                                                                               F3 is set if b = 3 and Z = 0
                                                                                                                                                                       are the                               4
                                                                                                                                                                                                               P/V is set like the Z flag
RR m                                    b           b       b           0       b           P           0       b          011                                         same as                               5
                                                                                                                                                                                                               This instruction has other unofficial opcodes
SLA m                                                                                                                      100                                         RLC.                                  * means unofficial ins struction.
                                        b           b       b           0       b           P           0       b
                                                                                                                                                                       Replace                  on:
                                                                                                                                                                                     Flag Notatio            • = flag is not affected 0 = flag is reset, 1 = flag is set b = flag is set according to the result of the operation.
                                                                                                                                                                                                                                    d,                                 t,                               e
SLL m*                                  b           b       b           0       b           P           0       b          110                                         000 with
                                                                                                                                                                       new
SRA m                                   b           b       b           0       b           P           0       b          101                                         number.
SRL m                                   b           b       b           0       b           P           0       b          111
                                                                                                                                                                                           and
                                                                                                                                                                                     Input a Output Grou
                                                                                                                                                                                                       ups
                                                                                                                                                                                                                                                                                                                                      Number of
RLD                                     b           b       b           0       b           P           0       •        11 101 101    ED       2       5         18
                                                                                                                                                                                                           Symbolic                                                                                                       H    Byte      M       T-
                                                                                                                         01 101 111    6F
                                                                                                                                                                                                                                                                 Flags                                        Opcode                   Cycle    State     Com
                                                                                                                                                                                             c
                                                                                                                                                                                      Mnemonic             Operation                                                                                                      e
                                                                                                                                                                                                                                                                                                                                                          ments
RRD                                                                                                                      11 101 101    ED       2       5         18                                                                                                                                                      x
                                        b           b       b           0       b           P           0       •                                                                                                            S       Z       F5              H     F3          P/V         N        C       76 543 210
                                                                                                                         01 100 111    67                                            IN A, (n)           A ← (n)             •       •        •              •      •           •          •        •       11 011 011    DB   2       3        11      r Reg.
                                                                                                                                                                                                                                                                                                            ← n →                                       0
                                                                                                                                                                                                                                                                                                                                                        000    B
Notes:             The P symbol in the P/V flag column indicates that the P/V flags contains the parity of the result.
                                        e                                                                y                                                                           IN r, (C)           r ← (C)             b       b           b           0         b           P       0        •       11 101 101    ED   2       3        12      001
                                                                                                                                                                                                                                                                                                                                                        0      C
                   r means any of the r  registers A, B, C, D, E, H, L.                                                                                                                                                                                                                                     01 r 000                                    0
                                                                                                                                                                                                                                                                                                                                                        010    D
                   * means unofficial in nstruction.                                                                                                                                 IN (C)* or          Just affects        b       b           b           0         b           P       0        •       11 101 101    ED   2       3        12      011
                                                                                                                                                                                                                                                                                                                                                        0      E
                                        y
                   CY means the carry flip-flop.                                                                                                                                     IN F, (C)*          lags, value is                                                                                     01 110 000    70                            100    H
Flag Not
       tation:     • = flag is not affecte 0 = flag is reset, 1 = flag is s b = flag is set according to the result of the operation.
                                         ed,                              set,                                                                                                                           lost.
                                                                                                                                                                                     INI                 (HL) ← (C)          b1 b1               b1          b3        b1          X       b2               11 101 101    ED   2       4        16      101        L
                                                                                                                                                                                                         HL ← HL + 1            b3                                                                          10 100 010    A2                            111        A
                                                                                                                                                                                                         B←B-1
    M              oup
Bit Manipulation Gro                                                                                                                                                                 INIR                (HL) ← (C)          0       1           0           b3        0           X       b2               11 101 101    ED   2       5        21      if B ≠ 0
                                                                                                                                                                                                                                                                                                                                                         f
                                                                                                                                                 Number of (-s)                                          HL ← HL + 1                 b3                                                                     10 110 010    B2   2       4        16       f
                                                                                                                                                                                                                                                                                                                                                        if B = 0
                                                                                                                                            Byte     M          T-                                       B←B-1
                        Symbolic                                                                                                      H                                                                  Repeat until
                                                                            Flags                                       Opcode                      Cycle      State      Com
   Mnemonic             Operation                                                                                                     e                                                                  B=0
                                                                                                                                                                          ments
                                                                                                                                      x                                              IND                 (HL) ← (C)          b1 b1               b1          b4        b1          X       b2               11 101 101    ED   2       4        16
                                            S Z             F5              H   F3 P/V                      N       C 76 543 210
BIT b, r                _                   b1 b             b2             1    b3 b4                      0       • 11 001 011       B
                                                                                                                                      CB    2       2         8         r Reg.                           HL ← HL - 1            b4                                                                          10 101 010    AA
                     Z ← rb                                                                                           01 b r                                            000    B                         B←B-1
BIT b, (H
        HL)              ___                b1 b                b2          1       b3          b4          0       • 11 001 011       B
                                                                                                                                      CB    2       3         12        001    C     INDR                (HL) ← (C)          0       1           0           b4        0           X       b2               11 101 101    ED   2       5        21      if B ≠ 0
                                                                                                                                                                                                                                                                                                                                                         f
                     Z ← (HL)b                                                                                        01 b 110                                          010    D                         HL ← HL - 1                 b4                                                                     10 111 010    BA   2       4        16      if B = 0
                                                                                                                                                                                                                                                                                                                                                         f
BIT b, (IX + d)5         _____              b   1
                                                        b       b   2
                                                                            1       b   3
                                                                                                b   4
                                                                                                            0       • 11 011 101      DD
                                                                                                                                       D    4       5         20        011    E                         B←B-1
                     Z ← (IX + d)b                                                                                    11 001 011      CB
                                                                                                                                       B                                100    H                         Repeat until
                                                                                                                      ← d →                                             101    L                         B=0
                                                                                                                      01 b 110                                          111    A     OUT (n), A          (n) ← A             •       •           •           •         •           •       •        •       11 010 011    D3   2       3        11
BIT b, (IY + d)5         _____              b1 b                b2          1       b3          b4          0       • 11 111 101      FD
                                                                                                                                       D    4       5         20                                                                                                                                            ← n →
                     Z ← (IY + d)b                                                                                    11 001 011      CB
                                                                                                                                       B                                             OUT (C), r          (C) ← r             •       •           •           •         •           •       •        •       11 101 101    ED   2       3        12
                                                                                                                      ← d →                                                                                                                                                                                 01 r 001
                                                                                                                      01 b 110                                                                 *
                                                                                                                                                                                     OUT (C), 0*         (C) ← 0             •       •           •           •         •           •       •        •       11 101 101    ED   2       3        12
SET b, r             rb ← 1                 •           •       •           •       •           •           •       • 11 001 011       B
                                                                                                                                      CB    2       2         8         b Bit.                                                                                                                              01 110 001    71




                                                                                                                                                                                                                                                                                                                                                                       104
                                                                                                                      11 b r                                            000    0     OUTI                (C) ← (HL)          b   1
                                                                                                                                                                                                                                     b   1
                                                                                                                                                                                                                                                 b   1
                                                                                                                                                                                                                                                             X         b   1
                                                                                                                                                                                                                                                                                   X       X        X       11 101 101    ED   2       4        16
SET b, (HL)
       (             (HL)b ← 1              •           •       •           •       •           •           •       • 11 001 011      CB
                                                                                                                                       B    2       4         15        001    1                         HL ← HL + 1                                                                                        10 100 011    A3
                   B←B-1                                                                                                                                       Notation:
OTIR               (C) ← (HL)          0 1       0     X      0     X     X      X      11 101 101         ED  2    5          21        if B ≠ 0
                   HL ← HL + 1                                                          10 110 011         B3  2    4          16        if B = 0
                   B←B-1                                                                                                                                       Call and Return Group
                   Repeat until
                   B=0                                                                                                                                                                                                                                                              Number of
OUTD               (C) ← (HL)          b1 b1 b1 X             b1 X        X      X      11 101 101         ED  2    4          16                                                                                                                                           Byte       M       T-
                                                                                                                                                                               Symbolic                                                                             H
                   HL ← HL - 1                                                          10 101 011         AB                                                                                                        Flags                         Opcode                            Cycle    State
                                                                                                                                                                               Operation                                                                            e                                   Comments
                   B←B-1                                                                                                                                       Mnemonic                                                                                             x
OTDR               (C) ← (HL)          0 1       0     X      0     X     X      X      11 101 101         ED  2    5          21        if B ≠ 0                                               S    Z   F5      H     F3    P/V   N      C     76 543 210
                   HL ← HL - 1                                                          10 111 011         BB  2    4          16        if B = 0              CALL nn     SP ← SP - 1          •    •    •      •      •     •    •      •     11 001 101         CD       3         5          17
                   B←B-1                                                                                                                                                   (SP) ← PCH                                                           ← n →
                   Repeat until                                                                                                                                            SP ← SP - 1                                                          ← n →
                   B=0                                                                                                                                                     (SP) ← PCL
Notes:                      The V symbol in the P/V flag column indicates that the P/V flags contains the overflow of the operation. Similarly the P                       PC ← nn
                            symbol indicates parity.                                                                                                           CALL cc,    if cc is true,       •    •     •     •      •     •    •      •     11 ccc 100                  3         3          10   if cc is false
                            r means any of the registers A, B, C, D, E, H, L.                                                                                  nn          SP ← SP - 1                                                          ← n →                       3         5          17   if cc is true
                            1
                                flag is affected by the result of B ← B - 1 as in DEC B.                                                                                   (SP) ← PCH                                                           ← n →
                            2
                            3
                                N is a copy bit 7 of the last value from the input (C).                                                                                    SP ← SP - 1
                                this flag contains the carry of ( ( (C + 1) AND 255) + (C) )                                                                               (SP) ← PCL
                            4
                                this flag contains the carry of ( ( (C - 1) AND 255) + (C) )                                                                               PC ← nn
                            * means unofficial instruction.                                                                                                    RET         PCL ← (SP)           •    •     •     •      •     •    •      •     11 001 001         C9       1         3          10
Flag Notation:              • = flag is not affected, 0 = flag is reset, 1 = flag is set, X = flag is unknown,
                                                                                                                                                                           SP ← SP + 1
                            b = flag is set according to the result of the operation.                                                                                      PCH ← (SP)
                                                                                                                                                                           SP ← SP + 1
                                                                                                                                                               RET cc      if cc is true,       •    •     •     •      •     •    •      •     11 ccc 000                  1         1          5    if cc is false
Jump Group                                                                                                                                                                 PCL ← (SP)                                                                                       1         3          11   if cc is true
                                                                                                                                                                           SP ← SP + 1
                                                                                                                     Number of                                             PCH ← (SP)
                 Symbolic                                                                                   Byte        M            T-                                    SP ← SP + 1
                                                     Flags                         Opcode          He                  Cycle        State                      RETI2       PCL ← (SP)           •    •     •     •      •     •    •      •     11 101 101         ED       2         4          14   cc       Cond.
Mnemonic         Operation                                                                                                                     Comments
                                                                                                    x
                                                                                                                                                                           SP ← SP + 1                                                          01 001 101         4D                                 000      NZ
                               S    Z    F5      H     F3    P/V   N     C      76 543 210
                                                                                                                                                                           PCH ← (SP)                                                                                                                 001      Z
JP nn            PC ← nn       •    •     •      •      •     •    •     •      11 000 011          C3      3            3          10
                                                                                                                                                                           SP ← SP + 1                                                                                                                010      NC
                                                                                ← n →                                                                                                                                                                                                                 011      C
                                                                                                                                                               RETN1,2     PCL ← (SP)           •    •     •     •      •     •    •      •     11 101 101         ED       2         4          14
                                                                                ← n →                                                                                                                                                                                                                 100      PO
                                                                                                                                                                           SP ← SP + 1                                                          01 000 101         45
JP cc, nn        if cc is      •    •     •      •      •     •    •     •      11 ccc 010                  3            3          10      ccc        Cond.                                                                                                                                          101      PE
                                                                                                                                                                           PCH ← (SP)
                 true,                                                          ← n →                                                       000        NZ                                                                                                                                             110      P
                                                                                                                                                                           SP ← SP + 1
                 PC ← nn                                                        ← n →                                                       001        Z                                                                                                                                              111      M
                                                                                                                                            010        NC                  IFF1 ← IFF2
                                                                                                                                            011        C       RST p       SP ← SP - 1          •    •     •     •      •     •    •      •     11 t 111                    1         3          11   t        p
                                                                                                                                            100        PO                  (SP) ← PCH                                                                                                                 000      0h
                                                                                                                                            101        PE                  SP ← SP - 1                                                                                                                001      8h
                                                                                                                                            110        P                   (SP) ← PCL                                                                                                                 010      10h
JR e             PC ← PC       •    •     •      •      •     •    •     •      00 011 000          18      2            3          12      111        M                   PC ← p                                                                                                                     011      18h
                 +e                                                             ←e -2 →                                                                                                                                                                                                               100      20h
JR ss, e         if ss is      •    •     •      •      •     •    •     •      00 ss 000                   2            3          12      if ss is true                                                                                                                                             101      28h
                                                                                                                                                                                                                                                                                                      110      30h
                 true                                                           ←e -2 →                     2            2          7       if ss is false
                                                                                                                                                                                                                                                                                                      111      38h
                 PC ← PC                                                                                                                                                   1
                 +e                                                                                                                                            Notes:        This instruction has other unofficial opcodes, see Opcode list.
JP HL            PC ← HL       •    •     •      •      •     •    •     •      11 101 001         E9       1            1          4
                                                                                                                                                                           2
                                                                                                                                                                             Instruction also IFF1 ← IFF2
JP IX            PC ← IX       •    •     •      •      •     •    •     •      11 011 101         DD       2            2          8       ss         Cond.   Flag        • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.
                                                                                11 101 001         E9                                       111        C       Notation:
                                                                                                                                            110        NC
JP IY            PC ← IY       •    •     •      •      •     •    •     •      11 111 101          FD      2            2          8       101        Z
                                                                                11 101 001          E9                                      100        NZ
DJNZ e           B←B-1         •    •     •      •      •     •    •     •      00 010 000          10      2            2          8       if B = 0
                 if B ≠ 0                                                       ←e -2 →                     2            3          13      if B ≠ 0
                 PC ← PC
                 +e

Notes:            e is a signed two-complement number in the range <-126, 129>
                  e - 2 in the opcode provides an effective number of PC + e as PC incremented by 2 prior to the addition of e.
Flag              • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.




                                                                                                                                                                                                                                                                                                                       105
                                                                                            106

                                           บรรณานุกรม

[1] กรกฏ วัฒนวิเชียร และนารีนาถ รักสุนทร, การออกแบบไมโครโปรเซสเซอรโดยใช FPGA, คนเมื่อ 17
   กรกฏาคม 2549, จาก https://pindex.ku.ac.th/file_research/Eng-11_01.pdf

[2] ชํานาญ ปญญาใส และวัชรากร หนูทอง, ภาษา VHDL สําหรับการออกแบบวงจรดิจิตอล,ซีเอ็ดยูเคชั่น,
   กรุงเทพฯ, 2547

[3] ธี ร ยศ เวี ย งทอง. ไมโครคอนโทรลเลอร กั บ เอฟพี จี เ อ, ค น เมื่ อ 16 กรกฎาคม 2549, จาก
   http://www.ee.mut.ac.th/home/theerayod/home_files/uCon_FPGA.pdf

[4] Rafiquzzaman M., Fundamentals of Digital Logic and Microcomputer Design, 5th Edition,
   Wiley-Interscience, 2005

[5] Ramesh S. Gaonkar, The Z80 Microprocessor, 2nd Edition, Prentice Hall, 1993

[6] Xilinx, Inc.. Xillinx ISE webPack 8.1i, Retrieved Jun. 26, 2006, from
   http://www.xilinx.com/ise/logic_design_prod/

[7] ZILOG, Inc.. Z80 Family CPU User’s Manual, Retrieved Sep. 2, 2006, from
   http://www.zilog.com/products/

								
To top