วันจันทร์ที่ 6 มิถุนายน พ.ศ. 2559

รายงานความก้าวหน้าฉบับสมบูรณ์

รายงานความก้าวหน้าฉบับสมบูรณ์

วิชา 010123109 Computer Organization
ชื่อโครงงาน : MIPS 32 CPU

วัตถุประสงค์ของโครงงาน(มินิโปรเจค)
- ศึกษาการใช้งาน CPU ที่ใช้สถาปัตยกรรมแบบ MIPS 32 บิต และ เป็น Open hardware IP core คือ CPU32 MIPS
- ทดลองสร้างระบบตามตัวอย่างที่มีอยู่ในเว็บไซต์ โดยนำมาทดลองกับบอร์ด FPGA ที่มีอยู่ในห้องแล็ป
- บอร์ด Altera Cyclone III

- สาธิตการทำงานโดยใช้โค้ดตัวอย่าง หรือสร้างตัวอย่างขึ้นมาเอง เพื่อสาธิตการทำงานของฮาร์ดแวร์และโค้ดตัวอย่าง (โค้ดอาจเขียนด้วยภาษา C หรือ Assembly ก็ได้) อย่างน้อยหนึ่งตัวอย่าง

ตัวอย่างสาธิตการทำงาน
คำนวณ และแสดงค่า Fibonacci Number บน 7Segment LED 

แนวทางการดำเนินการ
-แบ่งกลุ่มการทำงานไม่เกินกลุ่มละ 3 คน
- เขียน web blog นำเสนอรายงานความก้าวหน้าทุกสัปดาห์
- ส่งงานและสาธิตการทำงานสัปดาห์ถัดไปหลังช่วงสอบปลายภาค
- คะแนนของหัวข้อมินิโปรเจคนี้ คิดเป็น 20% ของคะแนนรวม 100%

ความรู้พื้นฐานที่เกี่ยวข้อง
CPU32
        CPU32 คือ ระบบ CPU ที่ทำงานตามสถาปัตยกรรมแบบ MIPS สำหรับบอร์ด FPGA
มีฟังก์ชั่นการทำงานดังนี้
- สามารถทำงานได้ตามชุดคำสั่ง MIPS เช่น คำสั่งพื้นฐานทางคณิตศาสตร์ คำสั่งเงื่อนไขต่างๆ
- รัน MIPS ได้จาก โปรแกรมภาษา C พื้นฐาน
- 32KB RAM (จาก Block RAM ของ Cyclone III)
- I/O : 7-seg LEDs สำหรับ เอาท์พุท , sw3 - sw0 สำหรับ อินพุท

ภาพตัวอย่าง CPU32 บนบอร์ด FPGA

บอร์ด FPGA
รูปบอร์ด FPGA ที่ใช้ในการทดลอง

EP3C10E144C8 มีความจุทางลอจิก 10,320 LEs (หรือ ประมาณ 575,800 เกท), RAM 414 Kbits, Build-in Phase Locked Loop 2 ชุด, Embedded Multipliers ขนาด 18 บิตx18บิต จำนวน 23 ชุด และ 9 บิตx9 บิต จำนวน 46 ชุด
         ชิป FPGA เป็นไอซีประเภทหนึ่งที่สามารถนำมาใช้ในการออกแบบวงจรดิจิทัลใดๆตามต้องการ อาจเป็นวงจรที่ถูกคิดค้นขึ้นมาใหม่เพื่อตอบโจทย์ใหม่ๆ หรือออกแบบ "เฉพาะงาน" และสามารถทดสอบการทำงานของวงจรเหล่านั้นโดยใช้ชิปหรือฮาร์ดแวร์จริงได้ โดยไม่ต้องส่งไปผลิตชิปซึ่งมีค่าใช้จ่ายสูง ความยืดหยุ่นในการใช้งานไอซีประเภทนี้มาจากความสามารถในการโปรแกรมสิ่งที่อยู่ภายในชิป FPGA (เป็นการโปรแกรมเชิงฮาร์ดแวร์) ให้ได้วงจรที่ทำงานตามที่ได้ออกแบบไว้ ชิป FPGA จึงเป็นไอซีประเภทที่เรียกว่า Field-Programmable Logic Device
         นับตั้งแต่เริ่มมีการพัฒนาชิป FPGA ในราวปีค.ศ. 1985 จนถึงปัจจุบัน จะเห็นได้ถึงความก้าวหน้าทางเทคโนโลยีในการผลิตชิป รวมถึงความก้าวหน้าเชิงสถาปัตยกรรมของ FPGA อย่างต่อเนื่อง และแม้ว่าหลายคนจะมองว่า ชิปหรือบอร์ด FPGA มีราคาหรือต้นทุนที่สูงกว่าไมโครคอนโทรลเลอร์ และในงานด้าน Embedded Systems ส่วนใหญ่แล้ว ก็สามารถตอบโจทย์ได้โดยใช้เพียงไมโครคอนโทรลเลอร์ การเรียนรู้และใช้งาน FPGA และการออกแบบวงจร "เฉพาะงาน" ยังถือว่าเป็นสิ่งสำคัญ เพราะจะทำให้เข้าใจการทำงานของวงจรดิจิทัลในระดับลอจิกเกต และในระดับสูงขึ้นไป และสำหรับบางโจทย์การออกแบบ ไมโครคอนโทรลเลอร์อาจไม่สามารถตอบโจทย์ได้อย่างเหมาะสม ชิปในปัจจุบันมีหลายตระกูลที่ได้รวม FPGA ไว้กับไมโครโปรเซสเซอร์ (CPU cores ซึ่งอาจมีมากกว่าหนึ่ง) ในชิปเดียวกัน เป็นการรวมจุดเด่นของทั้งสองตัวเลือกเข้าไว้ด้วยกัน แต่ในขณะเดียวกันก็เป็นการสร้างความท้าทายสำหรับนักออกแบบและพัฒนาเช่นกันที่จะต้องเข้าใจวิธีการ ขั้นตอน และเครื่องมือที่ใช้ในการออกแบบที่มีความซับซ้อนมากขึ้น


Fibonacci Number
         จำนวนฟีโบนัชชี หรือ เลขฟีโบนัชชี (อังกฤษ: Fibonacci number) คือจำนวนต่าง ๆ ที่อยู่ในลำดับจำนวนเต็มดังต่อไปนี้
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946 ... (ลำดับ OEISA000045)
         โดยมีนิยามของความสัมพันธ์ว่า จำนวนถัดไปเท่ากับผลบวกของจำนวนสองจำนวนก่อนหน้า และสองจำนวนแรกก็คือ 0 และ 1 ตามลำดับ และลำดับของจำนวนดังกล่าวก็จะเรียกว่า ลำดับฟีโบนัชชี (อังกฤษ: Fibonacci sequence)
หากเขียนให้อยู่ในรูปของสัญลักษณ์ ลำดับ Fn ของจำนวนฟีโบนัชชีนิยามขึ้นด้วยความสัมพันธ์เวียนเกิดดังนี้
Fn = Fn-1 + Fn-2
โดยที่
F0 = 0 , F1 = 1
         ชื่อของจำนวนฟีโบนัชชีตั้งขึ้นเพื่อเป็นเกียรติแก่นักคณิตศาสตร์ชาวอิตาลีชื่อ เลโอนาร์โดแห่งปีซา (Leonardo de Pisa) ซึ่งเป็นที่รู้จักกันในนามฟีโบนัชชี (Fibonacci) ผู้ค้นพบจำนวนฟีโบนัชชีในต้นศตวรรษที่ 13

Code ที่ใช้ในการทำงาน
- Code ในการแสดงค่าตัวเลขบน 7-segments LED ตั้งแต่ 0-9 และ A-F

- Code ภาษา c ที่ใช้คำนวณค่าของเลข Fibonacci ในแต่ละครั้ง

- สำหรับ code ส่วนอื่นๆ ดาวน์โหลดที่https://github.com/kazunori279/CPU32/blob/master/README.md

อุปกรณ์ที่ใช้ในการทำงาน
1. USB BLASTER

2. ALTERA CYCLONE III FPGA

3. 7-SEGMENT LED

4. สายไฟ

ขั้นตอนการทดลอง
1. ใช้โปรแกรม Altera ในการเขียนโค้ดตัวอย่างเพื่อใช้ในการทำงานทดลอง
2. ลงโปรแกรมที่เป็นโค้ด vhdl ลงบนบอร์ด FPGA
3. กำหนด PIN ของ input และ output ที่เป็นตัว LED และสวิตซ์ ดังนี้

4. ต่อวงจรตามรูป ดังนี้

ผลการทดลอง
         สาทิตการทำงานของ CPU32 MIPS ด้วย code ภาษา C ที่จะแสดง Fibonacci Number ตามลำดับ
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946 ...
โดยใน code กำหนดให้แสดงตัวเลขฐาน 16 จำนวน 4 digits แต่การทดลองต่อแสดงแค่ 2 digits


รายงานความก้าวหน้ามินิโปรเจคครั้งที่ 2

รายงานความก้าวหน้ามินิโปรเจคครั้งที่ 2

วัตถุประสงค์ที่ได้ดำเนินการไปแล้ว
1.ทดลองใช้ plasma CPU บน Xilinx ISE WebPACK 
การทำงานของ plasma cpu โดยจะมีหลายส่วนประกอบเพื่อนำมารวมกันกลายเป็นตัว cpu ที่เราใช้งานโดยประกอบไปด้วยหลายไฟล์มาประกอบกันกลายเป็นตัว plasma โดยส่วนที่นำมาประกอบกันจะได้อย่างรูปนี้

Plasma_3e.vhd
          ในส่วนนี้จะเป็นการทำงานนำส่วนนี้เป็นส่วนประกอบของตัวอื่นมาทำการเชื่อมต่อกันโดยจะมีการ reset การทำงานของ clk โดยถ้าขา reset เป็น 1 จะทำให้ค่า clk_regเป็น 0
Plasma.vhd
          ในส่วนของไฟล์นี้นั้นจะเป็นการทำงานของตัว plasma core โดยมี memory เพื่อช่วยในการทำงานด้วยโดยการทำงานจะเป็นการ port mapมาจากไฟล์ milte_cpu ในส่วนของการคำนวณในการทำงานคำสั่งๆต่างๆที่ทำใส่ cpu และมีการใช้ ram จากไฟล์ram_xilinx และมีการใช้คำสั่งใช้ Ethernet ได้และมีการเชื่อมต่อผ่าน uart
Mlite_cpu.vhd
จะเป็นส่วนที่ไว้บอกเส้นทางของข้อมูลว่าส่วนประกอบอันไหนเชื่อมโยงกะส่วนประกอบอันไหนลีการกำหนดคำสั่งการทำงานต่างๆของแต่ละส่วนประกอบด้วยโดยจะมีการกำหนดการทำงานของ pipeline ซึ่งเดิมทีละจะทำทีละ 2 คำสั่งมีการสามารถเปลี่ยนเป็น3 ได้แต่ว่าจะมีสัญญาณบางสัญญาณที่เกิดการหน่วงเวลาไป 1 cycle ซึ่งได้แก่ a_bus, b_bus, alu/shift/mult_func, c_source, and rd_index
Pc_next.vhd
เป็นส่วนที่ชี้ที่อยู่ของคำสั่งถัดไปให้ไปทำโดยจะไปส่งให้ตัวส่วนที่เป็น mem_ctrl
Mem_ctrl.vhd
เป็นส่วนไว้เก็บค่าที่อยู่ของคำสั่งที่ได้รับมาจากตัว program counter โดยสามารถมีการ pause ไว้ได้โดยจะทำงานคำสั่งเดิมซ้ำลงไปละถ้ามีการ reset ก็จะให้เป็น 0 เลย ถ้าไม่มีอะไรก็ส่ง opcode ต่อไปที่ control.vhd

Control.vhd
เป็นส่วนที่เอาส่วน opcode มาจำแนกเป็นการใช้งานคำสั่งต่างๆขึ้นอยู่กับว่ามี opcode อะไรก็จะให้ทำงานตามนั้นโดยจะเหมือนกับส่วนควบคุมพฤติกรรมการทำงานนั่นเอง
Reg_bank.vhd
เป็นส่วนที่ไว้เก็บตัว register และมีการรับค่าเข้ามาเพื่อดูว่า register ที่ต้องการใช้เป็นตัวไหนละมีการเก็บเป็นค่า address เอาไว้โดยถ้าจะต้องการใช้ก็บอกaddress มาจะสามารถเขียนข้อมูลลงไปหรืออ่านข้อมูล ทำหน้าที่เหมือน RAM
Bus_mux.vhd
เป็นส่วนไว้ทำการรวมสัญญาณที่มาจากต่างส่วนประกอบมาทำการรวมกันให้สามารถทำงานได้อย่างถูกต้อง
Alu.vhd
เป็นส่วนที่ใช้คำนวณทางคณิตศาสตร์
Shifter.vhd
เป็นส่วนที่ใช้ทำการเลื่อนบิตข้อมูล
Mult.vhd
เป็นส่วนที่ไว้ใช้คำนวณการคูณการหาร
Pipeline.vhd
เป็นส่วนที่ควบคุมการทำงานที่พร้อมกัน


การทดลอง
ได้ทำการโหลดไฟล์ที่เป็น Source Code มาจากเว็บไซต์ OpenCores แล้วนำทำการทดลองในโปรแกรม XillinxISE Design 14.7 โดยได้ทำการสร้างโปรเจคใหม่ละทำการ import ไฟล์ใส่เข้าไปเรียบร้อยละตอนแรกมันจะเรียกถามหาไฟล์ Ram_image ให้ใส่ไฟล์ ram_xilinx ลงไปแทนทำให้สามารถทำงานได้เหมือนกันแต่ว่าถึงจะคอมไพล์ผ่านแต่ว่าติด warning เยอะ

ภาพตอนเสร็จสิ้นการคอมไพล์

แหล่งข้อมูล : http://opencores.org/project,plasma
                     : http://plasmacpu.no-ip.org:8080/cpu.htm

2.ทดลองเขียนโค้ดโดยใช้โปรแกรมArduino และโปรแกรมลงบอร์ด Xilinx Spartan 3E-500 Starter Kit
-ทำการโหลดโปรแกรม Arduino จากเว็บไซต์ https://www.arduino.cc/en/Main/Software
-จากนั้นทำการติดตั้งโปรแกรมและเข้าโปรแกรม ไปที่ tool>board>board manager หาคำว่า FPGArduino และทำการติดตั้ง
-จากนั้นทำการตั้งค่าตามรูปข้างใต้

-เขียนโค้ดทดลองเข้าไปในโปรแกรมและ compile จากรูปจะเห็นมีชื่อบอร์ด FPGA อยู่



แหล่งข้อมูล : http://www.nxlab.fer.hr/fpgarduino/

รูปภาพการทดลอง



ผลการเรียนรู้ที่ได้รับ
          -ได้เรียนรู้วิธีการทำงาน รวมไปถึงโครงสร้าง block diagram ภายใน Plasma CPU
-ได้ศึกษาการทำงานของบอร์ด Mojo v3 (Xilinx Spartan-6) เพื่อนำไปประยุกต์ใช้กับตัว Plasma CPU

ปัญหาหรืออุปสรรคและการแก้ไข
-เวลาทดลองเขียนโค้ดจะเกิดจุด bug หรือ error ในการ compile
วิธีการแก้ไข : หาจุดที่ผิดและเขียนโค้ดลองดูใหม่อีกครั้งหรือหาข้อมูลมาควบคู่การเขียนโค้ดไปด้วย
-โปรแกรมลงบอร์ดไม่เข้าหรือบอร์ดไม่ได้รับโค้ดจากคอมพิวเตอร์ของเรา
วิธีการแก้ไข : ทำการแก้ชื่อบอร์ด รุ่นต่างๆ และทำการลงไดรเวอร์ของบอร์ดนั้นๆหรือหาโปรแกรมที่สามารถใช้เชื่อม หิ ของบอร์ดเข้าที่คอมพิวเตอร์ได้ อย่างเช่น โปรแกรม Zadig