Zynq

上一节我们体验了一把PS和PL是怎样联合开发的,这种ARM和FPGA联合设计是ZYNQ的精华所在。这一节我们实现一个稍微复杂一点的功能——测量未知信号的频率,PS和PL通过AXI总线交互数据,实现我们希望的功能。

如何测量数字信号的频率

最简单的办法——在一段时间内计数

在我们设定的时间(Tpr) 内对被测信号的脉冲进行计数, 得Nx, Fx=Nx/Tpr。

Tpr 越大,测频精度越高。这种方法适合于高频信号,因为这里可能会有一个被测信号周期的误差,测量高频信号时误差小。

另一个变种——在一个周期内计数

在 被测信号一个周期内对基准时钟信号计数,得Nx, 基准时钟周期为T, 则Tx=T*Nx, Fx=1/Tx。
被测信号频率越低, 基准时钟频率越高,测量精度越高。因此这种方法适用于低频信号。

二者结合——多个周期同步计数

这种方法的精髓在于同步二字。
在计数时引入D触发器,在被测信号的上升沿计数(Ntest),实际测量时间是被测信号周期的整数倍,消除了可能的1 个周期的误差。
引入一个标准时钟信号(Fstd已知),在测量被测信号频率的同时,对标准时钟脉冲进行计数(Nstd)。
它俩的计数时间相同:Nstd/Fstd = Ntest / Ftest,所以Ftest=Fstd*Ntest/Nstd

ZYNQ QNX开发——在ZedBoard上运行QNX

QNX版本:QNX6.6
宿主系统:Windows
交互系统:Debin
开发板:MIZ702 完全兼容ZedBoard

开发流程:
1、打开QNX Momentics IDE开发环境,File->QNX Source Package and BSP->Next->选择从官网下的BSP压缩包一路Next Finish。

2、在IDE左侧的工程目录下找到新导入的BSP文件,编译工程。Note:在编译BSP之前将/BSP/image/mkflashimage文件的26行的Xilinx SDK路径根据自己的安装情况进行修改。后面附修改后的代码。

3、ZYNQ启动所需要的文件有BOOT.bin和OS镜像文件。若宿主操作系统为Linux,BSP编译完成后即可获得系统需要的文件。NOTE:若使用的开发板为ZC702 EVM则不需要任何修改,若使用的开发板为ZedBoard或者自制板卡需要将image文件下的fsbl进行替换。

前面一节我们学会了创建基于AXI总线的IP,但是对于AXI协议各信号的时序还不太了解。这个实验就是通过SDK和Vivado联合调试观察AXI总线的信号。由于我们创建的接口是基于AXI_Lite协议的,所以我们实际观察到是AXI_Lite协议的信号时序。

具体做法是创建一个基于AXI总线的加法器模块,在Vivado里将AXI总线添加到debug信号里,实际上是用逻辑分析仪探测信号,在SDK端通过debug方式依次写入两个加数,由PL计算出和,我们读出这个和打印到串口,这样AXI总线的读和写就都能观察到了。

板子使用的是zc702。

在观察信号之前我们有必要简单了解AXI是个什么:

AXI总线是一种高性能、高带宽、低延迟的片内总线,AXI协议描述了主从设备数据传输的方式。主设备和从设备通过握手信号建立连接,握手信号包括主机发送的VALID信号,表示数据有效,从机发送的READY信号,表示从机准备好了接收数据。当VALID和READY都有效的时候传输开始。

Zynq使用的是AXI协议的4.0版本,由AMBA3.0协议发展而来:

PYNQ系列学习(四)——pynq与zynq对比(三)

上一期,我们重点学习了ZYNQ的PL开发,本期我们侧重于进行PS开发的学习。我们将在 VIVADO 开发环境下搭建 ARM+FPGA 的系统架构,并在 SDK 中编译软件实现软硬件联合开发。

本部分的学习,我们依旧借助得力的助手与伙伴——PYNQ_z2来完成。

一. 实验目的

1. 点亮开发板右下角三个灯

2. 输出“Hello,World!”

二. 实验要求

1. 在 VIVADO 中编译 bit 文件;

2. 在 SDK 中编译 elf 文件并将 FPGA 的 bit 文件和 ARM 处理器 的 elf 文件下载到开发板中

三. 实验步骤

1. 启动 VIVADO


2. 在 File 菜单中选择 New Project 选项启动项目向导。填写所要新建的工程名,然后点击 Next

xilinx zynq RapidIO系统配置

参考

书籍《RapidIO The Embedded System Interconnect》
xilinx手册pg007《Serial RapidIO Gen2 Endpoint v4.1 LogiCORE IP Product Guide》
Zynq-Linux移植学习笔记之14-RapidIO驱动开发

host初始化

直接看RapidIO的初始化,一些底层的比如物理层链路层之类的不需要关心,用到了再去看,毕竟都是基于芯片或者IP来开发。先从高层了解这个过程。

系统启动过程概述

1. host CPU获取引导代码,启动,如果有两个host,则两者是同时启动的。
2. 开始执行系统探测和枚举算法。
3. 枚举所有器件并将相关器件信息记录到器件数据库,建立host和所有endpoint之间的路由。
    •   计算并配置host和所有endpoint之间的最优路径。
    •   用最优路径信息配置switch。
    •   更新路由表。
4. 映射地址空间。

一、前言

  之前ZYNQ与PC之间的网络连接依赖于外接硬件协议栈芯片,虽然C驱动非常简单,但网络带宽受限。现采用LWIP+PS端MAC控制器+PHY芯片的通用架构。关于LWIP库,已经有很多现成的资料和书籍。其有两套API,一个是SOCKET,另一个是本例中要用到的RAW。RAW API理解起来较为复杂,整个程序基于中断机制运行,通过函数指针完成多层回调函数的执行。SOCKET API需要支持多线程操作系统的支持,也牺牲了效率,但理解和编程都较为容易。实际上SOCKET API是对RAW API的进一步封装。

二、LWIP Echo Server demo解读

  首先打开Xilinx SDK自带的LwIP Echo Server demo.
/******************************************************************************
*
* Copyright (C) 2009 - 2014 Xilinx, Inc. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy

Zynq 轻量级以太网控制器LWIP传输速度优化

在sdk中选择lwip模板,编译调试可轻松连接成功并进行通信,模板中代码完成的任务是client给server发什么,server就会回复什么。

但是传输速度非常低下,只有50KB左右,所以需要改进速度,修改lwip BSP中的设置参数可明显改进传输速度,默认BSP参数是:

需要修改的参数如下:

MEM_SIZE 524288
MEMP_NUM_PBUF 1024 
MEMP_NUM_TCP_SEG 1024
PBUF_POOL_SIZE 8192
N_RX_DESCRIPTORS = 512
N_TX_DESCRIPTORS = 512
TCP_SND_BUF 65535
TCP_WND 65535
TCP_IP_TX_CHECKSUM_OFFLOAD= true

ZYNQ跑系统 系列(四) AXI-DMA的linux下运行

AXI-DMA的linux驱动

一、搭建硬件环境

vivado版本2017.4,芯片为7010,不过不管什么版本和芯片大致步骤是一样的

本文工程文件:https://gitee.com/long_fly/AXIDMA_linux

硬件平台PL的搭建同ZYNQ基础系列(六) DMA基本用法,在这个工程的基础上添加SD卡(根据自己的开发板硬件选择相应的引脚)

然后直接生成bit文件,然后记得要导出硬件(包含bit文件)进SDK

二、生成设备树

1.解压设备树工具文件夹到一个地方
在https://github.com/Xilinx/device-tree-xlnx下载

2.菜单栏 –> Xilinx –> Repositories
添加刚刚解压的位置

利用ZYNQ验证算法的一大优势在于,可以在上位机发送指令借助CPU的控制能力和C语言易开发特点,实时配置算法模块的工作模式、参数等对来对其算法模块性能进行全面的评估。最重要的是无需重新综合硬件模块。

  接着上篇该系列博文,在sysGen中设计模块功能为:根据模式选择输入,来完成乘2或除2两种运算,0乘1除。

测试激励选用From Workspace模块,从MATLAB工作空间导入数据。利用MALTAB脚本可以非常容易地生成任意数据集,极大体现了sysGen开发的优势。

设计完成调用xilinx waveform viewer,两种运算行为仿真波形如下:

ZYNQ的Linux开发--使用SDK生成设备树

开发环境:
Windows下的Vivado套件
Linux ubuntu

Step1:首先从Xilinx GitHub上下载Device Tree Generator(设备树生成器)的BSP https://github.com/Xilinx/device-tree-xlnx/pulls 并将其复制到SDK的安装目录下

Step2:配置SDK开发环境,Xilinx Tools->Repositories,在Local Repositories 中点击New,将在github中下载的文件夹路径添加进去。


Step3:使用Device Tree Generator生成设备树
File->New->Board Support Package

同步内容