การเขียนภาษา 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) ที่ไม สามารถนําไปเปนชื่อตางๆไดในทุกลักษณะของตัวหนังสือคําเหลานี้ไดแก
- แนะนําพื้นฐานภาษา VHDL
ภาษา VHDL มีความเป็น Concurrent ซึ่งถือว่าเป็นหัวใจสําคัญของการเขียนออกแบบอุปกรณ์อิเล็กทรอนิกส์หมายถึงการเขียนโค๊ดภาษา VHDL จะไม่มีลําดับความสําคัญของตําแหน่งของแต่ละบรรทัดและภาษา VHDL ยังมีความเป็น Case insensitive อีกด้วยกล่าวคือไม่มีความแตกต่างในการเขียนอักษรพิมพ์เล็กหรือพิมพ์ใหญ์
- ค่าหน่วงเวลา (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 (ซึ่งจะกล่าวในภายหลัง)
- การประกาศออบเจ็กต์
- ชนิดของออบเจ็กตที่ไดกําหนดไวแลว
- องคประกอบของภาษา VHDL
- คําสั่งตางๆ ภายในภาษา VHDL
- การทํางานของ operator
- การกําหนดคาตางๆ
- คําสงวนในภาษา VHDL