使用Python开发FPGA【QSPI Flash】-LiteX社区-FPGA CPLD-ChipDebug

使用Python开发FPGA【QSPI Flash】

下载仓库

LiteX有一个生态库叫做litex-boards,里面包含了上百种开发板(比如Xilinx、Digilent等品牌)
若是你手中有现成的开发板,可以直接使用litex-boards仓库:https://github.com/litex-hub/litex-boards
而我目前手头的是BoChenK7开发板我自己作了一个litex-boards-vacajk仓库:https://github.com/vacajk/litex-boards-vacajk

开发板在Python代码中的名称为:bochen_kintex7_base
litex-boards-vacajk仓库依赖LiteX开发环境,环境搭建方法可以跳转:【LiteX】使用Python实现FPGA SoC构建的开源工具

# 激活conda环境 conda activate <your conda env name> # 进入litex环境目录 cd ~/Study/litex/env/litex # 下载仓库 git clone git@github.com:vacajk/litex-boards-vacajk.git # 安装仓库 cd litex-boards-vacajk pip install --editable . 

工程设计

bochen_kintex7_base开发板的基础配置文件:litex-boards-vacajk/litex_boards_vacajk/targets/bochen_kintex7_base.py
这次我们需要开启如下配置:

  • –with-sdram
  • –with-spi-flash

代码实现

源码:litex-boards-vacajk/litex_boards_vacajk/platforms/bochen_kintex7_base.py

  • IO管脚约束
  • 使用Vivado实现FLASH烧写需要指定QSPI Flash的型号
# _io = [     # SPIFlash     ("spiflash4x", 0,         Subsignal("cs_n", Pins("C23")),         # Subsignal("clk",  Pins("C8")), # Accessed through STARTUPE2         Subsignal("dq",   Pins("B24 A25 B22 A22")),         IOStandard("LVCMOS33")     ), # class Platform(Xilinx7SeriesPlatform): #     def create_programmer_vivado(self):         return VivadoProgrammer(flash_part="mx25l25645g-spi-x1_x2_x4") 

源码:litex-boards-vacajk/litex_boards_vacajk/targets/bochen_kintex7_base.py

  • 添加QSPI Flash型号:MX25L25645G
    • 设置读写模式:READ_1_1_1
  • 添加spi_flash模块:self.add_spi_flash
# class BaseSoC(SoCCore):         # SPI Flash --------------------------------------------------------------------------------         if with_spi_flash:             from litespi.modules import MX25L25645G             from litespi.opcodes import SpiNorFlashOpCodes as Codes             self.add_spi_flash(mode="4x", module=MX25L25645G(Codes.READ_1_1_1), with_master=True) 	    ) # def main():     if args.flash:         prog = soc.platform.create_programmer_vivado()         prog.flash(0, builder.get_bitstream_filename(mode="flash")) 

工程构建

# 加载vivado开发环境 $ source ~/Xilinx/Vitis/2021.1/settings64.sh # 找一个工程目录(如果使用python -m的方法,在哪里运行都无所谓) $ cd ~/Study/litex/env/litex-boards-vacajk/litex_boards_vacajk # 编译BIOS、综合、布局、布线、生成bitstream $ python -m litex_boards_vacajk.targets.bochen_kintex7_base --with-sdram --with-spi-flash --build 

启动测试

连接JTAG(USB)、UART(USB)、电源(USB)到BoChenK7开发板

# 查看USB转串口设备名 $ ls /dev/ttyUSB* /dev/ttyUSB0 # +x属性到USB转串口设备 $ sudo chmod +x /dev/ttyUSB0 

提前打开新的BASH Shell,使用litex_term打开串口监听

# BASH B $ cd ~/Study/litex/env/litex-boards-vacajk/litex_boards_vacajk $ litex_term /dev/ttyUSB0 

打开litex_term后,再进行FPGA bitstream下载

# BASH A $ cd ~/Study/litex/env/litex-boards-vacajk/litex_boards_vacajk $ python -m litex_boards_vacajk.targets.bochen_kintex7_base --with-sdram --with-spi-flash --load 

查看BASH B中的litex_term命令行

        __   _ __      _  __        / /  (_) /____ | |/_/       / /__/ / __/ -_)>  <      /____/_/__/__/_/|_|    Build your hardware, easily!   (c) Copyright 2012-2024 Enjoy-Digital  (c) Copyright 2007-2015 M-Labs   BIOS built on Aug 17 2024 22:29:57  BIOS CRC passed (9508ee2a)   LiteX git sha1: 35498b468  --=============== SoC ==================-- CPU:		VexRiscv @ 100MHz BUS:		wishbone 32-bit @ 4GiB CSR:		32-bit data ROM:		128.0KiB SRAM:		8.0KiB L2:		8.0KiB FLASH:		32.0MiB SDRAM:		1.0GiB 32-bit @ 800MT/s (CL-6 CWL-5) MAIN-RAM:	1.0GiB  --========== Initialization ============-- ...... Initializing mx25l25645g SPI Flash @0x02000000... SPI Flash clk configured to 50 MHz Memspeed at 0x2000000 (Sequential, 4.0KiB)...    Read speed: 5.1MiB/s Memspeed at 0x2000000 (Random, 4.0KiB)...    Read speed: 2.5MiB/s  --============== Boot ==================-- ...... --============= Console ================--  litex>  

可以看到BIOS启动时:

  • 驱动对SDRAM进行了初始化(包括了各种IO delay训练)
  • 初始化完成后将SDRAM的控制权交给了硬件
  • 对SDRAM进行了读写速度测试
    • 写:58.2MB/s
    • 读:62.4MB/s
  • 对QSPI Flash进行了读速度测试
    • 连续读:5.1MB/s
    • 随机读:2.5MB/s

Flash读写测试

litex> help flash_erase_range        - Erase flash range flash_from_sdcard        - Write file from SD card to flash flash_write              - Write to flash  # 查看memory map ## MAIN_RAM:SDRAM/DDR ## SPIFLASH:QSPI Flash Read MMAP litex> mem_list Available memory regions: ROM       0x00000000 0x20000  SRAM      0x10000000 0x2000  MAIN_RAM  0x40000000 0x40000000  SPIFLASH  0x02000000 0x2000000  CSR       0xf0000000 0x10000   # 写测试数据到SDRAM litex> mem_write 0x40000000 0x12345678 256 litex> mem_read 0x40000000 32 Memory dump: 0x40000000  78 56 34 12 78 56 34 12 78 56 34 12 78 56 34 12  xV4.xV4.xV4.xV4. 0x40000010  78 56 34 12 78 56 34 12 78 56 34 12 78 56 34 12  xV4.xV4.xV4.xV4.  # 擦除QSPI Flash ## 写新的数据到QSPI Flash之前必须先进行擦除操作 litex> flash_erase_range 0x0 1024 Erase SPI Flash @0x00000000.. # 读取QSPI Flash数据 ## 被擦除的QSPI Flash数据读回来会是0 litex> mem_read 0x02000000 32   Memory dump: 0x02000000  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ................ 0x02000010  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ................ # 从SDRAM烧写数据到QSPI Flash litex> flash_write 0x0 0x40000000 1024 # 读取QSPI Flash最新数据,与写入的一致 litex> mem_read 0x02000000 32  Memory dump: 0x02000000  78 56 34 12 78 56 34 12 78 56 34 12 78 56 34 12  xV4.xV4.xV4.xV4. 0x02000010  78 56 34 12 78 56 34 12 78 56 34 12 78 56 34 12  xV4.xV4.xV4.xV4. 

烧写bitstream到Flash(使用LiteX命令)

LiteX集成了专用命令,除了能够用来编译(–build),加载bitstream(–load)
还能够用来烧写硬件板上的QSPI Flash(–flash),烧写过程依赖Xilinx Vivado软件

烧写bitstream到Flash的命令如下:

$ cd ~/Study/litex/env/litex-boards-vacajk/litex_boards_vacajk $ python -m litex_boards_vacajk.targets.bochen_kintex7_base --with-sdram --with-spi-flash --flash 

烧写完成后,按下FPGA硬件板子的RST复位按钮,通过litex_term观察SoC是否能够成功启动

使用mem_read直接读取QSPI Flash中的数据,发现上一个步骤中被手动写到QSPI Flash的数据已经被修改
数据格式就是Xilinx FPGA bitstream的数据结构(0xAA995566)

litex> mem_read 0x02000000 64 Memory dump: 0x02000000  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ................ 0x02000010  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ................ 0x02000020  00 00 00 bb 11 22 00 44 ff ff ff ff ff ff ff ff  .....".D........ 0x02000030  aa 99 55 66 20 00 00 00 30 03 e0 01 00 00 02 6b  ..Uf ...0......k 0x02000040  30 00 80 01 00 00 00 12 20 00 00 00 30 02 20 01  0....... ...0. . 

烧写bitstream到Flash(使用SD Card)

 

 

请登录后发表评论

    没有回复内容