0%

Lattice ECP5 FPGA 开发板实践

Lattice ECP5ECP5-5G系列FPGA简介

  • ECP5是属于Lattice公司里的高端产品线,ECP5 FPGA器件提供低成本,低功耗,小尺寸的解决方案,用于实现大批量应用中的连接,视频和图像功能,如小型蜂窝网络,工业摄像头和宽带接入设备。
    • 特點:
      • 新型应用中FPGAASICASSP相结合,
      • 快速构建灵活的系统,可以满足严格的成本,功耗和尺寸限制。
      • 在开发ECP5TM FPGA系列的过程中,莱迪思打破了FPGA产品密度极高,功耗惊人和价格昂贵的陈规。
      • ECP5ECP5-5G针对低成本,小封装尺寸和低功耗进行了优化,
      • 比竞争对手的FPGA产品成本更低,使用更好的布线架构,双通道SERDES以及增强的DSP模块,减少高达4倍的乘法器资源使用,这些特性使得ECP5器件非常适用于辅助ASIC和ASSP的可编程连接解决方案。
    • 用途:
      • ECP5/ECP5- 5g设备系列FPGA包括可查找表(LUT)容量为85K的逻辑元件,支持最多365个用户I/O。
      • 同时还提供多达156个18x18乘法器和广泛的并行I/O标准。
      • ECP5/ECP5- 5g FPGA在低功耗,低成本的前提下进行了高性能的优化。
      • 利用可重新配置的SRAM逻辑技术,提供lutb的逻辑,分布式和嵌入式内存,锁相环(PLLs),延迟锁相环(DLLs),预先设计的源同步I/O支持,增强的sysDSP片和高级配置支持,包括加密和双启动功能。
      • 支持广泛的接口标准,包括DDR2/3,LPDDR2/3,XGMII和7:1 LVDS

开源工具

  • 开发FPGA,从verilog到可以烧录的bitstream有以下几步:

    • Synthesis:一般叫合成,把verilogRTL生成为逻辑门。
    • Place and Route:布线,依照逻辑门的的数量限制,生成逻辑的连线。
    • Bitstream Creation:將逻辑门的连线,依照对应的FPGA型号生成可烧写的bitstream的文件。
  • 开源Verilog逻辑综合(Synthesis)工具Yosys,可以用于LatticeXilinxFPGAClifford Wolf创建了FPGA的整条开源工具链:

    • YosysHQ/yosys:用来将verilog RTL综合生成网表文件
    • YosysHQ/nextpnr: 根据网表文件和约束文件进行布局布线
    • YosysHQ/prjtrellis:针对Lattice ECP5 FPGA架构信息库和完整生成bitstream的烧写文件。
    • icestorm:针对Lattice iCE40 FPGA架构信息库和完整生成bitstream工具链组合,依靠反向工程创建出来的。
  • 上面三个开源工具链被SymbiFlow收入整合了。也可以用YosysHQ/oss-cad-suite-build去做开发环境的构建。

SymbiFlow

  • ECP5_FPGA

  • SymbiFlow is a fully open source toolchain for the development of FPGAs of multiple vendors. Currently, it targets the Xilinx 7-Series, Lattice iCE40, Lattice ECP5 FPGAs, QuickLogic EOS S3 and is gradually being expanded to provide a comprehensive end-to-end FPGA synthesis flow.

  • SymbiFlow相当于是FPGAs开源界的GCC工具。

构建环境

prjtrellis

1
2
3
4
5
~$ git clone --recursive https://github.com/YosysHQ/prjtrellis
~$ export LATTICE_TOOLS_PATH=~/Lattice-OpenTools
~$ cd libtrellis
~$ cmake -DCMAKE_INSTALL_PREFIX=$LATTICE_TOOLS_PATH .
~$ make install
  • 如果出现python3开发版本不匹配的错误,可以参照下面修改到合适的版本。删除CMakeCache.txt,重新运行cmake生成配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
prjtrellis/libtrellis$ rm CMakeCache.txt
prjtrellis/libtrellis$ git diff CMakeLists.txt
diff --git a/libtrellis/CMakeLists.txt b/libtrellis/CMakeLists.txt
index 540368e..868bd2b 100644
--- a/libtrellis/CMakeLists.txt
+++ b/libtrellis/CMakeLists.txt
@@ -49,10 +49,10 @@ else()
add_definitions(-DNO_THREADS)
endif()
set(Boost_NO_BOOST_CMAKE ON)
-find_package(PythonInterp 3.5 REQUIRED)
+find_package(PythonInterp 3.9 REQUIRED)

if (BUILD_PYTHON)
- find_package(PythonLibs 3.5 REQUIRED)
+ find_package(PythonLibs 3.9 REQUIRED)
set(PythonInstallTarget "pytrellis")
endif()

nextpnr

  • 我现在手上只有ECP5 Evaluation Board,这只选择编译-DARCH=ecp5,具体更多的参数,查看源码脚本。
    1
    2
    3
    ~$ git clone --recursive https://github.com/YosysHQ/nextpnr
    ~$ cmake . -DARCH=ecp5 -DTRELLIS_INSTALL_PREFIX=$LATTICE_TOOLS_PATH -DCMAKE_INSTALL_PREFIX=$LATTICE_TOOLS_PATH
    ~$ make install

Yosys

  • 安装编译工具与其它依赖,命令文档指南.注意别与apt-get install yosys混用了,旧版的yosys会报错ERROR: Found netlist using legacy-style JSON parameter values, please update your Yosys.

    1
    2
    3
    4
    ~$ sudo apt-get install build-essential clang bison flex \
    libreadline-dev gawk tcl-dev libffi-dev git \
    graphviz xdot pkg-config python3 libboost-system-dev \
    libboost-python-dev libboost-filesystem-dev zlib1g-dev libjson11-1-dev
  • 编码编译,安装目录与前面的工具一样,默认使用clang,可以传送参数变量CONFIG=gcc,用gcc来编译。

    1
    2
    3
    4
    ~$ git clone https://github.com/YosysHQ/yosys
    ~$ cd yosys && mkdir build
    ~$ cd build
    ~$ PREFIX=$LATTICE_TOOLS_PATH make -j20 -f ../Makefile install
  • 因为系统安装了qflow它会依赖安装一个较旧的发行版,最终还是使用了最新源码去覆盖旧的发行版。

1
~$ PREFIX=/usr sudo make -j20 -f ../Makefile install

openFPGALoader

编译openFPGALoader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
~$ apt-get install libftdi1-2 libftdi1-dev libudev-dev cmake  # 这装必要的支持库
~$ git clone https://github.com/trabucayre/openFPGALoader

~$ cd openFPGALoader
~$ sudo cp 99-openfpgaloader.rules /etc/udev/rules.d/
~$ sudo udevadm control --reload-rules && udevadm trigger # 强制重新加载rules
~$ mkdir build && cd build
build$ cmake -DCMAKE_INSTALL_PREFIX=$LATTICE_TOOLS_PATH ../
-- The CXX compiler identification is GNU 10.2.1
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.2")
-- Checking for module 'libftdi1'
-- Found libftdi1, version 1.5
-- Checking for module 'libusb-1.0'
-- Found libusb-1.0, version 1.0.24
-- Checking for module 'hidapi-hidraw'
-- Found hidapi-hidraw, version 0.10.1
-- Checking for module 'zlib'
-- Found zlib, version 1.2.11
-- Checking for module 'libudev'
-- Found libudev, version 247
cmsis_dap support enabled
-- Configuring done
-- Generating done
-- Build files have been written to: /home/michael/openTools-For-Lattice/openFPGALoader/build
~$ make && make install
[...]
Install the project...
-- Install configuration: ""
-- Installing: /home/michael/Lattice-OpenTools/bin/openFPGALoader
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/test_sfl.svf
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_xc6slx100fgg484.bit
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_xc6slx45csg324.bit
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_xc7a100tfgg484.bit
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_xc7a200tsbg484.bit
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_xc7a35tcpg236.bit
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_xc7a35tcsg324.bit
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_xc7a35tftg256.bit
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_xc7a50tcpg236.bit
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_xc7a75tfgg484.bit
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_10cl025256.rbf
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_5ce223.rbf
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_ep4ce2217.rbf
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_5ce423.rbf.gz
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_ep4ce1523.rbf.gz
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_xc7a100tcsg324.bit.gz
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_xc7s25csga324.bit.gz
-- Installing: /home/michael/Lattice-OpenTools/share/openFPGALoader/spiOverJtag_xc7s50csga324.bit.gz

1
2
3
~$ openFPGALoader --list-boards
~$ openFPGALoader --list-fpga
~$ openFPGALoader --list-cables

测试编译示例

编译

1
2
3
4
5
6
7
~$ cd prjtrellis/examples/ecp5_evn
~$ make
[....]
2.51. Executing JSON backend.
ERROR: Module top contains processes, which are not supported by JSON backend (run `proc` first).
make: *** [Makefile:7: blinky.json] Error 1
rm blinky.json
  • 默认编译显示上面的错误,找到错误行,显示:yosys -p "synth_ecp5 -json $@" $<.按照理论上来,我安装的是最新版本的yosys版本,不应该出现这样的错误。这种写法是省掉的读取verilog的参数,完整的命令行写法,如下:

    1
    ~$ yosys -p "read_verilog blink.v; read_verilog rst_gen.v; synth_ecp5 -json main.json"
  • 这里需要修改Makefile,修改成如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    prjtrellis/examples/ecp5_evn$ git diff
    diff --git a/examples/ecp5_evn/Makefile b/examples/ecp5_evn/Makefile
    index 40622b0..02f0d9d 100644
    --- a/examples/ecp5_evn/Makefile
    +++ b/examples/ecp5_evn/Makefile
    @@ -4,7 +4,7 @@ TRELLIS?=/usr/share/trellis
    all: ${PROJ}.bit

    %.json: %.v
    - yosys -p "synth_ecp5 -json $@" $<
    + yosys -p "read_verilog -sv $<" -p "synth_ecp5 -json $@" $<

    %_out.config: %.json
    nextpnr-ecp5 --json $< --textcfg $@ --um5g-85k --package CABGA381 --lpf ecp5evn.lpf

    ~$ make
    [...]
    Info: Program finished normally.
    ecppack --svf blinky.svf blinky_out.config blinky.bit
    rm blinky.json blinky_out.config

烧写到板上的RAM

  • openFPGALoader默认是加载到FPGA的内存里的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ~$ openFPGALoader -b ecp5_evn blinky.bit
    write to ram
    Jtag frequency : requested 6.00MHz -> real 6.00MHz
    Open file: DONE
    Parse file: DONE
    Enable configuration: DONE
    SRAM erase: DONE
    Loading: [==================================================] 100.00%
    Done
    Disable configuration: DONE
  • 烧写成功后,就能看到板上的流水灯的效果。

  • 这里也可以使用一个外部的JTAG烧写。比如使用一个独立的FTDI 2232HL连接到板上的J1 JTAG,再把JP1跳线安装上,就可以下载调试了。

1
2
3
4
5
6
7
8
9
10
11
~$ openFPGALoader -d /dev/ttyUSB1 --detect
write to ram
Jtag frequency : requested 6.00MHz -> real 6.00MHz
index 0:
idcode 0x1113043
manufacturer lattice
family ECP5
model LFE5U-85
irlength 8

~$ openFPGALoader -d /dev/ttyUSB1 -b ecp5_evn blinky.bit

烧写到SPI Flash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
prjtrellis/examples/ecp5_evn_multiboot$ openFPGALoader -b ecp5_evn -f blinky1.bit
write to flash
Jtag frequency : requested 6.00MHz -> real 6.00MHz
Open file DONE
Parse file DONE
Enable configuration: DONE
SRAM erase: DONE
Detail:
Jedec ID : c2
memory type : 20
memory capacity : 18
EDID + CFD length : c2
EDID : 1820
CFD :
flash chip unknown: use basic protection detection
Erasing: [==================================================] 100.00%
Done
Writing: [==================================================] 100.00%
Done
Refresh: DONE
  • 烧写flash的时间会略长一些。每次上电启动,都是从spi flash加载程序来运行。如果烧写的是openFPGALoader -b ecp5_evn -f multiboot.bin,可以通过板上的PGMN SW3按键来切换从不同的flash位置加载启动。

RISC-V

VexRiscv

运行linux-on-litex-vexriscv

  • 这里可以接合参照我写的另一篇文章XILINX_Arty-A7-35T实践指南去实践。要先编译安装riscv toolchains.

  • 编译工程

    1
    ~$ ./make.py --board ecpix5 --toolchain=symbiflow --build
  • 加载工程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
~$ ./make.py --board ecpix5 --load
[....]
python3 -m litex.soc.software.mkmscimg bios.bin --little
python3 -m litex.soc.software.memusage bios.elf /home/michael/workspace-xilinx/RISC-V/litex-hub/litex/linux-on-litex-vexriscv/build/ecpix5/software/bios/../include/generated/regions.ld riscv64-unknown-elf

ROM usage: 39.21KiB (61.27%)
RAM usage: 0.61KiB (7.62%)

make: Leaving directory '/home/michael/workspace-xilinx/RISC-V/litex-hub/litex/linux-on-litex-vexriscv/build/ecpix5/software/bios'
INFO:SoC:Initializing ROM rom with contents (Size: 0x9cf4).
INFO:SoC:Auto-Resizing ROM rom from 0x10000 to 0x9cf4.
write to ram
Jtag frequency : requested 6.00MHz -> real 6.00MHz
Open file: DONE
Parse file: DONE
Enable configuration: DONE
SRAM erase: DONE
Loading: [==================================================] 100.00%
Done
Disable configuration: DONE

直接运行litex-boards

  • 编译工程

    1
    ~$ litex-boards/litex_boards$ ./targets/lattice_ecp5_evn.py --cpu-type vexriscv --sys-clk-freq 100e6 --build
  • 加载工程

    1
    2
    ~$ litex-boards/litex_boards$ ./targets/lattice_ecp5_evn.py --cpu-type vexriscv --sys-clk-freq 100e6 --load

  • 更换连接uart的管脚配置,把原板上的FTDI P2,P3换成M19,M20,因为P2,P3有复用到其它功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
litex-boards/litex_boards$ git diff platforms/lattice_ecp5_evn.py
diff --git a/litex_boards/platforms/lattice_ecp5_evn.py b/litex_boards/platforms/lattice_ecp5_evn.py
index 1a96862..7892dc0 100644
--- a/litex_boards/platforms/lattice_ecp5_evn.py
+++ b/litex_boards/platforms/lattice_ecp5_evn.py
@@ -48,8 +48,8 @@ _io = [

# Serial
("serial", 0,
- Subsignal("rx", Pins("P2"), IOStandard("LVCMOS33")),
- Subsignal("tx", Pins("P3"), IOStandard("LVCMOS33")),
+ Subsignal("rx", Pins("M19"), IOStandard("LVCMOS33")),
+ Subsignal("tx", Pins("M20"), IOStandard("LVCMOS33")),
),

# SPIFlash

  • 连接成功后如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
litex>
__ _ __ _ __
/ / (_) /____ | |/_/
/ /__/ / __/ -_)> <
/____/_/\__/\__/_/|_|
Build your hardware, easily!

(c) Copyright 2012-2022 Enjoy-Digital
(c) Copyright 2007-2015 M-Labs

BIOS built on Feb 26 2022 23:37:36
BIOS CRC passed (23ff10b6)

Migen git sha1: ac70301
LiteX git sha1: 7f49c523

--=============== SoC ==================--
CPU: VexRiscv @ 100MHz
BUS: WISHBONE 32-bit @ 4GiB
CSR: 32-bit data
ROM: 128KiB
SRAM: 8KiB


--============== Boot ==================--
Booting from serial...
Press Q or ESC to abort boot completely.
sL5DdSMmkekro
Timeout
No boot medium found

--============= Console ================--


通过SDCard Boot加载linux系统

其它

谢谢支持

  • 微信二维码: