วันจันทร์ที่ 5 มิถุนายน พ.ศ. 2560

Week07 : VHDL - Digital System Laboratory


การเขียนภาษา VHDL สําหรับการออกแบบวงจรดิจิตอล
  • ภาษา VHDL เบื่องต้น 

         VHDL ย่อมาจาก VHSIC Hardware Description language เป็นภาษาบรรยายฮาร์ดแวร์ประเภทหนึ่งโดยเกิดขึ้นจากโครงการที่มีชื่อ VHSIC (Very High Speed Integrate Circuit) โดยมีเป้าหมายของโครงการเพื่อพัฒนาขีดความสามารถในการออกแบบวงจรรวมให้สูงและง่ายมากยิ่งขึ้น ซึ่งมีการพัฒนาจนสามารถกําหนดเป็นมาตรฐานของ IEEE (Institute of Electrical and Electronics Engineers) ได้ในเวลาต่อมา

  • ประโยชน์ของภาษา VHDL

     - เป็นภาษาสากลโดยรองรับจากสถาบัน IEEE ทําให้มีโปรแกรมและเครื่องมือต่างๆ และบริษัทที่
สนับสนุนการทํางานมากมาย
    - เป็นภาษาที่ใช้งานจริงในอุตสาหกรรม
    - ฯลฯ

  • แนะนําพื้นฐานภาษา VHDL
          ภาษา VHDL มีความเป็น Concurrent ซึ่งถือว่าเป็นหัวใจสําคัญของการเขียนออกแบบอุปกรณ์อิเล็กทรอนิกส์หมายถึงการเขียนโค๊ดภาษา VHDL จะไม่มีลําดับความสําคัญของตําแหน่งของแต่ละบรรทัดและภาษา VHDL ยังมีความเป็น Case insensitive อีกด้วยกล่าวคือไม่มีความแตกต่างในการเขียนอักษรพิมพ์เล็กหรือพิมพ์ใหญ์
            ภาษา VHDL สามารถบรรยายพฤติกรรมทางฮาร์ดแวร์ได้หลายระดับ ตั้งแต่การทํางานของวงจร จนถึงระดับลอจิกเกต ซึ่งในแต่ละระดับจะมีรายละเอียดที่แตกต่างกัน เช่น สมมุติผู้ออกแบบต้องการออกแบบวงจรบวกสองอินพุตผู้ออกแบบสามารถออกแบบโดยใช้operatorการบวก (“+”) ในภาษา VHDL หรือทําการออกแบบวงจรในระดับลอจิกเกต หรือทําการออกแบบในระดับทรานซิสเตอร์ก็ได้

  • ค่าหน่วงเวลา (Delta Time)
        เนื่องจากการจําลองการทํางานในระบบ VHDL สามาทํางานแบบ Concurrent ได้กลไกสําคัญที่ช่วยให้การทํางานปราศจากข้อแม้ทางเวลานี้เรียกว่า Delta Time (d-time) และเราไม่ควรเขียนโค้ดที่ทําให้เกิด delta time สะสมมากขึ้นเรื่อยๆ หรือมีค่าไม่รู้จบ เช่น a <= NOT a ; ในกรณีนี้จะทําให้เกิด delta time สะสมจนกระทั่งมีค่าไม่รู้จบ ซึ่งสามารถแก้ไขได้โดยกําหนดค่าหน่วงเวลา เช่น a <= NOT a AFTER 10 us ; ในกรณีนี้จะทําให้เกิดหน่วงการส่งสัญญาณ not a ไปยัง a เป็นเวลา 10 ไมโครวินาที (10-5วินาที) 
  • VHDL Object
                 - ค่าคงที่ (Constant) เป็นออบเจ็กต์ที่เมื่อกําหนดค่าเริ่มต้นแล้วจะคงค่านั้นไว้ตลอดไม่สามารถ
ดัดแปลง หรือแก้ไขได้
       - สัญญาณ (Signal) เป็นออบเจ็กต์ที่สามารถกําหนดค่าที่สัมพันธ์กับเวลานั้น หมายความว่า สัญญาณสามารถรับค่าได้เพียงค่าเดียวเท่านั้นในขณะเวลาหนึ่ง
                - ตัวแปร (Variable) เป็นออบเจ็กต์ที่สามารถกําหนดค่าใดๆได้และสามารถเปลี่ยนแปลงค่าได้
ตลอดเวลาการจําลองการทํางาน แต่จะเก็บค่าได้เพียงค่าเดียวเท่านั้น ในขณะเวลาหนึ่ง และตัวแปรจะสามารถใช้ได้เฉพาะกับการเขียนบรรยายพฤติกรรมแบบลําดับขั้นเท่านั้น กล่าวคือต้องเขียนภายใต้คําสั่ง PROCESS (ซึ่งจะกล่าวในภายหลัง) 
  • การประกาศออบเจ็กต์
          รูปแบบการประกาศออบเจ็กต object name : type := intial_value ; 
              - Object ไดแก constant,signal หรือ variable - Name คือ ชื่อของออบเจ็กต (ซึ่งตองเปนไปตามกฎ) - Type คือการกําหนดประเภทของออบเจ็กต 
         - Intial_value คือการกําหนดคาเริ่มตนสําหรับออบเจ็กตซึ่งอาจจะมีหรือไมก็ได การตั้งชื่อออบเจ็กต
           - ประกอบดวยพยัญชนะตัวเลขและเครื่องหมายขีดเสนใตที่ใชในภาษาอังกฤษไดไมจํากัดจํานวน และตองขึ้นตนดวยพยัญชนะเทานั้น 
            - การใชเครื่องหมายขีดเสนใต(_)ทุกครั้งตองนําหนาและตามดวยพยัญชนะหรือตัวเลขเทานั้น 
            - หามใชคําสงวนในภาษา VHDL (ซึ่งจะกลาวในภายหลัง) 
  • ชนิดของออบเจ็กตที่ไดกําหนดไวแลว
      หมายถึงชนิดของขอมูลที่ไดกําหนดโดย IEEE ในแพกเก็จมาตรฐานดังนั้นจึงไมจําเปนตองประกาศใช ในทุกๆรูปแบบที่เขียนขึ้น
                 - BOOLEAN คือกลุมของตรรกะไดแก TURE และ FALSE 
                 - BIT คือกลุมของคา ‘0’ และ ‘1’
                 - INTEGER คือกลุมของจํานวนเต็มมีคา -214748347 ถึง 214748347 
                 - REAL คือกลุมคาจํานวนเต็มมีคา -1.0E38 ถึง 1.05E38 
                 - CHARATER คือกลุมของพยัญชนะอักษร หรือเครื่องหมายพิเศษ และเครื่องหมายควบคุม 
                 - TIME คือกลุมคาของเวลาซึ่งมีคาพื้นฐานเปนวินาที 
                 - SEVERITY LEVEL คือกลุมคาของการแจงเตือนระดับความรุนแรง เชน warning
  • องคประกอบของภาษา VHDL
         1. Entity เปนหนวยการออกแบบที่ใชสําหรับติดตอระหวางอุปกรณภายนอกกับวงจรที่จะเขียนขึ้น รวมทั้งการสงผานคาพารามิเตอรบางอยางระหวางวงจรกับอุปกรณภายนอก โดยมีรูปแบบ ดังนี้
                                          ENTITY entity_name is 
                                                         GENERIC (generic_list); 
                                                         PORT (port_list); 
                                          END entity_name; 
                  - GENRIC ผูออกแบบสามารถกําหนดคาพารามิเตอรท่ีเปนขอมูลอื่นๆเพิ่มเติมไดในสวนนี้ โดยมีรูปแบบการเขียนดังนี้ 
GENERIC (generic_name : type := intial_value);

                     - PORT ผูออกแบบสามารถประเภทของแตละพอรตไดในสวนนี้โดยมีรูปแบบการเขียนดังนี้

PORT (port_name : port_type); 
                     
                       ประเภทของพอรต(port_type)ที่สามารถประกาศใชใน Entity มี 4 ประเภทดังนี้
                       In (input)       เปนพอรตทิศทางเดียว ที่นําคาจากอุปกรณภายนอกเขามาใชภายในวงจร                                                ได แตไมสามารถถูกเขียนจากภายในวงจรได 
                       Out (output)  เปนพอรตทิศทางเดียว ที่นําคาสัญญาณจากวงจรสงไปยังอุปกรณภายนอก                                              แตไมสามารถถูกอานจากภายในวงจรได 
                      Inout               เปนพอรตสองทิศทาง ที่สามารถถูกเขียนและอานไดภายในวงจร Buffer                                                   เปนพอรตเอาตพุตประเภทหนึ่ง ที่สามารถอาคากลับเขามาภายในวงจรได                                                 (Feedback)

         2. Architecture เปนหนวยออกแบบที่ใชสําหรับเขียนบรรยายพฤติกรรมการทํางานของวงจรที่ตองการ ออกแบบ ซึ่งจะสัมพันธกับสวนของEntity โดยมีรูปแบบการเขียนดังนี้
                                           ARCHITECTURE arch_name of entity_name is 
                                                           Signal_declalarations 
                                                           Constant_declalarations 
                                          BEGIN 
                                                          - The program; 
                                          END arch_name; 

  • คําสั่งตางๆ ภายในภาษา VHDL
             ตัวดําเนินการในภาษา VHDL ภาษา VHDL จะมีชุดของ 0perator ที่ใชสําหรับการเปรียบเทียบการกระทําการทางคณิตศาสตรหรือ ตรรกะโดยชุดของ Operator ทั้งหมดของภาษา VHDL มีดังตอไปนี้ 

                                                 NOT                    Inversion 
                                                 AND                    And function 
                                                NAND                 Not-and function 
                                                OR                       Or function 
                                                NOR                    Not-or function 
                                                XOR                    Exclusive-or function (bit wise inequality) 
                                                XNOR                 Exclusive-nor function (bit wise equality)(VHDL’93) 
                                                =                          Equality 
                                                /=                         Inequality 
                                                >=                        Greater-than or equality 
                                                >                          Greater-than 
                                                <=                        Less-than or equality 
                                                <                          Less-than 
                                               SLL                      Shift-left logical (VHDL’93) 
                                               SRL                      Shift-right logical (VHDL’93) 
                                               SLA                      Shift-left arithmetic (VHDL’93) 
                                               SRA                     Shift- right arithmetic (VHDL’93) 
                                               ROL                     Rotate left (VHDL’93) 
                                               ROR                     Rotate right (VHDL’93) 
                                               +                           Addition 
                                               -                            Minus sign 
                                              *                            Multiplication 
                                              /                             Division 
                                              MOD                     Modulo arithmetic 
                                              REM                     Remainder after division 
                                              **                          Exponentiation 
                                              ABS                      Absolute value 
                                              &                          Concatenation
  • การทํางานของ operator
               สามารถแบง Operator เปนกลุม โดยมีลําดับการทํางานของ operator จากสูงไปต่ำไดดังนี้ 

                                     กลุมพิเศษ ** ,ABS ,NOT 
                                     กลุมการคูณ * ,/ ,MOD ,REM 
                                     กลุมการบวก + ,- ,& 
                                     กลุมการเลื่อนบิต SLL ,SRL ,SLA ,SRA ,ROL ,ROR 
                                     กลุมความสัมพันธ = ,/= ,>= ,> ,<= ,< 
                                     กลุมตรรกะ AND ,OR ,NAND ,NOR ,XOR ,XNOR
          
        การทํางานของ operator จะเริ่มทํางานที่ operator ที่มีลําดับการทํางานสูงสุดไปต่ำสุด สําหรับ operator ที่มีลําดับการทํางานระดับเดียวกันจะทํางานจากซายไปขวา เชน 1-2+3*4 จะหมายถึง 1-2+(3*4) = 1-2+12 = (1- 2)+12 = -1+12 = 11 

  • การกําหนดคาตางๆ
               การเขียน comment จะใชเครื่องหมาย -- แลวตามดวยขอความ 
           การกําหนดคาสัญญาณจะใชเครื่องหมาย <= โดยจะใหสัญญาณที่ตองการใหรับคาอยูดานขวาของเครื่องหมายและสัญญาณที่ตองการใหสงคา(อาจจะอยูในรูปของสมการหรือการดําเนินการตางๆ)อยูดานซายของ เครื่องหมาย เชน q <= a or b ; หมายความวาจะสงคาที่ไดจาก a or b ไปยัง q และเมื่อมีกําหนดคาใหกับสัญญาณ (signal assignment) สัญญาณจะมีการเปลี่ยนแปลงคาโดยใชเวลาอยางนอย 1 delta time เสมอ 
             การกําหนดคาตัวแปรจะใชเครื่องหมาย := โดยการกําหนดตัวแปรสามารถใชไดเฉพาะภายใน คําสั่ง process เทานั้น และจะใหตัวแปรที่ตองการใหรับคาอยูดานขวาของเครื่องหมายและตัวแปรที่ตองการใหสง คา(อาจจะอยูในรูปของสมการหรือการดําเนินการตางๆ)อยูดานซายของเครื่องหมาย เชน y := m*x + c ; หมายความวา จะสงคาที่ไดจากสมการ (m คูณ x) บวก c ไปยังตัวแปร y และเมื่อมีกําหนดคาใหกับตัวแปร (variable assignment) ตัวแปรจะมีการเปลี่ยนแปลงคาทันที 






กฎการใชคําสั่ง case 
       • ตัวเลือก (choice) จะตองเปนแบบระบุตัวเลือกที่เปนคาแนนอน 
       • ถามีมากวา 1 ตัวเลือกจะใชเครื่องหมาย | ซึ่งมีความหมายวา or 
       • ถาตองการระบุเปนชวงขอมูล สามารถใชคําสั่ง TO ได 
       • “WHEN OTHERS” จะใชเปนตัวเลือกครอบคลุมที่เหลือทั้งหมด ขอควรระวังการใชคําสั่ง case 
       • เงื่อนไขตองไมขัดแยงกัน 
       • ตองกําหนดตัวเลือกครบทุกกรณี



  • คําสงวนในภาษา VHDL 
            การตั้งชื่อตางๆในภาษา VHDL ตามมาตรฐาน IEEE มีขอจํากัดในการใชคําสงวน (reserved word) ที่ไม สามารถนําไปเปนชื่อตางๆไดในทุกลักษณะของตัวหนังสือคําเหลานี้ไดแก




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

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