320 likes | 447 Views
Digital System Engineering. บทที่ 4. Hardware Description Language. 4.1 Introduction. การออกแบบวงจร Combinational หรือ Sequential โดยการเขียน Truth Table และลดรูป สมการบูลีน หรือใช้ Karnaugh Map เป็นวิธีการที่เสียเวลาและเกิดความผิดพลาดได้ง่าย
E N D
Digital System Engineering บทที่ 4. Hardware Description Language
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 ภาษาเพื่อใช้เปรียบเทียบกัน
4.1.1 Modules • Module หมายถึงบล็อกของ Hardware ที่มี Input และ Output • ตัวอย่างเช่น AND gate, Multiplexer และวงจรดิจิตอลของบทก่อนหน้านี้เป็นต้น • เราสามารถเขียนฟังก์ชันของ Module ได้ 2 วิธีคือ • Behavioral Model เป็นการอธิบายว่า Module ทำงานอย่างไร • Structural Model เป็นการอธิบายว่าจะสร้าง Module อย่างไร
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
4.1.1 Modules • โปรแกรม VHDL ประกอบด้วย 3 ส่วน • Library Clause ส่วนนี้จะอธิบายในหัวข้อที่ 4.2.11 • Entity Declaration แสดงชื่อของ Module รายชื่อของ Input และ Output • Architecture Body กำหนดการทำงานของ Module • เราจะต้องกำหนดชนิดของสัญญาณ input และ output เป็น STD_LOGIC
4.1.1 Modules • ตัวแปรชนิด STD_LOGIC สามารถ มีค่าเป็น 0 หรือ 1 • และสามารถมีค่าเป็น Float หรือ Undefined Value ซึ่งจะพูดถึงใน หัวข้อที่ 4.2.8 • ชนิดตัวแปรแบบ STD_LOGIC ถูก กำหนดไว้ใน Library IEEE.STD_LOGIC_1164 ทำให้เราต้องประกาศใช้ Library นี้ใน Library Clause
4.1.1 Modules • ภาษา VHDL ไม่มีการกำหนดลำดับการ ทำงานของ Operator ต่างๆ เช่น AND, NOT หรือ OR • ทำให้โปรแกรมไม่สามารถทราบว่าควรจะ ทำงานของ Operator ใดก่อนหรือหลัง • ดังนั้นการเขียนสมการบูลีนในภาษา VHDL จะต้องมีการใส่เครื่องหมาย วงเล็บทุกครั้ง ดังแสดงในโปรแกรมตัวอย่าง
4.1.1 Modules • Module ของVerilogและ VHDL เป็นตัวอย่างที่ดีของหลักการ Modularity • Module ประกอบด้วย Input และ Output และทำงานตามฟังก์ชันที่กำหนดไว้ • ตราบใดที่ Module ยังคงทำงานถูกต้อง ก็ไม่จำเป็นต้องรู้ว่าโปรแกรมของ Module ถูกเขียนอย่างไร • เราสามารถเขียนโปรแกรมภาษา Verilogและ VHDL เพื่อสร้าง Hardware ใดก็ได้ ดังนั้นการเลือกใช้ภาษาใด ขึ้นกับความต้องการของลูกค้า หรือขึ้นว่าโปรแกรมเดิมถูกเขียนด้วยภาษาใด
4.1.3 Simulation และ Synthesis • Simulation คือการป้อน Input ให้กับ Module และตรวจสอบ Output ของ Module เพื่อตรวจสอบความผิดพลาด • จากรูปแสดงการทำ Simulation ของsillyfunction • จะเห็นว่า y มีค่า Output เป็น True เมื่อ a, b, และ c มีค่าเป็น 000, 100 หรือ 101 ซึ่งทำงานถูกต้องตามที่ได้กำหนดไว้ในสมการบูลีน
4.1.3 Simulation และ Synthesis • Synthesis คือการเปลี่ยน HDL เป็น Netlist หรือการสร้างโลจิกเกทและสายไฟที่ใช้เชื่อมต่อ โลจิกเกทแต่ละตัว • การ Synthesizer อาจจะมีขั้นตอนการทำ Optimize หรือการลดขนาดของวงจรให้เล็กที่สุดเท่าที่จะทำได้ • Netlistอาจอยู่ในรูปของ Text หรือ Schematic เพื่อให้ดูง่ายขึ้น • คำสั่งส่วนใหญ่ใน Verilogและ VHDL สามารถแปลงเป็น Hardware ได้ แต่ก็มีบางคำสั่งที่ไม่สามารถแปลงเป็น Hardware เช่นกัน
4.1.3 Simulation และ Synthesis • โปรแกรม HDL สามารถแบ่งออกเป็น 2 กลุ่มคือ • Synthesizable Module คือส่วนที่ใช้กำหนด Hardware ของ Module • Testbenchคือส่วนที่เพิ่มเข้าไปเพื่อใช้ตรวจสอบการทำงานของ Module Testbenchถูกใช้ในการทำ Simulation เท่านั้น แต่จะไม่ถูก Synthesize ออกมาเป็นวงจรได้
4.1.3 Simulation และ Synthesis • ข้อผิดพลาดส่วนใหญ่ของผู้เริ่มต้นเขียน HDL ใหม่ๆคือมักจะคิดว่าการเขียน HDL เหมือนกับการเขียนโปรแกรมคอมพิวเตอร์ • แต่ที่จริงแล้วการเขียน HDL เปรียบเสมือนกับการออกแบบวงจรดิจิตอล • ดังนั้นถ้าผู้เขียน HDL ไม่เข้าใจการทำงานของวงจรดิจิตอลที่ออกแบบ จะทำให้ Module ที่เขียนออกมา • มีการทำงานที่ผิดพลาด • ทำให้ต้องใช้ Hardware มากเกินจำเป็น • ได้ Module ที่สามารถ Simulate ได้แต่ไม่สามารถ Synthesize ได้ • ก่อนเขียน HDL ควรเขียนบล็อกของวงจร Combination, Register และ Finite State Machine และเขียนว่าแต่ละบล็อกเชื่อมต่อกันอย่างไร ในกระดาษเสียก่อน
4.1.3 Simulation และ Synthesis • วิธีที่ดีที่สุดในการเรียน HDL คือการเรียนจากตัวอย่าง • วิธีที่ใช้ในการเขียนวงจรโลจิกต่างๆเรียกว่า Idiom • ในบทนี้จะเริ่มจากการศึกษาการเขียน Idiom ของแต่ละบล็อกที่ถูกต้อง • จากนั้นจึงศึกษาว่าจะนำเอาแต่ละบล็อกมาเชื่อมต่อกันอย่างไร
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]
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
4.2 Combinational Logic :4.2.1 Bitwise Operators • เราสามารถเลือก Endianเป็นแบบใดก็ได้ แต่ถ้าเลือกใช้แบบใดแล้วก็ต้องใช้แบบนั้นไปตลอด
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
4.2 Combinational Logic :4.2.1 Bitwise Operators • assign out = in1 op in2; เรียกว่า Continuous Assignment Statement • ทุกครั้งที่ input ด้านขวามือของเครื่องหมาย = เปลี่ยน ค่าของ Output ด้านขวามือจะเปลี่ยนด้วย • ดังนั้น Continuous Assignment Statement เป็นตัวกำหนการทำงานของวงจร Combination
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
4.2 Combinational Logic :4.2.1 Bitwise Operators • ทุกครั้งที่ตัวแปรด้านขวามือของเครื่องหมาย <= เปลี่ยนค่า ตัวแปรด้านซ้ายมือจะเปลี่ยนด้วย • ดังนั้นเราสามารถเขียนวงจร Combination ในรูปของ Concurrent SignalAssignment
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 ถ้าจำนวนเป็นเลขคี่
4.2 Combinational Logic :4.2.3 Reduction Operators • ภาษา VHDL ไม่มี Reduction Operator ดังนั้นจึงต้องเขียน Concurrent Signal Assignment แบบตรงๆ
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
4.2 Combinational Logic :4.2.4 Conditional Assignment • Conditional Assignment คือการเลือกๆสัญญาณ Input ที่จะออกไปยัง Output • ? : เป็น Operator ชนิด Ternary • Operator เนื่องจากมันมี 3 Input
4.2.5 Internal Variables • ในกรณีที่วงจร Combination มีความซับซ้อนมาก เรานิยมแบ่งการทำงานของวงจรออกเป็นหลายๆขั้นตอน หรือแบ่งสมการบูลีนออกเป็นหลายๆสมการ โดยใช้ตัวแปรภายใน (Internal Variable) ในการเก็บผลลัพธ์การทำงานในแต่ละขั้น • ตัวอย่างวงจร Full Adder S=A xor B xorCin Cout = AB + ACin + BCin • เราสามารถเขียนใหม่เป็น P=A xorB, G = AB S=P xorCin,Cout=G+PCin
4.2.5 Internal Variables • เราเรียก P และ G ว่าตัวแปรภายใน • เราสามารถตั้งตัวแปรภายในของ Verilog โดยใช้คำสั่ง wire
4.2.5 Internal Variables • เราใช้คำสั่ง signal ในการตั้งตัวแปร ภายในของ VHDL
4.2.5 Internal Variables • ข้อสังเกต ในการเขียนโปรแกรมทั่วไปเช่นภาษา C++ หรือ Java เราจะต้องเขียน P=A xor B ก่อน จากนั้นจึงเขียน S=P xorCin • แต่ลำดับการเขียนคำสั่งใน HDL ไม่มีความสำคัญ เนื่องจากคำสั่งในแต่ละ Assignment จะถูกคำนวณใหม่ทุกครั้งที่ตัวแปรทางด้านขวามือมีการเปลี่ยนแปลงค่า