Digital System Engineering บทที่ 4
Download
Report
Transcript Digital System Engineering บทที่ 4
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 วิธีคือ
1. Behavioral Model เป็ นการอธิบายว่า Module ทางานอย่างไร
2. Structural Model เป็ นการอธิบายว่าจะสร้าง Module อย่างไร
4.1.1 Modules
• ตัวอย่างที่ 4.1 แสดง Behavioral Description ของ
y=/a/b/c + a/b/c + a/bc
• Verilog Module เริ่ มจาก
Verilog
module sillyfunction (input a, b, c, output y);
assign y = ~a & ~b & ~c |
a & ~b & ~c |
a & ~b & c;
endmodule
• ชื่อ Module
• รายชื่อ input และ output
• จากนั้นจึงเป็ น assign ของสมการบูลีน
ของ Output
• เครื่ องหมาย ~ คือ NOT, & คือ AND และ | คือ OR
• สัญญาณ Input และ Output เป็ นตัวแปรแบบบูลีนคือมีค่า 0 หรื อ 1 แต่เรา
สามารถกาหนดให้มีค่าเป็ น Float หรื อ Undefined Value ได้ซ่ ึ งจะพูด
ถึงในหัวข้อที่ 4.2.8
4.1.1 Modules
• โปรแกรม VHDL ประกอบด้วย 3 ส่ วน
1. Library Clause
ส่ วนนี้จะอธิบายในหัวข้อที่ 4.2.11
2. Entity Declaration
แสดงชื่อของ Module รายชื่อของ
Input และ Output
3. Architecture Body
กาหนดการทางานของ Module
VHDL
library IEEE; use IEEE.STD _LO G IC _1164.all;
entity sillyfunction is
port (a, b, c: in STD _LO G IC ;
y: out STD _LO G IC );
end;
architecture synth of sillyfunction is
begin
y <= ((not a) and (not b) and (not c)) or
(a and (not b) and (not c)) or
(a and (not b) and c);
end;
• เราจะต้องกาหนดชนิ ดของสัญญาณ input และ output เป็ น
STD_LOGIC
4.1.1 Modules
• ตัวแปรชนิด STD_LOGIC สามารถ VHDL
library IEEE; use IEEE.STD _LO G IC _1164.all;
entity sillyfunction is
มีค่าเป็ น 0 หรื อ 1
port (a, b, c: in STD _LO G IC ;
• และสามารถมีค่าเป็ น Float หรื อ
y: out STD _LO G IC );
Undefined Value ซึ่ งจะพูดถึงใน end;
architecture synth of sillyfunction is
begin
หัวข้อที่ 4.2.8
y <= ((not a) and (not b) and (not c)) or
• ชนิดตัวแปรแบบ STD_LOGIC ถูก
(a and (not b) and (not c)) or
(a and (not b) and c);
กาหนดไว้ใน Library
end;
IEEE.STD_LOGIC_1164
ทาให้เราต้องประกาศใช้ Library นี้ใน Library Clause
4.1.1 Modules
• ภาษา VHDL ไม่มีการกาหนดลาดับการ VHDL
library IEEE; use IEEE.STD _LO G IC _1164.all;
entity sillyfunction is
ทางานของ Operator ต่างๆ เช่น
port (a, b, c: in STD _LO G IC ;
AND, NOT หรื อ OR
y: out STD _LO G IC );
• ทาให้โปรแกรมไม่สามารถทราบว่าควรจะ end;
architecture synth of sillyfunction is
ทางานของ Operator ใดก่อนหรื อหลัง begin
y <= ((not a) and (not b) and (not c)) or
• ดังนั้นการเขียนสมการบูลีนในภาษา
(a and (not b) and (not c)) or
(a and (not b) and c);
VHDL จะต้องมีการใส่ เครื่ องหมาย
end;
วงเล็บทุกครั้ง ดังแสดงในโปรแกรมตัวอย่าง
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 กลุ่มคือ
1. Synthesizable Module คือส่ วนที่ใช้กาหนด Hardware ของ
Module
2. 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 หรื อหลาย
บิท โดยที่แต่ละบิทจะทางานแยกจากกัน Verilog
• ตัวอย่างที่ 4.2 วงจร Inverter สาหรับ module inv (input [3:0] a,
output [3:0] y);
assign y = ~a;
Bus ขนาด 4 บิท
endmodule
• 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 เป็ นตัวแปร VHDL
IEEE; use IEEE.STD_LO G IC_1164.all;
ชนิด STD_LOGIC_VECTOR library
entity inv is
• STD_LOGIC_VECTOR
(3 downto 0) หมายถึงบัสขนาด 4
บิทแบบ Little Endian
• แต่ถา้ เขียนเป็ น (0 to 3) หมายถึง
Big endian
port (a: in STD _LO G IC_VECTO R (3 downto
0);
y: out STD _LO G IC_VECTO R (3 downto 0));
end;
architecture synth of inv is
begin
y <= not a;
end;
4.2 Combinational Logic :
4.2.1 Bitwise Operators
• เราสามารถเลือก Endian เป็ นแบบใดก็ได้ แต่ถา้ เลือกใช้แบบใดแล้วก็ตอ้ งใช้
แบบนั้นไปตลอด
4.2 Combinational Logic :
4.2.1 Bitwise Operators
• ตัวอย่างที่ 4.3 วงจรตัวอย่างการใช้ Gate
• ~, ^ และ | เป็ นตัวอย่าง Operator Verilog
module gates (input [3:0] a, b,
output [3:0] y1, y2,y3, y4, y5);
ของ Verilog โดยที่ a, b, และ y1
/* Five different two-input logic
เรี ยกว่า Operand
gates acting on 4 bit busses */
y1 = a & b; // AND
• การผสมกันระหว่าง Operator และ assign
assign y2 = a | b; // OR
assign y3 = a ^ b; // XOR
Operand เช่น ~(a|b) เรี ยกว่า
assign y4 = ~(a & b); // NAND
assign y5 = ~(a | b); // NOR
endmodule
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
VHDL
library IEEE; use IEEE.STD_LOGIC_1164.all;
entity gates is
port (a, b: in STD_LOGIC_VECTOR (3
downto 0);
y1, y2, y3, y4,y5: out
STD_LOGIC_VECTOR (3 downto 0));
end;
architecture synth of gates is
begin
— — Five different two-input logic gates
— —acting on 4 bit busses
y1 <= a and b;
y2 <= a or b;
y3 <= a xor b;
y4 <= a nand b;
y5 <= a nor b;
end;
4.2 Combinational Logic :
4.2.1 Bitwise Operators
• ทุกครั้งที่ตวั แปรด้านขวามือของเครื่ องหมาย <= เปลี่ยนค่า ตัวแปรด้านซ้ายมือ
จะเปลี่ยนด้วย
• ดังนั้นเราสามารถเขียนวงจร Combination ในรู ปของ Concurrent
Signal Assignment
4.2 Combinational Logic :
4.2.3 Reduction Operators
• Reduction Operator หมายถึงการใช้เกทแบบหลาย Input เพื่อ
Verilog
ประมวลผลข้อมูลในบัส
module and8 (input [7:0] a, output y);
• ตัวอย่างที่ 4.4 แสดงตัวอย่างการใช้ and
assign y = &a;
// &a is much easier to write than
เกท 8 input
// assign y = a[7] & a[6] & a[5] & a[4] &
// a[3] & a[2] & a[1] & a[0];
• เราสามารถใช้วธิ ี เดียวกันในการเขียน
endmodule
ในการเขียน OR (|) , XOR (^),
NAND (~&) และ NOR (~|)
• XOR จะให้ค่า TRUE ถ้าจานวน Input ที่เป็ นโลจิก 1 เป็ นเลขคู่ และเป็ น
FALSE ถ้าจานวนเป็ นเลขคี่
4.2 Combinational Logic :
4.2.3 Reduction Operators
• ภาษา VHDL ไม่มี Reduction
Operator ดังนั้นจึงต้องเขียน
Concurrent Signal
Assignment แบบตรงๆ
VHDL
library IEEE; use IEEE.STD_LOGIC_1164.all;
entity and8 is
port (a: in STD_LOGIC_VECTOR (7 downto 0);
y: out STD_LOGIC);
end;
architecture synth of and8 is
begin
y <= a(7) and a(6) and a(5) and a(4) and
a(3) and a(2) and a(1) and a(0);
end;
4.2 Combinational Logic :
4.2.4 Conditional Assignment
• Conditional Assignment คือการเลือกๆสัญญาณ Input ที่จะออกไป
Verilog
ยัง Output
module mux2 (input [3:0] d0, d1, input s,
• ตัวอย่างที่ 4.5 แสดงการสร้าง
output [3:0] y);
assign y = s ? d1 : d0;
Multiplexer 2:1 โดยใช้
endmodule
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 ที่จะออกไป
Verilog
ยัง Output
module mux2 (input [3:0] d0, d1, input s,
• ? : เป็ น Operator ชนิด Ternary output [3:0] y);
• Operator เนื่องจากมันมี 3 Input endmoduleassign y = s ? d1 : d0;
4.2 Combinational Logic :
4.2.4 Conditional Assignment
VHDL
library IEEE; use IEEE.STD_LOGIC_1164.all;
entity mux2 is
port (d0, d1: in STD_LOGIC_VECTOR (3 downto 0);
s: in STD_LOGIC;
y: out STD_LOGIC_VECTOR (3 downto 0));
end;
architecture synth of mux2 is
begin
y <= d0 when s = ‘0’ else d1;
end;
4.2 Combinational Logic :
4.2.4 Conditional Assignment
Verilog
module mux4 (input [3:0] d0, d1, d2, d3,
input [1:0] s,
output [3:0] y);
assign y = s[1] ? (s[0] ? d3 : d2)
: (s[0] ? d1 : d0);
endmodule
VHDL
library IEEE; use IEEE.STD _LO G IC _1164.all;
entity m ux4 is
port (d0, d1,
d2, d3: in STD _LO G IC_VECTO R (3 downto 0);
s: in STD _LO G IC _VECTO R (1 downto 0);
y: out STD _LO G IC_VECTO R (3 downto 0));
end;
architecture synthl of m ux4 is
begin
y <= d0 when s = “00” else
d1 when s = “01” else
d2 when s = “10” else d3;
end;
4.2 Combinational Logic :
4.2.4 Conditional Assignment
Verilog
module mux4 (input [3:0] d0, d1, d2, d3,
input [1:0] s,
output [3:0] y);
assign y = s[1] ? (s[0] ? d3 : d2)
: (s[0] ? d1 : d0);
endmodule
VHDL
library IEEE; use IEEE.STD_LOGIC_1164.all;
entity mux4 is
port (d0, d1,
d2, d3: in STD_LOGIC_VECTOR (3 downto 0);
s: in STD_LOGIC_VECTOR (1 downto 0);
y: out STD_LOGIC_VECTOR (3 downto 0));
end;
architecture synth2 of mux4 is
begin
with a select y <=
d0 when “00”,
d1 when “01”,
d2 when “10”,
d3 when others;
end;
4.2 Combinational Logic :
4.2.4 Conditional Assignment
4.2.5 Internal Variables
• ในกรณี ที่วงจร Combination มีความซับซ้อนมาก เรานิยมแบ่งการทางาน
ของวงจรออกเป็ นหลายๆขั้นตอน หรื อแบ่งสมการบูลีนออกเป็ นหลายๆสมการ
โดยใช้ตวั แปรภายใน (Internal Variable) ในการเก็บผลลัพธ์การทางาน
ในแต่ละขั้น
• ตัวอย่างวงจร Full Adder
S=A xor B xor Cin
Cout = AB + ACin + BCin
• เราสามารถเขียนใหม่เป็ น
P=A xor B,
S=P xor Cin,
G = AB
Cout=G+PCin
4.2.5 Internal Variables
• เราเรี ยก P และ G ว่าตัวแปรภายใน
• เราสามารถตั้งตัวแปรภายในของ Verilog
โดยใช้คาสั่ง wire
Verilog
module fulladder(input a, b, cin,
output s, cout);
wire p, g;
assign p = a ^ b;
assign g = a & b;
assign s = p ^ cin;
assign cout = g | (p & cin);
endmodule
4.2.5 Internal Variables
• เราใช้คาสั่ง signal ในการตั้งตัวแปร
ภายในของ VHDL
VHDL
library IEEE; use IEEE.STD _LO G IC _1164.all;
entity fulladder is
port(a, b, cin: in STD _LO G IC ;
s, cout: out STD _LO G IC);
end;
architecture synth of fulladder is
signal p, g: STD _LO G IC ;
begin
p <= a xor b;
g <= a and b;
s <= p xor cin;
cout <= g or (p and cin);
end;
4.2.5 Internal Variables
• ข้อสังเกต ในการเขียนโปรแกรมทัว่ ไปเช่นภาษา C++ หรื อ Java เราจะต้อง
เขียน P=A xor B ก่อน จากนั้นจึงเขียน S=P xor Cin
• แต่ลาดับการเขียนคาสัง่ ใน HDL ไม่มีความสาคัญ เนื่องจากคาสั่งในแต่ละ
Assignment จะถูกคานวณใหม่ทุกครั้งที่ตวั แปรทางด้านขวามือมีการ
เปลี่ยนแปลงค่า
4.2.6 Precedence
• ลาดับการทางานของ Operator ในภาษา Verilog และ VHDL จะเรี ยง
ไม่เหมือนกัน ดังแสดงในตาราง (Operator ด้านบนจะทางานก่อน
ด้านล่าง)
• จากตารางของ Verilog จะเห็นว่าลาดับ
การทางานของ AND มาก่อน OR
ดังนั้นเราสามารถที่จะเขียนสมการบูลีน
assign cout = g | p&cin;
• ซึ่ งจะจะทางานเหมือนกับ
assign cout = g | (p&cin);
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;
4.2.7 Numbers
• รู ปแบบการเขียนเลขใน Verilog คือ
N’bvalue
โดยที่ N คือจานวนบิท
b คือเลขฐาน
Value คือค่าของตัวเลข
• ตัวอย่างเช่น
9’h25 หมายถึงเลขฐาน 16 ขนาด 9
บิท มีคาเท
่ ากั
่ บ
2516=3710=0001001012
4.2.7 Numbers
• ถ้าไม่ใส่ ขนาดให้ตวั เลข Verilog จะ
กาหนดขนาดของตัวเลขให้ใหญ่เท่ากับ
ขนาดที่ถกู ใช้ในสมการ
• และ 0 จะถูกใส่ เข้าไปข้างหน้าของตัวเลข
ให้เองโดยอัตโนมัติ
• ตัวอย่างเช่นถ้าให้ w เป็ นบัสขนาด 6 บิท
• ดังนั้นคาสั่ง w=‘b11
• w จะมีค่าเท่ากับ 0000112
4.2.7 Numbers
• ในภาษา VHDL ตัวเลขของตัวแปร
ชนิด STD_LOGIC จะเขียนเป็ น
เลขฐาน 2 ขนาด 1 บิท และปิ ดดวย
้
เครื่ องหมาย ‘x’
• เช่น ‘0’ และ ‘1’ หมายถึงโลจิก 0 หรื อ 1
• ตัวเลขของตัวแปรชนิด STD_LOGIC_VECTOR จะถูกเขียนเป็ นเลข
ฐาน 2 หรื อเลขฐาน 16 และปิ ดด้วยเครื่ องหมาย “xxx”
4.2.8 Z’s และ X’s
• Z ใช้แสดงสถานะลอย (Float)
• .=h
• ตัวอย่างที่ 4.10 แสดงตัวอย่างของ
Tristate Buffer
• ถ้า Buffer ถูก Enable จะทาให้
Output มีโลจิกตรงกับ Input
• แต่ถา้ ถูก Disable จะทาให้ Output
ลอย
Verilog
module tristate (input [3:0] a,
input en,
output [3:0] y);
assign y = en ? a : 4'bz;
endmodule
4.2.8 Z’s และ X’s
• ใน HDL จะใช้ X แทน
4.2.9 Bit Swizzling
• Bit Swizzling เป็ นการนาเอาสัญญาณหลายๆสัญญาณมารวมกันเพื่อเป็ น
สัญญาณบัส หรื อเป็ นการแยกเอาสัญญาณบางสัญญาณของบัสไปใช้งาน