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)
没有回复内容