文章目录
- 开发板介绍
- 下载仓库
- 工程设计
- 代码实现
- 工程构建
- 启动测试
- Flash读写测试
- 烧写bitstream到Flash(使用LiteX命令)
- 烧写bitstream到Flash(使用SD Card)
- 开发板信息
开发板介绍
手头目前只有一个购买的BoChenK7开发板,后续会用它来进行LiteX FPGA SoC的构建
测试可能会包括:
- LED:【LiteX】【开发板】【BoChenK7】使用Python开发FPGA【Hello World、LED点灯、Memory测速、替换BIOS】
- DDR:【LiteX】【开发板】【BoChenK7】使用Python开发FPGA【SDRAM/DDR/Bootloader】
- QSPI Flash:本篇文章
- SD Card
- Ethernet以太网
- HDMI视频输入输出
- PCIe
- Linux
下载仓库
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开发板的接口如下图,还是比较丰富的