本文主要描述了如何在Linux系统启动以后,在线将bitstream文件更新到ZYNQ PL的过程及方法。相关内容主要译自xilinx-wiki,其中官网给出了两种方法,分别为Device Tree Overlay和Sysfs interface。由于项目需要,暂只对sysfs interface在线烧录的执行过程作简要介绍和实践,并附有相关的配置脚本文件,更多详情请参照Solution Zynq PL Programming With FPGA Manager

内核配置

为保证FPGA Manager可正常使用,需要按图中配置内核相关选项。(在zynq_defconfig里面,这些选项是默认使能的)

配置 Zynq FPGA Manager:

选择:Device Drivers ---> FPGA Configuration Framework

配置Contiguous Memory Allocator:

CONFIG_CMA

Kernel Features --> Contiguous Memory Allocator

CONFIG_DMA_CMA

Select: Device Drivers --> Generic Driver Options → DMA Contiguous Memory Allocator

工具准备

  • bootgen

映像文件准备

使用Bootgen工具,将.bit文件转换成.bin文件

bootgen -image Full_Bitstream.bif -arch zynq -process_bitstream bin

其中,Full_Bitstream.bif文件应包含下列内容

all:
{
design_1_wrapper.bit /* Bitstream file name */
}

执行过程

设置flags为Full Bitstream模式

echo 0 > /sys/class/fpga_manager/fpga0/flags

通过sysfs提供的接口,下载Bitstream文件到PL

mkdir -p /lib/firmware
cp /media/design_1_wrapper.bit.bin /lib/firmware/
echo design_1_wrapper.bit.bin > /sys/class/fpga_manager/fpga0/firmware

正常输出如下:

参考脚本

为便于项目使用,笔者将上述过程形成以下两个脚本,其中makebitbin.sh可将.bit文件转换为.bin文件,具体使用方法为:

注意,该脚本执行前需要配置好Bootgen工具才可以正常使用!

脚本如下:

#!/bin/bash
###############################################################################
#
# Copyright (C) 2019 by Luego Zhang <zhanglucc@foxmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# Reference:
# https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841645/Solution+Zynq+PL+Programming+With+FPGA+Manager
################################################################################
# => Force locale language to be set to English. This avoids issues when doing
# text and string processing.
export LC_ALL=C LANGUAGE=C LANG=C # => Help and information
usage() {
printf "
NAME
$(basename ${BASH_SOURCE}) - generating .bin from .bit file using Bootgen SYNOPSIS
$(basename ${BASH_SOURCE}) [option] filename DESCRIPTION
In order to load bitstream files to PL through Linux, we need to get one
type of file with suffix like '.bit.bin'. Run this script and .bin will
be generated with the given file(.bit) using Bootgen.
Please run this script in PC. OPTIONS
--help Display this help message EXAMPLE Version : 191031v1.0
"
exit 0;
}
expr "$*" : ".*--help" > /dev/null && usage # => Setting the development environment variables
if [ ! "${ZN_CONFIG_DONE}" ]; then
printf "\033[31m[ERROR]\033[0m Please source the settings64.sh script first\n"
exit 1
else
# => Setting zynq-7000 development envirionment variables
if [ -f "${ZN_SCRIPTS_DIR}/xilinx/export_xilinx_env.sh" ]; then
source ${ZN_SCRIPTS_DIR}/xilinx/export_xilinx_env.sh
else
error_exit "Could not find file ${ZN_SCRIPTS_DIR}/xilinx/export_xilinx_env.sh"
exit 1
fi
fi ZN_SCRIPT_NAME="$(basename ${BASH_SOURCE})"
ZN_SCRIPT_PATH="$(dirname ${BASH_SOURCE})"
################################################################################
# => The beginning
print_info "[ $(date "+%Y/%m/%d %H:%M:%S") ] Starting ${BASH_SOURCE}\n" # => Check user input is correct
[[ -f $1 ]] || error_exit "$1 not found, please check that the filename is correct\n" echo_info "1. Create fullbitstream.bif "
BIF_FILE=${ZN_SCRIPT_PATH}/fullbitstream.bif
echo "//arch = zynq; split = yes; format = .bit.bin" > ${BIF_FILE}
echo "all:" >>${BIF_FILE}
echo "{" >>${BIF_FILE}
echo " $1" >>${BIF_FILE}
echo "}" >>${BIF_FILE} echo_info "2. Generate .bif file for Bootgen"
bootgen -image fullbitstream.bif -arch zynq -process_bitstream bin -w # => The end
print_info "[ $(date "+%Y/%m/%d %H:%M:%S") ] Finished ${ZN_SCRIPT_NAME}\n"

makebitbin.sh

另一个脚本为load-fpga-image.sh,该脚本应在开发板上运行,具体使用方法为:

将load-fpga-image.sh脚本和上一步生成的blinkblink.bit.bin文件共同copy至开发板的同一目录下,然后按以下方法执行脚本:

./load-fpga-image.sh blinkblink.bit.bin

即可,参考脚本如下:

#!/bin/bash
###############################################################################
#
# Copyright (C) 2019 by Luego Zhang <zhanglucc@foxmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# Reference:
# https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841645/ \
# Solution+Zynq+PL+Programming+With+FPGA+Manager
################################################################################
# => Force locale language to be set to English. This avoids issues when doing
# text and string processing.
export LC_ALL=C LANGUAGE=C LANG=C # => Help and information
usage() {
printf "
NAME
$(basename ${BASH_SOURCE}) - load fullbitstream file to PL through Linux SYNOPSIS
$(basename ${BASH_SOURCE}) [option] bitstream_file DESCRIPTION
Load bitstream file to PL using sysfs interface through Linux.
Be careful the type of bitstream_file is .bit.bin file which is generated
by Bootgen and bitstream_file should be in the same path with the script.
Please run this script on the board! OPTIONS
--help Display this help message EXAMPLE Version : 191031v1.0
"
exit 0;
}
expr "$*" : ".*--help" > /dev/null && usage
#------------------------------------------------------------------------------
# => Check system environment and make sure fpga manager runs well
FPGA_MGR_PATH=/sys/class/fpga_manager/fpga0
if [ ! -d ${FPGA_MGR_PATH} ]; then
printf "\033[31m[ERROR]\033[0m FPGA Manager is not found, please check the driver!"
exit 1
fi # => Check that user input is correct
if [ ! -f "$1" ]; then
printf "\033[31m[ERROR]\033[0m '$1' not found, please check if the file exists\n"
exit 1
fi ZN_SCRIPT_NAME="$(basename ${BASH_SOURCE})"
ZN_SCRIPT_PATH="$(dirname ${BASH_SOURCE})" BITSTREAM="$1"
FPGA_MGR_FLAGS=${FPGA_MGR_PATH}/flags
FPGA_MGR_FIRMWARE=${FPGA_MGR_PATH}/firmware ################################################################################
# => The beginning
echo "\033[32m[ $(date "+%Y/%m/%d %H:%M:%S") ]\033[0m Starting ${ZN_SCRIPT_NAME}\n" # => Set flags for Full Bitstream
echo 0 > $FPGA_MGR_FLAGS
read flag <<<$(cat $FPGA_MGR_FLAGS)
[ "$flag" = "" ] || $(echo "[error] invalid mode, please check ${FPGA_MGR_FLAGS}" && exit 1) # => Loading Bitstream into PL
mkdir -p /lib/firmware/ && cp ./$BITSTREAM /lib/firmware/
echo $BITSTREAM > $FPGA_MGR_FIRMWARE # => The end
printf "\033[32m[ $(date "+%Y/%m/%d %H:%M:%S") ]\033[0m Finished ${ZN_SCRIPT_NAME}\n"

load-fpga-image

基于FPGA Manager的Zynq PL程序写入方案的更多相关文章

  1. 基于FPGA的按键扫描程序

    最近在学习FPGA,就试着写了个按键扫描的程序.虽说有过基于单片机的按键扫描处理经验,对于按键的处理还是有一些概念.但是单片机程序的编写通常都采用C写,也有用汇编,而FPGA却是采用VHDL或者Ver ...

  2. 基于FPGA的线阵CCD实时图像采集系统

    基于FPGA的线阵CCD实时图像采集系统 2015年微型机与应用第13期 作者:章金敏,张 菁,陈梦苇2016/2/8 20:52:00 关键词: 实时采集 电荷耦合器件 现场可编程逻辑器件 信号处理 ...

  3. S02_CH07_ ZYNQ PL中断请求

    S02_CH07_ ZYNQ PL中断请求 7.1 ZYNQ 中断介绍 7.1.1 ZYNQ中断框图 可以看到本例子中PL到PS部分的中断经过ICD控制器分发器后同时进入CPU1 和CPU0.从下面的 ...

  4. 基于FPGA的SPI FLASH控制器设计

    1.SPI FLASH的基本特征 本文实现用FPGA来设计SPI FLASH,FLASH型号为W25Q128BV.支持3种通信方式,SPI.Dual SPI和Quad SPI.FLASH的存储单元无法 ...

  5. 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)

    本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  6. 基于FPGA的音频信号的FIR滤波(Matlab+Modelsim验证)

    1 设计内容 本设计是基于FPGA的音频信号FIR低通滤波,根据要求,采用Matlab对WAV音频文件进行读取和添加噪声信号.FFT分析.FIR滤波处理,并分析滤波的效果.通过Matlab的分析验证滤 ...

  7. 基于FPGA的DW8051移植(三)

    总结一下问题: 1) http://www.cnblogs.com/sepeng/p/4137405.html  基于FPGA的DW8051移植(一)里面用modelsim观测波形发现程序进入了ida ...

  8. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  9. 基于FPGA的OLED真彩色动态图像显示的实现

    源:基于FPGA的OLED真彩色动态图像显示的实现 作为第3代显示器,有机电致发光器件(Organic Light Emitting Diode,OLED)由于其主动发光.响应快.高亮度.全视角.直流 ...

随机推荐

  1. 洛谷p3398仓鼠找suger题解

    我现在爱死树链剖分了 题目 具体分析的话在洛谷blog里 这里只是想放一下改完之后的代码 多了一个son数组少了一个for 少了找size最大的儿子的for #include <cstdio&g ...

  2. JAVA基础--MySQL(二)

     数据库约束 1.基础限制 ① 单一表内字节量总和不能超过65535,null 占用一个字节空间 ② varchar存储255 以内字节占用一个字节表示长度,255以上自己则占用两个字节表示长度 ③ ...

  3. nginx 访问控制之 限速

    nginx限速可以通过 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块来实现限速的功能. 一.ngx_http_limit_conn ...

  4. 第10组 团队Git现场编程实战

    组员职责分工 姓名 分工 童景霖 博客 朱晓倩 制作UI 万本琳 制作UI 唐怡 制作UI 陈心怡 制作UI 黄永福 测评福州最受欢迎的商圈.后期代码修改和完善 郑志强 测评各个价位的前五美食餐厅代码 ...

  5. R 语言输入输出 读取命令函参数

    输入数据 使用键盘输入数据 只能处理小样本,很少使用 在创建 data.txt 字符串之后,用函数 read.table() 创建数据框 data.1.这种方法可以让我们把数据嵌入到R代码中,此处切记 ...

  6. Java编程思想之二 一切都是对象

    2.1 用引用操作对象 每种编程语言都有自己的操作内存中元素的方式. 在Java中,一切都可以视为对象,因此可以采用单一的固定语法. 2.2 必须由你创建所有对象 一旦创建一个引用,就希望它能与一个新 ...

  7. Nginx+keepalived实现负载均衡高可用配置

    1. 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了屏蔽负载均衡服务 ...

  8. 【C++】C++中的异常解析

    异常是程序在执行期间产生的问题.C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作. 异常提供了一种转移程序控制权的方式.C++ 异常处理涉及到三个关键字:try.catch.throw ...

  9. Xamarin.FormsShell基础教程(7)Shell项目关于页面的介绍

    Xamarin.FormsShell基础教程(7)Shell项目关于页面的介绍 轻拍标签栏中的About标签,进入关于页面,如图1.8和图1.9所示.它是对应用程序介绍的页面. 该页面源自Views文 ...

  10. vue重置表单数据

    Object.assign(this.$data, this.$options.data()) // 全部重置 Object.assign(this.$data.form, this.$options ...