ZYNQ7020学习历程

一、介绍

 Zynq 的全称是 Zynq-7000 All Programmable SoC, 是它由一个双核 ARM Cortex-A9 处理器和一个传统的现场可编程门阵列(FPGA)逻辑部件组成的。作为片上系统(System on Chip,SOC),仅使用单个硅芯片即可实现整个系统的功能。

Zynq 是由两个主要部分组成的:一个是由双核 ARM Cortex-A9 为核心构成的处理系统(PS,Processing System),和一个等价于一片 FPGA 的可编程逻辑( PL, Programmable Logic)部分组成,可以理解为整体框架是由双核 ARM Cortex-A9 组成的处理系统外加PL外设方式构成的SOC,方便开发者进行编程以及复杂算法的实现。

由Zynq的结构可知其主要是分为两个部分,如果将Zynq比作完整的控制器,PL端相当于硬件电路,而PS端相当于控制器的程序。硬件电路的优势就是低延时,速度快,而PL端的开发实际也是硬件电路的搭建过程,利用其低延时特性能够完成复杂算法的开发,图像数据的处理等大规模数据操作。PS端的开发可以理解为软件程序的设计,通过程序设计可以完成各种复杂逻辑控制。PL与PS的完美配合,降低了传统单片机+FPGA的开发难度,节约了开发设计成本。

二、开发环境

PL端的开发采用软件Vivado,通过Verilog HDL硬件描述语言实现,学习PL端开发时我选择学习的是Verilog语言,该语言主要是数字电路的编程实现,我们开始学习的时候不需要特别精通,只需要了解基础的语法内容:数据类型,赋值操作(阻塞赋值以及非阻塞赋值),寄存器锁存器等基本概念即可;模块功能实现方面可以学习学习状态机。

PS端的开发采用软件vitis,通过C语言编程实现,语言学习主要关注:数据类型,数组和指针的运用,结构体,if,swith判断语句,for循环语句等基本知识。编程过程中使用到的C语言知识并不深,不需要特别了解。但是很多学习时不常关注到的const,typedef以及#ifdef等经常会用到。

语言的学习主要是遇到不懂的去查阅资料学习即可,要把主要精力放到重要的事情上面,他们只是工具。

三、PL端

Zynq的本质是FPGA,PL端属于Zynq开发的硬件设计部分。

其发开流程主要:

1、功能分析:根据需求分析要是实现的逻辑功能,形成逻辑流程图或逻辑框图的格式(可以借助绘图软件visio)。

2、编写程序以及测试程序:在FPGA的开发过程中除功能实现程序外,存在测试程序用于对功能模块的验证。

3、仿真验证:利用modelsim仿真软件对测试程序进行验证,验证模块是不是按照逻辑设计运行的。

4、分析与综合:综合主要是将HDL编写的Verilog或VHDL代码转换为门级网表的过程,也就是转换为门级电路。

5、设计实现:在此阶段会将生成网表进一步映射到FPGA具体资源上面。

6、下载验证:没什么可说的,进行看是否按预想设计运行。

此部分需要掌握的基本知识,也可以说基本功能:

1、首先就是我们最常用最基本的实验:点灯程序,我们主要通过例程掌握如何去建立工程,进行仿真,如何对IO端口进行约束以及时序约束,如何操作IO端口。

2、利用某IO端口电平的变换去控制LED的关断:学习输入端口的配置,理解IO输入与输出配置的不同。

3、学习基本IP核:PL部分的功能主要是通过IP核进行实现,IP核可以看作是各个功能模块。在这部分只需要学习系统基本的IP核即可:

(1)PLL IP核:主要用于时钟的配置,作为时钟反馈电路,通过该IP核可以提供不同的时钟信号,用于需要时钟的IP模块或者外设使用。

(2)RAM IP核:包括单双端口RAM IP核的生成以及利用读写对其数据的访问,作为PL端基本的存储单元,用于数据的交互操作。

(3)FIFO IP核:FIFO是一种先进先出的数据缓冲器,用于读写带宽不同步的场合,使用性较广。

其余的IP核可以等到具体应用具体学习。

注:利用 IP Catalog 可以创建系统提供的IP核,节省开发时间。

注:由于Zynq的特性,片上存储器较小,因此需要外接动态存储器DDR用于程序的运行RAM。此外,内部只集成了bootload的引导程序,不能进行程序的下载固化,需要借助外接的非易失性存储器。

四、PS端

PS端的开发类似于单片机,不同之处是需要将PL端与PS端连接起来,也就是说PS需要在PL搭建的窝里面下蛋。

PS端的开发流程:

1、准备工作:如上述表达的一样,需要创建vivado工程,验证综合实现后导出XSA文件,该文件就是那个窝,利用vitis导入后进行软件部分的开发。

2、软件逻辑的编写,调试与编译:此部分与单片机开发流程几乎无异。

3、最后的程序下载验证。

此部分需要掌握的知识:

1、基本操作:点灯实验,利用 IP Integrator 创建 Processing System (也就是PS端的控制器)控制IO口动作。此处主要学会三个点: Processing System 的使用设置;PS控制自已专有的IO口,也就是MIO的动作;PS通过扩展控制PL端的IO口(EMIO)的动作。

2、IO口中断操作:学习系统的中断结构,包括中断源的类别,中断的传播路径,中断产生后的处理方式;学习利用IO口发生电平变化作为中断触发条件触发中断,后续通过在PS端进行中断处理后打印出提示信息或者改变IO电平方式验证实验的成功与否。

3、程序的固化:学会利用存储器接口实现非易失性存储器的扩展设置,通过启动引脚改变程序启动方式,实现程序的固化(再次上电后不需要再次进行程序烧录而运行);也包括了通过PS端对各种存储器的操作,如EEPROM,QSPI flash,SD卡等。

注:后续可以研究怎样利用串口实现IAP。

五、PL与PS的交互

1、AXI接口学习:上面也介绍了PS与PL之间交互的一种方式,通过EMIO实现,另外一种是可以通过AXI接口实现,该接口在PL与PS的交互中是一种较为常用的一种方式。其不仅可以扩展IO,也可以进行实现复杂的寄存器地址的操作。

2、基于BRAM的数据交互:BRAM是位于PL端的资源,通过对同一BRAM的先写后读操作可以实现数据的交互,主要用于数据量较小,地址不连续的情况。

3、基与AXI DMA进行数据交互:主要实现PL对PS端的数据读写访问,当需要传输的数据量较大,地址连续的情况,为了减少CPU资源的浪费,通过DMA进行数据传输是一种有效的方式。

六、其他

上面的介绍能够做一些简单的控制,还有一些规范以及工具类可以有余力看一下:

1、自定义IP核及封装:并不是所有的IP核都可以通过IP Catalog 找到,为方便某一特定功能模块的管理,使其能够方便的移植到其他项目时,需要对其自定义并封装管理。

2、双核交互:Zynq具有双核处理器,SMP(对称多处理)方式会造成性能的浪费,但是开发简单;而AMP可以将双核分开运行,一个做裸机控制或者实现特定功能,一个实现OS。也是较为常见的使用方式。需要学习其存储空间分配的问题以及利用中断实现交互的方法。

3、FreeRTOS操作系统:vitis种提供了FreeRTOS的相关模板,可以较为快捷的实现实时操作系统的应用,可以通过网络查阅相关知识,了解其应用情况。

4、PL端提供了在线逻辑分析仪的功能,通过IP模块的开发可以建立ILA IP核,可以对信号进行DEBUG观察,降低了仪器成本,但是需要占用一定的片上资源。

七、总结

资源看的再多,不如上手实验,强烈建议当对系统的架构有一定的了解后,入手开发板进行学习,理论与实际结合才能深入。第一次编写文案,且只是学习过程中经验总结,有错误或不同见解请多多担待,预祝大家学习进步,事业风顺。。。

你可能感兴趣的:(学习,fpga开发)