1 / 40

Digital System Engineering

Digital System Engineering. บทที่ 4. Hardware Description Language. 4.1 Introduction. การออกแบบวงจร Combinational หรือ Sequential โดยการเขียน Truth Table และลดรูป สมการบูลีน หรือใช้ Karnaugh Map เป็นวิธีการที่เสียเวลาและเกิดความผิดพลาดได้ง่าย

tuwa
Télécharger la présentation

Digital System Engineering

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Digital System Engineering บทที่ 4. Hardware Description Language

  2. 4.1 Introduction • การออกแบบวงจร Combinational หรือ Sequential โดยการเขียน Truth Table และลดรูปสมการบูลีน หรือใช้ Karnaugh Map เป็นวิธีการที่เสียเวลาและเกิดความผิดพลาดได้ง่าย • ต่อมาได้มีการพัฒนาโปรแกรมประเภท Computer-Aid Design (CAD) เพื่อช่วยให้การออกแบบวงจรมีประสิทธิภาพมากยิ่งขึ้น • โดยการเขียนฟังก์ชันการทำงานของวงจรโดยใช้ Hardware Description Language (HDL) จากนั้นจึงส่งให้ CAD ทำการออกแบบวงจรที่เหมาะสมที่สุดให้ • ภาษา HDL ที่นิยมใช้กันมากมี 2 ภาษาคือ Verilogและ VHDL • Verilogและ VHDL ถูกออกแบบมาจากหลักการเดียวกันแต่มีโครงสร้างภาษาที่แตกต่างกัน ในบทนี้จะแสดงโปรแกรมของทั้ง 2 ภาษาเพื่อใช้เปรียบเทียบกัน

  3. 4.1.1 Modules • Module หมายถึงบล็อกของ Hardware ที่มี Input และ Output • ตัวอย่างเช่น AND gate, Multiplexer และวงจรดิจิตอลของบทก่อนหน้านี้เป็นต้น • เราสามารถเขียนฟังก์ชันของ Module ได้ 2 วิธีคือ • Behavioral Model เป็นการอธิบายว่า Module ทำงานอย่างไร • Structural Model เป็นการอธิบายว่าจะสร้าง Module อย่างไร

  4. 4.1.1 Modules • ตัวอย่างที่ 4.1 แสดง Behavioral Description ของ y=/a/b/c + a/b/c + a/bc • Verilog Module เริ่มจาก • ชื่อ Module • รายชื่อ input และ output • จากนั้นจึงเป็น assign ของสมการบูลีน ของ Output • เครื่องหมาย ~ คือ NOT, & คือ AND และ | คือ OR • สัญญาณ Input และ Output เป็นตัวแปรแบบบูลีนคือมีค่า 0 หรือ 1 แต่เราสามารถกำหนดให้มีค่าเป็น Float หรือ Undefined Value ได้ซึ่งจะพูดถึงในหัวข้อที่ 4.2.8

  5. 4.1.1 Modules • โปรแกรม VHDL ประกอบด้วย 3 ส่วน • Library Clause ส่วนนี้จะอธิบายในหัวข้อที่ 4.2.11 • Entity Declaration แสดงชื่อของ Module รายชื่อของ Input และ Output • Architecture Body กำหนดการทำงานของ Module • เราจะต้องกำหนดชนิดของสัญญาณ input และ output เป็น STD_LOGIC

  6. 4.1.1 Modules • ตัวแปรชนิด STD_LOGIC สามารถ มีค่าเป็น 0 หรือ 1 • และสามารถมีค่าเป็น Float หรือ Undefined Value ซึ่งจะพูดถึงใน หัวข้อที่ 4.2.8 • ชนิดตัวแปรแบบ STD_LOGIC ถูก กำหนดไว้ใน Library IEEE.STD_LOGIC_1164 ทำให้เราต้องประกาศใช้ Library นี้ใน Library Clause

  7. 4.1.1 Modules • ภาษา VHDL ไม่มีการกำหนดลำดับการ ทำงานของ Operator ต่างๆ เช่น AND, NOT หรือ OR • ทำให้โปรแกรมไม่สามารถทราบว่าควรจะ ทำงานของ Operator ใดก่อนหรือหลัง • ดังนั้นการเขียนสมการบูลีนในภาษา VHDL จะต้องมีการใส่เครื่องหมาย วงเล็บทุกครั้ง ดังแสดงในโปรแกรมตัวอย่าง

  8. 4.1.1 Modules • Module ของVerilogและ VHDL เป็นตัวอย่างที่ดีของหลักการ Modularity • Module ประกอบด้วย Input และ Output และทำงานตามฟังก์ชันที่กำหนดไว้ • ตราบใดที่ Module ยังคงทำงานถูกต้อง ก็ไม่จำเป็นต้องรู้ว่าโปรแกรมของ Module ถูกเขียนอย่างไร • เราสามารถเขียนโปรแกรมภาษา Verilogและ VHDL เพื่อสร้าง Hardware ใดก็ได้ ดังนั้นการเลือกใช้ภาษาใด ขึ้นกับความต้องการของลูกค้า หรือขึ้นว่าโปรแกรมเดิมถูกเขียนด้วยภาษาใด

  9. 4.1.3 Simulation และ Synthesis • Simulation คือการป้อน Input ให้กับ Module และตรวจสอบ Output ของ Module เพื่อตรวจสอบความผิดพลาด • จากรูปแสดงการทำ Simulation ของsillyfunction • จะเห็นว่า y มีค่า Output เป็น True เมื่อ a, b, และ c มีค่าเป็น 000, 100 หรือ 101 ซึ่งทำงานถูกต้องตามที่ได้กำหนดไว้ในสมการบูลีน

  10. 4.1.3 Simulation และ Synthesis • Synthesis คือการเปลี่ยน HDL เป็น Netlist หรือการสร้างโลจิกเกทและสายไฟที่ใช้เชื่อมต่อ โลจิกเกทแต่ละตัว • การ Synthesizer อาจจะมีขั้นตอนการทำ Optimize หรือการลดขนาดของวงจรให้เล็กที่สุดเท่าที่จะทำได้ • Netlistอาจอยู่ในรูปของ Text หรือ Schematic เพื่อให้ดูง่ายขึ้น • คำสั่งส่วนใหญ่ใน Verilogและ VHDL สามารถแปลงเป็น Hardware ได้ แต่ก็มีบางคำสั่งที่ไม่สามารถแปลงเป็น Hardware เช่นกัน

  11. 4.1.3 Simulation และ Synthesis • โปรแกรม HDL สามารถแบ่งออกเป็น 2 กลุ่มคือ • Synthesizable Module คือส่วนที่ใช้กำหนด Hardware ของ Module • Testbenchคือส่วนที่เพิ่มเข้าไปเพื่อใช้ตรวจสอบการทำงานของ Module Testbenchถูกใช้ในการทำ Simulation เท่านั้น แต่จะไม่ถูก Synthesize ออกมาเป็นวงจรได้

  12. 4.1.3 Simulation และ Synthesis • ข้อผิดพลาดส่วนใหญ่ของผู้เริ่มต้นเขียน HDL ใหม่ๆคือมักจะคิดว่าการเขียน HDL เหมือนกับการเขียนโปรแกรมคอมพิวเตอร์ • แต่ที่จริงแล้วการเขียน HDL เปรียบเสมือนกับการออกแบบวงจรดิจิตอล • ดังนั้นถ้าผู้เขียน HDL ไม่เข้าใจการทำงานของวงจรดิจิตอลที่ออกแบบ จะทำให้ Module ที่เขียนออกมา • มีการทำงานที่ผิดพลาด • ทำให้ต้องใช้ Hardware มากเกินจำเป็น • ได้ Module ที่สามารถ Simulate ได้แต่ไม่สามารถ Synthesize ได้ • ก่อนเขียน HDL ควรเขียนบล็อกของวงจร Combination, Register และ Finite State Machine และเขียนว่าแต่ละบล็อกเชื่อมต่อกันอย่างไร ในกระดาษเสียก่อน

  13. 4.1.3 Simulation และ Synthesis • วิธีที่ดีที่สุดในการเรียน HDL คือการเรียนจากตัวอย่าง • วิธีที่ใช้ในการเขียนวงจรโลจิกต่างๆเรียกว่า Idiom • ในบทนี้จะเริ่มจากการศึกษาการเขียน Idiom ของแต่ละบล็อกที่ถูกต้อง • จากนั้นจึงศึกษาว่าจะนำเอาแต่ละบล็อกมาเชื่อมต่อกันอย่างไร

  14. 4.2 Combinational Logic :4.2.1 Bitwise Operators • Bitwise Operator เป็นการออกแบบวงจรที่ Input 1 bit หรือหลายบิทโดยที่แต่ละบิทจะทำงานแยกจากกัน • ตัวอย่างที่ 4.2 วงจร Inverter สำหรับ Bus ขนาด 4 บิท • a[3:0] หมายถึงบัสขนาด 4 บิท โดยเรียง จากบิทที่สำคัญมากที่สุด (Most Significant Bit) ไปยังบิทที่มีความสำคัญน้อยที่สุ่ด(Least Significant Bit) คือ a[3], a[2], a[1] และ a[0] ตามลำดับ • เราเรียกการเรียงลักษณะนี้ว่า Little Endian • แต่ถ้าเรียง a[0], a[1], a[2], และ a[3] จะเรียกว่า Big Endianและเขียนเป็น a[0:3]

  15. 4.2 Combinational Logic :4.2.1 Bitwise Operators • สัญญาณบัสของ VHDL เป็นตัวแปร ชนิด STD_LOGIC_VECTOR • STD_LOGIC_VECTOR (3 downto 0) หมายถึงบัสขนาด 4 บิทแบบ Little Endian • แต่ถ้าเขียนเป็น (0 to 3) หมายถึง Big endian

  16. 4.2 Combinational Logic :4.2.1 Bitwise Operators • เราสามารถเลือก Endianเป็นแบบใดก็ได้ แต่ถ้าเลือกใช้แบบใดแล้วก็ต้องใช้แบบนั้นไปตลอด

  17. 4.2 Combinational Logic :4.2.1 Bitwise Operators • ตัวอย่างที่ 4.3 วงจรตัวอย่างการใช้ Gate • ~, ^ และ | เป็นตัวอย่าง Operator ของ Verilogโดยที่ a, b, และ y1 เรียกว่า Operand • การผสมกันระหว่าง Operator และ Operand เช่น ~(a|b) เรียกว่า expression • คำสั่งในแต่ละบรรทัดเช่น assign y4 = ~(a|b) เรียกว่า Statement

  18. 4.2 Combinational Logic :4.2.1 Bitwise Operators • assign out = in1 op in2; เรียกว่า Continuous Assignment Statement • ทุกครั้งที่ input ด้านขวามือของเครื่องหมาย = เปลี่ยน ค่าของ Output ด้านขวามือจะเปลี่ยนด้วย • ดังนั้น Continuous Assignment Statement เป็นตัวกำหนการทำงานของวงจร Combination

  19. 4.2 Combinational Logic :4.2.1 Bitwise Operators • Operator ของ VHDL คือ not, xorและ or • การผสมกันระหว่าง Operator และ Operand เช่น a and b เรียกว่า expression • คำสั่งในแต่ละบรรทัดเช่น y4 <= a nand b เรียกว่า Statement • Out <= in1 op in2; เรียกว่า Concurrent Signal Assignment

  20. 4.2 Combinational Logic :4.2.1 Bitwise Operators • ทุกครั้งที่ตัวแปรด้านขวามือของเครื่องหมาย <= เปลี่ยนค่า ตัวแปรด้านซ้ายมือจะเปลี่ยนด้วย • ดังนั้นเราสามารถเขียนวงจร Combination ในรูปของ Concurrent SignalAssignment

  21. 4.2 Combinational Logic :4.2.3 Reduction Operators • Reduction Operator หมายถึงการใช้เกทแบบหลาย Input เพื่อประมวลผลข้อมูลในบัส • ตัวอย่างที่ 4.4 แสดงตัวอย่างการใช้ and เกท 8 input • เราสามารถใช้วิธีเดียวกันในการเขียน ในการเขียน OR (|) , XOR (^), NAND (~&) และ NOR (~|) • XOR จะให้ค่า TRUE ถ้าจำนวน Input ที่เป็นโลจิก 1 เป็นเลขคู่ และเป็น FALSE ถ้าจำนวนเป็นเลขคี่

  22. 4.2 Combinational Logic :4.2.3 Reduction Operators • ภาษา VHDL ไม่มี Reduction Operator ดังนั้นจึงต้องเขียน Concurrent Signal Assignment แบบตรงๆ

  23. 4.2 Combinational Logic :4.2.4 Conditional Assignment • Conditional Assignment คือการเลือกๆสัญญาณ Input ที่จะออกไปยัง Output • ตัวอย่างที่ 4.5 แสดงการสร้าง Multiplexer 2:1 โดยใช้ Conditional Assignment • Conditional Operator (? : ) จะเลือกสัญญาณ d1 หรือ d0 ขึ้นกับค่าของ s • s=1 ทำให้ y=d1 • s=0 ทำให้ y=d0 • ? : นิยมใช้ในการสร้าง Multiplexer เพื่อใช้เลือกสัญญาณ Input ที่จะออกไปที่ Output

  24. 4.2 Combinational Logic :4.2.4 Conditional Assignment • Conditional Assignment คือการเลือกๆสัญญาณ Input ที่จะออกไปยัง Output • ? : เป็น Operator ชนิด Ternary • Operator เนื่องจากมันมี 3 Input

  25. 4.2 Combinational Logic :4.2.4 Conditional Assignment

  26. 4.2 Combinational Logic :4.2.4 Conditional Assignment

  27. 4.2 Combinational Logic :4.2.4 Conditional Assignment

  28. 4.2 Combinational Logic :4.2.4 Conditional Assignment

  29. 4.2.5 Internal Variables • ในกรณีที่วงจร Combination มีความซับซ้อนมาก เรานิยมแบ่งการทำงานของวงจรออกเป็นหลายๆขั้นตอน หรือแบ่งสมการบูลีนออกเป็นหลายๆสมการ โดยใช้ตัวแปรภายใน (Internal Variable) ในการเก็บผลลัพธ์การทำงานในแต่ละขั้น • ตัวอย่างวงจร Full Adder S=A xor B xorCin Cout = AB + ACin + BCin • เราสามารถเขียนใหม่เป็น P=A xor B, G = AB S=P xorCin, Cout=G+PCin

  30. 4.2.5 Internal Variables • เราเรียก P และ G ว่าตัวแปรภายใน • เราสามารถตั้งตัวแปรภายในของ Verilog โดยใช้คำสั่ง wire

  31. 4.2.5 Internal Variables • เราใช้คำสั่ง signal ในการตั้งตัวแปร ภายในของ VHDL

  32. 4.2.5 Internal Variables • ข้อสังเกต ในการเขียนโปรแกรมทั่วไปเช่นภาษา C++ หรือ Java เราจะต้องเขียน P=A xor B ก่อน จากนั้นจึงเขียน S=P xorCin • แต่ลำดับการเขียนคำสั่งใน HDL ไม่มีความสำคัญ เนื่องจากคำสั่งในแต่ละ Assignment จะถูกคำนวณใหม่ทุกครั้งที่ตัวแปรทางด้านขวามือมีการเปลี่ยนแปลงค่า

  33. 4.2.6 Precedence • ลำดับการทำงานของ Operator ในภาษา Verilogและ VHDL จะเรียงไม่เหมือนกันดังแสดงในตาราง (Operator ด้านบนจะทำงานก่อนด้านล่าง) • จากตารางของ Verilogจะเห็นว่าลำดับ การทำงานของ AND มาก่อน OR ดังนั้นเราสามารถที่จะเขียนสมการบูลีน assign cout = g | p&cin; • ซึ่งจะจะทำงานเหมือนกับ assign cout = g | (p&cin);

  34. 4.2.6 Precedence • แต่คำสั่ง AND และ OR ใน VHDL อยู่ในลำดับการทำงานเดียวกัน ดังนั้นเราจำเป็นจะต้องใส่เครื่องหมายวงเล็บเข้าไปในสมการเพื่อป้องกันไม่ให้ทำงานผิดพลาดได้ • cout <= g or (p and cin); • แต่ถ้าไม่ใส่เครื่องหมายวงเล็บดังเช่น cout <= g or p and cin; • คำสั่งจะทำงานจากซ้ายไปขวามือ หรือ เทียบเท่ากับสมการ • cout<= (g or p) and cin;

  35. 4.2.7 Numbers • รูปแบบการเขียนเลขใน Verilogคือ N’bvalue โดยที่ N คือจำนวนบิท b คือเลขฐาน Value คือค่าของตัวเลข • ตัวอย่างเช่น 9’h25 หมายถึงเลขฐาน 16 ขนาด 9 บิท มีค่าเท่ากับ 2516=3710=0001001012

  36. 4.2.7 Numbers • ถ้าไม่ใส่ขนาดให้ตัวเลข Verilogจะ กำหนดขนาดของตัวเลขให้ใหญ่เท่ากับ ขนาดที่ถูกใช้ในสมการ • และ 0 จะถูกใส่เข้าไปข้างหน้าของตัวเลข ให้เองโดยอัตโนมัติ • ตัวอย่างเช่นถ้าให้ w เป็นบัสขนาด 6 บิท • ดังนั้นคำสั่ง w=‘b11 • w จะมีค่าเท่ากับ 0000112

  37. 4.2.7 Numbers • ในภาษา VHDL ตัวเลขของตัวแปร ชนิด STD_LOGIC จะเขียนเป็น เลขฐาน 2 ขนาด 1 บิท และปิดด้วย เครื่องหมาย ‘x’ • เช่น ‘0’ และ ‘1’ หมายถึงโลจิก 0 หรือ 1 • ตัวเลขของตัวแปรชนิด STD_LOGIC_VECTOR จะถูกเขียนเป็นเลขฐาน 2 หรือเลขฐาน 16 และปิดด้วยเครื่องหมาย “xxx”

  38. 4.2.8 Z’s และ X’s • Z ใช้แสดงสถานะลอย (Float) • .=h • ตัวอย่างที่ 4.10 แสดงตัวอย่างของ Tristate Buffer • ถ้า Buffer ถูก Enable จะทำให้ Output มีโลจิกตรงกับ Input • แต่ถ้าถูก Disable จะทำให้ Output ลอย

  39. 4.2.8 Z’s และ X’s • ใน HDL จะใช้X แทน

  40. 4.2.9 Bit Swizzling • Bit Swizzlingเป็นการนำเอาสัญญาณหลายๆสัญญาณมารวมกันเพื่อเป็นสัญญาณบัส หรือเป็นการแยกเอาสัญญาณบางสัญญาณของบัสไปใช้งาน

More Related