ข้อเสียอย่างหนึ่งของการใช้งาน FPGA คือ ทุกครั้งที่มีการเปลี่ยนแปลงโปรแกรม เราต้องทำการคอมไพล์โปรแกรมใหม่ซึ่งอาจจะใช้เวลาประมาณสิบนาทีไปจนถึง 12 ชั่วโมง (จากประสบการณ์ของผู้เขียน) แม้จะทำการแก้ไขเพียงเล็กน้อย เราจะสามารถก้าวข้ามปัญหานี้ได้อย่างไร?
ก่อนจะก้าวไปถึงเรื่องของการแก้ปัญหาเรื่องเวลาที่ใช้ในการคอมไพล์ เราลองมาดูกันว่าทำไมเราถึงใช้งาน FPGA? โดยปกติแล้วเราใช้ FPGA ในการประมวลผลความเร็วสูงหรืออ่านค่าจากอินพุต/เอาท์พุต งานหลาย ๆ อย่างที่ไม่จำเป็นต้องประมวลผลด้วยความเร็วสูง เช่น ส่งข้อมูลผ่านพอร์ต เขียนข้อมูลลงไฟล์ อ่าน/เขียนการตั้งค่านั้นไม่จำเป็นต้องใช้งาน FPGA ซึ่งงานลักษณะนี้อาจจำเป็นต้องมีการแก้ไขโปรแกรมบ่อยครั้งด้วย เพราะฉะนั้นเราอาจพิจารณาย้ายงานประเภทนี้ไปทำบนตัวประมวลผลอื่น ๆ แล้วเขียนโปรแกรมเพื่อทำงานในลักษณะนี้แยกต่างหาก ซึ่งเมื่อไรก็ตามที่มีการแก้ไขโปรแกรมในส่วนที่ประมวลผลบนตัวประมวลผลอื่น ๆ เราก็ไม่จำเป็นต้องแก้โปรแกรมบน FPGA
สำหรับบอร์ดพัฒนา FPGA ของ Digilent นั้น หากเป็นบอร์ดที่ใช้ชิพ ZYNQ ได้แก่ ZedBoard, Zybo Z7, Cora Z7, Arty Z7, PYNQ-Z1 และ Eclypse Z7 จะสามารถใช้งานไมโครคอนโทรลเลอร์ที่อยู่บนชิพ ZYNQ (ชิพ ZYNQ นั้นเป็น SoC/System on Chip ซึ่งมีชิพไมโครคอนโทรลเอร์อยู่ด้วยในแพ็คเกจ) ส่วนบอร์ดอื่น ๆ ได้แก่ Basys 3, Nexys A7, Arty A7, Arty S7, Cmod A7, Cmod S7, Nexys Video, Genesys 2 และ USB104 A7 นั้นเราสามารถที่จะจำลองไมโครคอนโทรลเลอร์ MicroBlaze ขึ้นมาบนหน่วยความจำบนชิพ FPGA สำหรับขั้นตอนนั้นเราสามารถอ้างอิงได้จาก Getting Started with Vivado and Vitis for Baremetal Software Projects

สำหรับการพัฒนาโปรแกรมในส่วนของไมโครคอนโทรลเลอร์นั้น เราจะใช้ซอฟต์แวร์ Vitis ในการพัฒนาด้วยภาษา C/C++ ซึ่งโปรแกรมในส่วนนี้จะสามารถติดต่อกับ FPGA ผ่านอินเตอร์เฟส AXI หลังจากนั้นจึงทำการคอมไพล์แล้วนำไปสร้าง bitstream ร่วมกับโปรแกรมบน FPGA แล้วจึงอัพโหลดโปรแกรมขึ้นไปบนชิพเพื่อให้แอพพลิเคชั่นเริ่มทำงาน สำหรับขั้นตอนการพัฒนาด้วย Microblaze สามารถอ้างอิงได้ดังต่อไปนี้:
1. ทำการพัฒนาโปรแกรมบน FPGA ด้วย Vivado Block Design เนื่องจากการใช้งาน MicroBlaze จะมีการเรียกใช้ IP อื่น ๆ ร่วมด้วย เช่น interrupt controller, processor system reset, peripheral connect และ memory เป็นต้น
2. ทำการวาง Microblaze IP และ IP อื่น ๆ ที่จะใช้งานลงไปในบล็อก ใช้ Block Automation และ Connection Automation ในการเชื่อมต่อและตั้งค่า IP
3. ดับเบิ้ลคลิก IP เพื่อทำการตั้งค่าเพิ่มเติม สำหรับ Microblaze ให้ตั้งค่าสำหรับการคำนวณที่ต้องใช้งาน เช่น INTEGER DIVIDER ด้วย
4. ทำการเชื่อมต่อพอร์ตที่เหลือเข้าด้วยกันหากต้องการ
5. ใช้ Address Editor ตั้งค่าการทำงานของ IP ต่าง ๆ ควรตั้งค่าไว้ 64K สำหรับ IP แต่ละตัวเป็นอย่างน้อย
6. กด Validate Design เพื่อตรวจสอบข้อผิดพลาดและแก้ไขก่อนบันทึกบล็อก
7. คลิกขวาที่บล็อก (*.bd) เลือก Generate Output Products เมื่อเสร็จเรียบร้อยแล้วให้คลิกขวาอีกทีแล้วเลือก Create HDL Wrapper เพื่อสร้างโมดูลหลัก
8. แก้ไขไฟล์ XDC เพื่อเชื่อมต่อกับโมดูลหลัก
9. Generate bitstream ตามปกติ โดยให้ทำการตรวจสอบ Metrodology เพื่อแก้ไข Critical Warning ก่อนไปยังขั้นตอนถัดไป
10. เลือก File>Export>Export Hardware เพื่อสร้างไฟล์ xsa ไว้ใช้งานร่วมกับ Vitis โดยเลือก Include bitstream
11. เปิด Vitis และทำการ Set Workspace
12. เลือก File>New Component>Platform แล้วทำการอิมพอร์ตไฟล์ xsa ที่สร้างไว้
13. ตรวจสอบ platform ว่ามีการติดตั้งไดรเวอร์และไลบรารี่ที่จะใช้งาน เช่น uart ให้เรียบร้อย
14. ทำการ clean และ build platform
15. เลือก File>New Component>Application โดยเชื่อมต่อกับ platform ที่สร้างไว้
16. ทำการตั้งค่า Library search path ให้รวมไลบรารี่ที่สร้างขึ้นใน platform ไว้ด้วย
17. สร้างซอร์สโค้ดภาษา C ใน application ให้ทำงานตามต้องการ
18. ทำการ clean และ build application เพื่อสร้างไฟล์ elf
19. กลับไปยังโปรเจกต์ใน Vivado เลือก Tools>Associate ELF Files แล้วเลือกไฟล์ elf ที่สร้างไว้
20. ทำการ Generate bitstream อีกครั้ง
หวังว่าบทความนี้จะเป็นประโยชน์สำหรับผู้ที่กำลังมองหาหนทางในการพัฒนาโซลูชั่นที่มีความซับซ้อนบนบอร์ดพัฒนา FPGA หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการใช้งานบอร์ดพัฒนา FPGA ของ Digilent หรือผลิตภัณฑ์อื่น ๆ ท่านสามารถติดต่อทีมงาน ติดต่อ ทีมงาน เทคสแควร์ ได้ครับ
บทความที่เกี่ยวข้อง
การประยุกต์ใช้เครื่องมือวัดที่ปรับแต่งได้ด้วย FPGA
การพัฒนาโปรแกรมบน FPGA ด้วย Block Design
Getting Started with Vivado and Vitis for Baremetal Software Projects
การพัฒนาโปรแกรมบน FPGA ด้วย IP และ Block Design
การเลือกใช้ภาษาระดับสูงในการพัฒนาโปรแกรมบนบอร์ด FPGA ของ Digilent
