วันพฤหัสบดีที่ 3 กรกฎาคม พ.ศ. 2557

บทที่ 5 ความรู้เกี่ยวกับภาษา วีเอชดีแอล (VHDL)

: บทที่ 5 ::
ความรู้เกี่ยวกับภาษา วีเอชดีแอล (VHDL)
<<  5.1  ความหมายของภาษา VHDL
<<  5.2  การออกแบบแบบบนลงล่าง (Top-Down Design)
<<  5.3  ส่วนประกอบต่างๆ ของภาษา VHDL
<<  5.4  สถาปัตยกรรมของภาษา VHDL
<<  5.5  ชุดคำสั่งในภาษา VHDL
 









5.1  ความหมายของภาษา VHDL
                        VHDL ย่อมาจากคำว่า VHSIC Hardware Description Language (VHSIC :Very High SpeedIntegrated 
        Circuit) เป็นภาษาโปรแกรมระดับสูง (High Level Language) ที่ใช้สำหรับการออกแบบฮาร์ดแวร์ในระบบดิจิตอล       ตัวของภาษา
         สามารถบรรยายพฤติกรรมการทำงานในรูปของลำดับชั้น (Hierarchy )  และ สามารถเขียนได้หลายรูปแบบ ด้วยเหตุผลนี้จึงทำให้ภาษา 
        VHDL เป็นเครื่องมือที่ใช้ออกแบบตั้งแต่ขั้นตอนบนสุดคือ   แนวความคิดที่จะแก้ปัญหา ลงไปทีละขั้นจนถึงขั้นตอนของการสร้างวงจรจริง
        และตัวภาษาก็เปิดโอกาสให้ได้พัฒนาและจำลองการทำงานของรูปแบบฟังก์ชันการทำงานของวงจรอย่างสังเขป       โดยยังไม่ต้องคำนึงถึง 
        รายละเอียดเกี่ยวกับโครงสร้างวงจรจริง นอกจากนั้น   VHDL ยังเป็นภาษาที่สนับสนุนลักษณะต่างๆ ของระบบดิจิตอลที่มี ความซับซ้อนได้  
        ทั้งหมด วิวัฒนาการของภาษา VHDL เริ่มต้นประมาณปี ค.ศ. 1981 เมื่อกระทรวงกลาโหมสหรัฐอเมริกา  หรือ DoD (Department 
        of Defense) ได้พยายามปรับปรุงอุปกรณ์อิเล็กทรอนิกส์และคอมพิวเตอร์ที่ใช้ในกิจการทางทหาร  ให้มีความทันสมัยมากขึ้นประกอบกับ
        เทคโนโลยีทางด้านไมโคร-อิเล็กทรอนิกส์มีการพัฒนาไปอย่างรวดเร็วดังจะเห็นได้ จากการนำวงจรดิจิตอลหลายๆ วงจรมาทำการผลิตอยู่บน
       แผ่นซิลิกอนที่มีพื้นที่เพียง  1- 2 ตารางเซนติเมตรเท่านั้น ซึ่ง เป็นผลให้ประสิทธิภาพในการทำงานของวงจรสูงขึ้นตลอดจนความน่าเชื่อถือ    
       ในการทำงานและความคงทนต่อสภาพ แวดล้อมสูง 
                 ในปี 1986 ภาษา VHDL ได้เริ่มมีการปรับปรุงภาษา   VHDL  เพื่อให้สามารถกำหนดเป็นมาตรฐานของ IEEE โดยสามารถประกาศ
       เป็นมาตรฐานได้ในเดือนธันวาคมปี   1987 โดยอยู่ในหมวด  IEEE  1076 – 1987  หลังจากนั้นก็ได้มีการพัฒนาปรับปรุงอย่างต่อเนื่องโดย     
       ได้มีประกาศปรับปรุงอีกครั้งในปี 1993 ซึ่งเรียกว่า  IEEE  1076 – 1993 โดยได้มีการเพิ่มเติม   Syntax พิเศษเพื่อให้ผู้ใช้สามารถใช้งาน 
      ได้สะดวกมากยิ่งขึ้น สำหรับขีดความสามารถในการออกแบบโดยใช้ภาษา VHDL นั้นสามารถออกแบบได้เฉพาะวงจรที่มีลักษณะเป็น Digital
       เท่านั้นส่วนวงจรที่เป็น    Analog ในขณะนี้ยังไม่สามารถออกแบบได้โดยการใช้ภาษา VHDL แต่จะทำได้ในอนาคต        
5.2  การออกแบบแบบบนลงล่าง (Top-Down Design) 
                         เป็นการออกแบบที่เน้นความถูกต้อง และประสิทธิภาพในการทำงานของวงจรที่ออกแบบโดยจะใช้การออกแบบ  ในลักษณะที่เรียกว่า
          High-level behavioral  description  จะมีการแบ่งวงจรทั้งหมดที่ต้องการออกแบบออกเป็นส่วน  แล้วทำการออกแบบในแต่ละส่วน
          แล้ว จำลองการทำงานของวงจร   ในแต่ละส่วนแยกอิสระออกจากกันเพื่อตรวจสอบความถูกต้อง             ของหน้าที่การทำงานของวงจรและ
          ประสิทธิภาพการทำงานของวงจร      ขั้นต่อไปก็จะนำการออกแบบไปสังเคราะห์    เพื่อให้ได้เป็นวงจรในระดับ  Gate Level   แล้วทำการ
          จำลองการทำงาน           เพื่อตรวจสอบความล่าช้าของการทำงานภายในวงจร และทดสอบประสิทธิภาพการทำงานของวงจรก่อนที่จะนำไป 
          Implement เป็น Hardware 
                                                         
   
                                                    รูปที่ 5.1 ขั้นตอนการออกแบบจากบนลงล่าง

   5.2.1 System Specification and Analysis       ขั้นตอนการสร้างข้อกำหนดของความต้องการ  และวิเคราะห์ระบบ เพื่อหา
                  แนวความคิดและหลักการ(Idea and Concept) ในการแก้ปัญหา
   5.2.2 Modeling and Simulation   ขั้นตอนการเขียนรูปแบบของระบบที่ต้องการออกแบบโดยใช้ภาษาวีเอชดีแอลหรือ ภาษาเอชดีแอล
                  อื่นๆ สำหรับบรรยายพฤติกรรมการทำงาน    พร้อมทั้งจำลองการทำงาน          เพื่อเปรียบเทียบและตรวจสอบความถูกต้องกับข้อกำหนด
     5.2.3 Logic and Test Synthesis หลังจากที่ได้หลักการขั้นต้นพร้อมกับแนวความคิดที่ผ่านการตรวจสอบแล้ว  หลักการนี้จะถูกเพิ่ม
                 เติมในรายละเอียดลงมาเป็นลำดับขั้นที่สอง จนกระทั่งอยู่ในระดับที่จะนำไปผลิตวงจร  หรือสังเคราะห์ ในขั้นตอนนี้เองเทคโนโลยีที่จะมา
                รองรับวงจรออกแบบจะถูกกำหนดขึ้นและระบบช่วยการออกแบบจะสังเคราะห์วงจรที่ได้จากรูปแบบที่เขียนขึ้น ให้อยู่ในรูปของวงจรที่
                 ประกอบด้วยอุปกรณ์อิเล็กทรอนิกส์ หรือวงจรในระดับเกตและการเชื่อมต่อระหว่างกันของอุปกรณ์เหล่านั้น หรือไม่ก็อยู่ในรูปของเน็ทลิสท์ 
                 (Netlist)  ที่สามารถนำไปผลิตลงบนอุปกรณ์อื่นได้
     5.2.4. Pre-Timing Verification       หลังจากการสังเคราะห์วงจรให้อยู่ในรูประดับเกตหรือเน็ทลิสท์แล้วข้อมูลที่ได้จากผู้ผลิตอุปกรณ์
               วงจรนั้น นอกจากจะเป็นข้อมูลสำหรับจำลองการทำงาน ในเรื่องของความถูกต้องของฟังก์ชันแล้ว ยังมีข้อมูลที่เกี่ยวกับเวลาด้วยซึ่งเป็นความ
               จริงที่ว่าอุปกรณ์ทางอิเล็กทรอนิกส์ทุกชิ้นจะมีเวลาหน่วงของการแพร่กระจาย (Propagation delay time) เสมอ ถึง แม้ว่าจะเป็นเวลา
               ที่น้อยมากในระดับนาโนวินาที (10-9 นาที) แต่ถ้าภายในวงจรหนึ่งประกอบด้วยเกตของฟังก์ชันต่างๆ จำนวน  10,000 เกต ขึ้นไป เวลาดัง
                กล่าวนี้จะสะสมกันมากขึ้น จนอาจจะทำให้การทำงานของวงจรรวมทั้งหมดผิดไปหรือไม่สามารถทำงานในย่านความถี่สัญญาณนาฬิกาที่
               สูงได้
     5.2.5 Physical Design and Analysis ขั้นตอนของการผลิตเป็นวงจรจริง (Technology  and device mapping) โดยนำ
                ข้อมูลที่ได้จากการสังเคราะห์มาผลิต ซึ่งอาจจะอยู่ในรูปของแผงวงจรไฟฟ้า ที่ประกอบด้วยอุปกรณ์หลายๆ ชิ้น หรืออยู่ในรูปของวงจรรวม 
                (ASIC) 
     5.2.6 Post-Timing Verification หลังจากที่ได้วงจรจริงมาแล้ว ยังต้องมีความจำเป็นที่ต้องตรวจสอบการทำงานที่คำนึงถึงเวลาด้วย 
                เพื่อความถูกต้องของวงจรครั้งสุดท้ายก่อนที่จะนำไปรวม เข้ากับอุปกรณ์อื่นๆ ให้เป็นระบบดิจิตอลเพราะในขั้นตอนนี้วงจรที่ออกแบบจะ
                ประกอบด้วยอินพุตและเอาต์พุต แพด (Pad) ซึ่งเป็นจุดต่อสำหรับรับและส่งสัญญาณกับภายนอก
     5.2.7 System Level Verification หลังจากที่นำวงจรที่ออกแบบรวมเข้ากับอุปกรณ์อื่นๆ ให้เป็นระบบดิจิตอลแล้วนั้น จะต้องทดสอบ
                 การทำงานรวมทั้งระบบร่วมกับอุปกรณ์อื่นๆอีกครั้ง เป็นการควบคุมคุณภาพของผลิตภัณฑ์

                                                                                                                                                                                         << Go To Top
5.3 ส่วนประกอบต่างๆ ของภาษา VHDL
         5.3.1 หน่วยการออกแบบเอนทิตี (Entity Design Unit)
                         หน่วยการออกแบบนี้เป็นส่วนที่ใช้สำหรับติดต่อ ระหว่างโลกภายนอกกับรูปแบบที่เขียนขึ้น ที่เรียกว่า หน่วยการออกแบบเอนทิตี
                 ในส่วนนี้ใช้กำหนดจุดเชื่อมต่อของรูปแบบ กำหนดทิศทาง การไหลของสัญญาณ และประเภทของค่าที่สามารถกำหนดให้กับสัญญาณ
                ตามจุดต่างๆ ของข้อมูลที่ไหลผ่านจุดต่อเหล่านั้น 
ENTITY component_name IS
           
      Input and output ports
      Physical and other parameters
           
END [component_name];
         
                                                                          รูปที่ 5.2 โครงสร้างของ entity design unit

                           ส่วนนี้จะขึ้นต้นด้วยคำ ENTITY และ IS ระหว่างคำทั้งสองเป็นส่วนสำหรับชื่อของรูปแบบที่ต้องการจะเขียน
                (component_name)สำหรับการตั้งชื่อนั้น ต้องเป็นไปตามกฎเกณฑ์ของภาษาหลัง จากนั้นจะตามด้วยส่วนที่ใช้กำหนด
               ช่องทางเข้า และออกของข้อมูล   (input - output) รวมทั้งพารามิเตอร์ อื่นๆ ส่วนนี้เรียกว่า ส่วนหัว (entity header)
                และที่สำคัญคือ หน่วยการออกแบบเอนทิตีจะต้องปิดท้ายด้วยคำว่า END และต้องเป็นชื่อของ (component_name)
                 นั้นกับเครื่องหมายอัฒภาคเสมอ (;)        

entity HALFADDER is
              port(A, B: in bit ;
              SUM, CARRY: out bit) ;
end HALFADDER ;

                               รูปที่ 5.3 ตัวอย่างการออกแบบเอนทิตี (Entity Design Unit)
                            
                                 Ports
                                             IN :              คือ สัญญาณอินพุต
                                             OUT :         คือ สัญญาณเอาต์พุต
                                             INOUT :     คือ สัญญาณสองทิศทางเป็นทั้งสัญญาณอินพุตและสัญญาณเอาต์พุต
                                            BUFFER : คือ สัญญาณที่ออกมาจาก component
 5.3.2 หน่วยการออกแบบสถาปัตยกรรม (Architecture Design Unit)
                            คือส่วนที่ใช้เขียนบรรยายพฤติกรรมของรูปแบบ ในมุมมองของการจำลองการทำงาน พฤติกรรมต่างๆ ที่บรรยายในส่วน
                นี้ขึ้นอยู่กับข้อมูลที่ผ่านเข้าและออก ตรงช่องทางตลอดจนพารามิเตอร์ต่างๆ ที่กำหนดใน หน่วยการออกแบบเอนทิตี 

                                                                       

ARCHITECTURE identifier OF component_name IS
         [declaration]
         BEGIN
         specification of the functionality of the
         component in terms of its input lines and as
         influenced by physical and other parameters
 END [identifier];
                                                                                       รูปที่ 5.4 การออกแบบสถาปัตยกรรม

                             ส่วนของหน่วยการออกแบบสถาปัตยกรรม เริ่มต้นด้วยคำ ARCHITECTURE และตามด้วยชื่อ (identifier) สิ่งที่ต้อง
                 กำหนดลงไปได้แก่ สิ่งที่แสดงให้เห็นว่า architecture นั้นใช้บรรยายหน่วยการออกแบบเอนทิตีใดๆ (OF <entity design unit> IS) 
                ส่วนที่อยู่ระหว่าง ARCHITECTURE และBEGIN เป็นพื้นที่ส่วนประกาศหน่วยของสถาปัตยกรรมกำหนด (architecture 
                 declarative area) ที่เป็นเพียงส่วนเผื่อเลือก (option) ในบริเวณนี้สามารถใช้เขียนประกาศกำหนดค่าต่างๆ ที่จะนำไปใช้ภายใน
                 สถาปัตยกรรมนั้นได้ อาทิเช่นประเภท (type) ต่างๆ (ตัวอย่างเช่น bit, bit_vector), สัญญาณ (signal), ตัวคงที่ (constant),
                โปรแกรมย่อย (ได้แก่ function และ procedure) และอุปกรณ์ (component) ส่วนที่ใช้บรรยายความสัมพันธ์ระหว่างข้อมูลที่ไหลเข้า
                และไหลออกของรูปแบบ (สัญญาณที่กำหนดในชุดคำสั่ง PORT) นั้นจะถูกบรรยายในบริเวณเนื้อที่ระหว่างคำว่า BEGIN กับ END
                ของหน่วยการออกแบบสถาปัตยกรรม หน่วยการออกแบบสถาปัตยกรรม จะต้องปิดท้ายด้วยคำสั่ง  END และชื่อของสถาปัตยกรรมนั้นๆ
entity HALFADDER is
         port(
         A, B: in bit;
         SUM, CARRY: out bit);
         end HALFADDER;        
architecture RTL of HALFADDER is
begin

           SUM <= A xor B;
           CARRY <= A and B;
end RTL;    -- VHDL'93: end architecture RTL ;
         

                               รูปที่ 5.5 ตัวอย่างการออกแบบสถาปัตยกรรม (Architecture Design Unit)

                                                                                                                     << Go To Top

5.4 สถาปัตยกรรมของภาษา VHDL 
        5.4.1  Behavioral Description
                      การเขียนรูปแบบลักษณะของ behavioral description ของระบบดิจิตอลด้วยภาษา VHDLนั้น  ถูกจัดให้อยู่ในประเภท
                ของการบรรยายที่ไม่ต้องมีการอ้างถึงรูปแบบย่อย(submodel) ภายในarchitectureนั้นอีก  ทั้งนี้จะไม่รวมถึงการเรียกโปรแกรม
                ย่อย  (subprogram) ที่สามารถเกิดขึ้นได้เสมอในรูปแบบลักษณะนี้ แต่จะหมายถึงการอ้างถึงอุปกรณ์ที่ถูกกำหนดด้วย  VHDL 
               ก่อนแล้วลักษณะของ behavioral descriptionโดยทั่วไปแล้วจะเป็นขั้นตอนของการบรรยายที่จะกำหนดฟังก์ชั่นของการทำงาน               

Architecture behavioral OF Mux2x IS
       BEGIN
         PROCESS (in0,in1,sel)
         BEGIN
         IF sel=0 THEN
                       yout<=in1;
         ELSE
                        yout<=in2; 
END IF;
END PROCESS;
END behavioral

                                     รูปที่ 5.7 แสดงการออกแบบ  Behavioral Description ของ 2 Line Multiplexer

       5.4.2  Structural  Description
                     การบรรยายในลักษณะโครงสร้าง (structural description) ด้วยภาษา  VHDL จัดอยู่ในประเภทการแสดงด้วยการ
                     แทนที่โดยอุปกรณ์(ในที่นี้หมายถึงอุปกรณ์ที่อยู่ในรูปแบบของ VHDL คือ entity และ architecture  design unit ) 
                    และการเชื่อมต่อภายในระหว่างอุปกรณ์ต่างๆประกอบกันขึ้นเป็นวงจรหรือระบบดิจิตอล  และสามารถเรียกอีกอย่างได้ว่า
                    “  netlist  representation “ เป็นการเขียนที่แสดงให้เห็นโครงสร้างของ hardware

                                                   

Architecture structural OF Mux2x IS 
Component INV
         PORT(i1: in bit; y1: out bit)
END Component;
Component AND2
         PORT(iand1,iand2 : in bit; yand: out bit);
END Component;
Component OR2
         PORT(ior1,ior2 : in bit; yor: out bit);
END Component;
SIGNAL so,s1,s2 : bit;
BEGIN
         IC1 : INV PORT MAP (i1=>sel,y1=>s0);
         IC2 : AND2 PORT MAP (iand1=>in0,iand2=>s0,yand=>s1);
         IC3 : AND2 PORT MAP(iand1=>in1,iand2=>sel,yand=>s2); 
         IC4 : OR2 PORTMAP (ior1=>s1,ior2=>s2,yor=>yout);
END structural; 
                        รูปที่ 5.8 แสดงการออกแบบ Structural Description ของ 2 Line Multiplexer
      5.4.3  Dataflow  Description
                        เรียกอีกอย่างหนึ่งได้ว่า “ Register Transfer Level”  (RTL) เป็นรูปแบบที่ถูกเขียนขึ้น  เพื่อจุดประสงค์ที่จะใช้
                        เครื่องมือสำหรับสังเคราะห์วงจรอัตโนมัติ   รูปแบบลักษณะนี้ส่วนใหญ่จะเป็นProcedural constructs และ function  
                        operaters
            
Architecture dataflow  OF Mux2x IS
BEGIN
         yout <= ((NOT sel) AND in0) OR (sel AND in 1));
END dataflow;
                                รูปที่ 5.9 แสดงการออกแบบ Dataflow Description ของ 2 Line Multiplexer

          5.4.4  Mixed  Model Description
                         จากคุณสมบัติที่อ่อนตัวของภาษา  VHDL  จึงสามารถที่จะเขียนรูปแบบ โดยใช้ลักษณะต่างๆ  ที่กล่าวมาแล้วข้างต้น 
                           บรรยายวงจรหรือระบบดิจิตอลเดียวกันได้  ฉะนั้นรูปแบบเช่นนี้จึงมีการเขียนแบบผสม
USE WORK.until.ALL;
         ARCHITECTURE mixed OF IS
                  COMPONENT reg
                   GENERIC (width:INTEGER:=16);
                  PORT (D: IN BIT_VECTOR (width – 1 DOWNTO 0));
                                clk: IN BIT;
                                 Q : OUT BIT_VECTOR (width – 1 DOWNTO 0));
         END COMPONENT;
         SIGNAL reg_in1 ,reg_in2,accum : BIT_VECTOR (15 DOWNTO 0); 
         BEGIN
         ---- structural description
         u1 : reg GENERIC MAP (16) PORT MAP(in1,clk,reg_in1);
         u2 : reg GENERIC MAP (16) PORT MAP(in2,clk,reg_in2);
         ---- behavioral description
         PROCESS
                     VARIABLE temp1,temp2,mul,adder :INTEGER :=0;
         BEGIN
                      WAIT UNTIL clk = ‘1’; --- rising edge of clk
                      temp1 :=vect_to_int (reg_in1);
                      temp2 :=vect_to_int (reg_in2);
                     mul :=temp1 * temp2;
                     adder :=accum + mul;
                     accum <=int_to_vect(adder,32);
         END PROCESS
         ---- dataflow description
                      out1 <= accum;
         END mixed;
                                                           รูปที่ 5.10 แสดงการออกแบบ Mixed  Model Description

                                                                                                                                           << Go To Top

5.5 ชุดคำสั่งในภาษา VHDL
        5.5.1 Standard Type
                     -  BOOLEAN  คือกลุ่มของค่า   FALSE และ TRUE 
                     - BIT   คือกลุ่มของค่า ‘0’  และ ‘1’
                    -  INTEGER  คือ กลุ่มของค่า -214748347  ถึง  214748347
                    -  REAL  คือ กลุ่มของค่า -1.0E38 ถึง 1.05E38
                    -  CHARACTER  คือกลุ่มของค่า  พยัญชนะ  ‘A’-‘Z’, ’a’-‘z’  อักษรหรือเครื่องหมายพิเศษ และอักษรควบคุม
                    -  TIME  ได้แก่หน่วยเวลาที่มีค่าพื้นฐานเป็นวินาที  (second ย่อด้วย s หรือ S)
 
        5.5.2 ชุดคำสั่งลำดับ (Squential Statements)
                  5.5.2.1 Process Statement 
                                   ชุดคำสั่ง Process เป็นพื้นฐานที่สำคัญที่สุด สำหรับการเขียนรูปแบบในลักษณะของ  behavioral
                             และกฎเกณฑ์ในการเขียนตามที่แสดงดังรูป
   

[label]: PROCESS [(sensitivity list)]
         process declarative part
         BEGIN
         process statement part 
 <sequential statement(s)>
         END PROCESS [label];
                                                                          รูปที่ 5.11 โครงสร้างของ process statement
                                            คำ PROCESS ในบรรทัดแรกของโครงสร้าง แสดงถึงจุดเริ่มต้นของชุดคำสั่ง    process     ส่วนที่เป็น option
                          ได้แก่ label นั้นสามารถใช้เป็นที่สำหรับเขียนชื่อของ PROCESS เพื่อป้องกันการสับสนเพราะในบางกรณีใน    architecture 
                           หนึ่งอาจจะมีโครงสร้างของชุดคำสั่ง process หลายชุดได้ คำ  END PROCESS  บอกถึงจุดสิ้นสุดของชุดคำสั่ง process
                           และเช่นเดียวกับ label เป็นเพียงสิ่งเผื่อเลือกหรือ optionแต้ถ้าจะเขียนกำกับลงไป จะต้องเป็นชื่อเดียวกับที่เขียนไว้ตอนต้นก่อนคำ
                           PROCESS 
                                    เมื่อที่ชุดคำสั่ง  process ถูกกระตุ้นด้วยสัญญาณใน sensitivity list แล้วจะเริ่มทำงานตามคำสั่งสุดท้ายที่บรรทัดล่างสุด
                           อันได้แก่คำสั่ง END PROCESS ซึ่งเรียกการทำงานในลักษณะเช่นนี้ว่า “การทำงานแบบลำดับหรือ sequential” เมื่อคำสั่ง 
                        END PROCESS ถูกปฏิบัติแล้ว ชุดคำสั่ง  process จะหยุดการทำงานลงชั่วขณะ (แต่ยังคง active อยู่ตลอดเวลา)  จนกว่า
                       จะมีสัญญาณอย่างน้อยตัวใดตัวหนึ่งใน sensitivity list เกิด event ขึ้นอีก

               5.5.2.2 Wait Statement 
                               ในภาษา VHDL สามารถใช้ wait statement ได้ 4 แบบคือ
                                   1. WAIT ON signal_list;                   -- signal sensitivity
                                  2.  WAIT  UNTIL condition;            --condition
                                  3.  WAIT  FOR time;                          -- timeout
                                  4. WAIT;                                               -- forever 
                             ซึ่งแต่ละอย่างมีความหมายและวิธีใช้แตกต่างกันตามตัวอย่างต่อไปนี้
                       WAIT ON  clock,clear,present,d;
                            คำสั่งนี้จะหยุดการทำงานของชุดคำสั่งลำดับ ไว้จนกว่าจะเกิด event ขึ้นที่สัญญาณ clock หรือ clear  หรือ present  หรือ d
                       WAIT  UNTIL (clock=’1’);
                           การทำงานของชุดคำสั่งลำดับจะหยุดที่ตำแหน่งนี้  และจะทำงานต่อไปเมื่อสัญญาณ clock หรือ Event และ Boolean 
                        expression ภายในวงเล็บ (clock=’1’)   เป็น TRUE   ทุกครั้งเมื่อลำดับการทำงานถูกหยุดตรงจุดนี้ และก่อนที่จะทำต่อไปได้นั้น
                        ก่อนอื่นต้องตรวจสอบ ว่ามี    event   เกิดขึ้น บนสัญญาณ clock หรือเปล่า และข้อแม้ที่ว่า (หลังจากเกิดแล้ว) สัญญาณ clock มีค่า
                        เป็น ‘1’ ฉะนั้นBoolean expression จะต้องเป็นจริง (TRUE)
                       WAIT  FOR 10 NS;
                           คำสั่งนี้เป็นการรอหรือหยุดในขณะที่จำลองการทำงาน (simulation) จนกว่าเวลาการจำลอง (simulation time) จะล่วงเลยไป
                       แล้ว 10 ns.  จะมีผลทำให้ PROCESS  เริ่มทำงานต่อไปได้ คำสั่งนี้สามารถนำไปใช้เขียนรูปแบบได้อย่างมีประสิทธิภาพ ใน
                       สถานการณ์ที่เรียกว่า “time out”
                       WAIT;   
                            เป็นการคำสั่งให้  PROCESS หยุดการทำงานตลอดไป โดยไม่มีการเริ่มต้นการทำงานใหม่ บางครั้งการเขียนรูปแบบการบรรยาย
                        การทำงานของ ระบบดิจิตอล มีความจำเป็นที่ต้องใช้คำสั่งนี้ เพื่อหยุดการทำงานของ PROCESS  อย่างถาวร   

                 5.5.2.3 IF-THEN-ELSE statement           

IF condition THEN
         {sequential-statement(s)}
[{ ELSIF condition THEN
         {sequential_statement(s)}]
[ ELSE
         {sequential_statement(s)]
END IF;
                                                                  รูปที่ 5.12  โครงสร้างของ  IF-THEN-ELSE statement

                    ตัวอย่างที่สามารถจะเขียน  IF-THEN-ELSE statement ได้หลายรูปแบบ

                                    
IF statement         
Format: IF condition THEN             ตัวอย่าง: IF a=’1’ THEN 
       sequential-statement(s)                                count := count +1;
END IF;                                                                     END IF;
         
                                                                                                            (ก)
IF-ELSE construct         
 Format: IF condition THEN                         ตัวอย่าง: IF a=’1’ THEN 
                {sequential_statement(s)                                     one_count := count +1;
               ELSE                                                                         ELSE
               {sequential_statement(s)                                      two_count := count +1;
                END IF;                                                                  END IF;
         
                                                                                                            (ข)

IF-ELSE construct         
 Format: IF condition THEN                                      ตัวอย่าง: IF a=’X’    THEN 
           {sequential_statement(s)                                                       b := b +1;
           ELSIF condition THEN                                                     ELS IF a=’0’ THEN 
           {sequential_statement(s)                                                       c := c +1;
           END IF;                                                                                   ELS IF a=’1’ THEN 
                                                                                                                   d := d +1; 
                                                                                                                ELS IF a=’Z’ THEN 
                                                                                                                    e := e +1; 
                                                                                                                  END IF;
         
                                                                                                              (ค)

                                                                         รูปที่ 5.13 ตัวอย่าง IF-THEN-ELSE statement

        5.5.2.4  CASE Statement

                            

CASE expression IS
            WHEN choice => sequential statement(s)
         [ WHEN choice => sequential statement(s)]
END CASE; 
                                                                  รูปที่ 5.14  โครงสร้างของ  CASE Statement
                                 คำสั่ง CASE และ   END CASE   กำหนดจุดเริ่มต้น และจุดสิ้นสุดของ     case statement      คำสั่ง WHEN 
                     ใช้สำหรับกำหนดตัวเลือก ที่จะนำมาเปรียบเทียบกับ expression ตัวเลือกใดเป็นไปตาม  expression ข้างบน PROCESS
                     จะเริ่มต้นทำงานที่ชุดคำสั่งลำดับที่ตามมา จนกระทั่งคำสั่งสุดท้ายของตัวเลือกนั้นๆ      และออกจาก CASE statement โดยไม่
                     ทำหนทางเลือกอื่นๆ ที่ยังคงเหลืออยู่ดังตัวอย่าง
ARCHITECTURE behave_case OF clocked_mux IS
         BEGIN 
         PROCESS(clk)
         Variable temp: BIT;
         BEGIN 
                 CASE clk IS
                          WHEN ‘1’ => CASE sel IS
                          WHEN “00”=>temp:=inputs(0);
                          WHEN “01”=>temp:=inputs(1);
                         WHEN “10”=>temp:=inputs(2);
                          WHEN “11”=>temp:=inputs(3); 
                          END CASE;
                              Output <= temp AFTER 5NS;
                         WHEN OTHERS => NULL; -- do nothing 
                     END CASE;
         END PROCESS;
END behave_case; 
                                       รูปที่ 5.15 Behavioral model ของ 4:1 clocked multiplex (Case cluase)

                  5.5.2.5 LOOP Statement                                        คือ  การทำงานในลักษณะลำดับที่เป็นวงรอบ (loop)

[label:] [iteration_scheme] LOOP
                                                    sequential statement(s)
                                                    END LOOP [label];
iteration_scheme
                  FOR loop_ iteration_range
                  WHILE condition,
                                                                           รูปที่ 5.16 โครงสร้างของ LOOP Statement
                                                คำสั่ง   LOOP   และ   END LOOP   แสดงตำแหน่งของจุดเริ่มต้น และจุดสิ้นสุดของ loop statement จาก
                         โครงสร้างจะเห็นว่าสามารถสร้างloop ได้สองลักษณะคือ    FOR- LOOP   และ  WHILE- LOOP

                           - FOR- LOOP:
                                    กลุ่มคำสั่งลำดับใน FOR- LOOP จะทำงานเป็นวงรอบตราบเท่าที่ ค่าของพารามิเตอร์ยังอยู่ในขอบข่าย(range)ที่กำหนด

                       
[label:] FOR loop_parameter IN discrete_range
         LOOP
                 sequential statement(s)
          END LOOP[label]; 
                                                         รูปที่ 5.17 โครงสร้างของ FOR- LOOP

                                                            
lb1 : FOR index IN 0  TO 7 
       LOOP
             ray_out(index)<=ray_in(index);
         END LOOP lb1;
                                                                              รูปที่ 5.18 ตัวอย่างการใช้  FOR- LOOP
                           - WHILE- LOOP:
[label:] WHILE boolean_expression
         LOOP
               sequential statement(s)
         END LOOP[label]; 
                                                          รูปที่ 5.19 โครงสร้าง WHILE- LOOP
                                   กลุ่มคำสั่งลำดับใน WHILE- LOOP จะทำงานเป็นวงรอบไปเรื่อยๆ จนตราบเท่าที่ข้อแม้ของ   boolean expression
                   ใน    WHILE- LOOP   ยังมีค่าเป็น TRUE จำนวนครั้ง (รอบ) ที่จะถูกควบคุมจากภายในตัวของ     loop เอง นั้นคือการจะออกจาก
                   วงจรอบประเภทนี้ได้ ก็ต่อเมื่อผลลัพธ์ของ    boolean   expression ได้ค่าเป็น    FALSE    ข้อแม้ที่ใช้ควบคุมการทำงานี้ จะถูก
                   ตรวจสอบทุกครั้งก่อนการทำงานต่อไปภายในวงรอบ   นั้นคือถ้าตรวจพบว่า    boolean expression มีค่าเป็น FALSE เมื่อใดกลุ่ม
                   คำสั่งลำดับทุกๆอันจะไม่ถูกทำงาน      แต้ถ้าพบว่าค่า boolean expression มีค่าเป็น TRUE ทำให้กลุ่มคำสั่งลำดับภายในวงรอบ
                    การทำงาน  ทั้งนี้จะต้องไม่มีคำสั่งใดๆ ที่เป็นสาเหตุทำให้เกิดวงรอบของการทำงานที่ไม่มีสิ้นสุด  (infinite loop)   

p1:PROCESS(signal_a)
              VARIABLE index:INTEGER:=0;
         BEGIN
                          from_in_to_out: WHILE index<8 LOOP
                                             ray_out(index) <= ray_in (index);
                                                               Index := index +1;
                                              END LOOP from_in_to_out;
         END PROCESS p1;
                                                                         รูปที่ 5.20 ตัวอย่างสำหรับการใช้งาน WHILE- LOOP

                                                                                                                                                                     << Go To Top

ไม่มีความคิดเห็น:

แสดงความคิดเห็น