ove学习使我快乐

  • 2020-01-23
  • 发表了主题帖: 玩转Zynq连载37——[ex56] 基于Zynq的AXI HP总线读写实例

      1 概述          AXI HP总线是Zynq芯片非常重要的一个功能,它可以实现Cortex A9与PL之间大吞吐量的数据通信。可以说,Zynq芯片最大的卖点恐怕就是这条总线。对不起,不是1条,是4条这样的AXI HP总线。PL作为AXI HP主机,可以通过这4条总线实现对内存(DDR3)的读写访问,这4条总线加总的极限带宽,通常能够超过DDR3的最大有效带宽,因此,对于处理器与PL之间的数据交互,Zynq芯片可以做到了最优状态。因此,对于用Zynq做开发的工程师而言,如何玩转AXI HP总线就成为了必修课。          本实例(zstar_ex56)通过一个简单的AXI HP总线主机的读时序和写时序逻辑,来带领读者掌握基于Zynq的AXI HP总线基本使用方法。在这个实例中,首先需要在Zynq PS端对AXI HP总线进行配置,在系统硬件框图中进行必要的接口引出,然后在顶层源码中例化接口,并进行AXI HP读写时序的逻辑设计。   2 AXI总线协议介绍          参考文档《玩转Zynq-基础篇:AXI总线协议介绍.pdf》。   3 Zynq PS的AXI HP配置          在ZYNQ7 Processing System中,点击左侧Page Navigator的PS-PL Configuration页面,右侧展开HP Slave AXI Interface --> S AXI HP0 Interface,勾选S AXI HP0 Interface并且在展开的S AXI HP0 DATA WIDTH后面选择数据位宽是64(可选项只有32bit和64bit)。          回到Diagram中,需要将新增加的S_AXI_HP0接口引出。如图所示,点击选中S_AXI_HP0,然后单击右键,在弹出菜单中点击Create Interface Port...。          如图所示,将接口命名为AXI_HP0。          同样的方式,将S_AXI_HP0_ACLK引出,命名为AXI_HP0_ACLK。完成接口引出后,如图所示。          在Address Editor中,由于新增加的AXI_HP0总线地址还未做映射,所以如图所示,需要点击左侧的Auto Assign Address进行自动地址分配。          完成地址映射后,如图所示,AXI_HP0默认分配了偏移地址(Offset Address)0x0开始的1G内存空间。也就是说,这1G的地址空间是AXI_HP0可访问的地址空间。通常而言,DDR3也会默认映射到这一段地址空间中。那么,通过AXI_HP0就可以实现DDR3的读写了。          如图所示,点击Validate Design确认当前系统配置是否OK。   4 AXI HP主机读写逻辑设计          本实例工程源码的层次结构如下所示。我们重点来看和AXI HP相关的模块axi_hp0_source.v、axi_hp0_wr.v和axi_hp0_rd.v模块。          axi_hp0_source.v模块以1s为单位,计数定时,产生对AXI HP0总线固定地址32'h0100_0000写一组递增的burst lenght = 16的64bit位宽的数据。其产生的信号接口如下。          o_data_*信号送到axi_hp0_rd.v模块发起一次读DDR3的操作,i_data_*信号送到axi_hp0_wr.v模块发起一次DDR3写的操作。在ILA在线逻辑分析仪中,由于每秒都有AXI HP0总线的读操作和写操作,因此我们可以很容易抓到它们的时序进行观察和分析。          axi_hp0_wr.v模块对AXI HP0总线的写地址通道、写数据通道和写响应通道的信号接口产生必要的时序,完成一组数据的DDR3写入操作。该模块下例化了一个名为fifo_generator_0的FIFO,外部需要写入的数据都统一送到该模块中,当状态机检测到该FIFO的数据个数满足一个DDR3写入的burst length时,就发起一次DDR3写地址和数据的时序,读出FIFO中国的数据,通过AXI HP0的写数据通道送给DDR3。执行写操作的状态关系是先写地址(STATE_WADD),然后送数据(STATE_WDAT),最后等待写响应(STATE_DONE),完成一次操作(STATE_IDLE)。          axi_hp0_rd.v模块对AXI HP0总线的读地址通道产生必要的时序,由于读数据通道是由从机输出的,因此对该模块而言是输入,该实例的目的只是希望通过ILA在线逻辑分析仪进行时序查看,所以我们没有对读数据通道的接口做任何额外的连接。该模块的设计比较简单,按照axi_hp0_source.v模块给出的每秒定时脉冲和地址,每秒产生一个读地址通道时序即可。   5 AXI HP主机读写逻辑仿真          在本实例工程的Sources中,展开Simulation Sources --> sim_1,可以看到已经编写好的测试脚本tb_axi_hp0_wr.v,该测试脚本主要针对我们的AXI主机写模块axi_hp0_wr.v进行测试。在Simulation Sources中高亮的模块,表示当前有效的顶层模块。          若是希望设定更改Simulation Sources中有效的顶层模块,如图所示,可以展开Flow Navigator --> Simulation,点击Simulation Settings。弹出选项卡中,设置Simulation top module name即当前有效的Simulation顶层模块。          点击Simulation --> Run Simulation即可执行测试脚本的仿真。          如图所示,在弹出仿真界面后,点击Run All按钮,可以运行仿真测试。          axi_hp0_wr.v模块的仿真波形如下。          其中一次AXI HP0总线写地址和数据的时序波形如图所示。   6 嵌入式软件工程创建          参考文档《玩转Zynq-工具篇:导出PS硬件配置和新建SDK工程.pdf》导出PS硬件工程,并打开EDK新建一个HelloWorld的模板工程。本实例并不需要在嵌入式软件中做任何其它的功能实现,只需要在.bit文件烧录完成后,运行嵌入式软件即可(主要是PL端的时钟源是来自Zynq PS,因此必须在嵌入式软件运行起来后,才能够产生时钟信号)。   7 板级调试          在Zstar板子上,设置跳线帽P3为JTAG模式,即PIN2-3短接。          连接好串口线(USB线连接PC的USB端口和Zstar板的UART接口)和Xilinx下载线(下载器连接PC的USB端口和Zstar板的JTAG插座)。使用5V电源给板子供电。          参考文档《玩转Zynq-环境篇:XilinxPlatformCableUSB下载器使用指南.pdf》烧录PL工程编译产生的.bit和.ltx文件到Zstar板中,如图所示。          参考《玩转Zynq-工具篇:SDK在线运行裸跑程序.pdf》导出硬件并打开EDK,创建HelloWorld模板工程。运行工程,注意PL的.bit文件已经烧录好,不用再次烧录,直接运行.elf文件即可。          回到Vivado,查看当前引出的AXI接口。如图所示,可以双击hw_ila_1即可弹出dashboard_1界面。          如图所示,设置以AXI_wvalid == R作为触发条件,触发一次波形。          AXI_wvalid == R触发后,如图所示,出现了两组波形事件,前面一个是AXI HP总线写数据波形,后面一个是AXI HP总线读数据波形。          如图所示,前面一个波形是对AXI总线固定地址连续写入16个每16bit递增的64bit数据。          如图所示,后面一个波形是对相同地址的AXI总线读操作,读出的16个64bit数据和写入的数据一致。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2020-01-22
  • 发表了主题帖: 玩转Zynq连载36——[ex55] 基于VIO在线板级调试的AXI GP总线读写实例

      1 概述          本实例(zstar_ex55)在zstar_ex54的基础上,增加Virtual IO(VIO)实现在线板级调试的功能,意图让大家学会VIO这种基于FPGA的简单实用的在线板级调试手段。   2 PL代码中VIO的配置和例化          PL工程中,需要将作为开关量控制或状态显示的信号连接到VIO IP核的接口中。具体可以参考文档《玩转Zynq-工具篇:基于Vivado的Virtual IO在线板级调试.pdf》。   3 嵌入式软件修改          参考文档《玩转Zynq-工具篇:导出PS硬件配置和新建SDK工程.pdf》导出PS硬件工程,并打开EDK新建一个HelloWorld的模板工程。          修改HelloWorld工程中的HelloWorld.c源码如下。每隔1s递增变量second,同时将该数据写入到地址0x43c00008寄存器中(即PL中的reg_second寄存器),同时每隔5s读取一次0x43c0000c地址的数据值(即PL中的reg_rdtest寄存器),并且打印读出的数据。   4 板级调试          在Zstar板子上,设置跳线帽P3为JTAG模式,即PIN2-3短接。          连接好串口线(USB线连接PC的USB端口和Zstar板的UART接口)和Xilinx下载线(下载器连接PC的USB端口和Zstar板的JTAG插座)。使用5V电源给板子供电。          参考文档《玩转Zynq-工具篇:SDK在线运行裸跑程序.pdf》将当前工程产生的.bit文件和.elf文件在Zstar板上运行起来。          打开PuTTY,设定好串口号和波特率115200,可以看到不断的打印如下的信息。          VIO显示信号和PuTTY打印信息的比照调试,可以参考文档《玩转Zynq-工具篇:基于Vivado的Virtual IO在线板级调试.pdf》。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2020-01-20
  • 发表了主题帖: 玩转Zynq连载35——基于Vivado的Virtual IO在线板级调试

      1 概述          基于Vivado的板级调试介绍,可以参考文档《玩转Zynq-基础篇:基于Vivado的在线板级调试概述.pdf》。这里我们以zstar_ex55工程为例,对FPGA的Virtual IO(简称VIO)使用进行介绍和实战操练。   2 探测阶段          识别出VIO的待探测信号如图所示,对于VIO而言,reg_rdtest是我们要写入到axi_gp_data.v模块的信号;reg_second则是我们从axi_gp_data.v模块读出的数据。换句话说,如果我们要使用VIO探测这些信号,reg_rdtest就是我们要从VIO中产生的信号(VIO的output);reg_second就是我们在VIO上显示的信号(VIO的input)。 图识别出探测信号          如图所示,在IP Catalog中点击Debug & Verification --> Debug --> VIO(Virtual Input/Output)开启VIO的IP核配置页面。 图 VIO IP核          如图所示,VIO配置页面中,General Options中设定Input Probe Count的数量,即FPGA中output到VIO中进行观察显示的信号数量(每个信号的位宽可以在PROBE_IN Ports中设置);同时设定Output Probe Count的数量,即需要送到FPGA中进行实时变化的信号数量(每个信号的位宽可以在PROBE_OUT Ports中设置)。reg_second这个信号是input probe,因此设置Input Probe Count为1;reg_rdtest这4个信号是output probe,因此设置Output Probe Count也为1。 图 VIO配置的General Options页面          如图所示,在PROBE_IN Ports中可以设置每个input信号的位宽,reg_second这个input port的位宽是32,因此设定PROBE_IN0的位宽为32。 图 VIO配置的PROBE_IN Ports页面          如图所示,在PROBE_OUT Ports中可以设置每个output信号的位宽。reg_rdtest的位宽是32,因此设置PROBE_OUT0的位宽是32。 图 VIO配置的PROBE_OUT Ports页面          如图所示,在Source --> IP Sources下,可以看到出现了vio_0的IP,Instantiation Template展开后可以看到有VHDL和Verilog两种版本的例化模板。 图VIO例化模板文件          例化模板文件的代码如图所示。复制例化模板的代码,修改对应括号内的信号名称和FPGA系统中的匹配,就完成了VIO的代码集成。 图例化模板文件代码          如图所示,在模块axi_gp_data.v中,例化VIO模块如下。 图例化VIO IP核模块   3 实现阶段          完成VIO的基本配置和IP核例化后,对工程进行全编译,生成bit文件。   4 分析阶段          如图所示,将工程编译产生的.bit文件下载到FPGA中,并将嵌入式软件产生的.elf文件在处理器上运行起来。          如图所示,在Hardware Manager --> Hardware下,双击打开hw_vio_1,即例化的VIO的调试界面。 图 Hardware窗口          弹出的New Dashboard对话框中,如图所示,勾选hw_vio_1,点击OK。 图 New Dashboard对话框          如图所示,在dashboard_2界面中,点击左侧的“+”号,弹出Add Probes中,选中所有的信号,点击OK。就将所有的VIO连接好的信号添加到dashboard_2的调试界面中。 图添加可用的VIO接口信号          如图所示,点击选中信号名所在行,右键单击,在弹出菜单中点击Radix就可以看到所有支持的Vaule显示进制,可以点击Unsigned Decimal,即无符号十进制。          此时,reg_second寄存器就以十进制显示每秒递增1的数据。          连接的PuTTY打印窗口中,每隔5秒左右会打印一行数据,即reg_rdtest寄存器的值。          在VIO的调试窗口中,我们也注意到reg_rdtest寄存器默认显示16进制[H]0000_0000,可以将鼠标移动的该值上面点击并修改数据为[H]5511_6699。          随后我们可以看到PuTTY上打印的VIO input Data也随之更新了。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2020-01-16
  • 发表了主题帖: 玩转Zynq连载32——SDK在线运行裸跑程序

      1 SDK在线运行裸跑程序          以zstar_ex50为例,演示如何将裸跑程序在Zstar板上在线运行起来。          点击SDK的菜单Run --> Run Configurations。          在弹出的Run Configurations界面中,自动进入Xilinx C/C++ application (System Debugger) --> System Debugger on local Heloworld.elf配置页面。在首先出现的Target Setup页面中,要设置Bitstream file为PL产生的bit文件(... \zstar_ex50\zstar.runs\impl_1\zstar_zynq_ps_wrapper.bit)。要勾选Program FPGA,其它选项使用默认设置。          Application页面中,可以设置运行的软件为Debug/Helloworld.elf,点击Run运行当前工程到Zynq芯片中。          随后,可以看到弹出Progress Information的页面,进度条一路向右直到满格完成FPGA的下载。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2020-01-15
  • 发表了主题帖: 玩转Zynq连载31——[ex53] 基于Zynq PS的EMIO控制

      1 Zynq的GPIO概述          参考文档《玩转Zynq-基础篇:Zynq PS的GPIO外设.pdf》。          关于EMIO和MIO,这里多啰嗦两句。简单的理解,MIO是PS系统原生的,和PL没啥关系;但是EMIO是PS借PL的引脚用,所以它们就有千丝万缕的关系,PL的工程里面势必要做点什么。MIO在PS系统里面分配好对应的信号功能后,在PL的代码里面就不需要写任何的逻辑,甚至引脚分配都不需要(生成的PS系统会自动分配)。但是EMIO就要在PS的系统中引出,然后在PL顶层源码中申明端口类型,做引脚分配(因为EMIO用的就是PL的引脚)。          关于MIO和EMIO的关系,更形象直接的可以示意如图所示。MIO和EMIO都是PS的一部分,但是MIO可以直接连接到Zynq芯片的引脚上,和PL无关;而EMIO需要通过PL的IO才能连接到Zynq芯片的引脚上。EMIO的存在,其实是给用户更大的PS的GPIO扩展的灵活性,这也是FPGA+ARM独有的架构。因此,EMIO怎么用,很有必要好好玩玩。   2 EMIO的PS系统配置          打开ZYNQ7 Processing System的配置页面Peripheral I/O Pins,勾选GPIO EMIO选项,查看Periperals最右侧的EMIO列,对应的EMIO显示按钮变绿了,则表示该EMIO功能开启,EMIO引脚将会引出到PS系统。          完成配置后,回到ZYNQ7系统框图中,可以看到多了一个名为GPIO_0的接口。          展开GPIO_0接口,实际上有3组64bit的信号,分别代表input(GPIO_I)、output(GPIO_O)和inout(GPIO_T)。在实际使用中,根据我们的引脚方向,连接对应位的引脚即可。例如,GPIO_I[0]、GPIO_O[0]和GPIO_T[0]实际上对应的都是一个EMIO,如果我只用这个EMIO连接一个作为output的LED,那么我在PL上只要引出GPIO_O[0]并作引脚分配就可以了。          选中GPIO_0,右键单击,弹出菜单中点击Create Interface Port...,引出一个port用于PL工程的顶层连接。          可以命名为GPIO_EMIO。          完成GPIO_EMIO引出后如图所示。   3 EMIO在PL的使用和引脚分配          在Sources --> IP Sources中选择Block Designs -->zstar_zynq_ps,单击右键,弹出菜单中选中Generate Output Products...。          接着我们可以再次操作,单击右键菜单的Create HDL Wrapper...选项。          打开后,看到PS系统的例化部分如图所示,可以复制到我们的新建的顶层源码中,在顶层源码中重新设置接口映射。          在实例zstar_ex52中,我们直接使用PS系统生成的zstar_zynq_ps_wrapper.v模块做顶层模块,但是这样的方式其实对于含有PL代码的工程来说灵活性不够好。我们更建议大家把这个zstar_zynq_ps_wrapper.v模块里面例化的PS系统例化到我们自己为PL工程专门新建的顶层源码中,在这个顶层源码中,我们也可以例化其它的PL逻辑模块。          废话不说了,先新建一个zstar.v的Verilog模块,然后做如下编辑。          若要将新建的zstar.v模块作为PL工程的顶层模块,需要先选中zstar.v模块,右键单击选中菜单项Set as Top。          同时需要打开Sources --> Constraints - constrs_1下的约束文件zstar.xdc,增加led[2:0]的引脚约束。   4 导出PS硬件配置和新建SDK工程          参考文档《玩转Zynq-工具篇:导出PS硬件配置和新建SDK工程.pdf》。          SDK中,新建Empty的模板工程,名称为GPIO_EMIO_project。   5 EMIO控制编程          展开新建的工程GPIO_EMIO_project,选中文件夹src,单击右键,弹出菜单中选择New --> Source File。          新建一个名为main.c的Default C source template源文件。          输入EMIO控制的bit2-0引脚的程序,程序中实现EMIO0、EMIO1和EMIO2循环拉高,逐次点亮3个LED中的1个。   6 板级调试          在Zstar板子上,设置跳线帽P3为JTAG模式,即PIN2-3短接。          连接好串口线(USB线连接PC的USB端口和Zstar板的UART接口)和Xilinx下载线(下载器连接PC的USB端口和Zstar板的JTAG插座)。使用5V电源给板子供电。          接着参考《玩转Zynq-工具篇:SDK在线运行裸跑程序.pdf》将zstar.bit文件和GPIO_EMIO_project.elf文件烧录到Zynq中运行起来。          程序运行起来后,我们就可以看到Zstar板上PL侧的3个LED指示灯D3、D2和D1逐个闪烁起来。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2020-01-13
  • 发表了主题帖: 玩转Zynq连载30——[ex52]基于Zynq PS的GPIO控制

      Zynq的GPIO概述          参考文档《玩转Zynq-基础篇:Zynq PS的GPIO外设.pdf》。   1 GPIO的PS系统配置          打开ZYNQ7 Processing System的配置页面Peripheral I/O Pins,可以看到右侧若勾选GPIO MIO选项,在对应的MIO号若点击变绿,则表示该MIO号将被用于GPIO功能。当然了,原则上所有的MIO都可以配置为GPIO,但是实际应用中大家不会这么干,MIO的分配需要从系统角度考虑,兼顾各个外设的需要。如果大多数的MIO都被其它外设占用了,而能用于GPIO的MIO捉襟见肘时也不用当心,可以打开GPIO EMIO,连接PL端的IO作为PS可控的GPIO使用,这个功能下一个例程我们会讲,这里我们重点要来看看GPIO MIO怎么用。          Zstar板载2个LED,即D29和D30分别连接到了PS的MIO0(PS_LED0)和MIO9(PS_LED1)。          因此,在这个GPIO控制LED的实例中,我们不能够让任何会用到MIO0和MIO9的PS外设打开(勾选),而必须把MIO0和MIO9保留给GPIO MIO使用。          完成配置后,重新编译PL工程,确保当前配置产生.bit文件。   2 导出PS硬件配置和新建SDK工程          参考文档《玩转Zynq-工具篇:导出PS硬件配置和新建SDK工程.pdf》。          其中新建SDK工程名称为GPIO_MIO_project。          工程模板(Available Templates)选择空白应用(Empty Application)即可。   3 GPIO控制程序          展开新建工程GPIO_MIO_project,选中文件夹src,单击右键,弹出菜单中选择New --> Source File。          新建一个名为main.c的Default C source template源文件。          输入GPIO控制MIO0和MIO9的程序,程序中实现MIO0和MIO9每秒高低交错输出,实现2个LED交错闪烁的功能。   4 板级调试          在Zstar板子上,设置跳线帽P3为JTAG模式,即PIN2-3短接。          连接好串口线(USB线连接PC的USB端口和Zstar板的UART接口)和Xilinx下载线(下载器连接PC的USB端口和Zstar板的JTAG插座)。使用5V电源给板子供电。          接着参考《玩转Zynq-工具篇:SDK在线运行裸跑程序.pdf》将zstar.bit文件和GPIO_MIO_project.elf文件烧录到Zynq中运行起来。          程序运行起来后,我们就可以看到Zstar板上D4和D5这两颗LED交替的闪烁起来。D4和D5这两颗LED指示灯的位置示意如图所示。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2020-01-09
  • 发表了主题帖: 玩转Zynq连载29——[ex51] 制作裸跑程序的启动文件BOOT.bin

    1 概述          对于Zynq的裸跑程序加载,比linux的SD卡启动文件制作要简单得多。          只需要在FAT32格式化后的SD卡中放置一个BOOT.bin文件即可。如图所示,BOOT.bin中需要包含2~3个文件,对Zynq部分外设初始化并搬运下一阶段代码和配置PL的fsbl.elf文件、PL的配置比特流文件(.bit)、用户裸跑程序(.elf)。如果用户只是在Zynq的Cortex A9上跑程序,无需使用PL做任何工作,那么PL的配置文件.bit也可以免了。          在Zynq上电后,BootROM率先工作,加载BOOT.bin中的FSBL,FSBL初始化一些必要的外设,如SDIO外设,用于SD卡的读写;FSBL也可以将PL的配置比特流.bit文件加载到PL中启动PL的逻辑运行,随后加载用户裸跑程序(通常是elf后缀的文件),裸跑程序随后就在DDR3中运行起来。          这里,我们来实际操作一把,使用fsbl.elf、.bit和用户裸跑程序(.elf)这3个文件产生BOOT.bin文件。          为了更好的理解Zynq的启动原理,建议参考文档《玩转Zynq-基础篇:Zynq的启动过程.pdf》。   2 导出硬件信息并启动SDK          参考文档《玩转Zynq-工具篇:导出PS硬件配置和新建SDK工程》。   3 创建FSBL工程          打开EDK后,在Project Explorer中,出现了名为zstar_zynq_ps_wrapper_hw_platform_0的文件夹,下面的一些文件都是前面Export Hardware产生的PS硬件配置信息以及系统初始化代码。          在打开的SDK中,点击菜单File --> New --> Application Project,新建一个应用工程。          弹出的New Project中,输入Project name(这里命名为fsbl_project)。对应的Hardware Platform必须是前面Export Hardware所对应的PL工程。然后点击Next。          选择Avaliable Templates为Zynq FSBL。点击Finish。   4 创建HelloWorld实例工程          再次点击菜单File --> New --> Application Project,新建一个应用工程。          工程名(Project name)命名为HelloWorld,操作系统(OS Platform)选择standalone,硬件平台(Hardware Platform)选择zstar_zynq_ps_wrapper_platform_0,点击Next。          Templates页面中,选择Hello World工程模板。点击Finish完成工程创建。          新建HelloWorld工程出现在Project Explorer中,展开HelloWorld-->src,打开helloworld.c源文件,修改源码,实现每隔2s通过UART打印一串带计数值的Hello World!信息。          保存修改后的helloworld.c源文件,SDK会自动编译并生成新的HelloWorld.elf文件。   5 生成BOOT.bin文件          展开Project Explorer中新建好的fsbl_project工程,找到Binaries下的fsbl_project.elf文件。选中fsbl_project.elf文件,右键单击后,点击Copy选项。Paste到专门新建的sd_image文件夹下。          展开HelloWorld工程,找到Binaries下的HelloWorld.elf文件。选中HelloWorld.elf文件,右键单击后,点击Copy选项。也Paste到sd_image文件夹下。          打开...\zstar.sdk\zstar_zynq_ps_wrapper_hw_platform_0文件夹,把PL配置文件zstar_zynq_ps_wrapper.bit也复制到sd_image文件夹下。          生成裸跑程序的启动文件BOOT.bin所必须的3个文件齐聚在sd_image文件夹下。 点击SDK的菜单Xilinx -->Create Boot Image。 弹出的Create Boot Image对话框中,设定Output BIF file path到sd_image文件夹下,产生output.bif文件到该文件夹。然后依次点击Boot image partitions按钮加载fsbl_project.elf、zstar_zynq_ps_wrapper.bit和HelloWorld.elf文件。          特别需要注意的是,fsbl_project.elf的文件Partition type选择bootloader,而zstar_zynq_ps_wrapper.bit和HelloWorld.elf文件则选择datafile。点击Boot image partitions右侧Add菜单,分别加载这3个文件。          完成设定后,如图所示,点击Create Image按钮。          在sd_image文件夹下,出现了新产生的BOOT.bin文件。   6 SD卡启动板级调试          将Micro SD卡通过读卡器插入PC中,用FAT32进行格式化。然后将生产的BOOT.bin文件拷贝到Micro SD卡中。          将Micro SD卡插入Zstar板的SD卡槽中。            在Zstar板子上,设置跳线帽P3为SD BOOT模式,即PIN1-2短接。          连接好串口线(USB线连接PC的USB端口和Zstar板的UART接口)和Xilinx下载线(下载器连接PC的USB端口和Zstar板的JTAG插座)。使用5V电源给板子供电。          打开串口调试助手PuTTY,正确设置端口号和波特率。          接着我们就能看到PuTTY上不停的打印带数据递增的Hello World字符串了。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2020-01-08
  • 发表了主题帖: 玩转Zynq连载28——[ex50] 第一个Zynq系统工程“Hello Zynq”

    1 概述          如图所示,Zynq系统的PS部分有丰富的外设接口,常见的USB、UART、SPI、I2C、SDIO、CAN、GPIO、以太网,一应俱全,能够满足大多数的嵌入式应用需求。这么强大的外设系统,是不是有些迫不及待了,不着急,万丈高楼平地起,我们要从最简单的流程跑起,带大家先从工具层面玩转Zynq,再深入其中。          本实例,我们要搭建第一个Zynq系统工程,并且在这个Zynq系统的Cortex A9上在线跑一个通过UART打印“Hello Zynq!”的软件程序。当然了,重点不是Hello Zynq,而是如何新建Zynq系统模块、配置PS的参数、导出硬件、新建软件工程并且在线板级运行起来。流程很重要,大家在开始的时候总要先走一遍流程了解开发的全貌,然后再细细把玩,逐个精通。   2 新建工程          新建文件夹zstar_ex50,注意它的整个存放路径中不要有中文、符号或空格(只能是数字和字母)。          打开Vivado,参考《玩转Zynq-工具篇:新建Vivado工程.pdf》新建一个Vivado工程。   3 ZYNQ硬件配置          在IP Integrator(IP集成器)下点击Create Block Design(创建新的设计模块)。          如图所示,在弹出的Create Block Design窗口中,Design name后面输入创建的模块名称(这里命名为zstar_zynq_ps),后面的Directory即文件存放路径使用默认,Specify source set即指定文件的子集也使用默认。          此时,在Vivado的主视图中,出现了如图所示的Block Design界面。在Diagram中,点击中央的小加号,准备添加zynq的处理器IP核。          如图所示,在弹出IP列表的Search后面,我们输入关键词zynq,随后筛选出唯一的ZYNQ7 Processing System选项,点击它。          此时,Diagram界面中央出现了一个名为processing_system7_0的模块,可以双击这个模块,将弹出该模块的配置页面。          Zynq系统配置页面如图所示。          点击Presets按钮,弹出菜单如图,接着点击Apply Configuration。          定位到当前工程路径下,找到zstar_ex50.tcl脚本,选中它,然后点击OK应用该tcl脚本的设定。这不操作的意义在于,将笔者已经配置好的ZYNQ7 Processing System参数整个应用到当前新建工程的系统中。下面我们会看看都有哪些特殊的需要注意的配置,这些配置通常是和我们所使用的板级硬件电路设计相关的。          如图,设置正在应用生效中。          完成配置加载后,Zynq系统的当前配置就能够用于我们后续的软件实例。如图所示,在Peripheral I/O Pins选项卡中,UART 1被勾选上了,它对应的MIO48和MIO49列是高亮的,表示UART 1所使用的引脚是MIO48和MIO49。点击OK完成设置。          回到Diagram中,可以看到ZYNQ模块的接口发生了变化,现在只有FIXED_IO是可以引出的,实际上我们后面的实例中也不使用这个引出的FIXED_IO。点击箭头所指的Run Block Automation按钮。          弹出图示的对话框,使用默认设置,点击OK就可以。          这时我们看到,FIXED_IO果然被引出了。          在Sources页面中,我们可以看到Design Sources下面,我们刚刚创建的系统模块zstar_zynq_ps。          点击选中zstar_zynq_ps模块,单击右键,弹出菜单中点击Generate Output Products,使得该系统输出生效。          弹出下面的对话框,点击Generate。          zstar_zynq_ps模块目前还不是当前工程的顶层模块,必须再次选中它,然后在右键菜单中点击Create HDL Wrapper。          若弹出如下对话框,使用默认设置,点击OK继续。          最后,在Flow Navigator的Program and Debug下,点击Generate Bitstream编译整个工程以生成可烧录PL的bit文件。   4 导出PS硬件配置和新建SDK工程          参考文档《玩转Zynq-工具篇:导出PS硬件配置和新建SDK工程.pdf》。   5 在线板级调试          在Zstar板子上,设置跳线帽P3为JTAG模式,即PIN2-3短接。          连接好串口线(USB线连接PC的USB端口和Zstar板的UART接口)和Xilinx下载线(下载器连接PC的USB端口和Zstar板的JTAG插座)。使用5V电源给板子供电。          确认当前设备管理器中识别到的COM口号,配置好打开PuTTY串口调试界面。          接着参考《玩转Zynq-工具篇:SDK在线运行裸跑程序.pdf》将zstar.bit文件和Helloworld.elf文件烧录到Zynq中运行起来。          SDK Log窗口中,也会打印输出相应的SDK工作信息。          回到PuTTY中,我们可以看到也已经打印出了我们期盼已久的Hello World(嘿嘿嘿,细心的同学已经发现,不是Hello Zynq,不过没关系,Hello Zynq要你自己尝试改C源码再跑一遍就OK)。          恭喜你,完成的Zynq系统Cortex A9的运行,裸跑了一个Hello World程序。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2020-01-07
  • 发表了主题帖: 玩转Zynq连载27——导出PS硬件配置和新建SDK工程

    1 概述          配置好PS的PL工程,在完成编译后,需要将PS的硬件配置导出,作为SDK的BSP(Board Support Package),然后SDK上可以新建软件工程,编写应用程序,实现Zynq上Cortex A9的开发。本节以zstar_ex50工程为例,演示如何将PL工程的PS硬件配置导出、在SDK新建一个最简单的HelloWorld模板工程。   2 导出PS硬件配置          PL工程编译完成后,如图所示,点击菜单File --> Export --> Export Hardware。          弹出如图所示对话框,默认设置,点击OK。   3 SDK新建工程          点击File --> Launch SDK,启动SDK进行软件工程创建。          弹出如下对话框,使用默认设置,点击OK继续。          SDK界面如下所示。          点击菜单栏上的File -->New -->Application Project新建工程。          New Project界面弹出,输入工程名称(Project Name)为Helloworld,其它选项使用默认设置,点击Next进入下一个页面。          Templates(模板)页面可以选择SDK预设的模板工程,选中Available Templates(可用模板)下的Hello World。点击Finish完成工程创建。          随后,如图所示,Project Explorer下出现了两个新的工程Helloworld和Helloworld_bsp,Helloworld是应用工程,用户的源码都在此编辑产生,Helloworld_bsp的bsp即board support package(硬件板级支持包),顾名思义,它存储的当前软件工程对应需要的硬件驱动支持。所有的应用工程都需要有一个bsp工程的支持,当然,如果我们再创建一个应用工程,可以不用勾选默认生成一个新的bsp工程,就指向当前的Helloworld_bsp作为bsp工程也是没有问题的。展开应用构成Helloworld,在src下面的helloworld.c是这个应用工程的主要C源码文件。这个C源码也很简单,就是上电初始化Zynq系统(init_platform()),然后串口打印Hello world(print("Hello World\n\r")),完成后关闭系统(cleanup_platform())。          如果对Helloworld工程的C源码做了任何的修改,保存后通常EDK会自动进行编译。当然如果不放心,可以选择Helloworld工程,右键单击,弹出菜单中点击Build Project对工程进行编译。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2020-01-06
  • 发表了主题帖: 玩转Zynq连载26——Vivado中PL的功能仿真

    1仿真验证概述          仿真测试是FPGA设计流程中必不可少的步骤。尤其在FPGA规模和设计复杂性不断提高的今天,画个简单的原理图或写几行代码直接就可以上板调试的轻松活儿已经一去不复返。一个正规的设计需要花费在验证上的工作量往往可能会占到整个开发流程的70%左右。验证我们通常分为仿真验证和板级验证,在设计初步完成功能甚至即将上板调试前,通过EDA仿真工具模拟实际应用进行验证是非常有效可行的手段,它能够尽早的发现设计中存在的各种大小bug,避免设计到了最后一步才返工重来。因此,仿真在整个验证中的重要性可见一斑。          提到仿真,我们通常会提testbench的概念。所谓testbench,即测试平台,详细的说就是给待验证的设计添加激励,同时观察它的输出响应是否符合设计要求。如图所示,测试平台就是要模拟一个和待验证设计相连接的各种外围设备。 图设计与验证          初学者在刚接触仿真这个概念的时候,可能以为仿真只是简单的用一些开发软件自带的波形发生器产生一些激励,然后观察一下最后的波形输出就完事了。但是对于大规模的设计,用波形产生激励是不现实的,观察波形的工作量也是可想而知的。例如,对于一个16位的输入总线,它可以有65536种组合,如果每次随机产生一种输入,那用波形岂不累死人。再说输出结果的观察,对应65536种输入的65536种输出,看波形肯定让人花眼缭乱。所以,testbench应该有更高效的测试手段。对于FPGA的仿真,使用波形输入产生激励是可以的,观察波形输出以验证测试结果也是可以的,波形也许是最直观的测试手段,但绝不是唯一手段。          如图所示,设计的测试结果判断不仅可以通过观察对比波形,而且可以灵活的使用脚本命令将有用的输出信息打印到终端或者产生文本进行观察,也可以写一段代码让他们自动比较输出结果。总之,testbench的设计是多种多样的,它的语法也是很随意的,不像RTL级设计代码那么多讲究,它是基于行为级的语法,很多高级的语法都可以在脚本中使用。因为它不需要实现到硬件中,它是运行在PC机上的一段脚本,所以相对RTL级可以做得更容易更灵活一些。但是,使用Verilog的验证脚本也有很多需要设计者留意的地方,它是一种基于硬件语言但是又服务于软件测试的语言,所以它常常游离于并行和顺序之间让人琢磨不透。不过,只要掌握好了这些关键点,是可以很好的让它服务于我们的测试。 图验证输出   2 Testbench的设计          Testbench的编写其实也没有想象中那么神秘,笔者简单的将其归纳为3个步骤。 ①对被测试设计的顶层接口进行例化。 ②给被测试设计的输入接口添加激励。 ③判断被测试设计的输出响应是否满足设计要求。 相对而言,最后一步还要复杂一些,有时不一定只是简单的输出观察,可能还需要反馈一些输入值给待测试设计。          例化的目的就是把待测试设计和testbench进行对接,和FPGA内部的例化是一个概念。那么如何进行例化呢?下面用一个简单实例来说明。 //待测试的设计 module fpga_design(                    clk,rst_n,a,b,c,d          ); input clk; input rst_n; input a,b,c; output d;   always @(posedgeclk or negedgerst_n) begin          if(!rst_n) d <= 1’b0;          else d <= a & b & c; end   endmodule          对于上面这个待测试的设计,testbench中的例化应该把input转换成reg,因为待测试设计的输入值是由testbench决定的。相应的output就应该转换成wire,因为待测试设计的输出值不是由testbench决定的。如果是inout端口,在例化中也是一个wire类型,在testbench中使用时和RTL代码设计中使用是一样的。 //例化待测试设计 reg clk; reg rst_n; reg a,b,c; wire d;   fpga_design(                    .clk(clk), .rst_n(rst_n), .a(a), .b(b), .c(c), .d(d)          );          对于激励的产生,只提最基本的时钟信号和复位信号的产生。时钟信号产生方式有很多,使用initial和always语句都是可以的。下面列出比较典型的两种产生方式供大家参考。 //时钟产生 parameter PERIOD = 20;          //定义时钟周期为20ns,已定义“`timescale 1ns/1ps”   initial begin          clk = 0;          forever                    #(PERIOD/2) clk = ~clk; end   //时钟产生 parameter PERIOD = 20;          //定义时钟周期为20ns,已定义“`timescale 1ns/1ps”   always begin          #(PERIOD/2) clk = 0;          #(PERIOD/2) clk = 1; end          复位信号的产生也很简单,比较常用的做法是封装成一个task,直接在需要复位的时候调用即可。 //复位产生 initial begin          reset_task(100);      //复位100ns,已定义“`timescale 1ns/1ps”          …… end   task reset_task; input[15:0] reset_time;   //复位时间 begin          reset = 0;          #reset_time;          reset = 1; end endtask          至于对测试的响应如何进行观察处理,这里不作太多描述,大家随便找本verilog语法方面的书籍都会有相应的行为级语法的部分,只要依葫芦画瓢就能学会。          对于这个简单的设计,有a、b和c三个输入,他们相与的结果d每个时钟周期输出一次最新的结果。因此,我们可以预见,若想完全覆盖这个设计的测试分支,那么要产生8个不同的测试项,即分别改变a、b和c的取值,观察他们输出的结果是否符合预期。测试脚本的编写如下所示。 //复位产生 timescale 1ns/1ps module tb_fpga_design;   //例化待测试设计 reg clk; reg rst_n; reg a,b,c; wire d;   fpga_design(                    .clk(clk), .rst_n(rst_n), .a(a), .b(b), .c(c), .d(d)          );   initial begin          reset_task(100);      //复位100ns,已定义“`timescale 1ns/1ps”          @(posedgeclk); #2;          a = 1’b0;          b = 1’b0;          c = 1’b0;          @(posedgeclk); #2;          a = 1’b0;          b = 1’b0;          c = 1’b1;          @(posedgeclk); #2;          a = 1’b0;          b = 1’b1;          c = 1’b0;          @(posedgeclk); #2;          a = 1’b0;          b = 1’b1;          c = 1’b1;          @(posedgeclk); #2;          a = 1’b1;          b = 1’b0;          c = 1’b0;          @(posedgeclk); #2;          a = 1’b1;          b = 1’b0;          c = 1’b1;          @(posedgeclk); #2;          a = 1’b1;          b = 1’b1;          c = 1’b0;          @(posedgeclk); #2;          a = 1’b1;          b = 1’b1;          c = 1’b1;          @(posedgeclk); #2;          $stop; end   task reset_task; input[15:0] reset_time;   //复位时间 begin          reset = 0;          #reset_time;          reset = 1; end endtask   //时钟产生 parameter PERIOD = 20;          //定义时钟周期为20ns,已定义“`timescale 1ns/1ps”   always begin          #(PERIOD/2) clk = 0;          #(PERIOD/2) clk = 1; end   endmodule          使用这个脚本对设计进行仿真,我们观察结果输出,在8种不同的设计输入情况下,输出是否和预期一致。若一致,则可以继续后面的设计流程完成设计,若不一致,则设计中一定存在问题,需要查找问题原因并对设计进行修改直到仿真结果达到预期结果。   3 创建仿真文件          以zstar_ex01为例,如图所示,选中Project Manager ->Simulation Sources ->sim_1,右键点击弹出菜单后,选中Add Sources…。 图新建仿真文件菜单          接着如图所示,使用默认选项Add or create simulation sources。 图 选择文件类型          如图所示,单击Create File按钮。 图新建设计文件          如图所示,设置创建的文件类型(File type)为Verilog;文件名(File name)为sim_zstar;文件路径(File location)为默认的<Local to Project>。 图设置新建文件名称和路径          最后点击Finish按钮完成仿真测试文件的创建。          随后弹出模块端口定义的界面,可以直接点击OK不做设定。 图模块端口定义          如图所示,双击Simulation Sources下刚刚创建好的sim_zstar.v文件,里面也只有一个Verilog模块框架,有待内容填充。 图创建好的仿真测试源文件          如图所示,将这个实例的仿真测试脚本写入这个文件中。 图仿真测试脚本   4功能仿真          下面我们看看如何使用Vivado自带的仿真工具实现功能仿真。如图所示,单击Project Manager ->Simulation ->Simulation Settings,弹出选项卡中,设置目标仿真器(Target Simulator)为Vivado Simulator,仿真语言(Simulation language)为Mixed,仿真集(Simulation set)为sim_1,仿真顶层模块名(Simulation top module name)为sim_zstar。 图仿真设置          如图所示,点击Run Simulation,接着弹出菜单中再点击Run Behavioral Simulation进行功能仿真。 图运行功能仿真          弹出仿真界面如图所示,3个窗口从左到右依次是模块及层次显示窗口、信号显示窗口和波形窗口。 图仿真界面          如图所示,点击Run All按钮。 图仿真运行按钮          此时,如图所示,仿真运行中。 图仿真运行中          如图所示,可以点击波形界面右上角的Float按钮,将波形界面从Vivado中独立出来,这样可以满屏显示波形,看到更多的波形细节。 图悬浮仿真波形界面          如图所示,在仿真结束后,我们可以点击Zoom Fit按钮将所有的仿真波形缩放到可视界面中。 图 全览仿真波形          如图所示,这是该工程仿真的波形。beep信号一直是10%占空比的1Hz PWM信号。 图仿真波形 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2020-01-03
  • 发表了主题帖: 玩转Zynq连载25——[ex04] 基于Zynq PL的自定义IP核集成

    1 概述          本实例将zstar_ex03工程中led_controller.v模块作为一个用户自定义IP核,添加到Vivado的IP Catalog中,然后和标准IP核一样,在Vivado工程中配置添加这个IP核。   2 用户自定义IP核的创建于封装          参考文档《玩转Zynq-工具篇:用户自定义IP核的创建与封装.pdf》,创建一个闪烁频率可设置的LED控制IP核。   3 用户自定义IP核的移植          参考文档《玩转Zynq-工具篇:用户自定义IP核的移植.pdf》,将LED闪烁的IP核移植到应用工程中   4 配置、例化IP核          如图所示,双击IP Catalog下的led_controller_ip后,弹出IP配置对话框。可以修改设置输入这个IP核的时钟频率(Clk Frequency)和LED闪烁频率(Led Flash Frequency),完成配置直接点击OK即可。 图IP核配置页面          如图所示,在Project Manager -> IP Source面板中,展开新创建的IP核,可以双击led_controller_0.veo打开例化模板,复制到我们的工程逻辑中,修改相应接口即可使用。 图 IP核例化模板          本实例要实现的功能和zstar_ex03实例一样,都是让3个LED工作在不同的时钟频率下,但是控制它们产生相同的LED闪烁频率,同步闪烁。和zstar_ex03实例的顶层源码不同的是,这里例化的LED闪烁子模块是我们自己创建的IP核,其输入时钟频率和LED闪烁频率的设定通过IP核的配置GUI即可完成,无需通过代码传递这些参数。          如前面led_controller_0的IP添加,我们分别添加另外2个IP核led_controller_1和led_controller_2,设置它们的LED闪烁频率(Led Flash Frequency)都是1(Hz),但输入时钟频率分别为50000(50MHz)和100000(100MHz)。然后例化到工程顶层源码中。          本实例工程源码如下。 module zstar(                             input ext_clk_25m, //外部输入25MHz时钟信号                                    output[2:0] led                   //LED指示灯接口                    );                                                                                                                                         //------------------------------------- wire clk_25m;  //PLL输出25MHz时钟 wire clk_50m;  //PLL输出50MHz时钟 wire clk_100m;         //PLL输出100MHz时钟 wire sys_rst_n;        //PLL输出的locked信号,作为FPGA内部的复位信号,低电平复位,高电平正常工作     clk_wiz_0    uut_clk_wiz_0    (    // Clock in ports .clk_in1(ext_clk_25m),      // input clk_in1     // Clock out ports .clk_out1(clk_25m),     // output clk_out1 .clk_out2(clk_50m),     // output clk_out2 .clk_out3(clk_100m),     // output clk_out3     // Status and control signals .reset(1'b0), // input reset .locked(sys_rst_n));      // output locked   //------------------------------------- //25MHz时钟进行分频闪烁                                                                                                                                                                                           led_controller_0 uut_led_controller_clk25m ( .clk(clk_25m),      // input wire clk .rst_n(sys_rst_n),  // input wire rst_n .sled(led[2])    // output wire sled );                                                                                  //------------------------------------- //50MHz时钟进行分频闪烁                                                                                                                                               led_controller_1 uut_led_controller_clk50m ( .clk(clk_50m),      // input wire clk .rst_n(sys_rst_n),  // input wire rst_n .sled(led[1])    // output wire sled );                                                                                                    //------------------------------------- //100MHz时钟进行分频闪烁                                                                                                                                          led_controller_2 uut_led_controller_clk100m ( .clk(clk_100m),      // input wire clk .rst_n(sys_rst_n),  // input wire rst_n .sled(led[0])    // output wire sled );                             endmodule   5 板级调试          参考文档《玩转Zynq-环境篇:XilinxPlatformCableUSB下载器使用指南.pdf》将“...\project\zstar_ex04\zstar_ex04\zstar.runs\impl_1”文件夹下的zstar.bit文件下载到STAR板上。可以看到3个LED指示灯同步闪烁起来,它们的频率完全一致。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2020-01-02
  • 发表了主题帖: 玩转Zynq连载24——用户自定义IP核的移植

    1概述          这里我们以led_controller_ip工程所创建的用户自定义LED闪烁IP核为例,来演示如何进行用户自定义IP核的移植。   2 拷贝IP文件          在project\zstar_ex04文件夹下创建一个新的工程文件夹zstar_ex04,用于存放本实例的应用工程,创建新工程,然后将刚刚制作的IP核所在工程文件夹下(…\project\zstar_ex04\led_controller_ip\zstar.srcs\sources_1\new)如图所示的全部5个文件拷贝出来。 图 移植IP核的文件 如图所示,在…\zstar_ex04\zstar.srcs\sources_1\ip文件夹下新建文件夹led_controller_ip用于存放IP文件。 图 新建led_controller文件夹 如图所示,将前面复制的5个文件粘贴到led_controller_ip文件夹下。 图 复制IP核相关文件   3在Repository Manager中添加新IP核 如图所示,在新建的这个zstar_ex04工程中点击菜单Tools-> Project Settings…。 图 Project Settings菜单 如图所示,在Project  Settings选项卡中选择分类IP-> Repository Manager,然后点击IP Repositories下的+号。 图 Project Settings选项卡 弹出路径选择窗口中,定位到路径…\zstar_ex04\zstar.srcs\sources_1\ip\led_controller_ip文件夹下。 弹出如图所示的提示,点击OK。 图 Add Repository提示框 如图所示,用户定制IP核的路径已经添加好,点击OK退出。 图 用户定制IP核的路径已经设置完成 如图所示,点击Project Manager下的IP Catalog。 图 IP Catalog选项 如图所示,此时用户自定义的IP核led controller已经赫然在目,双击它。 图 用户自定义IP核出现在IP Catalog中 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-12-31
  • 发表了主题帖: 玩转Zynq连载23——用户自定义IP核的创建与封装

    1概述          本节以zstar_ex04文件夹下的led_controller_ip工程为例,演示如何创建一个简单的LED闪烁控制模块的IP核。          创建一个用户自定义IP核,只需要以下3个步骤即可。   2 创建IP核          首先我们在文件夹.../project/zstar_ex04/led_controller_ip文件夹下创建一个新的工程,增加一个名为led_controller.v的verilog源码文件到这个工程中。源码如下。 module led_controller(                             input clk,           //时钟信号                             input rst_n,      //复位信号,低电平有效                             output sled                //LED指示灯接口                     );                                                                                                                                parameter CLK_FREQUENCY                     = 25000;  //clk的时钟频率,KHz parameter LED_FLASH_FREQUENCY      = 1;            //LED输出的闪烁频率,Hz   `define MAX_CNT                       (((CLK_FREQUENCY/LED_FLASH_FREQUENCY)*1000)-1)                 //cnt分频计数最大值 `define MAX_CNT_DIV2  (`MAX_CNT/2-1)                                                                                           //cnt分频计数最大值的一半          //------------------------------------- reg[31:0] cnt;            //计数器                                                                                                                                               //cnt计数器进行循环计数 always @ (posedgeclk or negedgerst_n)                                                                                            if(!rst_n) cnt<= 32'd0;                                                                                                            else if(cnt< `MAX_CNT) cnt<= cnt+1'b1;          else cnt<= 32'd0;   assign sled = (cnt< `MAX_CNT_DIV2) ? 1'b1:1'b0;                      endmodule          注意这个源码实现在时钟和复位信号下,产生固定频率的1个输出LED指示灯闪烁。时钟频率CLK_FREQUENCY和LED闪烁频率LED_FLASH_FREQUENCY都定义为参数(parameter),一会制作IP核的时候都可以配置为GUI供调用IP的用户手动设定。注意,类似的希望让用户可以在GUI上设定的参数,在源码中一定要定义为parameter。          如图所示,该工程中只包含led_controller.v源码文件。创建好工程并添加好工程源码后,建议对工程进行必要的编译,以避免任何的语法错误或者与所支持器件家族有任何不兼容的错误。 图 只包含led_controller.v源码的工程          如图所示,点击工程菜单Tools à Create and Package IP…。 图 Create and Package IP菜单          弹出Create and Package IP的第一个页面,点击Next。          弹出如图所示的Package Options选择对话框,勾选Package your current project选项,然后点击Next。 图 Package your current project选择页面          如图所示,弹出IP路径设置对话框,IP location路径建议设置和源码所在路径完全一致(通常为工程所在目录下的…/zstar.srcs/source_1/new文件夹)。设置好继续点击 Next。 图 生成IP路径选择页面          如图所示,点击Finish。 图 New IP Creation页面          此时,在工程主界面中,如图所示,右侧的Sources à Design Sources下增加了IP-XACT文件夹,展开后,可以看到新增了一个component.xml的文件,该文件就对应了图右侧的Package IP –led_controller页面,它存储当前新创建IP核的相关配置信息。 图 工程主界面          如图所示,Package IP –led_controller的第一个配置页面名为Identification,即用户定制IP核相关的配置信息,如IP核供应商(Vendor)、库名称(Library)、IP核名称(Name)、版本号(Version)、IP核显示名称(Display name)、描述(Description)、供应商显示名称(Vendor display name)、公司网址(Company url)等。特别提醒大家别忽略了最下面的Categories项,默认是空白的,若点击右侧的小加号,可以增加一个名称,例如本实例增加了一个名为UserIP的名称选项,将来生成的用户定制IP核在我们的IP核配置面板中将会归类到名为UserIP类别的文件夹下。 图 Identification配置页面          如图所示,Compatibility页面其实在我们刚刚创建这个工程选择好器件家族时就已经确定了,即设定该IP核所支持的器件家族(Family)。 图 Compatibility配置页面          如图所示,这里可以预览IP核包含的相关源码文件,在源码工程中包含的所有Verilog源码或者仿真测试脚本,也都会出现在这里,被集成到IP核中。 图 File Groups配置页面          如图所示,Customization Parameters配置页面罗列源码中所有可配置的参数(parameter所定义的),大家可以双击这些参数进一步配置。 图 Customization Parameters配置页面          如我们双击CLK_FREQUENCY参数所在行,弹出如图所示的配置页面。该配置页面中,我们可以配置该参数是否在GUI中可见(Visible in Customization GUI)、是否显示名称(Show Name)等信息,用户可以根据不同参数的实际情况设定。 图 Edit IP Parameter配置页面          如图所示,Ports and Interfaces配置页面显示IP核的对外接口。 图 Ports and Interfaces配置页面          如图所示,Addressing and Memory配置页面则是针对含有总线接口,并且具有多个寄存器需要寻址的IP核,我们的IP核则不需要,所以是空白的。 图Addressing and Memory配置页面          如图所示,Customization GUI配置页面则显示当前接口在GUI上的layout和preview信息。 图 Customization GUI配置页面          最后,如图所示,这是Review and Package配置页面,可以回顾上面的一些设置,并且回去做相应的修改。点击Package IP可以生成IP。 图 Review and Package配置页面          至此,IP核已经配置并封装完成。          如图所示,在Project Manager面板中,若点击Package IP则可以回到IP核的配置页面做修改。若点击IP Catalog则可以添加IP核。 图 Project Manager面板          如图所示,打开IP Catalog后,我们可以看到刚刚定义的用户IP核led_controller_v1_0已经出现在了UserIP文件夹下面。 图 IP Catalog页面 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-12-30
  • 发表了主题帖: 玩转Zynq连载22——[ex03] 基于Zynq PL的PLL配置实例

    1 概述          本实例通过PLL产生的不同频率的时钟,分别驱动3个LED指示灯闪烁一样的频率。本实例的重点其实不是LED,而是IP核的应用,当然,仅以PLL IP核为例。   2 模块化设计          参考文档《玩转Zynq-基础篇:基于FPGA的模块化设计.pdf》。   3 PLL IP核添加配置     3.1Vivado标准IP核概述          我们常说的IP核,也就是知识产权(Intellectual Property),是那些己验证的、可重利用的、具有某种确定功能的设计功能模块。IP核一般分为软IP(soft IP core)、固IP(firm IP core)和硬IP(hard IP core)。软IP是用某种高级语言来描述功能块的行为,但是并不涉及用什么电路和电路元件实现这些行为。固IP除了完成软IP所有的设计外,还完成了门电路级综合和时序仿真等设计环节,一般以门电路级网表形式提交用户使用。硬IP则是完成了综合的功能块,已有固定的拓扑布局和具体工艺,并己经经过工艺验证,具有可保证的性能。设计深度愈深,后续工序所需要做的事情就越少,但是灵活性也就越小。          在Xilinx的FPGA器件中,IP核设计是非常重要并且必不可少的一部分,应该说,前述的软IP、固IP和硬IP,在我们Zstar板载的Zynq上都能够找到踪影。而对于Vivado来说,对于Xilinx或者其第三方合作伙伴提供的,已经集成在Vivado工具界面中供设计者调用的IP,我们姑且可以称之为标准IP核;而对于Vivado未集成的,第三方或者用户自己开发设计的IP核,我们则称之为用户自定义IP核。          对于Vivado中集成的IP核,可以点击Vivado菜单Window --> IP Catalog查看。          在Vivado主视窗中,IP Catalog --> Cores中,列出了Vivado已经集成的分类IP核,点击各个分类前的+号,可以查看具体分类下都有哪些可用的IP核。          对于一般的IP核,先找到所需要的IP核,然后双击IP核弹出配置页面,配置完成后输出各类IP核相关设计文件,在用户设计中只要例化IP核模块就可以了。          下面我们以zstar_ex04实例的PLL IP核的配置为例,看看如何添加配置Vivado中集成的标准IP核。     3.2 PLL IP核配置实例          如图所示,点击Flow Navigator面板下的“Project Manager -> IP Catalog”。 图 IP Catalog菜单          如图所示,弹出的IP Catalog面板中列出了所有Vivado自带IP核的分类列表。 图 IP Catalog面板          如图所示,在“FPGA Features and Design ->  Clocking”分类展开后,可以看到名为Clocking Wizard的IP核,通过这个IP核,我们可以配置一个PLL用于对FPGA外部输入时钟做各种分频或倍频处理。点击Clocking Wizard后将弹出相应的配置页面。 图 Clocking Wizard IP核          弹出的第一个配置页面如图所示,这里的Primitive可以选择“PLL”,然后在时钟频率(Input Clock Information)的Primary一行中设定我们的输入时钟频率(Input Frequency)为25MHz即可。 图 Clocking Options配置页面          接着在Output Clocks配置页面中,如图所示,勾选clk_out1/2/3这3个时钟,分别设置其输出频率为25MHz、50MHz、100MHz。同时勾选控制信号reset和locked的,并且它们是高电平有效(Active High)。 图 Output Clocks配置页面          接下来几个页面不需要做配置更改,直接点击OK完成PLL的配置。          配置生效后,我们可以切换到Sources面板下方的IP Sources这个子页面中,如图所示,出现了名为clk_wiz_0的IP核,即我们刚刚配置添加的IP核。可以点击展开它,在“Instantiation Template”下方的“clk_wiz_0.veo”文件就是例化模板,可以双击打开它。 图 查看例化模板          如图所示,可以复制这个PLL的例化模板,在我们的工程中相应修改外部接口。 图 PLL例化模板          关于这里PLL模块的接口定义如表所示。 信号名 方向 功能描述 clk_in1 输入 PLL模块的输入时钟信号,即所有输出时钟的基频。 clk_out1 输出 PLL模块的输出时钟1。 clk_out2 输出 PLL模块的输出时钟2。 clk_out3 输出 PLL模块的输出时钟3。 reset 输入 PLL模块的输入复位信号,高电平有效。 locked 输出 PLL的锁定指示信号,高电平有效。即该信号高电平时,表示PLL输出时钟都已经正常输出。 注:方向是相对PLL模块而言的。     4 PLL IP核的移植          参考文档《玩转Zynq-工具篇:Vivado中IP核的移植.pdf》。   5 板级调试          参考文档《玩转Zynq-环境篇:XilinxPlatformCableUSB下载器使用指南》,将...\project\zstar_ex03\zstar.runs\impl_1路径下的zstar.bit文件烧录到Zynq中。          看到的效果D1、D2和D3这3颗LED指示灯同步闪烁。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-12-26
  • 发表了主题帖: 玩转Zynq连载20——基于FPGA的模块化设计

    1 模块化设计概述          模块化设计是FPGA设计中一个很重要的技巧,它能够使一个大型设计的分工协作、仿真测试更加容易,代码维护或升级更加便利。          如图所示,一般整个设计工程的顶层文件里只做例化,不做逻辑处理。然后一个顶层下面会有模块A、模块B、模块C等等,模块A/B/C下又可以分多个子模块实现。 图模块设计示意图          如此一来,就可以将大规模复杂系统按照一定规则划分成若干模块,然后对每个模块进行设计输入、综合与实现,并将实现结果约束在预先设置好的区域内,最后将所有模块的实现结果进行整合集成,就能完成整个系统的设计。          模块化设计的实现步骤是整个模块化设计流程中最重要、最特殊的,它包含:          ●初始预算,本阶段是实现步骤的第一步,对整个模块化设计起着指导性的作用。在初始预算阶段,项目管理者需要为设计的整体进行位置布局,只有布局合理,才能够在最大程度上体现模块化设计的优势;反之,如果因布局不合理而在较后的阶段需要再次进行初始预算,则需要对整个实现步骤全面返工。          ●子模块的设计实现,在该阶段,每个项目成员并行完成各自子模块的实现。          ●模块的最终集成,在该阶段项目管理者将顶层的实现结果和所有子模块的实现结果进行整合集成,完成整个设计的实现。          模块划分的基本原则是,子模块功能相对独立,模块内部联系尽量紧密,而模块间的连接尽量简单。对于那些难以满足模块划分准则的具有强内部关联的复杂设计,并不适合采用模块化设计方法。   2 模块化设计实例详解          下面以zstar_ex03工程的顶层源码zstar.v为例,讲解在Verilog代码中如何实现模块化设计。在zstar.v模块下面有4个模块,包括1个PLL时钟产生模块,以及3个控制LED闪烁的模块。 module zstar(                             input ext_clk_25m, //外部输入25MHz时钟信号                                   output[2:0] led                   //LED指示灯接口                    );                                                                                                                                         //------------------------------------- wire clk_25m;  //PLL输出25MHz时钟 wire clk_50m;  //PLL输出50MHz时钟 wire clk_100m;         //PLL输出100MHz时钟 wire sys_rst_n;        //PLL输出的locked信号,作为FPGA内部的复位信号,低电平复位,高电平正常工作     clk_wiz_0    uut_clk_wiz_0    (    // Clock in ports .clk_in1(ext_clk_25m),      // input clk_in1     // Clock out ports .clk_out1(clk_25m),     // output clk_out1 .clk_out2(clk_50m),     // output clk_out2 .clk_out3(clk_100m),     // output clk_out3     // Status and control signals .reset(1'b0), // input reset .locked(sys_rst_n));      // output locked   //------------------------------------- //25MHz时钟进行分频闪烁,计数器为24位                                                                                                                                               led_controller  #(24)                  uut_led_controller_clk25m(                                                                            .clk(clk_25m),           //时钟信号                                                                            .rst_n(sys_rst_n),    //复位信号,低电平有效                                                                            .sled(led[2])               //LED指示灯接口                                                                   );                    //------------------------------------- //25MHz时钟进行分频闪烁,计数器为25位                                                                                                                                               led_controller  #(25)                  uut_led_controller_clk50m(                                                                            .clk(clk_50m),           //时钟信号                                                                           .rst_n(sys_rst_n),    //复位信号,低电平有效                                                                            .sled(led[1])               //LED指示灯接口                                                                   );                    //------------------------------------- //25MHz时钟进行分频闪烁,计数器为26位                                                                                                                                               led_controller  #(26)                  uut_led_controller_clk100m(                                                                            .clk(clk_100m),                  //时钟信号                                                                            .rst_n(sys_rst_n),    //复位信号,低电平有效                                                                            .sled(led[0])               //LED指示灯接口                                                                   );                  endmodule   ★ 语法要点          注意zstar.v模块的代码中例化了4个子模块,这是一个不折不扣的模块化设计工程。下面是对led_controller.v模块的一个例化代码。 led_controller  #(24)                  uut_led_controller_clk25m(                                                                            .clk(clk_25m),           //时钟信号                                                                            .rst_n(sys_rst_n),    //复位信号,低电平有效                                                                            .sled(led[2])               //LED指示灯接口                                                                   );          以上面这段代码为例,模块例化大体有下面几个要点:          ● led_controller是原始工程源码本身的模块名称。          ● uut_led_controller_clk25m的名称是可以随意起的,只要不和已有的名称重名即可,它表示我们对当前例化工程led_controller.v的唯一识别名。在这个工程中,我们看到led_controller.v模块被例化了多次,但它和uut_led_controller_clk25m对应位置的命名是不一样的,而且必须是不一样的,表示工程中有多个完全一样的功能模块。这和软件程序里面的调用不一样,软件程序由于运行起来总是串行的,所以多次调用同一个函数时,这个函数可以只占一个函数所需的物理存储空间即可;但是FPGA是并行处理的,它的模块例化,哪怕是完全一样的模块,往往也是需要多个完全一样的物理资源与余对应的。          ● “.clk(clk_25m),”是接口的映射,“.(),”是固定格式。clk是led_controller.v模块内部的接口,clk_25m是zstar.v模块的接口。          如图所示,当工程编译后,我们便可以在工程管理窗口中看到整个工程的模块结构。在zstar.v模块下面对应了4个子模块。 图 at7_ex03模块结构          led_controller.v模块代码如下。 module led_controller(                             input clk,           //时钟信号                             input rst_n,      //复位信号,低电平有效                             output sled                //LED指示灯接口                     );                                                                                                                                parameter CNT_HIGH = 24;    //计数器最高位 //------------------------------------- reg[(CNT_HIGH-1):0] cnt;                 //24位计数器                              //cnt计数器进行循环计数 always @ (posedgeclk or negedgerst_n)                                                                                            if(!rst_n) cnt<= 0;                                                                                                           else cnt<= cnt+1'b1;                                                                                                                           assign sled = cnt[CNT_HIGH-1];                           endmodule 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-12-24
  • 发表了主题帖: 玩转Zynq连载19——[ex02]基于Zynq PL的欢快流水灯

      1功能概述          Zstar的Zynq PL连接了3个LED指示灯。如图所示,3个LED指示灯分别在正极串联一个510欧姆的限流电阻,再连接3.3V电压,另一端的负级连接到PL的IO上。通过控制PL的IO输出高或低电平,就可实现LED的亮或灭状态。          本实例功能相对简单,通过FPGA内部的定时器,循环点亮每个LED,达到流水灯的效果。如图所示,3个LED指示灯,我们依次给它们赋值,每次只有一个LED点亮,每次点亮某个LED的时间一定(固定延时)。3个LED依次被点亮一次,如此循环便能达到流水灯的效果。          如图所示,在Zstar板子左侧靠下的位置有一排的LED指示灯,从左往右数第4个、第5个和第6个LED指示灯分别是D3、D2和D1。   2 板级调试          参考文档《玩转Zynq-环境篇:XilinxPlatformCableUSB下载器使用指南》,将...\project\zstar_ex02\zstar.runs\impl_1路径下的zstar.bit文件烧录到Zynq中。          可以看到D1、D2和D3这3颗LED不断的循环点亮。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-12-23
  • 发表了主题帖: 玩转Zynq连载18——[ex01] 小试牛刀,基于Zynq PL的第一个工程

    1概述 蜂鸣器是一种最简单的发声元器件,它的应用也非常广泛,大都是作为报警或发声提醒装置。比如台式电脑在刚开机时,通常主板上会发出一声较短的尖锐的“滴……”的鸣叫声,提示用户主板自检通过,可以正常进行后面的启动;而如果是1长1短或1长2短的鸣叫声,则表示可能发生了电脑内存或显卡故障;当然还可以有其他不同的鸣叫声提示其他的故障,总而言之,可别小看了这颗区区几毛钱的蜂鸣器,关键时刻还挺有用的。可以毫不夸张的说,蜂鸣器也算是一种人机交互的手段。 PWM(Pulse Width Modulation),即脉冲宽度调制,如图所示,PWM的输出只有高电平1和低电平0。PWM不停的重复输出周期为T,其中高电平1时间为t的脉冲,t/T是它的占空比,1/T是它的频率。 如图所示,这是Zstar板上蜂鸣器的电路原理图,BEEP网络连接到FPGA的IO上,当BEEP = 1时,三极管Q1的BE导通,则CE也导通,蜂鸣器U2就有电流回路,那么蜂鸣器就会发声。同理,BEEP = 0时,Q1截止,蜂鸣器无电流回路,那么蜂鸣器就不会发出声音。          如图所示,基于蜂鸣器在FPGA的IO输出1就发声、0则不发声的原理,我们给IO口一个占空比为10%的PWM的信号,让蜂鸣器间歇性的发声鸣叫。如果它的频率高,则发声就显得相对尖锐急促一些;如果它的发声频率低,则发声就显得低沉平缓一些。          在我们给出的实例代码中,我们期望产生一个输出频率为1Hz(1s)、占空比为10%的PWM信号去驱动蜂鸣器的发声。因此,我们使用系统时钟25MHz进行计数,每计数25,000,000次,这个计数器就清零重新计算。因为这个计数器是2进制的,要能够表达0-24,999,999的每一个计数值,那么这个2进制计数器至少必须是25位的(代码中取计数器为28位)。此外,为了得到输出的PWM占空比为10%,那么我们只要判断计数值小于最大计数值的1/10即2,500,000时,输出高电平1,反之输出低电平0。          创建一个最终可以跑在Zynq的PL上的应用工程,最基本的可以归纳为以下几个步骤。下面我们会逐一进行实践操作。流程不过是一个熟能生巧的过程,只要大家认真走过一遍,后续大量实例中不断操作,反复练习就能轻松掌握。   2 新建Vivado工程          参考文档《玩转Zynq-工具篇:新建Vivado工程.pdf》。   3 创建工程源码          如图所示,选中Project Manager à Sources à Design Sources,右键单击,弹出菜单中选中Add Sources…。 图新建Verilog源码菜单          接着如图所示,使用默认选项Add or create design sources,点击“Next”。 图选择文件类型          如图所示,单击Create File按钮。 图新建设计文件          如图所示,设置创建的文件类型(File type)为Verilog;文件名(File name)为zstar;文件路径(File location)为默认的<Local to Project>。 图设置新建文件名称和路径          最后点击Finish按钮完成Verilog源文件创建。          随后还会弹出如图所示的模块端口设置页面,可以直接点击OK不做设置。 图定义模块          接着还会弹出如图所示的确认对话框,点击Yes。 图定义模块确认对话框          如图所示,双击Design Sources下刚刚创建好的zstar.v文件,将弹出源码,里面有基本的Verilog模块定义,内容空空如也,需要我们来填充。 图创建好的Verilog源文件          如图所示,将Verilog代码填充进去,实现一个完整的设计源码模块。 图 Verilog源码   4 创建约束文件          如图所示,选中Project Manager ->  Constraints ->  constrs_1,右键单击,在弹出菜单选择Add Sources…。 图新建约束文件菜单          接着如图所示,使用默认选项Add or create constraints。 图选择文件类型          如图所示,单击Create File按钮。 图新建设计文件          如图所示,设置创建的文件类型(File type)为XDC;文件名(File name)为zstar;文件路径(File location)为默认的<Local to Project>。 图设置新建文件名称和路径          最后点击Finish按钮完成约束文件创建。          如图所示,双击Constraints下刚刚创建好的zstar.xdc文件,里面是完全空白的。 图创建好的约束源文件          如图所示,将这个实例的引脚约束都写入这个约束文件中。从简单的语法可以看出,这里约束了zstar中顶层接口信号对应Zynq芯片的引脚号(PACKAGE_PIN)以及电平标准(IOSTANDARD)。 图引脚约束脚本          如图所示,工程路径下新产生的zstar.srcs\source_1和zstar.srcs\constrs_1文件夹分别和Project Manager下的Design Source和Constraints相对应。 图工程路径下对应的文件夹   5 功能仿真          参考文档《玩转Zynq:Vivado中PL的功能仿真.pdf》。   6编译          如图所示,Vivado的编译主要分为三步,即Run Synthesis(综合编译)、Run Implementation(实现编译)和Generate Bitstream(生成bit流)。一般而言,我们直接点击Generate Bitstream生成bit文件后就可以进行板级调试。 图编译菜单          编译过程中,如图所示,在Vivado工具的右上角,有当前编译的状态指示。 图编译状态信息          如图所示,编译完成后,会弹出提示选项窗口,该窗口有多个下一步操作执行的选项可供选择。大家可以直接点击Open Hardware Manager进入板级下载调试的界面。 图 bit流生成完成后的选择窗口          如图示,在工程路径“…/project/zstar_ex01/zstar.uns/impl_1”下就生成了zstar.bit文件,这是用于烧录到FPGA在线运行的比特流。 图生成的bit文件   7 板级调试          参考文档《玩转Zynq-环境篇:XilinxPlatformCableUSB下载器使用指南.pdf》进行板级调试。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-12-20
  • 发表了主题帖: 玩转Zynq连载17——新建Vivado工程

      1 新建Vivado工程          在本节,我们一起来动手使用Vivado创建一个FPGA工程。          首先,我们在电脑的硬盘中创建一个名为“project”的文件夹,注意这个文件夹所在的路径名称中不要有任何的中文和符号(下划线除外),即以数字和字母为主,例如笔者的路径为“D:\myfpga\Zstar\project”。          打开Vivado,进入主界面后,如图所示,我们点击“Creat New Project”图标来新建一个工程。          如图所示,出现提示界面,点击“Next”按钮继续。          如图所示,输入工程名(Project name)和工程存放路径(Project location),Create project subdirectory选项用于选择是否在已经设定的工程存放路径中再创建一个和工程名同名称的文件夹用于存放当前工程(本实例没有勾选它,意味着最终工程存放路径是E:/myfpga/Zstar/project/zstar_ex01)。          如图所示,勾选RTL Project,然后点击Next继续下一步。          如图所示,在Add Sources页面中,若有已经编写好的Verilog或VHDL代码源文件,可以添加点击+进行添加;若没有,直接点击Next到下一步。          如图所示,Add Existing IP页面也一样,若没有已经设计好的IP文件需要添加,则继续Next进入下一步。          如图所示,若有约束文件也可以添加进来,没有就继续Next进入下一步。          如图所示,选择xc7z010clg400-3为当前工程的FPGA器件型号。 最后会弹出如图所示的New Project Summary界面,将前面设定的所有工程信息罗列出来,便于核对,我们点击Finish完成工程的创建。   2 Vivado工程界面一览          此时,如图所示,Vivado的工程主界面呈现到我们眼前了。          并且如图所示,在文件夹“project/zstar_ex01”下,自动产生了一些工程文件。          恭喜你,Vivado工程新建完毕。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-12-19
  • 发表了主题帖: 玩转Zynq连载16——Ubuntu16.04 64bit安装

      1 虚拟机安装          参考文档《007 玩转Zynq-环境篇:虚拟机与Linux系统环境搭建.pdf》安装好虚拟机。   2 Ubuntu安装          点击安装好的虚拟机VMware Workstation如图所示。点击右侧名为“创建新虚拟机(N)”的按钮。          弹出如图所示的对话框,找到Software文件夹下的ubuntu-16.04.6-desktop-amd64文件,然后点击Next。          这个ubuntu-16.04.6-desktop-amd64文件就是64bit的Ubuntu操作系统的镜像,在Ubuntu的官方网站上可以下载到,Petalinux需要用到这个版本的64bit Ubuntu操作系统,建议不用安装其它不同版本的Ubuntu。          接着为我们要安装的Ubuntu操行系统命名(Full name和User name)并输入密码(Password和Confirm必须一致)。          接下来,为Ubuntu系统找个硬盘的安装空间,如果C盘够大(至少能有120G以上的空余空间),那么默认的C盘路径也可以,否者建议安装到其它有较大剩余空间的盘符。          紧接着,需要为Ubuntu分配硬盘空间,请务必设置100G或以上的空间。          完成配置后,如图所示,列出了我们前面几个页面的配置。点击Finish开始安装。          如图所示,开始安装了。需要大约半小时时间才能完成安装。          如果遇到下面情况,进入BIOS中,找到“Intel Virtualization Technology”选择,将其“Enable”后重新尝试安装即可。   此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-12-18
  • 发表了主题帖: 玩转Zynq连载15——使用GIT进行工程备份和版本管理7

      2.7 将分支(Branch)Merge到Master          工程实践的状况很可能是这样,我们在ver1上开的branch,原本是为了进行一些其它的验证,但是我们发现这个branch方向越走越光明,以至于我们决定抛弃原先master中的ver2,而使用当前branch_A的ver2作为最终release的版本。从版本管理角度,我们希望branch_A的ver2作为master的ver3进行release。怎么做?merge命令可以搞定。          由于是将branch_A分支merge到master,所以本地工作目录需要先使用Switch/Checkout命令切换回到master。          然后点击右键菜单的TortoiseGitàMerge…。          弹出的Merge窗口中,选中FromàBranch是branch_A,点击OK。          完成后如图所示。          Show log窗口中,可以看到master指向了一个新的merge的版本。 这个merge版本包含了之前master和branch_A中所有的文件内容。          这个例子中,原生的master和branch_A只是文件不同。但是不可避免的,我们的实际应用中,会存在相同文件名的文件内容不同的情况,那么使用当前小乌龟GIT进行merge,最终结果会是branch_A覆盖了master的内容。 此内容由EEWORLD论坛网友ove学习使我快乐原创,如需转载或用于商业用途需征得作者同意并注明出处

最近访客

< 1/2 >

统计信息

已有16人来访过

  • 芯币:114
  • 好友:--
  • 主题:34
  • 回复:1
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言