Gesture Sensor - Kasetsart Universityparuj/204224/final_practice...Gesture ส งท จะได...

Preview:

Citation preview

สิ่งท่ีจะได้จากการปฏิบตัิการครัง้นี ้คือ Nios II soft processor, JTAG UART, on-chip

memory, PLLs, and an I2C interface.

1. Set up project!

1.1. ดาวน์โหลดไฟล์แลปจากเว็บไซต์ของรายวิชา จากนัน้สร้าง directory ใหม่ขึน้มาช่ือว่า

‘gesture_lab’ แล้วน าไฟล์แลปท่ีโหลดมา มาแตกไฟล์ใส่ไว้

1.2. เปิดโปรแกรม Quartus II 15.0 (64-bit) เลือก File -> New Project Wizard

1.3. Browse ไปท่ี ตวัอย่าง C:\DECA\workshop_labs\4_Gesture_Sensor_Lab

Name of the project: gesture_lab

Name of the top level entity: gesture_lab_top

1.4. หน้า Project Type เลือกเป็น Empty Project

Gesture Sensor

1.5. Add files ตามรูปต่อไปนี ้

1.6 ตัง้ค่า Devices Setting ให้ตรงกบับอร์ดท่ีเราใช้ โดยเลือกดงันี ้

1.7 จากนัน้เลือก Finish

2. ต่อไปเป็นเร่ืองของ Hardware Design!

ภาพรวม จะเป็นการใช้ Qsys system integration tool ช่วยในการ design hardware system

โดยนิสิตจะได้ใช้ทัง้ standard และ custom components ในการเช่ือมต่ออินเตอร์เฟสต่างๆเข้า

ด้วยกนั, .ในการจดัการเร่ือง clocks, การตัง้ interrupt ต่างๆ รวมถึงการสร้าง HDL ให้ระบบ

2.1. เลือก tools -> Qsys เพ่ือเปิดหน้าต่างของ Qsys

2.2 หน้าต่างใหม่ท่ีเปิดขึน้มาจะแสดงส่วนประกอบต่างๆของระบบให้ดวู่ามีอะไรบ้าง

2.3. ใส่ clock ให้กบัระบบโดย double click ท่ี clk_0. จากนัน้ตัง้ค่าพารามิเตอร์ clock

frequency ให้เป็น 50 MHz (50000000 Hz) ตามรูป จากนัน้กดปุ่ ม ‘X’ เพ่ือปิดหน้าต่าง

2.4. เปล่ียนช่ือ clk_0 ให้เป็น clk_50 โดยกด CTRL + R หรือคลิกขวาตามรูป

2.5. File -> Save as… ตัง้ช่ือเป็น decs_top.qsys

3. Add a Nios II Processor!

เน่ืองจากพวกเราต้องการให้ Software ช่วย decode raw data ท่ีมาจาก Si1143 Gesture

Sensor IC. Nios จงึเป็นสิ่งจ าเป็นอย่างมากในแลปนี ้

3.1 ในส่วน IP Catalog, เลือกตามรูป (นิสิตสามารถใช้ค าสัง่ search หาเอาได้เช่นกนั)

3.2 หลงัจากกดปุ่ ม Add แล้วจะมีหน้าต่างเด้งขึน้มา, ให้นิสิตเลือก option ‘Nios II/e’

3.3. In Vectors tab, จะกลบัมาตัง้ค่าในส่วนนีภ้ายหลงั ซึง่ตอนนีน้ิสิตอาจมีเออเร่อดงันี ้

3.4. ในส่วน tabs อ่ืนๆ นิสิตสามารถศกึษาการตัง้ค่าอ่ืนๆได้เพิม่เติมได้ด้วยตนเองได้

จากนัน้กด Finish

3.5 แก้ช่ือ Nios II เป็น nios2.qsys

4. Add On-Chip Memory!

Nios II จะเข้าถึงหน่วยความจ าท่ีมีความเร็วสงู เพ่ือใช้ในการรันโค้ดและเป็นท่ีส าหรับ

เก็บตวัโปรต่างๆ โดยตวัหน่วยความจ านีจ้ะอยู่ใน on-chip memory ซึง่ภายในจะมี RAM/ROM อยู่

4.1. ในหน้า IP Catalog ให้นิสิต Add ตามดงัรูป

4.2. หน้า parameter editor จะถกูเปิดขึน้มา ให้นิสิตตัง้ค่าตามนี ้

4.3. คลิก Finish ซึง่อาจมีเออเร่อเกิดขึน้มาบ้าง ไม่ต้องเป็นกงัวลั ตอนนีใ้ห้เปล่ียนช่ือ

ส่วนประกอบนีใ้ห้เป็น onchip_ram

5. JTAG UART Peripheral

ตรงส่วนนีท้ าให้เราสามารถ Debug โปรแกรมได้คล้ายๆกบัการ printf ออกมา โดยตวั

JTAG UART จะต่อเข้ากบั Nios II processor และสามารถควบคมุได้ผ่านตวั IDE ของมนั

5.1. ส่วน IP Catalog, เลือกตามรูป หรือ เสริชว่า jtag

5.2. ในหน้า parameter editor ให้ตัง้ค่าตามรูป

5.3. เช่นเดิม อาจจะมีเออเร่อเกิดขึน้มาบ้าง ให้ปล่อยผ่านไปก่อน และตัง้ช่ือส่วนประกอบนี ้

ว่า jtag_uart

6. Add a PLL

จะใช้เป็นตวัสร้าง clock ให้ Qsys system

6.1 ในหน้า IP Catalog ให้เลือกตามรูป หรือเสริชว่า

Avalon ALTPLL

6.2. ในหน้า Parameter Setting -> General/Modes tab, ให้เปล่ียน clock frequency

เป็น 50 MHz (ซึง่เป็นค่าท่ีมากท่ีสดุแล้วท่ีตวั oscillator บนบอร์ดอนญุาต)

6.3. ในหน้า Parameter Settings -> Inputs/Lock tab, ติก้ถกูแค่ตรง Create ‘locked’

output เท่านัน้!!!

6.4 ในส่วนของ Output Clocks/clk tab, ให้เปิดใช้งานเฉพาะ c0 โดยตัง้ค่าตามรูป

(50 MHz * 2 multiplication factor = 100 MHz)

6.5. กด Finish ได้เลย โดยไม่ต้องสนใจ errors ก่อน, จากนัน้เปล่ียนช่ือ PLL ให้เป็น pll_qsys

6.6. เน่ืองจากเรา enable ตวั locked output ไว้ก่อนหน้านี ้เราจงึจ าเป็นต้องเพิม่ input

port ไปให้ระบบ Qsys ของเรา ให้ท าตามรูปจะเป็นการเปิดพอร์ตการเช่ือมต่อด้าน output กบั

user logic โดยการ Double click ส่วน export column ซึง่อยู่ใกล้กบั external_connection

จากนัน้ให้พมิพ์ว่า pll_qsysy_locked

7. Add a timer!

จะเป็นตวั periodic interrupts เพ่ือปอ้งกนัการเกิด system lockups

7.1. เช่นเดิม, IP Catalog ให้เสริชว่า timer และตัง้ค่าในส่วน parameter editor ดงัรูป

7.2. กด Finish โดยไม่ต้องสนใจ warnings/erorrs ใดๆทัง้สิน้ เราจะกลบัมาแก้ทัง้หมดใน

ภายหลงัทีเดียว

7.3. เปล่ียนช่ือตวั timer ให้เป็น timer_qsys

8. Add a System ID Peripheral!

8.1. IP Catalog เลือก system id ตามรูป และตัง้ค่า parameter editor ตามรูปเช่นกนั

8.2. เลือก Finish, ไม่ต้องสนใจ errors, เปล่ียนช่ือในส่วนนีเ้ป็น sysid_qsys

9. Add an Interrupted Pin!

เป็นตวัท่ีใช้ Interrupt ใน Gesture sensor เพ่ือประโยชน์ในหลายๆอย่าง เช่นเม่ือตวัวดัค่า

วดัค่าได้เกินค่า threshold ท่ีโปรแกรมเมอร์ตัง้ไว้ ทัง้นีเ้พราะตวั I2C bus ไม่มี interrupt เป็นของ

ตวัเอง

9.1. เลือก PIO ใน IP Catalog และตัง้ค่าในหน้าต่าง Parameter editor ดงัรูป

9.2. เลือก Finish, เปล่ียนช่ือเป็น pio_0

9.3. ต้อง Add ส่วนนีเ้ข้ากบั Qsys system เพ่ือท่ีจะสามารถเช่ือมต่อกบั external pin ได้

เช่นเดียวกบัขัน้ตอน 6.6 ให้ Doucle-click ท่ี export column ข้าง external_connection ท่ีเป็น

ของ pio_0 แล้วพมิพ์ไปว่า i2c_irq

10. Add an I2C Peripheral!

I2C bus ใช้ใน Gesture Sensor เพิม่คยุกบัโฮสต์, I2C controller ใช้ควบคมุอีกทีนงึ

10.1. IP Catalog, เลือก i2c ดงัรูป

10.2. จากนัน้คลิก Finish ได้เลย เพราะไม่มีอะไรให้ตัง้ค่าในหน้า Parameter Editor

10.3. เปล่ียนช่ือ component เป็น i2c_opencores_0

10.4. เช่นเดิม เราจ าเป็นต้อง add i2c เข้ากบั Qsys system ให้ท าตาม 9.3. ได้เลย แต่ให้

ท าในส่วนของ i2c_opencores_0 พมิพ์ไปว่า i2c_pins

11. เช่ือมต่อเข้ากบั Qsys system และก าจดั errors!

Errors ต่างๆ ก่อนหน้านีเ้กิดจากการท่ี Avalon interface และ ตวัประกอบต่างๆ แม้กระทัง่

Clock, resets ต่างๆนัน้ ไม่ได้ถกูเช่ือมต่อเข้ากบั Qsys system โดยสมบรูณ์

11.1. เปิดหน้าต่าง Nios II Processor ขึน้มาและคลิกขวาท่ี clk จากนัน้ให้เลือกตามรูป

ซึง่จะเป็นการเช่ือม clk input เข้ากบั c0 ของ PLL ท่ีเราเคยคอนฟิกเอาไว้

หมายเหตุ: สญัญาณต่างๆจะถกูอ้างถึงด้วย format ดงันี ้<component_name.signal_name>

โดย component_name จะเป็นการอ้างถึงส่วน Name column ใน Qsys โหมด System

Contents และ signal_name จะเป็นการอ้างถึงอินเตอร์เฟสใน component นัน้ๆ

11.2. ให้ Connect signal ท่ีเหลือตามตารางด้านล่างด้วยวิธีเดียวกนั โดยบางสญัญาณ

อาจมีมากกว่า 1 connections

12. Set Interrupt Priorities!

ซึง่ Nios II Processor มีถึง 32 independent interrupts (IRQs) ซึง่สามารถถกู assign

ล าดบัความส าคญัต่างๆได้ แต่ระบบท่ีเราท ากนัอยู่นัน้มีเพียง 4 interrupts เท่านัน้ ซึง่การ

ก าหนดค่าความส าคญัสามารถท าตามได้ดงันี ้

12.1. ในหน้าจอของ Qsys เลือก System -> Assign Interrupt Numbers

12.2. การตัง้ค่า Priority สามารถกระท าได้โดยการดบัเบิล้คลิกเข้าไปท่ี Column IRQ ได้

เลย (0 จะหมายถึงล าดบัความส าคญัสงูสดุ)

12.3 โดยขอให้นิสิตตัง้ค่าล าดบัความส าคญัของ 4 interrupts ตามนี ้

13. ก าหนด Nios II Reset และ Exception Vectors

จ าเป็นต้องมี memory location ให้เม่ือ processor มีการ reset/exception ขึน้ ซึง่ใน

ขัน้ตอนนีจ้ะเป็นการจดัการกบัเร่ืองดงักล่าว

13.1. การก าหนด vectos เหล่านี,้ สามารถกระท าได้โดยการดบัเบิล้คลิก nios2_qsys ใน

หน้า Nios II component ซึง่จะเป็นการเปิดตวั Parameter Editor ขึน้มา

13.2. ให้เลือก Vector tab, จากนัน้ตัง้ค่าในส่วนทัง้ของ reset vector memory และ

exception vector memory ให้เป็น onchip_ram.s1 ซึง่จะได้ดงัรูป โดยค่า offset อาจจะต่างกับ

ในรูป ไม่ต้องท าอะไรกับมันก่อน เราจะแก้ในหวัข้อถัดไป

13.3. ปิดตวั parameter editor และเตรียมตวัส าหรับการแก้ errors ในขัน้ตอนต่อไป

14. จดัการ Memory Address

ในแตล่ะ components ของ Qsys system นั 3น เราจําเป็นจะต้องระบ ุmemory address ให้มนั เพื?อที?จะทําให้ components อื?นๆ นั 3นสามารถ เข้าถงึข้อมลูของ components นี 3ได้ ซึ?งจะมีสองแบบ คือ automatically กบั manually โดยในที?นี 3เราจะทําแบบ manually โดยเริ?มจาก เลอืก System -> Assign Base Addresses

14.1 double-click ที่ hex address โดยเลือก base column ของ System Contents tab ที่อยู่ถัดจาก debug_mem_slave signal และใส่ค่า 0x0008_0800 เพื่อเปลี่ยน base address ของ component

14.2 ทำตามขั้นตอนที่ 14.1 กับ component ในตาราง

Component Base Address

nios2_qsys 0x0008_0800

timer_qsys 0x0008_1020

pll_qsys 0x0000_0000

onchip_ram 0x0004_0000

i2c_opencores_0 0x0008_1000

jtag_uart 0x0008_1058

sysid_qsys 0x0008_1050

pio_0 0x0008_1040

15. ตรวจสอบระบบทั 3งหมด

15.1 ตรวจสอบ Qsys system อีกรอบวา่เหมือนดงัรูปข้างลา่ง (ไมต้่องสนใจลาํดบั)

15.2 ตรวจสอบให้แนใ่จวา่ไมมี่ error messages in the Messages tab. และมีเพียง 2 warning messages ดงัรูปข้างลา่งนี 3เทา่นั 3น

16 Generate the Qsys System

เป็นการ generate HDL (hardware description language) code จาก Qsys system

16.1 เลอืก Generate -> Generate HDL

16.2 จะมีหน้าตา่ง generate ขึ 3นมา ให้เลอืกภาษาเป็น verilog และเลอืก None จากปุ่ ม drop down simulation model.

16.3 กดปุ่ ม Generate. Qsys จะทําการสร้าง HDL ที?จําเป็น มารวมเข้าด้วยกนั. เมื?อสร้างเสร็จแล้ว ให้กดปิดได้เลย

17. เพิ่ม Qsys System ไปยัง Quartus Project

17.1 กดปุ่ม “X” ขวาบนของหน้าต่าง Qsys เพื่อปิด. จะมีหน้าต่าง ของ Quartus II ขึ้นมาเพื่อบอกให้เราเพิ่ม Qsys system ไปยัง project. [1]

17.2 คลิกปุ่ม OK และ เลือก Project -> Add/Remove Files in Project จาก Quartus II Menu.

17.3 คลิก “...” และ directory ของ systhesis ที่เพิ่งปรากฏในรูป (1) และเลือกไฟล์ deca_top.qip

17.4 คลิกปุ่ม “Add” เพื่อแอดไฟล์ .qip ไปยังโปรเจ็ค. คลิก “Apply” and “OK”

18. Modify the Top-Level Design File

top-level design file บางส่วนนั้นได้สร้างให้เรียบร้อยแล้วแต่มีบางส่วนนั้นที่เราจำเป็นจะต้องแก้ไขเพื่อที่จะทำให้ compile ผ่าน

18.1 ดับเบิ้ลคลิก top-level design entity, geasure_lab_top, ของ Hierarchy tab ไฟล์ geasure_lab_top.v ที่ได้เคยเพิ่มไปในโปรเจ็คนั้นควรจะขึ้นมาในหน้าต่างนี้

18.2 ให้ดูบน top-level file และมองหา ports, wire declarations, และ structural coding. และให้ไปที่บรรทัดที่ 198 ของไฟล์ จะเห็นได้ว่า signal ที่ได้ export มาจาก Qsys นั้นแสดงอยู่

18.3 Uncomment บรรทัด ที่ 187-190 และ เพิ่ม signal names สำหรับ I2C signals และ PLL locked signal.

18.4 คลิก File -> Save All

19 Import Pin Assignments

โดยปกติแล้ว การกำหนด pin สำหรับการ design จำเป็นต้องกำหนดด้วยตัวเอง. แต่สำหรับ DECA board มี pin คงที่ ทำให้เราสามารถ import pin config เข้ามาใช้งานได้เลย

19.1 คลิกที่ Assignments -> Import Assignments19.2 คลิกที่ “...” และ เลือก DECA_golden_top.csv. คลิก OK. Quartus II จะขึ้นข้อความ มาว่า

563 assignments imports.

19.3 เปิด Pin Planner จาก Assignments -> Pin Planner. ดูที่ pin assignments ที่ signal ขึ้นต้นด้วย LIGHT. signals เหล่านี้คือ I2C signals ไปยัง Si1143 Sensor

19.4 คลิก ปุ่ม “X” ขวาบนเพื่อปิด Pin Planner

20. Compile the Quartus II Project

เราได้ทำ hardware design เรียบร้อยแล้ว แต่ยังมี device settings บางส่วน จำเป็นต้องเปลี่ยนแปลง และ โปรเจค จึงจะสามารถคอมไพล์ เพื่อสร้าง configuration file ได้

20.1 เปิด Device settings จาก Assignments -> Device… และ คลิก “Device and Pin Options”

20.2 Unselect checkboxes ดังรูป

20.3 เลือก category: configuration และเลือก configuration mode เป็น single uncompressed image ดังรูป

� 20.4 ทำการ compile โดยเลือก Processing -> Start Compilation

20.5 หลังจากผ่านไปซักพักแล้วควรจะขึ้นหน้าจอดังนี้

� 21. Download the configuration file ไปยัง DECA

หลังจากที่ได้ configuration ไฟล์จากการ compile แล้ว. เราก็จะมาโปรแกรม DECA ต่อ

21.1 เปิด Quartus II Programmer จาก Tool -> Programmer หรือ ดับเบิ้ลคลิก บน Program Devices จาก Tasks pane. เนื่องจากเรายังไม่ได้ต่อ DECA, หน้าต่าง Programmer จะแสดงหน้าต่าง configuration โล่งๆ.

21.2 ต่อ DECA board มายัง PC ด้วย USB cable. ตรวจสอบให้แน่ใจว่า เชื่อม mini-USB เรียบร้อยแล้ว เนื่องจากเราได้ลง USB Blaster II driver ได้ลงเรียบร้อยแล้ว. Windows Device Manager ควรจะแสดง ดังรูป

� เราควรจะเห็น แสดง LED บางส่วนแสดงขึ้นมาบน DECA รวมถึง blue LED 3.3V และ green LED ที่ label ไว้ว่า CONF_D

21.3 ในหน้าต่าง Programmer, เลือก Hardware Setup และดับเบิ้ลคลิก Arrow MAX10 DECA entry ใน Hardware pane. Currently selected hardware: ควรเป็น ดังรูป

21.4 คลิก “Add File..” เลือกไปยัง “<project_directory>/output_files/“ ใน compilation directory. เลือกไฟล์ gesture_lab_top.sof

21.5 ตรวจสอบให้แน่ใจว่า หน้าต่าง Programmer แสดงถูกไฟล์ และ JTAG ถูกต้อง

21.6 ตรวจสอบให้แน่ใจนะ Program/Configuration checkbox ได้ checked เรียบร้อยแล้ว และ คลิก Startเพื่อเริ่ม DECA. เราควรจะเป็น CONF_D LED ทำการกระพริบ เป็นการบ่งบอกว่าทำการ configuration เรียบร้อยแล้ว และ progress bar เป็น 100%

22. เปิด Nios II Software Build Tools for Eclipse

22.1 จากหน้าต่างหลักของ Quartus, เปิด SBT จาก Tools -> Nios II Software Build Tools for Eclipse

22.2 สร้าง workspace ตามที่ๆเราต้องการ เช่นดังรูป

23 สร้าง New Software Project 23.1 เลือก File -> New -> Nios II Application and BSP from Template

23.2 คลิก “...” และเลือก deca_top.sopcinfo จาก project directory และเรียก โปรเจค lab_work. เลือก Blank Project จาก templates section. ตรวจสอบว่า settings ต่างๆเป็นดังรูป

23.3 Eclipse จะสร้าง 2 directories ใน workspace ; สำหรับ application และอีก directory สำหรับ BSP. ใน BSP directory (lab_work_bsp) จะมี software drivers, system.h, source code เริ่มต้น และ software ของ infrastructure ต่างๆ

24 เพิ่ม Source Code ไปยัง Project

24.1 เปิด Folder <project_directory>/sw_src/. ก๊อบไฟล์ C source และ headers ไฟล์ไปยัง lab_work ใน eclipse และ click “OK”

25 Configure the Board Support Package

25.1 คลิกขวา folder lab_work_bsp เลือก Nios II -> BSP Editor จาก popup-menu

25.2 เมื่อ Nios BSP Editor เปิดขึ้นมา ในหน้าต่าง Main-> Settings -> Common ตรวจสอบว่าเป็นดังรูป

25.3 คลิกปุ่ม “Generator” เพื่ออัพเดท BSP และ เลือก File -> Exit เพื่อปิด หลังจาก ที่ generate เสร็จแล้ว

25.4 แก้ BSP Settings ส่วนที่เหลือ. คลิกขวาที่ lab_work_bsp เลือก Properties

25.5 ในหน้าต่าง Properties เลือก Nios II BSP Properties tab. เลือก Optimization Level เป็น 2 enable “Reduced device driver” และ disable “Support C++” เนื่องจากเราไม่มีการใช้ C++ ในที่นี้

25.6 เลือก Apply และ คลิก “OK”

26 Configure the Application Project

26.1 คลิกขวาที่ lab_work และเลือก properties เลือก Nios Application Properties tab และเลือก Optimization Level เป็น 2

� 26.2 เลือก Apply และ กด OK

27 Build the Software Project สร้าง executable ไฟล์ที่ใช้ในการรันบน DECA

27.1 คลิกขวาที่ lab_work_bsp เลือก Build Project

27.2 คลิกขวาที่ lab_work เลือก build project

� ถ้าหากไม่มี errors แปลว่า เราได้ compiled สำเร็จเรียบร้อยแล้ว

28 Download executable to the DECA

28.1 คลิกขวาที่ lab_work เลือก Run As -> Nios II Hardware

Note: ถ้าหากหน้าต่าง Run Configuration dialogue ปรากฏขึ้นมา เราอาจจะต้อง คลิก Target Connection tab และ คลิก “Refresh Connections”. และ คลิก Run

28.2 หลังจากผ่านไปซักพัก Nios II Console จะเปิดขึ้นมาที่ข้างล่างของโปรแกรม Eclispe

� 28.3 ทำการพลิก board ให้ MAX10 หันหน้าลง

28.4 ทำการขยับมือ หลัง DECA โดยห่างประมาณ 2-3 นิ้ว จาก board โดยทำมุม 90 องศา จากขอบของ board. โดยการขยับมือแต่ละครั้งประมาณ 0.5 วิ ก็ควรจะเห็น ข้อความขึ้นในหน้าต่าง console

เชื่อมต่อ LED เข้ามาในระบบ แล้วให้การแสดงผลของ Gesture sensor ไปปรากฏที ่ LED โดยให้กําหนด

29 ทำแบบฝึกหัดต่อไปนี้เพื่อทดสอบว่านิสิตเข้าใจเรื่องการเชื่อมต่อและการโปรแกรม

สร้างโค๊ดไบนารีที่จะใช ้ LED แสดงผลแทน UP DOWN LEFT RIGHT ด้วยตนเอง

Recommended