การทดลองใช้งานบอร์ด Mojo v3 - Xilinx Spartan 6 FPGA (legacy)#


บอร์ด Mojo v3 FPGA#

บอร์ด Mojo v3 FPGA ของบริษัท Alchitry Labs (Embedded Micro) เป็นบอร์ดที่มีชิป Xilinx Spartan-6 FPGA และ MCU (Atmel ATmega32U4) อยู่บนบอร์ด บอร์ดนี้ได้มีการระดมทุนสร้างโดยเปิดเป็นโครงการใน KickStarter ในปีค.ศ. 2013

รูป: บอร์ด Mojo v3

ผู้เขียนได้เคยทดลองใช้บอร์ดนี้ครั้งแรกในช่วงประมาณปีพ.ศ. 2557 ในปัจจุบัน (ขณะที่กำลังเขียนบทความนี้) ดูเหมือนว่า ซอฟต์แวร์ "Xilinx ISE Design Suite - WebPACK" ของบริษัท Xilinx ที่จะต้องนำมาใช้ในการออกแบบวงจรสำหรับบอร์ด Mojo V3 ไม่ได้มีการอัปเดตมาตั้งแต่ปีค.ศ. 2013 (เวอร์ชันสุดท้ายคือ v14.7) และทางบริษัท Embedded Micro ก็ไม่ได้มีการจำหน่ายบอร์ดนี้อีกแล้ว

วัตถุประสงค์ของการเขียนบทความนี้คือ การรวบรวมข้อมูลเกี่ยวกับการใช้งานบอร์ด Mojo v3 และทดลองใช้งานอีกครั้ง (หลังจากที่ไม่ได้ใช้มาหลายปี)

ข้อมูลเชิงเทคนิคสำหรับบอร์ด Mojo v3 มีดังนี้

  • FPGA: Xilinx Spartan-6 XC6SLX9-TQG144-2C
    • Logic Cells: 9,152 (1,430 Slices / 5,720 6-input LUTs)
  • MCU: Atmel ATmega32U4 (8-bit AVR, 3.3V @8MHz, Mojo v3 bootloader)
  • Serial Flash: 4MBits (Microchip SST25VF040B-80-4I)
  • I/O Voltage: 3.3V only (all I/O Banks)
  • LDO Voltage Regulators:
    • 5V to 3.3V: NCP1117ST33
    • 3.3V to 1.2V: LD1117S12
  • 1x Push Button (Reset)
  • 8x LED (SMD, yellow-color)
  • 1x Micro USB Connector
  • Voltage Supply:
    • +5V via the USB Connector
    • +4.8 ~ +12V via DC Jack (5.5x2.1mm Barrel, center-positive)
  • On-board Oscillator: 50MHz
  • Software: Xilinx ISE WebPACK
  • Schematic (.pdf)

รูป: ผังวงจร (เลือกมานำเสนอบางส่วน) ของบอร์ด Mojo v3

รูป: โหมดในการโปรแกรมชิป Spartan 6 (Source: Xilinx)

หากศึกษาจากซอร์สโค้ด mojo-arduino จะทำให้เข้าใจขั้นตอนการทำงานของเฟิร์มแวร์ ได้ดีขึ้น

รูป: Github Repo สำหรับซอร์สโค้ด mojo-arduino.ino

รูป: การโปรแกรมชิป FPGA ในโหมด SelectMap โดยใช้ไมโครคอนโทรลเลอร์ (Source: Xilinx)

เมื่อเปิดไฟเลี้ยงและฮาร์ดแวร์เริ่มทำงาน เฟิร์มแวร์ Mojo Loader ในชิป ATmega32U4 จะเริ่มต้นอ่านข้อมูล "บิตสตรีม" จากชิปหน่วยความจำแฟลช (Loading Bitstream from Serial Flash) มาใช้ในการโปรแกรมชิป FPGA ให้ทำงานได้ตามวงจรดิจิทัลที่ผู้ใช้ได้ออกแบบไว้

เมื่อเฟิร์มแวร์ในชิป ATmega32U4 ได้ทำขั้นตอนการโปรแกรมชิป FPGA เสร็จสมบูรณ์แล้ว จากนั้นจึงรอการเชื่อมต่อผ่านทาง USB และตรวจสอบว่า มีการเชื่อมต่อมาจากคอมพิวเตอร์ผู้ใช้ เพื่อโปรแกรมชิป ถ้าเป็นกรณีนี้ ก็จะเข้าสู่โหมดการโหลดข้อมูลและเขียนข้อมูลไปยังหน่วยความจำ ซึ่งมีสองกรณีคือ

  • การเขียนข้อมูลลงใน SRAM-based Configuration Memory จะใช้โหมดที่เรียกว่า MCU-driven 8-bit SelectMAP Configuration โดยใช้ขาสัญญาณระหว่าง MCU เชื่อมต่อกับ FPGA ดังนี้
    • PD5 --> INIT_B
    • PC7 --> PROGRAM_B
    • PC6 <-- DONE
    • PD0 --> CCLK
    • PB7..PB0 --> D[7..0]
  • การเขียนข้อมูลลงในชิปหน่วยความจำ Serial Flash ใช้ขาสัญญาณเชื่อมต่อระหว่าง MCU กับชิปหน่วยความจำ ดังนี้
    • PB1 --> SPI_SCK
    • PB2 --> SPI_MOSI
    • PB3 <-- SPI_MISO
    • PD1 --> CS_FLASH

แนะนำให้ศึกษาในรายละเอียดเพิ่มเติมเกี่ยวกับการโปรแกรมชิป Spartan-6 FPGA จากเอกสารของผู้ผลิต: "UG380 Spartan-6 FPGA Configuration User Guide"

ข้อสังเกต: ยังมีอีกวิธีหนึ่งที่เลือกใช้ได้สำหรับการโปรแกรมชิป FPGA ก็คือ การใช้ JTAG Interface แต่ต้องใช้อุปกรณ์อย่าง เช่น Xilinx Platform USB Cable

การเขียนข้อมูลใหม่ลงในชิปหน่วยความจำแฟลชที่อยู่บนบอร์ด Mojo v3 จะต้องอาศัยเฟิร์มแวร์ของ Mojo v3 Loader ที่อยู่ในชิป ATmega32U4

เฟิร์มแวร์ในชิป ATmega32U4 ยังมีหน้าที่อีก 2 งาน (เรียกว่า User Tasks)

  • ADC Task: ทำหน้าที่เป็น SPI Master หากมีการส่งสัญญาณมาจากวงจรภายในชิป FPGA เพื่อให้อ่านค่าสัญญาณอินพุต หนึ่งใน 8 ช่องอินพุตที่เลือก (ADC0..ADC7) โดยใช้วงจร ADC ภายในชิป ATmega32U4 แล้วเขียนข้อมูลไปยัง FPGA ดังนั้นจะต้องมีวงจรใน FPGA ที่ทำหน้าที่เป็น SPI Slave เพื่อคอยรับค่าจำนวน 2 ไบต์ จากชิป MCU แล้วนำไปใช้ต่อไป
  • UART Task: ทำหน้าที่เป็นตัวเชื่อมต่อ SerialUSB to Hardware Serial ไปยังวงจรในชิป FPGA สามารถส่งข้อมูลได้ทั้งสองทิศทาง (ถ้ามีการสร้างวงจร UART เอาไว้)

 


การติดตั้ง Mojo v3 Loader ลงใน ATmega32U4#

คำเตือน: ขั้นตอนนี้ไม่จำเป็นต้องทำ ถ้าไม่ต้องการเปลี่ยนแปลงเฟิร์มแวร์เดิม Mojo v3 Loader ที่มีอยู่ในชิป ATmega32U4 ของบอร์ด Mojo v3

เฟิร์มแวร์ในชิป ATmega32U4 หากเป็นรุ่นเก่า ได้มีการติดตั้ง Atmel DFU Bootloader เอาไว้ในหน่วยความจำแฟลชภายในชิป ถ้าเสียบสาย USB เชื่อมต่อบอร์ดกับคอมพิวเตอร์ผู้ใช้แล้ว จากนั้นให้ใช้ลวดสายไฟเชื่อมต่อจุดสัมผัสด้านใต้บอร์ดที่ตำแหน่งขา RST (Reset) ของ ATmega32U4 และ GND ช่วงเวลาสั้น ๆ ก็จะเข้าสู่ Atmel DFU Bootloader แล้วอัปเดตเฟิร์มแวร์ใหม่ได้ (ในส่วนที่เป็น User Application แต่ส่วนที่เป็น Atmel DFU Bootloader จะไม่ถูกเขียนทับ)

ถ้าใช้ Ubuntu Linux ก็สามารถใช้คำสั่ง dfu-programmer ลองเขียนไฟล์ .hex ได้ไม่ยาก

# Check the USB device with VID=03eb and PID=2ff4.
$ sudo lsusb | grep "ID 03eb:2ff4"
Bus 001 Device 083: ID 03eb:2ff4 Atmel Corp. atmega32u4 DFU bootloader

# Install the dfu-programmer.
$ sudo apt install dfu-programmer

# Download mojo-loader firmware from github.
$ FW=mojo-bootloader/raw/master/mojo-v3-loader.hex; \
  wget https://github.com/embmicro/$FW

# Erase on-chip User-Application Flash
$ sudo dfu-programmer atmega32u4 erase 

# Flash the User Application (.hex)
$ sudo dfu-programmer atmega32u4 flash mojo-v3-loader.hex

# Reset the bootloader
$ sudo dfu-programmer atmega32u4 reset

 


การติดตั้ง Arduino-Compatible Bootloader & Mojo v3 Loader#

คำเตือน: ขั้นตอนนี้ไม่จำเป็นต้องทำ ถ้าไม่ต้องการเปลี่ยนแปลง Bootloader เดิมที่มีอยู่ในชิป ATmega32U4 ของบอร์ด Mojo v3

Atmel DFU Bootloader ไม่รองรับการเขียนโค้ดและอัปโหลดด้วย Arduino IDE หากต้องการใช้งาน Arduino-Compatible Bootloader สำหรับ ATmega32U บนบอร์ด Mojo V3 ผู้ใช้จะต้องติดตั้ง Arduino Bootloader ที่มีชื่อว่า mojo-v3-Caterina.hex

ในกรณีจะต้องใช้อุปกรณ์ ISP Programmer ร่วมด้วย อย่างเช่น USBasp (เลือกแรงดันไฟเลี้ยงเป็น +3.3V ไม่ใช่ +5V) และจะต้องทำผ่านทางจุดสัมผัส (Pads) สำหรับ ISP: In-System-Programming (2x3 Pins) ซึ่งอาจจะไม่สะดวกสำหรับผู้ใช้ทั่วไป

# Download the Bootloader file.
$ FW=mojo-bootloader/raw/master/mojo-v3-Caterina.hex; \
  wget https://github.com/embmicro/$FW

# Check the USB device with VID=16c0 and PID=05dc.
$ lsusb | grep "ID 16c0:05dc"
Bus 001 Device 002: ID 16c0:05dc Van Ooijen Technische Informatica

# Install AVRdude program.
$ sudo apt install avrdude

# Use AVRdude to program the firmware file.
$ sudo avrdude -u -c usbasp-clone -p m32u4 \
  -U flash:w:./mojo-v3-Caterina.hex:a \
  -U lfuse:w:0xFF:m -U hfuse:w:0xDF:m -U efuse:w:0xFF:m

เมื่อได้ติดตั้ง Mojo v3 - Arduino-Compatible Bootloader สำเร็จแล้ว ถัดไปให้ผู้ใช้เปิดใช้งาน Arduino IDE และคอมไพล์โค้ด Arduino Sketch ที่มีชื่อว่า Mojo-v3-loader แต่ก็ต้องมีการติดตั้งไฟล์เพิ่มสำหรับ Arduino IDE ดังนี้

  • ติดตั้ง Arduino Mojo Plugin (ไฟล์ arduino-mojo-plugin.zip สำหรับ Arduino IDE (v1.8.x)
  • คอมไพล์โค้ดและอัปโหลด Arduino Sketch "Mojo-v3-loader" ไปยังชิป ATmega32U4 บนบอร์ด Mojo v3 โดยเลือกพอร์ต Serial ที่ตรงกับบอร์ด Mojo v3 ที่กำลังเชื่่อมต่อกับเครื่องของผู้ใช้

รูป: การติดตั้ง Arduino Mojo Plugin สำหรับ Arduino IDE (Windows)

รูป: การคอมไพล์โค้ด Mojo-v3-loader โดยใช้ Arduino IDE (Windows)

รูป: การคอมไพล์โค้ด Mojo-v3-loader โดยใช้ Arduino IDE (Ubuntu)

รูป: การอัปโหลดเฟิร์มแวร์ Mojo-v3-loader ไปยังชิป MCU บนบอร์ด Mojo v3 โดยใช้ Arduino IDE (Ubuntu)

ดังนั้นถ้าหากติดตั้ง Arduino Bootloader ได้สำเร็จและเขียนโค้ดด้วย Arduino IDE ผู้ใช้ก็สามารถปรับเปลี่ยนหรือแก้ไขโค้ดMojo v3 Loader ได้เอง ยกตัวอย่างเช่น การแก้ไขหรือเพิ่มโค้ดในส่วนที่เรียกว่า User Tasks

รูป: โค้ดในไฟล์ mojo-arduino.ino ที่แสดงให้เห็นฟังก์ชัน userLoop() สำหรับ User Tasks

 


การอัปโหลดไฟล์ .bin ไปยังบอร์ด Mojo v3#

ซอฟต์แวร์ที่มีชื่อว่า Alchitry Labs ซึ่งมาพร้อมกับโปรแกรม Alchitry Loader (มีทั้งเวอร์ชันสำหรับ Windows และ Linux) และสามารถนำมาใช้แทนที่ Mojo Loader ของเดิมได้ (ไม่มีให้ดาวน์โหลดแล้ว)

รูป: การติดตั้ง Mojo V3 USB Device Driver สำหรับ Windows 10

รูป: การคลิกเลือกโปรแกรม Alchitry Loaders เพื่อเปิดใช้งาน

โปรแกรม Alchitry Loader จะทำหน้าที่สื่อสารกับโปรแกรม Mojo-v3-loader ในชิป ATmega32U4 และใช้สำหรับโปรแกรมไฟล์ .bin ลงในหน่วยความ SRAM-based Configuration Memory ภายในชิป FPGA โดยตรง หรือ โปรแกรมลงในชิปหน่วยความจำภายนอกซึ่งเป็น SPI Flash การเลือกวิธีโปรแกรมลงชิป SPI Flash จะทำให้ชิป FPGA ถูกโปรแกรมด้วยข้อมูลที่อยู่ในชิปหน่วยความจำโดยอัตโนมัติทุกครั้งที่ป้อนไฟเลี้ยงให้บอร์ด

หากใช้ Ubuntu 22.04 ก็สามารถทำคำสั่งเพื่อติดตั้งและใช้งานได้ดังนี้

# Download the archive file.
$ TGZ_FILE=alchitry-labs-1.2.7-linux.tgz; \
  wget https://cdn.alchitry.com/labs/$TGZ_FILE

# Extract the .tgz file for Alchitry Labs.
$ tar xvf alchitry-labs-1.2.7-linux.tgz
$ sudo mv ./alchitry-labs-1.2.7 /opt/

# Lauch the Alchitry loader.
$ cd /opt/alchitry-labs-1.2.7/
$ ./alchitry-loader > /dev/null 2>&1 &

ถ้าต้องการเขียนโปรแกรมสำหรับ Linux โดยใช้ภาษา C/C++ เพื่อการอัปโหลดไฟล์ .bin ไปยังบอร์ด Mojo v3 Loader ก็มีตัวอย่างการเขียนโค้ด เช่น cmojoloader

 


การติดตั้ง Xilinx ISE Design Suite (for Linux)#

ดาวน์โหลดไฟล์ Archive File: Xilinx_ISE_DS_Lin_14.7_1015_1.tar จากเว็บไซต์ของ Xilinx และขอไฟล์ลิขสิทธิ์ (License File) เพื่อใช้งานซอฟต์แวร์ และจะได้รับไฟล์ทางอีเมล์ จากนั้นให้นำไฟล์ Xilinx License File (.lic) ไปใส่ไว้ในไดเรกทอรี ~/.Xilinx/

แตกไฟล์ .tar ในไดเรกทอรี ./Xilinx_ISE_DS_Lin_14.7_1015_1 แล้วทำคำสั่งเรียกโปรแกรม xsetup เพื่อเริ่มต้นขั้นตอนการติดตั้งโปรแกรม (เลือกติดตั้งไว้ใน /opt/Xilinx/14.7)

$ sudo apt install libncurses5 libstdc++5 libmotif-dev \
    xfonts-75dpi xfonts-100dpi
$ sudo mkdir -p /opt/Xilinx/14.7
$ cd ./Xilinx_ISE_DS_Lin_14.7_1015_1
$ sudo chmod +x xsetup
$ sudo ./xsetup

 

รูป: ขั้นตอนการติดตั้ง Xilinx ISE v14.7 WebPACK

เมื่อติดตั้งโปรแกรมได้แล้ว ให้ลองทำคำสั่งต่อไปนี้

## Under the directory: /opt/Xilinx/14.7
$ tree -L 2
.
└── ISE_DS
    ├── common
    ├── EDK
    ├── ISE
    ├── PlanAhead
    ├── settings32.csh
    ├── settings32.sh
    ├── settings64.csh
    └── settings64.sh

5 directories, 4 files

ทำคำสั่งเพื่อเรียกใช้โปรแกรม ise

$ source /opt/Xilinx/14.7/ISE_DS/settings64.sh
$ /opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64/ise &

 

แนะนำให้ติดตั้ง Java / OpenJDK สำหรับ Ubuntu Linux ด้วย ถ้าต้องการใช้โปรแกรม Alchitry Loader สำหรับ Linux โดยทำคำสั่งดังนี้

$ sudo apt-cache search openjdk | grep -E "openjdk\-[0-9]+.\-jdk "

openjdk-17-jdk - OpenJDK Development Kit (JDK)
openjdk-18-jdk - OpenJDK Development Kit (JDK)
openjdk-19-jdk - OpenJDK Development Kit (JDK)

$ sudo apt install openjdk-17-jdk -y
$ java -version

openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7-Ubuntu-122.04)
OpenJDK 64-Bit Server VM (build 17.0.8+7-Ubuntu-122.04...)

 


การใช้งาน Xilinx ISE WebPACK (Ubuntu 22.04)#

ขั้นตอนในการสร้างดีไซน์และแปลงเป็นไฟล์บิตสตรีม มีดังนี้

  • สร้างโปรเจคใหม่ (New Project Creation)
  • เพิ่มหรือสร้างไฟล์ Source Code (เขียนโค้ด VHDL หรือ Verilog) ให้เป็นส่วนหนึ่งของโปรเจกต์
  • เขียนหรือแก้ไขโค้ด (HDL Code Editing)
  • ทำขั้นตอนสังเคราะห์วงจรจากโค้ด (Logic Synthesis)
  • กำหนดตำแหน่งขาให้สัญญาณ I/O ของวงจร และข้อกำหนดอื่นๆ (I/O Pin & Standard Assignment + Design Constraints) โดยสร้างไฟล์ .ucf (User Constraints File) เพิ่มไว้ในโปรเจกต์
  • ดูตัวอย่างไฟล์ mojo.ucf สำหรับบอร์ด Mojo v3
  • ทำขั้นตอนแปลงให้เป็นวงจรดิจิทัลที่ใช้ทรัพยากรของชิป FPGA จัดวางตำแหน่งและหาเส้นทางสัญญาณให้เหมาะสมที่สุด (Performing Mapping, Placement and Routing Steps)
  • สร้างไฟล์บิตสตรีม (Bitstream File Generation) และเลือกสร้างไฟล์เอาต์พุต .bin
  • โปรแกรมชิป FPGA บนบอร์ด Mojo v3 ด้วยซอฟต์แวร์ที่มีชื่อว่า Mojo Loader / Alchitry Loader (Java-based)

สำหรับผู้ใช้ Windows 10 / 11 แนะนำให้ผู้ใช้ติดตั้ง Ubuntu 22.04 LTS VM โดยใช้ Oracle VirtualBox เพื่อติดตั้งและใช้งานซอฟต์แวร์ Xilinx ISE WebPack v14.7 (Linux version)

โปรเจกต์ตัวอย่าง มี 2 กรณีสำหรับการสาธิตดังนี้ (เขียนโค้ดด้วย VHDL)

  • led_blink
  • leds_running

หากต้องการออกแบบวงจรในชิป FPGA และสามารถสื่อสารกับ ATmega32U4 ได้ ผู้พัฒนาบอร์ดได้สร้างไฟล์สำหรับโปรเจกต์ตัวอย่างไว้ให้แล้ว (ซอร์สโค้ดเป็นภาษา Verilog) สามารถดูได้จาก mojo-base เช่น ตัวอย่างการส่งข้อความผ่านทาง UART-TX mojo-v3-hello-world

 

รูป: หน้าต่างหลักของ Xilinx ISE WebPACK

รูป: ขั้นตอนการสร้างโปรเจกต์ใหม่ ตั้งชื่อโปรเจกต์ ไดเรกทอรีของโปรเจกต์ และชิป FPGA ( XC6SLX9-TQG144-2C)

รูป: สร้างไฟล์ VHDL แล้วเพิ่มไว้ในโปรเจกต์

รูป: เพิ่ม/แก้ไขโค้ด VHDL ตามตัวอย่าง

รูป: เพิ่มไฟล์ Implementation Constraints File (.ucf)

รูป: ทำขั้นตอนใน Xilinx FPGA Design Flow เพื่อแปลงโค้ด VHDL ให้เป็นไฟล์บิตสตรีม

รูป: ลองเปิดดูผังวงจรที่ได้จากการสังเคราะห์วงจร

รูป: การตั้งค่า "Create Binary Configuration File"

รูป: การใช้โปรแกรม Alchitry Loader เพื่ออัปโหลดไฟล์ .bin ไปยังชิป FPGA บนบอร์ด Mojo V3 (ถ้าต้องการเขียนข้อมูลไปยังหน่วยความจำแฟลช ให้คลิกเลือก Program Flash แล้วกดปุ่ม Erase แล้ว Program ตามลำดับ)

 


โค้ดตัวอย่างที่ 1

File: led_blink.vhd

-- File: led_blink.vhd
-- Mojo V3 FPGA Development Board
-- CLK   : P56 
-- RST_N : P38
-- LED   : P134

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity LED_BLINK is
    generic( CLK_HZ : natural := 50000000 );
    port ( CLK   : in STD_LOGIC; 
           RST_N : in STD_LOGIC; 
           LED   : out STD_LOGIC 
    ); 
end LED_BLINK;

architecture SYNTH of LED_BLINK is
  constant COUNT_PERIOD : integer := CLK_HZ/2; -- Half period
  subtype count_t is integer range 0 to (COUNT_PERIOD-1); 
  signal count : count_t := 0;
  signal led_state : std_logic := '0';

begin

  LED <= led_state;

  process (RST_N, CLK) begin
    if RST_N = '0' then
      count <= 0;
      led_state <= '0';
    elsif rising_edge(CLK) then
      if count = (COUNT_PERIOD-1) then 
        count <= 0;       -- reset the counter.
        led_state <= not led_state; -- toggle the LED status
      else
        count <= count+1; -- increment counter by 1.
      end if;
    end if;
  end process;

end SYNTH;

File: led_blink.ucf

## Mojo v3 board (XC6SLX-2TQG144)

NET "clk" TNM_NET = clk;
TIMESPEC TS_clk = PERIOD "clk" 50 MHz HIGH 50%;

NET "CLK"     LOC = P56  | IOSTANDARD = LVTTL;
NET "RST_N"   LOC = P38  | IOSTANDARD = LVTTL;
NET "LED"     LOC = P123 | IOSTANDARD = LVTTL;

 


โค้ดตัวอย่างที่ 2

File: leds_running.vhd

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity LEDS_RUNNING is
  generic (
     CLK_HZ : natural := 50000000;
     WIDTH  : natural := 8
  );
  port(
     CLK   : in std_logic; -- system clock
     RST_N : in std_logic; -- acive-high asynchronous reset
     LEDS  : out std_logic_vector(WIDTH-1 downto 0)
  );
end LEDS_RUNNING;

architecture SYNTH of LEDS_RUNNING is
  constant COUNT_MAX: integer := (CLK_HZ/10) - 1;
  subtype count_t is integer range 0 to COUNT_MAX; 
  signal  count : count_t := 0;
  signal  leds_reg : std_logic_vector(2*WIDTH-1 downto 0);

begin

  LEDS <= leds_reg(WIDTH-1 downto 0); 

  process (RST_N, CLK) 
  begin
    if RST_N = '0' then
      count <= 0;
      leds_reg(WIDTH-1 downto 0 ) <= (others => '0');
      leds_reg(2*WIDTH-1 downto WIDTH) <= (others => '1');
    elsif rising_edge(CLK) then
      if count = COUNT_MAX then 
        count <= 0; -- reset the counter.
        leds_reg <= leds_reg(leds_reg'left-1 downto 0) 
                    & leds_reg(leds_reg'left); 
      else
        count <= count+1; -- increment counter by 1.
      end if;
    end if;
  end process;

end SYNTH;

File: leds_running.ucf

## Mojo v3 board (XC6SLX-2TQG144)

NET "clk" TNM_NET = clk;
TIMESPEC TS_clk = PERIOD "clk" 50 MHz HIGH 50%;

NET "CLK"     LOC = P56  | IOSTANDARD = LVTTL;
NET "RST_N"   LOC = P38  | IOSTANDARD = LVTTL;

NET "LEDS<0>" LOC = P134 | IOSTANDARD = LVTTL;
NET "LEDS<1>" LOC = P133 | IOSTANDARD = LVTTL;
NET "LEDS<2>" LOC = P132 | IOSTANDARD = LVTTL;
NET "LEDS<3>" LOC = P131 | IOSTANDARD = LVTTL;
NET "LEDS<4>" LOC = P127 | IOSTANDARD = LVTTL;
NET "LEDS<5>" LOC = P126 | IOSTANDARD = LVTTL;
NET "LEDS<6>" LOC = P124 | IOSTANDARD = LVTTL;
NET "LEDS<7>" LOC = P123 | IOSTANDARD = LVTTL;

 


กล่าวสรุป#

บทความนี้ได้นำเสนอข้อมูลเกี่ยวกับการใช้งานบอร์ด Mojo v3 ซึ่งเป็นบอร์ดที่ผู้ผลิตยกเลิกการผลิตและจำหน่ายไปหลายปีแล้ว แม้ว่าชิป Xilinx Spartan 6 ถือว่าเป็นชิปรุ่นเก่าในปัจจุบัน และบริษัท Xilinx ก็ไม่ได้พัฒนาซอฟต์แวร์สำหรับชิปตระกูลนี้แล้ว แต่ถ้าผู้ใช้ยังมีบอร์ดที่มีชิป Xilinx Spartan-6 FPGA เช่น Mojo v3 ก็ยังสามารถนำมาใช้ในการเรียนรู้และทดลองเกี่ยวกับ FPGA ได้เช่นกัน

 


This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Created: 2023-08-22 | Last Updated: 2023-08-23