Z2PCBA@gmail.com +66-897725026
ทำความรู้จักกับ ZYNQ VIVADO ของ Xilinx – Basic PS
Friday April 13th, 2018
0
ZYNQ Vivado(Tutorial): Basic PS

บทความนี้เป็นรายละเอียดต่อเนื่องจากบทความที่แล้ว โดยเราจะมาทำความรู้จักกับ ZYNQ VIVADO ของ Xilinx – Basic PS ซึ่งเราจะมาลงรายละเอียดตรงส่วนของการออกแบบ PS และรวมไปถึงการใช้ SDK เพื่อแสดงผลปรินท์ค่า “Hello world” ออกมาร่วมกับวงจรควบคุมไฟกระพริบ

จากบทความที่แล้ว เราเริ่มสร้างวงจรกับ ZYNQ โดยเริ่มต้นที่ฝั่ง PL กันไปแล้ว ในบทความนี้เราจะมาเริ่มต้นในฝั่ง PS กันบ้าง ซึ่งในความเป็นจริงแล้วการพัฒนาบน ZYNQ นั้นควรที่จะต้องมีวงจร PS ประกอบด้วยทุกครั้ง เนื่องจาก Bootloader ของ ZYNQ นั้นต้องทำผ่านทาง PS ทำให้ถ้าไม่มี PS แล้วเมื่อเราเปิดไฟเข้าบอร์ด โค้ดหรือวงจรที่เราเขียนลงไปนั้นก็จะหายไปหมด (โดยรายละเอียดของ Bootloader นั้นจะเขียนถึงในบทความต่อไป ส่วนบทความนี้เราจะมาโฟกัสกันที่ PS)

การกำหนด PS

Add PS

เริ่มต้นจากตัวโปรเจคของบทความที่แล้วที่เป็นวงจรไฟกระพริบ(Blinking LED) ให้เราเพิ่มส่วน PS โดยเลือก “IP INTEGRATOR” แล้วเลือก “ADD IP” โดยทำการคลิกขวาหรือกดที่เครื่องหมาย “+” หน้า Diagram แล้วไปค้นหา “ZYNQ” จากนั้นจึงทำการ “add” ลงมา

หน้าตา IP INTEGRATOR

หน้าตาของ IP INTEGRATOR

รูปแสดงการค้นหา

ทำการค้นหา ZYNQ

จากนั้นให้ทำการเพิ่มโมดูล(Add Module) ที่ชื่อ “Blinking LED” ที่เราได้สร้างไว้ในบทความที่แล้ว โดยทำการกดคลิกขวาแล้วเลือก “Add Module” โปรแกรมจะทำการลิสต์วงจรที่เขียนไว้แล้ว เลือกวงจรที่เราได้เขียนเอาไว้(“Blinking_LED”) จากนั้นให้ทำการกด “Ok” เพื่อ add module เข้ามาเลย
เลือก Add module เพื่อนำเข้าวงจรไฟกระพริบที่เขียนไว้แล้ว
เลือก module เพื่อนำเข้าวงจรไฟกระพริบที่เขียนไว้แล้ว

เมื่อได้ component ทั้ง 2 อันแล้วให้ทำการกดปุ่ม “Regenerate Layout” เพื่อทำการจัดการวาง component ให้ดูเป็นระเบียบดังรูปด้านล่าง
กดปุ่มเพื่อให้โปรแกรมช่วยจัดวาง component ให้เป็นระเบียบ

จากนั้นเราจะทำการตั้งค่าของ ZYNQ โดยสิ่งที่เราต้องทำเป็นพื้นฐานเลยคือ การตั้งค่า UART และ DDR เพื่อให้ PS นั้นสามารถพิมพ์(print) ค่าออกมาได้ผ่านทาง UART Port

ทำการตั้งค่า “UART” โดยให้ดับเบิลคลิกที่ตัว ZYNQ จะได้หน้าตาดังรูปด้านล่าง ให้ไปกดที่ “MIO Configuration” แล้วเลือก “UART” ที่บอร์ดที่เราได้ออกแบบไว้ โดยของผมเป็น UART1 ขา 48,49 นะครับ ก็ไปตั้งว่าเป็นขาไหน (อย่าลืมตั้งค่า power ของแต่ละ bank ด้วยนะครับ)
ตั้งค่า UART

จากนั้นไปตั้งค่า DDR โดยกดที่ “DDR Configuration” โดยในที่นี้บอร์ดผมใช้ MT41K256M16 RE-125 32bit นะครับ
ตั้งค่า DDR

เมื่อตั้งค่าเสร็จ ต่อไปเราก็จะทำการต่อวงจรนะครับ โดยให้เอาเมาส์ไปที่ขา FCLK_CLK0 แล้วจึงลากไปเชื่อม IP_LCLK และ M_AXI_GPO_ACLK ดังรูป ขั้นตอนดังกล่าวเป็นการต่อสัญญาณ FCLK ที่ออกจาก PS ไปให้ทั้ง 2 ส่วน
ลากสัญญาณไปเชื่อมที่ขาต่างๆ

จากนั้นก็จะทำการตั้งค่าที่ขาต่างๆให้กลายเป็นพอร์ต(port) เพื่อเชื่อมต่อกับภายนอก ZYNQ นะครับ ดังรูป โดยกด “คลิกขวา” เลือก “Create port” นะครับ
คลิกขวาเพื่อ create port

จากนั้นให้กด “Regenerate Layout” อีกครั้ง ตามด้วย “Run Block Automation” ดังรูป
กด regenerate layout และ run block automation

จากนั้นให้กด “Validate Design” เพื่อทำการตรวจสอบวงจรที่เราได้ออกแบบไว้ว่าถูกต้องหรือไม่
กดปุ่ม Validate Design

จากนั้นให้ไปหน้า Project Management คลิกขวาที่ไฟล์ Design ที่เราได้ออกแบบไว้(ในที่นี้คือ “design_1”) จากนั้นให้เลือก “Create HDL Wrapper” เพื่อที่สร้าง TOP File ขึ้นมา
เลือก Create HDL Wrapper

เมื่อเสร็จแล้วจะได้หน้าตาดังรูปด้านล่าง
หลังจากกด Create HDL wrapper

หลังจากนั้นก็ทำการ “Synthesis” และ “Implement” แล้ว “Generate Bitstream” ขึ้นมาก็เป็นอันเสร็จในส่วนของ PS โดยขั้นตอนเหมือนกับบทความก่อนหน้าครับ

การปรินต์ค่า Hello World

เมื่อเราสร้างวงจรที่มี PS เสร็จเรียบร้อยแล้ว ต่อไปเราจะมาทำการเขียนโปรแกรมเพื่อให้ ZYNQ นั้นสามารถแสดงผลข้อความ “Hello world” ออกมาทาง UART ให้ได้ ซึ่งถือเป็นพื้นฐานในการทดสอบการเขียนโปรแกรม เพื่อจะตรวจสอบว่าวงจรทำงานได้ถูกต้องนะครับ

Export Hardware

เริ่มด้วยการ “Export Hardware” เพื่อให้ SDK นั้นรู้ว่า Hardware ที่เราออกแบบนั้นมีอะไรบ้างนะครับ โดยให้กดที่ File > Export > Export Hardware ดังรูป โดยอย่าลืมกดเลือก “Include bitstream” ไปด้วยนะครับ
กดปุ่ม export hardware
เลือก include bitstream

Launch SDK

เมื่อ Export เสร็จเราก็จะทำการเปิดโปรแกรม SDK ซึ่งเป็นโปรแกรมที่เอาไว้เขียนโค้ดลง PS ทำได้โดยการกด File > Launch SDK
กดปุ่ม Launch SDK

สร้างโปรเจค Hello World

หลังจากที่เราได้เปิดโปรแกรม SDK ก็จะได้หน้าตาดังรูป จากนั้นให้เราทำการ “สร้างโปรเจค Hello World” ดังนี้
ให้ไปกด Files > New > Application Project ดังรูปนะครับ
สร้าง Application Project ใหม่

จากนั้นให้ตั้งชื่อโปรเจค แล้วกด “Next” ได้เลย
กด Next เพื่อดำเนินการขั้นต่อไป

จากนั้นให้เลือกโปรเจคเทมเพลต(template) “Hello World “ นะครับซึ่งจะเป็นตัวอย่างโปรเจคต้นแบบซึ่งจะทำการพิมพ์ค่า “Hello World” ออกมา เพียงแค่นี้ก็จะได้ตัวอย่างโปรเจค Hello World แล้วครับ
ทำการเลือก template ของโปรเจคเป็น Hello World

จากนั้นให้ทำการแก้ไขตัวโปรแกรมโดยทำการเปิดไฟล์ “Helloworld.c” จาก ชื่อโปรเจค(ในที่นี้คือ Hello_World) > src นะครับ ก็จะเห็นหน้าตาของไฟล์ Hello World ที่จะพิมพ์ค่า “Hello World” ออกมาดังรูป
ทำการแก้ไขตัวโปรแกรมจากไฟล์ Helloworld.c

ให้ทำการเพิ่มบรรทัดใหม่ตรงด้านล่างของบรรทัด “print(“Hello World\n\r”);” โดยจะปรินท์ค่าอะไรออกมาก็ได้เพื่อให้แตกต่างจากไฟล์ต้นฉบับ เช่น

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"

int main()
{
	init_platform();

	// ทำการแสดงผลโดยปรินต์ค่า Hello World
	print("Hello World\n\r");

	// บรรทัดที่เพิ่มเข้าไปใหม่ ทำการแสดงผลโดยปรินต์ค่า Hello xxxxx
	print("Hello xxxxx\n\r");

	cleanup_platform();
	return 0;
}

จากนั้นให้ไปตั้งค่าเพื่อดู UART ก่อนนะครับโดย ตรงด้านล่างของ SDK ให้ไปกด “SDK Terminal” แล้วกดเครื่องหมาย “+”
กดเครื่องหมาย + เพื่อตั้งค่า UART

จากนั้นก็ให้ตั้งค่า UART ที่จะออกได้เลยนะครับ โดยของผมเป็น COM1 ส่วน Baud Rate Default จะเป็น 115200 นะครับ
กำหนดค่า UART

จากนั้นเราจะทำการทดสอบวงจรที่เราเขียนนะครับ โดยให้ไปคลิกขวาที่ โปรเจคที่สร้างไว้ > Run As > Launch on Hardware (System Debugger)” นะครับ
ทำการทดสอบวงจรที่เราเขียน Launch on Hardware(System Debugger)

เมื่อ run เสร็จให้ไปกดที่หน้า “SDK Terminal” ที่เราได้ตั้งค่าไว้ จะพบว่ามีการปรินต์ค่า “Hello World” ออกมาแล้ว ตรงนี้ก็จะเป็นการจบการใช้ SDK พื้นฐานง่ายๆ เพื่อให้สามารถปรินต์ “Hello World” ได้นะครับพร้อมทั้ง LED ก็จะกระพริบอีกด้วยซึ่งเราได้พัฒนาไว้ใน บทความที่แล้วด้วย

ส่วนในบทความต่อไปจะเป็นเรื่อง Bootloader ว่าเราจะตั้งค่าได้อย่างไรบ้างนะครับ เพื่อเป็นการช่วยให้เวลาเราเปิดไฟเข้าบอร์ดใหม่นั้นจะสามารถ run ตัวโค้ดที่เราเขียนไว้ได้เลย โดยไม่ต้องมานั่งโปรแกรมใหม่ในทุกๆรอบ