วันอังคารที่ 9 กรกฎาคม พ.ศ. 2556

โปรเจค PCI card ตอนที่ 5 PCI driver for windows

โปรเจค PCI card ตอนที่ 5 PCI driver for windows


วิธีการดีบัก PCI card ในระบบ windows นั้นมีโปรแกรม windriver (http://www.jungo.com) ผมใช้ตัวทดลอง เมื่อเปิดโปรแกรมขึ้นมาจะสามารถเลือก card ที่เราต้องการ acess ได้ รูปด้านล่างเป็นรูปตอนทดสอบผ่าน windriver


เมื่อเราทดสอบผ่าน windriver ว่า PCI card ที่ทำขึ้นมานั้นสามารถทำงานได้แล้ว จากนั้นก็ต้องมาทำ driver บน windows ซึ่งสามารถทำได้โดยการใช้ WDK (Windows Driver Kit) รูปด้านล่างเป็นผลจากการรัน WDK 


เมื่อสร้าง driver ได้แล้วถ้าลองลงดูจะพบว่า เราจะเห็น device ของเราผานทาง device manager ของ windows ครับ




โปรเจค PCI card ตอนที่ 4 PCI driver for linux

โปรเจค PCI card ตอนที่ 4 PCI driver for linux


การจะเขียน driver ต้องเข้าใจภาพรวมก่อน ภาพรวมระบบจะเป็นดังภาพด้านล่าง นั้นคือ PC จะสั่งงาน ADC , DAC, DIO ไปที่ FPGA (ผ่านทาง PCI bus) จากนั้น FPGA จะเอาค่าต่างๆ ที่ ได้รับมา ไปสั่งงาน ADC, DAC, DIO อีกทีนึง



การจะให้ PC คุยกับ PCI card ให้รู้เรื่องนั้น มีสิ่งสำคัญแค่ 2 อย่างเท่านั้นคือ
1. Vendor ID, Device ID
ตัวนี้จะเป็นตัวบอกว่า จะให้ PC ไปติดต่อสื่อสารกับ Card ตัวไหน
2. Memory map
memory map นั้นเรา(ผู้สร้างระบบ)จะเป็นคนกำหนดขึ้นมาเอง จะเป็นข้อกำหนดว่า ถ้าจะสั่งงานอะไร ต้องส่ง data ไปที่ address ไหน รูปด้านล่างเป็น memory map ของ card ตัวนี้ที่ผมกำหนดขึ้นมา



เมื่อเราสร้าง driver ได้แล้ว พอ Insmod เราจะเจอ driver ของเราดังรูปด้านล่าง


เมื่อเราสร้าง driver ขึ้นมาได้ ถ้าเรา access ตาม memory map ที่เราสร้างขึ้นก็จะสามารถ ควบคุม ADC, DAC, DIO ได้ตามที่เราต้องการแล้ว รูปด้านล่างเป้น test program ที่ทำขึ้นมาจาก QT ครับ



โปรเจค PCI card ตอนที่ 3 ออกแบบ FPGA

โปรเจค PCI card ตอนที่ 3 ออกแบบ FPGA


ในตอนนี้ผมจะขอพูดแค่การออกแบบ FPGA สำหรับทำให้เป็น PCI card เท่านั้นนะครับ ส่วนการออกแบบให้ลง NIOS2(Soft core CPU) นั้นจะพูดอีกทีในตอนต่อๆไป

1. PCI interface
วิธีการ
  1. ช้ IP core ที่ Altera มีมาให้
  2. เขียน PCI interface ด้วย VHDL หรือ Verilog ด้วยตัวเอง 
ผมเลือกแบบที่ 2 ครับ ที่เลือกแบบที่ 2 นั้นก็เพราะท้ายสุดจะเอาบอร์ดนี้ให้ คนทั่วไปหรือนักศึกษาเอาไปเรียนรู้ ถ้าคนเอาไปแล้วยังต้องไป crack หรือต้อซึ่ง IP core มันจะทำให้ลำบากเกินไป
แต่ที่บอกว่า เขียน PCI interface ด้วย VHDL code เองนั้น ผมก็ไม่ได้เขียนเองหรือเผอิญ(อีกแล้ว)เจอหนังสือเล่มนึงสอนเขียน VHDL code แล้วเค้าก็มีตัวอย่าง code มาให้ด้วยมาลิงค์นี้เลยครับ http://www.cqpub.co.jp/hanbai/books/33/33361.htm อาจจะลำบากหน่อยเพราะเป็นภาษาญี่ปุ่น แต่ไม่เป็นไร เอาเราแค่โค้ดส่วนที่เป็น PCI interface มาใช้

2. Peripheral interface

1. DAC
MCP4922
เขียนทีเดียว 4 channel

2. ADC
MCP3208
อ่านทีเดียว 8 channel

3. DIO
อันนี้เป็นแค่ ออก output High/Low อย่างเดียว


 3. Simulation

สำคัญที่สุดคือ การ simulation ครับ โค้ด PCI interface ที่เราเอามาจะรู้ได้ยังไงว่าใช้ได้จริง ก็ต้องมาลอง simulate ดูครับ รูปข้างล่างเป็นรูปผล simulate รูปนี้เป็นการ sim ให้ สั่งงาน ADC ผ่าน PCI bus ครับ สังเกตุว่าเมื่อมีสัญญาณจาก PCI (ad, cben . ... etc ) จะมีสัญญาณออกทาง ADC (ADC_DIN, ADC_CLK ,... etc)



ส่วนรูปนี้ขยายจากรูปข้างบนอีกทีครับ


4. Memory map

จากข้อ 3 เราสามารถสื่อสารกันผ่านทาง PCI bus ได้แล้ว มาถึงการออกแบบจริง จำเป็นต้องมีสิ่งที่เรียกว่า memory map เพราะจะเป็นตัวบอกว่า เราจะสั่งงานอะไรต้อง data ไปที่ address  ไหน ข้างล่างเป็น memory map ที่ผมได้กำหนดขึ้นมาคร่าวๆ ไว้ครับ











วันพฤหัสบดีที่ 14 มีนาคม พ.ศ. 2556

โปรเจค PCI card ตอนที่ 2 Aries Board Version A.1 คลอดแล้ว...



โปรเจค PCI card ตอนที่ 2 Aries Board คลอดแล้ว...


1. หน้าตาบอร์ด

ในที่สุดก็ออกมาได้แล้วครับ Aries boardวอร์ชั่นนี้ให้เป็น Version A.1 ก่อนละกันครับ เผื่อมีแก้อะไรจะอัฟเวอร์ชั่นอีกที ดูหน้าตาบอร์ดเลยละกันครับ




2. Board specification

spec ของบอร์ดเป็นแบบนี้ครับ

Tile
Specification
Note
FPGA
Cyclone II 5000 LE (EP2C5Q208C8)

Memory
SDRAM                              : 256Mbit
FPGA config ROM           : 4Mbit
Serial Flash memory          : 4Mbit

PCI interface
32 bits 66MHz/33MHz
Default: 33Mhz
ADC
12 bits / 8 Channels (MCP3208 x 1)

DAC
12 bits / 4 Channels (MCP4922 x 2)

Digital I/O
16 Channels

RS232
1 Channel

LED
8 bit
Share with VGA
VGA
8 bit (RGB:222)
Share with LED
Swtich
Tact SW       x3
Slide SW      x 4

Input power
5V



ส่วน้ายบนที่เห็นมี USB connector ด้วยนั้น ริงมันคือ USB blaster ตัว clone ครับ อาวงจรและ firmware มาจากเวปนี้ครับ http://sa89a.net/mp.cgi/ele/ub.htm เนื่องจากผมรู้สึกว่าถ้าได้แต่บอร์ดแต่ต้องหาตัวโปรแกรม FPGA(USB Blaster) ีกซึ่งราคาในบ้านเราก็ขายกันกัน 1พันกว่าบาท จะทำให้คนที่อยากเรียนรู้ ต้องเสียตังค์เพิ่มเพื่อซื้อ USB blaster ีก และเผอิญมาเจอเวปนี้เข้าเห็นเข้าท่าดีเลยลองเอามาไว้บนบอร์ดดู


ตอนนี้เท่าที่ test อยู่ config FPGA ได้ไม่มีปัญหา ลองลง NIOS2 เล่นๆ ได้รันได้ไม่มีปัญหา ทีนี้ก็เหลือแค่ลอง test ฟังค์ชั่นการทำงานเป็น PCI card แล้วละครั





วันจันทร์ที่ 11 มีนาคม พ.ศ. 2556

โปรเจค PCI card ตอนที่ 1: กำเนิดโปรเจค ARIES Board...



โปรเจค PCI card ตอนที่ 1: กำเนิดโปรเจค ARIES Board... 





1. เกรินนำ

เนื่องมาจากเมื่อปีที่ผ่านมาผมได้ลองคิดว่า FPGA น่าจะนำมาทำอะไรได้บ้างและควรจะเอาใช้งานได้ไหนดีเท่าที่สรุปได้ในตอนนี้ก็คือ ควรจะเอามาทำเป็นตัวขยาย peripheral เนื่องจากการจะเอาไปทำงานแข่งกับพวก CPU หรือ microcontroller นั้นมีข้อด้อย 2 ส่วนคือ
  1. ด้านราคา FPGA แพงกว่า
  2. เวลาที่ใช้ในการออกแบบ CPU, microcontroller ใช้เวลาออกแบบน้อยกว่ามาก
ข้อด้อยสำคัญสุดคือ เรื่องราคา ในเมื่อราคา FPGA ยังไงมันก็แพงกว่า microcontroller อยู่แล้ว
ส่วนเรื่องแข่งกับ CPU ได้หรือไม่นั้น เท่าที่คิดตอนนี้คือ CPU อย่างพวก OMAP นั้นกินขาดกว่าอยู่แล้ว ยกเว้นแต่งานประเภทเฉพาะด้านจริงๆ อย่างการคำนวนที่จำเป็นต้องทำเป็น pipe line (จริงๆ CPU ปัจจุบันก็เก่งมากแล้วด้วยดีไม่ดีอาจจะทำการคำนวนได้ดีกว่าก็เป็นไปได้ ) ถ้าใครเคยลองออกแบบ FPGA ออกแบบไปแล้วบ้างอาจจะไปเจอ ความจริงที่ว่าออกแบบดียังไงมันก็ทำงานไม่ได้เกิน 100MHz (ไม่นับพวก FPGA ระดับ ไฮโซ เพราะยังไงราคาเอื้อมไม่ถึงอยู่แล้ว)

จากเหตุผลข้างบน สิ่งที่ FPGA จะเอามาสู้ได้ก็คือ อะไรที่ CPU, microcontroller ไม่สามารถทำได้ แต่ FPGA ทำได้ เลยกลายเป็นข้อสรุปว่าทำ PCI card ดีกว่า(เป็นของที่คิดว่าน่าจะใกล้ตัวที่สุด) และผมก็ให้ชื่อบอร์ดนี้ว่า ARIES Board
เนื่องจากต้องการทำให้บอร์ดนี้เป็น development board ไปในตัวด้วย ดังนั้นจึงได้กำหนดฟังค์ชั่นการใช้งานไว้ 2 โหมดคือ
1. PCI card
2. Stand alone (ไม่ได้ใช้เป็น PCI card) ซึ่งสามารถเอาไปทดลองการใช้งาน soft CPU NIOS2


ทำไมถึงไม่เลือก PCI express
  1. อย่างแรกสุด ความสามารถไม่พอ พวก PCI express จำเป็นต้องไปยุ่งเกี่ยวกับการส่งข้อมูลแบบ serial ความถี่สูง (2.5GHz) serial ความถี่สูงที่ใช้ใน PCI express นั้น ถ้าจำไม่ผิดน่าจะใช้พื้นฐานมาจาก LVDS (Low Voltage Differialtial Signal) ซึ่งมีส่วนสำคัญอยู่ 2 ส่วนหลักๆคือ การออกแบบ PCB (จำเป็นต้องระวังเรื่อง characteristic impedance) และการออกแบบ logic(VHDL)
  2. FPGA ที่มี PCI express Hard IP อยู่ในตัวจะเป็น package BGA
  3. จากข้อ 1, 2 การจะสร้าง board นั้นมีความเป็นไปได้ว่าจำเป็นต้องใช้เงินทุนสูงกว่า PCI card แบบธรรมดา ดังนั้น ณ. ตอนนี้ ผมเลยตัดสินใจในการทำ PCI card แบบธรรมดาไปก่อน 


2. เป้าหมายของบอร์ด ARIES Board

  1. เป็นบอร์ดเริ่มต้นสำหรับการเรียนรู้ FPGA
  2. จากข้อ 1 เมื่อสามารถทำความเข้าใจกับ FPGA ได้มากขึ้นพอสมควร การนำ FPGA ไปใช้งานนั้นควรเอาไปใช้งานในที่ที่ microcontroller ไม่สามารถทำงานได้
สิ่งที่ใกล้ตัวสุดเท่าที่คิดได้คือ การนำเป็น PCI card


รูป PCI card



3. กำหนด specification ของ ARIES Board

ฟังค์ชั่นหลักๆที่อยากให้มีคือ
  1. Analog input output
  2. Digital input output
  3. Switch input
  4. VGA (แชร์ร่วมกับ LED)
  5. RS232 ต้องมีไว้หน่อย
ในส่วน Analog I/O, Digital I/O นั้นจะเป็นส่วนที่ใช้สำหรับการใช้งานเป็น PCI card ตัว FPGA หลักที่จะนำมาใช้คิดว่าจะใช้ Cyclone II ของ Altera ดังนั้น spec คร่าวๆ น่าจะเป็น
FPGA: Altera Cyclone II 5000LE
DIO 16Channel
ADC 12bit
DAC 12bit
SDRAM 256MBit
Serial flash 4MBit


4. สิ่งที่คาดหวัง

โปรเจคนี้จะไม่ลงมือทำจริงหรือไม่นั้นยังไม่ทราบเหมือนกัน แต่ที่เอาลงบล็อกนั้นเป็นสิ่งที่ผมอยากจะให้เป็นการกระตุ้นตัวเองไปอีกทางหนึ่ง อย่างน้อยเพื่อผลักดันตัวเองให้ออก ARIES Board นี้มาให้ได้ ใครสนใจก็ติดตามต่อตอนไปละกันครับว่ามันจะออกมาเป็นในรูปแบบไหน 
ท้ายสุดแล้วผมตั้งใจอยากขายบอร์ดนี้เพื่อให้นักศึกษาเอาไปใช้เรียน FPGA ด้วยครับจะได้รู้สึกว่า FPGA มันทำอะไรได้มากกว่าที่เราคิดไว้เยอะ