【LiteX】【开发板】【BoChenK7】使用Python开发FPGA【QSPI Flash】

文章目录

  • 开发板介绍
  • 下载仓库
  • 工程设计
    • 代码实现
  • 工程构建
    • 启动测试
    • Flash读写测试
    • 烧写bitstream到Flash(使用LiteX命令)
    • 烧写bitstream到Flash(使用SD Card)
  • 开发板信息

开发板介绍

手头目前只有一个购买的BoChenK7开发板,后续会用它来进行LiteX FPGA SoC的构建
测试可能会包括:

下载仓库

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

BoChenK7开发板在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)

开发板信息

BoChenK7开发板的接口如下图,还是比较丰富的
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值