精华内容
下载资源
问答
  • 第一步: 在Vivado的ZYNQ Block Design时候不配置DDR 第二步: 在Vitis中: 1、 在Vitis中新建Platform,选择xsa文件: 2、 在xparameters.h中添加DDR的地址空间定义,如下: 3、 修改链接文件,修改每个段都到...

    软件版本:Vivado Vitis2019.2

    第一步: 在Vivado的ZYNQ Block Design时候不配置DDR

    第二步: 在Vitis中:
    1、 在Vitis中新建Platform,选择xsa文件:

    2、 在xparameters.h中添加DDR的地址空间定义,如下:

    3、 修改链接文件,修改每个段都到ram_0,因为ram_1空间全部给到应用程序

    4、 修改fsbl工程的main.c,增加XPAR_PS7_DDR_0条件编译

    5、 修改fsbl.h,重定义DDR_END_ADDR的宏

    6、 修改qspi.c,注释掉FLASH大小选择,写成128M

    7、 编译修改好的Platform

    8、 新建Application工程(此处新建Helloworld工程作为示例):

    9、 选择编译好的Platform

    10、 修改(或者新建)Application工程的链接脚本,将ram_1空间全部给到应用程序:

    11、 编译Application工程

    12、 生成BOOT.bin

    13、 Program Flash
    在Vitis直接下载BOOT.bin时候较大概率会出错,一般我使用Vivado进行下载(Program)

    展开全文
  • zynqDDR设计参考

    2018-10-07 09:50:37
    zynqDDR设计参考,已经在项目上实施,需要更改FSBL才可以。资料里包括微博的内容以及官方原版英文的资料。
  • ZYNQ7000系列中PS端与PL端的通信都是通过AXI总线进行连接的,利用好AXI协议是PS与PL交互的基础,因此设计这个实验来进一步了解两者间的通信。1.实验目的PL端通过AXI协议访问PS端的DDR内存,其中包括往DDR写数据,...

    ZYNQ7000系列中PS端与PL端的通信都是通过AXI总线进行连接的,利用好AXI协议是PS与PL交互的基础,因此设计这个实验来进一步了解两者间的通信。

    1.实验目的

    PL端通过AXI协议访问PS端的DDR内存,其中包括往DDR写数据,以及读取DDR内部的数据。

    图 1 实验框图

    2.如何实现

    看起来实验目的很简单,但是对于像我这样的初学者而言那还是有很多的问题的。例如:

    1.芯片内部硬件怎么连接(好比两个人打电话,总得知道电话号码才能交流)

    2.谁是主机谁是从机(好比两个人打电话,谁打给谁)

    3.什么时候发数据,什么时候读数据,总不能在别人还没存好数据的时候读吧(比如两个人打电话,一个人在睡觉,怎么都打不通吧)

    3.设计思路

    针对上述3个问题,来设计总的思路,这样能有条理的实现总体的功能。

    4.芯片内部硬件连接

    ZYNQ中有9个AXI总线(如图 1),其中包含4个General-Purpose Ports(AXI_GP),主要是一些常用的通信,位宽为32位,4个High-Performance Ports,高速的通信,位宽为64位,还有一个AXI_AXP这个我不太了解,不过位宽也是64位。

    图 2 ZYNQ示意图

    从图 2中可以看出访问DDR3的接口有三条①、②、③条接口,其中PL的访问有两条,分别为①和③,为了简单我们选个③,如果有兴趣可以使用③来写,①来读的操作,这样能更好的理解两者间的交互。

    5.从机与主机

    这个简单的理解就是图 2中的箭头,箭头连接的一段为从机,没有连接的一段为主。例如AXI_HP接口,主机就是PL,而箭头连接的一段是PS,那么PS就是从机。

    6.读写时序的控制

    主要的问题集中于PL什么时候写数据;PL什么时候读数据。简单的一种控制就是PL自己控制,例如先写5个数据,在读5个数据,为了增加点难度,我们可以这样设计,用PS来通知PL什么时候写,什么时候读。那么又涉及到了两者的通信,而这种通信就比较普通,不是内存的控制,具有普适化的意义,这里使用AXI_GP来进行通信,以PS为主机。

    注:PS发数据是走红色的路还是蓝色的路是由其地址决定的图 3 PS发命令的端口

    7.总结

    最后我们使用AXI_GP接口来控制读写,其中PS为主机;用AXI_HP接口来进行DDR3数据的输入与输出,这时PL为主机。

    8.程序设计流程图

    流程图包含PS部分和PL部分。

    9.PS部分流程设计

    PS端的程序,我们采用轮训的方式进行读写命令完成的获取,也就是PS端不停地读取PL端是否写完,以及是否读完的命令。后续可以拓展为采用中断的方式进行读写控制。

    图 4 PS端流程图

    10.PL部分流程设计

    PL端AXI_HP的流程如图 4所示,一个简单的状态机来完成数据的读写,此时PL为主机。图 5 PL端AXI_HP的状态机

    PL端AXI_GP的流程图如所示,也是一个简单的状态机,但是此时PL是从机,PS是主机,PS发出读取(是否写完或者是否读取)的状态,PL将此时的状态返回给PS端,让PS来进行判断是否需要进行下一步操作。

    图 6 PL端AXI_GP的状态机

    11.程序设计

    首先,设计FPGA端的程序。有几个注意点:PL端的逻辑一般都是先仿真,然后进行板级调试,如果仿真没过,那么下载到板子上肯定不过(仿真很重要)。

    ZYNQ-7000的AXI协议不是和ARM一样严格遵守的,有些端口是没有用到的如图 7,但是响应这些一定要按协议来。

    这里可以简单的想一下,PS端的DDR怎么能用PL来仿真呢?我能想到的解决方法有2个(欢迎提供更多的方法):在PL端利用ddr的ip核选择AXI模式进行仿真,操作比较麻烦,同时仿真时间长,但是参考价值高

    就在PL端用一个带AXI4总线的bram进行仿真,比较简单,但是参考价值低

    为了偷懒,我这边就用方法2来仿真。这个IP中有些端口也是没有用到的图 7 axi_bram s_axi_awlock端口

    根据4.2中的流程图,以及5中的分析,自己编写axi协议后,得到仿真图如图 8 AXI_HP的仿真,采用AXI INCR突发模式,突发大小为8个字节,突发长度为2。突发的地址是根据ZYNQ中的硬件地址来的如图 9,采用32’h0008_0000为起始地址(仿真的起始地址是0)。图 8 PL端的AXI_HP仿真图

    那么往ddr3写数据的地址应该怎么确定呢?图 9中可以看到AXI_HP可以用的地址,我用的起始地址是32’h0008_0000。图 9 PS的地址映射

    这里有个问题可以想一下,PS端的程序也是跑在DDR3里面的,那么怎么才能使得PL端访问的地址与程序跑的地址不冲突呢?(这个可以在评论中给点意见)

    我这里的解决方案有两个:简单的就是写的地址与程序的地址不一样就好了

    就是在PS端分配好内存用来写ddr,然后将这个地址的起始地址发给PL,这样肯定不会有冲突(也许xilinx dma那个ip核就是这么干的吧)

    同样为了偷懒,我采用第一个方法,那么怎么知道程序跑的地址呢?

    在SDK的工程里面有个lscript.ld里面有许多地址的信息如图 10,图 11。可以看到这边的地址是从100000开始的,所以我用的地址不在这里。图 10图 11

    12.程序验证结果

    因为熟悉了一点AXI协议,就自己写了个AXI通信的模块,然后实现了PL与ddr的通信,以及PL与PS的通信。

    本来用黑金zynq7020的板子验证的,结果电源模块坏了,找客服修说过保了,就不能修了,哎,好可惜。。。。。。。。。。。应该是二极管击穿导致的。

    于是接了个ZCU102的开发板来测试这个程序,不过原理都是一样,只是代码上的地址可能要改一下。

    写数据结果如图 12图 12 写数据

    读数据结果如图 13图 13 读数据

    上述读写的结果一致,完成了本次实验,这次实验中最重要的部分就是对AXI协议的理解。

    参考资料

    附录

    Block Design如图 14 这个是ZCU102的,如果是zynq-7000.只要把中间的换了就好。

    图 14 Block Design

    展开全文
  • 今天给大侠带来Zynq:用PS控制DDR3内存读写,话不多说,上货。本篇文章的目的主要用简明的方法对DDR3进行读写,当然这种方式每次读写都需要CPU干预,效率是比较低的,但是这是属于学习的过程,还是可以经历经历的。...
    52b506fd8d7ce299c5a356b4b82f0dfa.gif大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

    今天给大侠带来Zynq:用PS控制DDR3内存读写,话不多说,上货。

    本篇文章的目的主要用简明的方法对DDR3进行读写,当然这种方式每次读写都需要CPU干预,效率是比较低的,但是这是属于学习的过程,还是可以经历经历的。

    本系列文章尽可能的让每一个实验都相对独立,过程尽可能保证完整性,保证实验的可重现性。但是用到的模块或者IP的具体作用和用法不保证都重复详细的介绍。

    本文所使用的开发板是兼容zedboard

    PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4。

    生成硬件系统

    ffa3c875e28687cb9dbcbaacc85a311f.png6f3faa86e44d682932e1511dde30f144.png

    1、新建vivado工程。

    963f22206f8e66335e882ff0d1a3609b.png

    2、选择Zedboard。

    cc4770f4bc16b4dac02ecd03f655e5c6.png

    3、新建Block Design。

    959f6908fe2f0ca6937f81294f865025.png

    4、添加ZYNQ PS。

    67991bca6fccf2605dc9b8cbb132ae6b.png

    5、点击Run Block Automation,让vivado自动配置好zedboard相关的默认的信息,点击OK。

    43cfa64a945efeb6dc7e0e7f0bd5fea4.png

    6、双击ZYNQ,在此可以去掉一些不用的外设。

    6d590b616747759fab74b0067684d0aa.png2aacf1dbba59e04ae7e0448761abde1d.pngf598a02f35e7384589988e58cdc78f1a.png

    7、设置好的Block Design如图所示。

    0b1bc25ddc8d1bfb9e9abdf7a4e3be7f.png

    8、在block design上右击,选择Create HDL Wapper。

    9、完成后,在block design上右击,选择Generate Output Prouducts,在弹出的对话框选择 Generate。

    10、点击 Generate Bitstream。

    11、完成后,选择File->Export->Export Hadfware,选中 Include bitsteam。

    12、File -> Launch SDK,把硬件架构导出到软件工程。

    编写软件程序

    ffa3c875e28687cb9dbcbaacc85a311f.png6f3faa86e44d682932e1511dde30f144.png

    1、新建Hello工程

    84bd6a71e9f80164a85b321da382ab77.png

    2、DDR3的地址

    建好后,在mem_demo_bsp->ps7->cortexa9_0的路径下,打开xparameters_ps.h这个头文件,这个头文件是cortexA9可以直接控制的外设地址的宏定义。在里面可以找到DDR的地址,可以看到如下代码: 

    /* Canonical definitions for DDR MEMORY */ #define XPAR_DDR_MEM_BASEADDR 0x00000000U #define XPAR_DDR_MEM_HIGHADDR 0x3FFFFFFFU

    等会我们要使用这个地址,对DDR3进行读写操作。

    3、读写操作函数

    在mem_demo_bsp->ps7->cortexa9_0的路径下,打开xil_io.h这个头文件,这个头文件是cortexA9可以直接控制的内存映射或者映射到了地址空间的IO。在里面可以看到如下代码: 

    //从某个地址读数据 u8 Xil_In8(INTPTR Addr); u16 Xil_In16(INTPTR Addr); u32 Xil_In32(INTPTR Addr);//向某个地址写数据。void Xil_Out8(INTPTR Addr, u8 Value); void Xil_Out16(INTPTR Addr, u16 Value); void Xil_Out32(INTPTR Addr, u32 Value);

    OK,有了这些就可以简单的对DDR进行续写操作了。

    代码实现

    ffa3c875e28687cb9dbcbaacc85a311f.png6f3faa86e44d682932e1511dde30f144.png
    #include "stdio.h"#include "platform.h"#include "xparameters.h"#include "xparameters_ps.h"
    #include "xil_printf.h"
    #include "xil_io.h"#define DDR_BASEARDDR XPAR_DDR_MEM_BASEADDR + 0x10000000 int main(){ init_platform(); int i; int rev; xil_printf("Hello World\n\r"); for(i=0; i<32; i++) { Xil_Out32(DDR_BASEARDDR+i*4,i); } for(i=0; i<32; i++) { rev = Xil_In32(DDR_BASEARDDR+i*4); xil_printf("the address at %x data is : %x \n\r" ,DDR_BASEARDDR+i*4, rev); } cleanup_platform(); return 0;}

    烧写测试

    ffa3c875e28687cb9dbcbaacc85a311f.png6f3faa86e44d682932e1511dde30f144.png

    串口终端的结果如下: 

    Hello World the address at 10000000 data is : 0 the address at 10000004 data is : 1 the address at 10000008 data is : 2 the address at 1000000C data is : 3 the address at 10000010 data is : 4 the address at 10000014 data is : 5 the address at 10000018 data is : 6 the address at 1000001C data is : 7 the address at 10000020 data is : 8 the address at 10000024 data is : 9 the address at 10000028 data is : A the address at 1000002C data is : B the address at 10000030 data is : C the address at 10000034 data is : D the address at 10000038 data is : E the address at 1000003C data is : F the address at 10000040 data is : 10 the address at 10000044 data is : 11 the address at 10000048 data is : 12 the address at 1000004C data is : 13 the address at 10000050 data is : 14 the address at 10000054 data is : 15 the address at 10000058 data is : 16 the address at 1000005C data is : 17 the address at 10000060 data is : 18 the address at 10000064 data is : 19 the address at 10000068 data is : 1A the address at 1000006C data is : 1B the address at 10000070 data is : 1C the address at 10000074 data is : 1D the address at 10000078 data is : 1E the address at 1000007C data is : 1F
    END后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!60a9ad50f82bd930a8ef11225016b145.gif

    8b14c427258bba31d2f9b62d084bf7da.png

    FPGA技术江湖广发江湖帖

    无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有,QQ微信双选,FPGA技术江湖打造最纯净最专业的技术交流学习平台。

    FPGA技术江湖微信交流群

    a1c175eda0060d7ad938dc609e0e0f5b.png

    加群主微信,备注职业+方向+名字进群

    FPGA技术江湖QQ交流群

    6c27025eb0b5dcf88018469863ca3281.png

    备注地区+职业+方向+名字进群

    a7906e2f98981092f3a7b46874dd4587.png

    展开全文
  • 上一篇:【干货分享】ZYNQ常用...ZYNQ有专用的DDR Controller接口,如果外部硬件连接了DDR器件,于是在ZYNQ Processing System中正确配置了相应的信号和参数后,DDR就可以成为ZYNQ的内存,在SDK中可以直接使用memcpy...

    上一篇:【干货分享】ZYNQ常用外设设计 (上)

    f1a07783ade396e1efe0e0a69efea8d6.gifZYNQ对Memory的操作参考工程见“ZYBO_Memory_GPIO_Interrupt_demo.xpr”。ZYNQ有专用的DDR Controller接口,如果外部硬件连接了DDR器件,于是在ZYNQ Processing System中正确配置了相应的信号和参数后,DDR就可以成为ZYNQ的内存,在SDK中可以直接使用memcpy、memset以及类似的函数对于Memory空间进行操作。Step1:查看ZYBO的原理图,找到相应的配置。ZYBO原理图中与DDR相关的部分如图 49所示。9bfaa42d2cdcee9ebf752f98d0e719fd.png图 49于是得到两个信息,第一个所使用的芯片是MT41J128M16JT-125,第二个是两片DDR3颗粒是通过位拼接完成的,也就是数据位宽为32bit。Step2:在Block Design中对DDR部分的参数进行配置。fba911393be3b0b56c8cdca29c853d4f.png图 50Step3:完成Block Design设计,产生Bitstream,导入SDK。b6963a5cf5fe664be0a6ad61e551390d.png图 51Step4:在SDK中编写Memory测试代码。
    #include #include #include "platform.h"#include "xil_printf.h"#include "xil_types.h"#include "xil_io.h"int main(){    u32 test_src[100];    int i;    int readback;     init_platform();    u32 *result = (u32*) malloc(sizeof(u32) * 100);     if (result) {       memset(result, 0, sizeof(u32) * 100);    } else {       return 0;    }     for(i=0;i<99;i++)    {       test_src[i]=i;    }    memcpy(result,test_src,100 * sizeof(u32));     for(i=0;i<100;i++)    {       readback = Xil_In32(result+i);

    其中特别需要学习的就是malloc与memcpy的使用方法。

    ZYNQ中MIO/EMIO GPIO的使用

    参考工程见“ZYBO_Memory_GPIO_Interrupt_demo.xpr”。

    MIO是PS端的外部引脚,共有54个;EMIO是PL端的外部引脚,共有64个。ZYNQ支持通过配置将PS的控制器信号通过EMIO输出,例如PS自带的UART Controller,如果正常选择引脚只能选择MIO引脚输出,但是通过设置可以选择连接到EMIO引脚。同时EMIO引脚也可以作为PS端的扩展引脚,即经过扩展PS一共可以控制118个引脚。

    该例程演示将4个EMIO设置为PS的扩展引脚,这4个EMIO连接着LED。于是,与“将用户逻辑设计封装成IP”中的实验相比,同样是控制外部4个LED,就不需要另外设计一个逻辑模块,并封装成IP作为PS的外设了,可以直接通过SDK的程序进行控制。

    注意:

    1. 用于扩展GPIO的EMIO和用于扩展外设的EMIO是完全独立的,GPIO的EMIO共有64个,由2个bank组成,如图 52所示。
    02f7039225133ed3577ee850d90349ee.png

    图 52

    2. EMIO的内部排序按照EMIO54、EMIO55... ... EMIO117,以此类推。有了EMIO的编号之后就与内部控制EMIO的寄存器一一对应;而EMIO在外部与外部引脚的对应关系又是可以通过管脚约束进行更改的。于是可以得出:不能通过EMIO的外部引脚的关系确定其内部寄存器的地址。工具对于EMIO GPIO的连接关系是按照从EMIO54开始依次向上排列。

    Step1:在Block Design中加入ZYNQ7 Processing System,在ZYNQ7 Processing System配置中添加EMIO GPIO,如图 53所示。通过设置EMIO GPIO Width来选择扩展EMIO GPIO的个数,此时就完成了与内部寄存器之间的对应关系,规则就是从EMIO54开始向上排列。

    b8a367e4d0a0a2a0ff2e58fccc2abed7.png

    图 53

    Step2:将ZYNQ的EMIO连接到外部引脚。右击生成的GPIO信号,点击Make External。4affb9628041e02b16b0010fb204f739.png图 54Step3:约束EMIO与外部引脚Pad的对应关系以及EMIO的电平标准。方法有两种:
    • 第一种是通过XDC约束文件进行约束,需要先将Block Design生成HDL Wrapper,这样才能知道其引脚名称。

    e015c698889c8149dec7065cf302f7a1.png

    图 55
    • 第二种方法就是Open Elaborated Design,在GUI中设置电平和引脚。
    d2af8363b1d11bd198401c75db697d5a.png

    图 56

    Step4:完成Block Design的综合、实现、生成Bitstream并导入SDK。

    Step5:SDK中完成代码的编写,EMIO的代码编写需要包含的库文件是"xgpiops.h"。

    #include "xgpiops.h"static XGpioPs emio;#define EMIO_54   54#define EMIO_55   55#define EMIO_56   56#define EMIO_57   57int main(){    //定义GPIOPS型指针,用于初始化时绑定硬件    XGpioPs_Config *ConfigPtrPS;    init_platform();    //初始化GPIOPS,将ConfigPtrPS与硬件绑定    ConfigPtrPS = XGpioPs_LookupConfig(0);       XGpioPs_CfgInitialize(&emio, ConfigPtrPS,                     ConfigPtrPS- > BaseAddr);       //设置EMIO的方向,并使能EMIO        XGpioPs_SetDirectionPin(&emio, EMIO_54, 1);        XGpioPs_SetOutputEnablePin(&emio, EMIO_54, 1);        XGpioPs_SetDirectionPin(&emio, EMIO_55, 1);        XGpioPs_SetOutputEnablePin(&emio, EMIO_55, 1);        XGpioPs_SetDirectionPin(&emio, EMIO_56, 1);        XGpioPs_SetOutputEnablePin(&emio, EMIO_56, 1);        XGpioPs_SetDirectionPin(&emio, EMIO_57, 1);        XGpioPs_SetOutputEnablePin(&emio, EMIO_57, 1);       while(1)      {       // 向EMIO写入数据,即驱动EMIO引脚      XGpioPs_WritePin(&emio, EMIO_54, 0x0);      XGpioPs_WritePin(&emio, EMIO_55, 0x0);      XGpioPs_WritePin(&emio, EMIO_56, 0x0);      XGpioPs_WritePin(&emio, EMIO_57, 0x0);       usleep(200000);      XGpioPs_WritePin(&emio, EMIO_54, 0x1);      XGpioPs_WritePin(&emio, EMIO_55, 0x1);      XGpioPs_WritePin(&emio, EMIO_56, 0x1);      XGpioPs_WritePin(&emio, EMIO_57, 0x1);       usleep(200000);      }    cleanup_platform();    return 0;}
    Step6:如果需要将EMIO作为输入端口,只需要将IO的方向设置为input。对于IO,作为输出的时候需要Enable,但是作为输入是永远使能的,不需要额外的Enable。具体代码如图 57所示。9e70b81d680dfa34a56e16f62bba5f2b.png

    图 57

    补充说明:MIO和EMIO都属于PS的GPIO,用于指示的变量类型为XGpioPs;而使用AXI_GPIO外设的GPIO,由于是属于PL的,所以指示这些IO的变量类型为XGpio。MIO和EMIO的控制对于SDK是完全相同的,其地址偏移量也是排在一起的,MIO从0排到53,EMIO接着从54开始。示例代码中显示的是EMIO作为输出和MIO作为输入,只需要将引脚编号的宏定义改为需要的MIO或者EMIO编号即可使用。在硬件配置时MIO的配置方法与EMIO有所不同,EMIO的配置如图 53所示。而MIO由于不像EMIO,外部管脚是确定的,所以可以在ZYNQ7 Processing System配置时同时完成属性以及电平的设置,如图 58所示。c5ddaffd9b799c7005dc23b177dd90fa.png

    图 58

    ZYNQ中Interrupt使用参考工程见“ZYBO_Memory_GPIO_Interrupt_demo.xpr”。ZYNQ中的中断管理是通过Generic Interrupt Controller(GIC)完成的。任何的中断功能都需要两步,第一步是配置相应的中断,第二步是设置中断触发之后的服务函数。配置相应中断分以下几个步骤:1. 使能相应的功能,例如GPIO中断需要首先使能和配置GPIO;Timer中断需要首先使能和配置Timer;9137d927575edef537b89ef09e301f20.png

    图 59

    2. 初始化并配置使能GIC,还要使能异常处理。第1步中的操作对于每个中断源来说都不相同,但是这一步的配置对于不同中断源而言是类似的。不同之处在于有一个参数:中断ID,即例子中的52是变化的,52是GPIO的中断号,其他中端需要使用不同的ID。该值可以在UG585中断的相关章节查询到,如图 61所示。另一个区别就是XScuGic_Connect时的服务子函数不同。f70096aa0ae6021d8076f7dd3bfeea64.png

    图 60

    16adb104ce63cc20f9a7976faae90491.png图 61

    3. 编写中断服务函数,需要注意的是进入服务函数后首先需要禁止中断,保证在处理中断时不会再次因触发中断而程序跳转;另外就是需要清除中断标志位,否则会不断触发中断。

    99c3bfdb4758cbf71d2602d20e0df4c7.png

    图 62

    源代码见附件。

    ZYNQ CPU内部任何有定时器,在Vivado的ZYNQ配置中无需任何操作就可以在SDK中直接使用。与GPIO中断类似,Timer的中断也包含相同的几步操作,下面给出各个阶段的代码片段,完整代码见附件。

    1. 初始化Timer。

    2fa0346ed6fbb43060f0a8bbb58ab8b9.png

    图 63

    2. 初始化GIC,设置中断服务函数入口。

    e8f432776603edba5478330439b9bfc3.png

    图 64

    3. 配置Timer工作模式,导入计数初值,使能中断。

    d03a47d74fed4abe829dd76f13ba97b6.png

    图 65

    4. 编写中断服务函数,进入中断后首先Disable中断,清楚中断标志位;然后进行中断处理;退出中断服务函数前重新使能中断。

    94ddf0959e4376b28749cba81248072e.png

    图 66

    Appendix 1: 配套工程

    8c213aa67663aeb064f24ce2e680193c.png

    关注我们2171ce2e0103c3cf4999a3718aac8d1b.png58a431ac631242d00b29d72d48c57108.png

    2b31598f1d02fbcd9bf97b2a8a6c6916.png

    展开全文
  • ZYNQ上无DDR加载应用

    千次阅读 2019-09-18 21:58:14
    1、背景介绍 为了节约成本和降低功耗,现在板载BMC全部选择了ZYNQ7010,无外挂DDR,存储空间使用QSPI,借助板载OCM执行应用程序。 xilinx网站上提供了一种解决方案,链接如下: ...
  • zynq使用DATAMOVER实现DDR到PL数据搬运的代码,用于学习ZYNQ的逻辑编程
  •   DDRzynq的内存又可以叫做主存。是CPU能直接寻址的存储空间,没有DDR的话,运行内存只有很小的内部RAM,软件大小受限,也几乎没法跑操作系统。作为下一篇AXIDMA的基础知识提前做个准备,内容很简单这里就简单做...
  • 欢迎FPGA工程师加入官方微信技术群ZYNQ7000系列中PS端与PL端的通信都是通过AXI总线进行连接的,利用好AXI协议是PS与PL交互的基础,因此设计这个实验来进一步了解两者间的通信。1.实验目的PL端通过AXI协议访问PS端的...
  • Xilinx-ZYNQ7000系列-学习笔记(6):ZYNQDDR使用OCM加载程序 之前由于某项目需求,需要去掉DDR,但是去掉DDR以后会导致程序无法正常启动,因为默认的启动方式会经过DDR这一步。 在查阅了大量的资料和仔细研究了...
  • Zynq UltraScale+ MPSoC配置DDR4参数

    千次阅读 热门讨论 2019-10-29 20:07:20
    Zynq UltraScale+ MPSoC配置DDR4参数 前言 自己做自己的嵌入式产品一般要选择合适的DDR,而这里开发板给的是4GB的UIMM的DDR4,也就是电脑上用的,所以用不了,只能自己挂载Component,这里说一下配置的过程,如何从...
  • ZYNQ平台调试DDR时,FPGA芯片为xa7z020,DDR芯片为MT41K256M16-107 由于FPGA芯片最快支持DDR的speed bin为DDR3L-1066,而DDR芯片的speed bin为DDR3L-1866 此时DDR Configuration是以原来速度慢的如1066的参数...
  • 本文对 Xilinx Vivado 中提供的 DDR3 控制器 IP 核模块进行例化,实现基本的 DDR3读写操作。并使用在线逻辑分析仪查看有规律变化的 DDR3 数据读写时序。1.DDR3控制器IP接口时序DDR3 控制器 IP 核用于衔接 DDR3 芯片...
  • 本编文章的目的主要用简明的方法对DDR3进行读写,当然这种方式每次读写都需要CPU干预,效率是比较低的,但是这是学习的过程吧。本系列文章尽可能的让每一个实验都相对独立,过程尽可能保证完整性,保证实验的可重现...
  • memtester交叉编译测试zynq mpsoc的DDR 【环境】: ubuntu 16.04 memtester 4.3.0 zynq mpsoc zcu9eg 1.下载 官网下载:http://pyropus.ca/software/memtester/ 2.编译 2.1 安装交叉编译环境 下载 Zynq UltraScale+...
  • ZYNQ PS DDR应用FDMA (AXI4总线方案
  • zynq ps DDR3 SDRAM

    2017-04-01 08:58:58
    参考 AR :https://www.xilinx.com/support/answers/53051.html
  • 本编文章的目的主要用简明的方法在纯PS里对DDR3进行读写。本文所使用的开发板是Miz701PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.410.0本章难度系数★☆☆☆☆☆☆10.1 搭建硬件工程Step1:新建一个名为为Miz...
  • ZYNQ实现无DDR启动实现

    千次阅读 2019-12-03 16:57:23
    在配置中,不使能DDR 生成bit,导入到sdk 2.SDK操作流程 在平台环境中,修改ps7_init.c文件,将ddr相关文件注释掉 生成bsp后,修改xparameters.h,添加ddr参数配置 然后,生成fsbl 在fsbl的main.c中,增加XPAR_PS7...
  • ZYNQ PS与PL共享DDR

    千次阅读 2019-11-07 20:37:32
    平台: 开发板:ZYNQ-7000系列裸板开发 开发环境:vivado hls、vivado、sdk 参考 https://blog.csdn.net/weixin_36474809/article/details/85111550 ...
  • zynqDDR使用OCM加载程序运行

    千次阅读 2018-12-28 13:58:44
    一、使能DDR,但程序不用DDR 赛灵思提供的文档,按照文档进行 ... 第八步 改为注释掉FLASH大小选择,均写成128M 就可以成功的OCM加载程序了 ...采用的方法是在zynq block design配置时保留ddr,而在程序编...
  • 【摘要】使用ZYNQ或者MPSoC的好处是可以通过PL逻辑设计硬件加速器,对功能进行硬件加速。加速器和ARM之间的交互信息一般包含自定义加速指令传递、待计算数据以及计算结果。这三种交互信息 使用ZYNQ或者MPSoC的...
  • ZYNQ_DMA访问DDR和PL资源

    千次阅读 2019-04-05 22:00:32
    ZYNQ_DMA访问DDR和PL资源前言需求PLPS结果总结 前言 之前一篇是PS通过AXI总线读写PL的寄存器,对于大数据的传输,这显然不是一个高效的方法,zynq的解决方案是给予PL直接访问DDR的通路,网上资料很多,但建议读UG873...
  • http://www.wiki.xilinx.com/Zynq-7000+AP+SoC+-+32+Bit+DDR+Access+with+ECC+Tech+Tip http://patchwork.ozlabs.org/patch/441802/ http://blog.csdn.net/andy_wsj/article/details/9339247 ...
  • ZYNQ7000系列中PS端与PL端的通信都是通过AXI总线进行连接的,利用好AXI协议是PS与PL交互的基础,因此设计这个实验来进一步了解两者间的通信。1.实验目的PL端通过AXI协议访问PS端的DDR内存,其中包括往DDR写数据,...
  • 本次想和大家继续讨论一些 DDR3 的东西,另外新增 DDR4 的仿真。主要包括,多组关于DDR3 的读写仿真测试,DDR4 逻辑仿真验证的另一种较为简单的方式。本次读写测试中采用:FPGA硬件平台为Xilinx的评估版KCU116,硬件...
  • 本编文章的目的主要用简明的方法在纯PS里对DDR3进行读写。本文所使用的开发板是Miz702PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.411.0本章难度系数★☆☆☆☆☆☆11.1 搭建硬件工程Step1:新建一个名为为Miz...
  • 欢迎FPGA工程师加入官方微信技术群点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群[导读] 基于ZYNQ实现复杂嵌入式系统非常便利,其应用领域也越来越广泛,本文来从对ZYNQ芯片架构的理解来谈谈个人体会。...
  • 本编文章的目的主要用简明的方法对DDR3进行读写,当然这种方式每次读写都需要CPU干预,效率是比较低的,但是这是学习的过程吧。本系列文章尽可能的让每一个实验都相对独立,过程尽可能保证完整性,保证实验的可重现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 430
精华内容 172
关键字:

ddrzynq