如何在FPGA中永久存储程序?BASYS3项目断电程序丢失问题咨询
Hey there! Let's tackle your BASYS3 + Arduino project challenges one by one—you've got two key goals here: tracking how long the FPGA was powered off when it boots back up, and making sure your FPGA program stays stored permanently even without power. Let's break this down:
The BASYS3 uses SRAM for both configuration storage and runtime data, which gets completely wiped when power is lost. That means we can't store the "last power-on/off timestamp" directly on the FPGA itself. Here's a practical, Arduino-integrated solution:
- Add an RTC module to your Arduino: Grab a reliable module like the DS3231 (it has a backup coin cell slot, so it keeps time even when main power is off). Use Arduino's RTC libraries to keep continuous time running.
- Sync and store active timestamps:
- When the system is running normally, have the FPGA send a regular "heartbeat" signal to the Arduino (via GPIO pins, I2C, or SPI). Every time the Arduino receives this signal, it updates a "last active timestamp" stored in its onboard EEPROM (non-volatile, so it survives power loss).
- When power is restored, the Arduino reads the last active timestamp from EEPROM, compares it to the current RTC time, calculates the outage duration, and sends this value to the FPGA via your chosen communication interface.
- The FPGA then displays this duration on its onboard LEDs, seven-segment display, or whatever output you're using.
- Alternative (FPGA-only timestamping): If you want to skip the Arduino, you can connect an RTC directly to the BASYS3 (via I2C/SPI) and use the board's onboard SPI EEPROM to store timestamps. This requires writing FPGA logic to handle the RTC/EEPROM communication, which is more code-heavy but keeps everything on the FPGA side.
By default, the BASYS3 loads its configuration from a USB cable when connected, but it has an onboard SPI flash memory (16MB, non-volatile) that you can program to hold your bitstream permanently. Here's how to do it in Vivado:
- Generate your bitstream as usual, then go to
File > Export > Export Hardware—make sure to check the box to include the bitstream in the export. - Open the Vivado Hardware Manager, connect to your BASYS3 over USB, and right-click the FPGA device in the list.
- Select
Program and Debug > Configuration Memory Device—follow the wizard to select the onboard SPI flash (it will be listed as something likexc7a35t_0). - Load your bitstream file into the flash, and wait for the programming to complete.
- Now, every time you power on the BASYS3, it will automatically load your program from the SPI flash into its SRAM—no USB cable or computer required.
Quick Notes
- For the outage duration feature: Don't forget to install the backup coin cell in your RTC module—without it, the time will reset when power is lost, and you won't get accurate duration calculations.
- If you're using EEPROM (either Arduino's or the FPGA's), remember that EEPROM has a limited write cycle count (~100,000 writes). Avoid updating the timestamp too frequently (e.g., every 5 minutes instead of every second) to extend its lifespan.
内容的提问来源于stack exchange,提问作者asha.anil

