Vivado2015.2

FPGA+ARM是ZYNQ的特点,那么PL部分怎么和ARM通信呢,依靠的就是AXI总线。这个实验是创建一个基于AXI总线的GPIO IP,利用PL的资源来扩充GPIO资源。通过这个实验迅速入门开发基于总线的系统。

使用的板子是zc702。

AXI总线初识:

AXI (Advanced eXtensible Interface),由ARM公司提出的一种总线协议。总线是一组传输通道, 是各种逻辑器件构成的传输数据的通道, 一般由数据线、地址线、 控制线构成。 Xilinx从6系列的 FPGA 开始对 AXI 总线提供支持, 此时 AXI 已经发展到了 AXI4 这个版本, Vivado里都是基于AIX4的 IP。

ZYNQ支持三种AXI总线,拥有三种AXI接口,用的都是AXI协议:
AXI4:(For high-performance memory-mapped requirements)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大256轮的数据突发传输。
AXI4-Lite:(For simple, low-throughput memory-mapped communication)是一个轻量级的地址映射单次传输接口, 占用很少的逻辑单元。

前言:

前面我们都是使用JTAG方式下载比特流文件,然后下载elf文件,最后点击Run as或者Debug as来运行程序。JTAG方式是通过tcl脚本来初始化PS,然后用JTAG收发信息,优点是可以在线调试,缺点是断电后程序就丢失了。为了解决程序丢失的问题,可以制作镜像文件烧写到sd卡或者flash中,上电即可加载程序。

ZYNQ有两大类启动模式:从BootROM主动启动,从JTAG被动启动。

在没有外部JTAG的情况下,处理系统(PS)与可编程逻辑(PL)都必须依靠PS来完成芯片的初始化配置。即借助CPU来完成配置,这也是ZYNQ系列的不同之处。

板子依然使用的是zc702.

启动模式设置:

zynq 具有多种启动方式: NOR, NAND, Quad-SPI, SD Card以及 JTAG 。 zynq 如何判断从哪里启动呢? 上电后, zynq 会根据模式管脚的设定选用 boot 的方式。 而这个管脚的设定是通过核心板上的拨码开关实现的。zc702的拨码开关是sw16。

The ZC702 board supports these configurationoptions:
• PS Configuration: Quad SPI flash memory

前言:

ZYNQ 7000有三种GPIO:MIO,EMIO,AXI_GPIO

MIO是固定管脚的,属于PS,使用时不消耗PL资源;EMIO通过PL扩展,使用时需要分配管脚,使用时消耗PL管脚资源;AXI_GPIO是封装好的IP核,PS通过M_AXI_GPIO接口控制PL部分实现IO,使用时消耗管脚资源和逻辑资源。

使用的板子是zc702。

1.MIO方式

Zynq7000 系列芯片有 54 个 MIO(multiuse I/O), 它们分配在 GPIO 的 Bank0 和Bank1 隶属于 PS 部分, 这些 IO 与 PS 直接相连。 不需要添加引脚约束, MIO 信号对 PL部分是透明的, 不可见。 所以对 MIO 的操作可以看作是纯 PS 的操作。

前言:

使用的板子是zc702。用Vivado的IP核搭建最小系统,包括ARM核(CPU xc7z020),DDR3(4×256M),一个UART串口(Mini USB转串口),纯PS,通过串口打印出HelloWorld,工程虽小,五脏俱全,算是一种朝圣。配置要和板子对应,大家注意修改。

操作步骤:

硬件部分

1. 新建Vivado工程。选择芯片型号xc7z020clg484_1或者点击Boards选择zc702

2.单击Create Block Design, 命名

前言:

偶数分频容易得到:N倍偶数分频,可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。

奇数分频如何得到呢?

第一部分  奇数分频

奇数分频方法:

N倍奇数分频,首先进行上升沿触发进行模N计数,计数到(N-1)/2时输出时钟翻转,同时进行下降沿触发的模N计数,计数到(N-1)/2时输出时钟翻转时,进行输出时钟时钟翻转。两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数N分频时钟。

或者使用“相与”,方法与上相同,只是翻转的数值变为(N-2)/2。

三分频的Verilog实现:
module Divider_Multiple(
input clk_i,
input rst_n_i,
output div2_o,
output div3_o
);

reg div2_o_r;
always@(posedge clk_i or negedge rst_n_i) //二分频
begin
if(!rst_n_i)
div2_o_r<=1'b0;
else
div2_o_r<=~div2_o_r;
end
reg [1:0] pos_cnt;

作者: ChuanjieZhu

前言:

学习Xilinx的ZYNQ 7000系列,用的板子是zc702(注意不是zedboard),SOC型号是xc7z020。虽然设计思路一样,但不同的套件引脚和io标准是有区别的,zc702评估板的的外观图如下,可以对照下自己的板子:

作为入门体验,本设计实现的功能是控制8个流水灯,循环闪烁,每隔1s移位一个。我们用到的部分是SoC和user LEDs。声明一下本文仅仅用PL编程,并不是PS+PL。

步骤:

1.新建Vivado工程,这里命名为LedTest,next选择新建PTL Project,next选择Boards,输入z7c02,单击后finish:

同步内容