熟悉vivado的好处

您所在的位置:网站首页 vivado生成bitstream 熟悉vivado的好处

熟悉vivado的好处

2023-03-22 05:37| 来源: 网络整理| 查看: 265

「正点原子FPGA连载」第一章Hello World实验,下面一起来看看本站小编正点原子给大家精心整理的答案,希望对您有帮助

熟悉vivado的好处1

1)摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南

2)实验平台:正点原子领航者ZYNQ开发板3)平台购买地址:https://item.taobao.com/item.htm?&id=6061601087614)全套实验源码+手册+视频下载:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)对正点原子FPGA感兴趣的同学可以加群讨论:8767449006)关注正点原子公众号,获取最新资料

第一章Hello World实验“Hello World!”是各种编程语言中最简单,同时也是最经典的入门实验。因此,我们将串口打印“Hello World”作为ZYNQ嵌入式系统的开篇实验,这也是我们步入ZYNQ的PS部分的始发点。通过本次实验我们将了解ZYNQ嵌入式系统的开发流程,熟悉ZYNQ嵌入式最小系统的搭建。本章包括以下几个部分:1.1简介1.2实验任务1.3硬件设计1.4软件设计1.5下载验证1.1简介首先我们来了解一下ZYNQ嵌入式系统的开发流程。

图 1.1.1 ZYNQ嵌入式系统开发流程如上图所示,开发流程大体可以分为6步。其中step1至step4为硬件设计部分,在Vivado软件中实现;step5为软件设计部分,在SDK软件中实现;step6为功能的验证。复杂的程序还涉及Debug,这个也是在SDK软件中实施。具体每一步的操作我们会在后面详细介绍。在简单了解ZYNQ嵌入式系统的开发流程后,接下来我们来看一下什么是ZYNQ嵌入式最小系统。ZYNQ嵌入式最小系统的概念包括以下两个方面:一、它是使系统正常工作的最小条件;二、它是其他系统建立的基础。

图 1.1.2 ZYNQ嵌入式最小系统如图 1.1.2所示,以ARM Cortex-A9为核心、DDR3为内存,加上传输信息使用的UART串口就构成了ZYNQ嵌入式最小系统。可以看到,这个最小系统只包括了ZYNQ中的PS部分。下面我们将按照ZYNQ嵌入式系统开发流程,一步步的搭建上图所示的最小系统。1.2实验任务本章的实验任务是在领航者ZYNQ开发板上搭建ZYNQ嵌入式最小系统,并使用串口打印“Hello World”信息。1.3硬件设计在图 1.1.1中,我们将step1至step4划分为硬件设计部分。step1:创建Vivado工程1-1 打开Vivado,进入Vivado界面后,点击“Quick Start”栏的 “Create Project”。然后在弹出的创建Vivado工程向导界面,点击“Next”。如下图所示:

图 1.3.1 点击创建工程

图 1.3.2 创建工程向导1-2 进入工程命名界面。设置工程名为“hello_world”,工程路径可使用任意路径,本章我们将该工程放在F:\ZYNQ\Embedded_System文件夹下。注意,工程名和路径只能由英文字母、数字和下划线组成,不能包含中文、空格以及特殊字符!确认已经勾选“Create project subdirectory”,点击“Next”,如下图所示:

图 1.3.3 设置工程信息

图 1.3.4 选择工程类型1-3 进入图 1.3.4所示的界面,在此界面设置工程类型。此处我们选择 “RTL Project”。本次实验不需要添加源文件和约束文件,所以勾选“Do not specify sources at this time”。勾选之后会省略后面添加源文件和约束文件的步骤,点击“Next”直接跳到器件选型界面。1-4 器件选型界面。所选择的器件型号一定要跟领航者核心板上的ZYNQ芯片型号保持一致。领航者核心板上的ZYNQ芯片有两种型号,XC7Z010和XC7Z020。大家可以通过查看核心板上ZYNQ芯片的私印来确认所使用的芯片型号。这两个芯片主要的差异是PL部分的逻辑资源不同,PS部分相同,另外XC7Z010型号速度等级speed为“-1”,XC7Z020的为“-2”,这在器件选型的时候需要注意。此处以XC7Z020为例。选择器件型号的方式有两种,一种是根据Parts,另一种是根据Boards,此处我们使用Parts选择器件。在Family栏里选择“Zynq-7000”, Speed栏选择“-2”,需要注意的是,在Package栏选择“clg400”。然后根据所使用的领航者核心板上的ZYNQ芯片型号,在下面的器件列表中选择“xc7z020clg400-2”,如下图所示。若是XC7Z010,相对应的器件为“xc7z010clg400-1”。

图 1.3.5 器件选型界面

选中之后,点击“Next”。1-5 工程摘要界面。这是创建工程的最后一步,显示工程摘要信息,如图 1.3.6所示。在此界面检查前面所设置的工程名称、所选择的器件型号等信息。如果发现工程设置有误,则可以通过Back按钮返回前面的步骤,重新设置。检查无误后点击“Finish”,完成工程创建。工程创建完成后的Vivado界面如图 1.3.7所示。

图 1.3.6 工程摘要界面

图 1.3.7 工程创建完成后的Vivado界面step2:使用IP Integrator创建Processing SystemVivado开发套件中提供了一个图形化的设计开发工具——IP 集成器(IP Integrator),在IP集成器中可以非常方便的插入各种功能模块(IP)。它支持关键IP接口的智能自动连接、一键式IP子系统生成、实时DRC等功能,能够帮助我们快速组装复杂系统,加速设计流程。接下来我们将在IP集成器中完成ZYNQ嵌入式系统的搭建。2-1 在左侧导航栏(Flow Navigator)中,单击IP Integrator下的Create Block Design。然后在弹出的对话框中指定所创建的Block Design的名称,在Design name栏中输入“system”。如下图所示:

图 1.3.8 创建 Block Design

2-2点击“OK”按钮,此时Vivado界面如下图所示。注意右侧的Diagram窗口,我们将在该窗口中以图形化的方式完成设计。

图 1.3.9 Block Design界面

2-3 接下来在Diagram窗口中给设计添加 IP。点击上图中箭头所指示的加号“+”,会打开IP目录(IP Catalog)。也可以通过快捷键Ctrl + I,或者右键点击Diagram工作区中的空白位置,然后选择“ADD IP”。2-4 打开IP目录后,在搜索栏中键入“zynq”,找到并双击“ZYNQ7 Processing System”,将ZYNQ7处理系统IP添加到设计中。

图 1.3.10 添加ZYNQ7 Processing System IP

2-5 添加完成后,ZYNQ7 Processing System模块出现在Diagram中,如下图所示:

图 1.3.11 ZYNQ7 Processing System IP

2-6 双击所添加的ZYNQ7 Processing System模块,进入ZYNQ7处理系统的配置界面。界面左侧为页面导航面板,右侧为配置信息面板。如下图所示:

图 1.3.12 ZYNQ7处理系统配置界面

下面我们简要地介绍一下页面导航面板中各个页面的作用。在Zynq Block Design页面,显示了Zynq处理系统(PS)的各种可配置块,其中灰色部分是固定的,绿色部分是可配置的,按工程实际需求配置。可以直接单击各种可配置块(以绿色突出显示)进入相应的配置页面进行配置,也可以选择左侧的页导航面板进行系统配置。PS-PL Configuration页面能够配置PS-PL接口,包括AXI、HP和ACP总线接口。Peripheral IO Pins页面可以为不同的I/O外设选择MIO/EMIO配置。MIO Configuration页面可以为不同的I/O外设具体配置MIO/EMIO。Clock Configuration页面用来配置PS输入时钟、外设时钟,以及DDR和CPU时钟等。DDR Configuration页面用于设置DDR控制器配置信息。SMC Timing Calculation页面用于执行SMC时序计算。Interrupts页面用于配置PS-PL中断端口。2-7 配置PS的UART。点击Peripheral I/O Pins页面,出现以下IO引脚配置界面。

图 1.3.13 配置ZYNQ7 Processing System的UART

PS和外部设备之间的连接主要是通过复用的输入/输出(Multiplexed Input/Output,MIO)来实现的。PS的54个MIO引脚可以用于连接不同的外设接口,如图 1.3.13中的MIO14和MIO15,既可以配置成UART0的引脚接口,也可以配置成I2C0或CAN0的引脚接口。最终所选择的配置需要与领航者开发板的原理图相对应。

图 1.3.14 领航者核心板原理图

图 1.3.14是领航者核心板原理图的一部分。从图中我们可以看到,BANK500中的MIO14和MIO15被用作UART串口通信的引脚,并最终与底板上的USB转串口芯片CH340连接。因此,为了实现串口通信的功能,我们需要在PS中将MIO14和MIO15配置成 UART0模块的接口引脚。如下图所示,我们在MIO14和MIO15下点击UART0,方框的颜色会变成绿色,与此同时这两个MIO也会变成绿色。这就表明MIO14和MIO15被配置成了UART接口引脚,它们与PS中的串口电路UART0相连接。

图 1.3.15 选中UART0

点击左侧的MIO Configuration页面,在右侧展开I/O Peripherals > UART0,可以看到更具体的引脚配置信息。其中MIO14作为RX引脚、MIO15作为TX引脚,如下图所示:

图 1.3.16 UART0的具体引脚配置

点击左侧的PS-PL Configuration页面,我们可以在这里设置UART0串口通信的波特率。在General目录下,可以看到UART0的波特率默认是115200。通过下拉按钮可以选择其他波特率,一般保持默认设置。

图 1.3.17 选择UART0的波特率

2-8 配置PS的DDR3控制器。点击左侧的DDR Configuration页面,在右侧DDR Controller Configuration下的“Memory Part”一栏选择DDR的器件,XC7Z020的核心板选择MT41J256M16RE-125,XC7Z010的核心板选择MT41J128M16 HA-125。需要注意的是,我们在这里选择的型号并不是领航者核心板上的DDR3型号,而是参数接近的型号,或者说兼容的型号。其他的配置选项保持默认即可。

图 1.3.18 配置PS的DDR3控制器

2-9 配置PS的时钟。点击左侧的Clock Configuration页面,该界面主要是配置ZYNQ PS中的时钟频率。比如输入时钟默认是33.33333Mhz,这与我们领航者核心板上的PS端输入时钟频率相同。对于CPU的时钟、DDR的时钟以及其它外设的时钟,我们直接保持默认设置即可。如下图所示:

图 1.3.19 配置PS的时钟

2-10 因为本实验是搭建ZYNQ的嵌入式最小系统,只需要使用ZYNQ中的PS端。因此我们将PS中与PL端交互的接口信号移除。同样是在Clock Configuration页面,展开PL Fabric Clocks,取消勾选FCLK_CLK0,如下图所示:

图 1.3.20 去掉勾选FCLK_CLK0

点击左侧的PS-PL Configuration页面,然后在右侧展开General下的Enable Clock Resets,取消勾选其中的FCLK_RESET0_N。另外在当前界面中展开AXI Non Secure Enablement下的GP Master AXI Interface,取消勾选其中的M AXI GP0 interface。如下图所示:

图 1.3.21 取消勾选FCLK_RESET0_N和M AXI GP0 interface

2-11 配置ZYNQ7 Processing System完成,点击“OK”。返回到Vivado界面后,在Diagram中可以看到ZYNQ7 Processing System IP模块发生了变化,如图 1.3.22所示。 我们将其与图 1.3.11作对比可以发现,ZYNQ7 PS模块少了四个接口,这正是因为我们在配置ZYNQ7 PS的过程中移除了与PL相关的接口信号。

图 1.3.22 点击Run Block Automation

2-12 我们点击上图中箭头所指示的位置“Run Block Automation”,会弹出如下图所示的对话框:

图 1.3.23 完成对ZYNQ7 Processing System IP核的配置

在该界面中我们可以选择自动连接IP模块的接口,包括导出外部端口,甚至可以自动添加模块互联过程中所需的IP。在我们本次设计中只有一个IP模块,在左侧确认勾选processing_system7_0,然后点击“OK”。此时ZYNQ7 PS模块引出了两组外部接口,分别是DDR和FIXED_IO,引出的接口将会被分配到ZYNQ器件具体的引脚上。大家也可以通过点击ZYNQ7 PS模块接口处的加号“+”,来展开这两组接口,观察其中都有哪些信号。如下图所示:

图 1.3.24 配置完成后的ZYNQ7 Processing System

2-12 本次实验不需要添加其它IP,直接按快捷键Ctrl+S保存当前设计。接下来点击下图箭头所指示的按钮,验证当前设计。验证完成后弹出对话框提示没有错误或者关键警告,点击“OK”,如下图所示:

图 1.3.25 验证设计

如果验证结果报出错误或者警告,大家需要重新检查自己的设计。step3:生成顶层HDL模块3-1 在Sources窗口中,选中Design Sources下的sysetm.bd, 这就是我们刚刚完成的Block Design设计。右键点击sysetm.bd,在弹出的菜单栏中选择“Generate Output Products”,如下图所示:

图 1.3.26 选择Generate Output Products

3-2 弹出“Generate Output Products”对话框,如下图所示:

图 1.3.27 设置Generate选项

在对话框中Synthesis Options选择Global;Run Setings用于设置生成过程中要使用的处理器的线程数,进行多线程处理,保持默认或设置为个人电脑处理器最大可使用线程数都可以,一般选择最大可使用线程数的一般。然后点击“Generate”来生成设计的综合、实现和仿真文件。在“Generate”过程中会为设计生成所有需要的输出结果。比如Vivado工具会自动生成处理系统的XDC约束文件,因此我们不需要手动对ZYNQ PS引出的接口(DDR和FIXED_IO)进行管脚分配。Generate完成后,在弹出的对话框中点击“OK”。在Sources窗口中,点击“IP Source”标签页,可以看到Generate过程生成的输出结果。

图 1.3.28 block design生成的结果

3-3 在“Hierarchy”标签页再次右键点击system.bd,然后选择“Create HDL Wrapper”。

图 1.3.29 生成顶层模块

在弹出的对话框中确认勾选“Let Vivado manage wrapper and auto-update”,然后点击“OK”。

图 1.3.30 创建顶层HDL封装

创建完成后,Design Sources结构如下图所示:

图 1.3.31 生成system_wrapper.v顶层文件

system_wrapper.v为创建的Verilog文件,箭头所指的“品”字形图标指示当前模块为顶层模块。该模块使用Verilog HDL对设计进行封装,主要完成了对block design的例化,大家也可以双击打开该文件查看其中的内容。另外我们在图 1.3.30中勾选了“Let Vivado manage wrapper and auto-update”,这样我们在修改了Block Design之后就不需要再重新生成顶层模块,Vivado工具会自动更新该文件。step4:生成Bitstream文件并导出到SDK如果设计中使用了PL的资源,则需要添加引脚约束并对该设计进行综合、实现并生成Bitstream文件。由于本次实验未用到PL部分,所以无需生成Bitstream文件,只需将硬件导出到SDK即可。4-1 导出硬件。在菜单栏选择 File > Export > Export hardware。

图 1.3.32 导出硬件

在弹出的对话框中,因为没有生成bitstream文件,所以无需勾选“Include bitstream”,直接点击“OK”按钮。

图 1.3.33 无需勾选“Include bitstream”

在上图中,因为选择了“Exort to ”,Vivado工具会在当前工程目录下新建一个文件夹,名为“hello_world.sdk”,它是我们接下来软件开发的工作空间。在Export Hardware的过程中,工具会将硬件以一个ZIP压缩文件的形式导出到该工作空间中,文件名为“system_wrapper.hdf”。该文件包含了我们前面所搭建的硬件平台的配置信息,其后缀名.hdf的含义为“Hardware Definition File”,即硬件定义文件。4-2 硬件导出完成后,在菜单栏中选择File > Launch SDK,启动SDK开发环境。如下图所示:

图 1.3.34 启动SDK开发环境

在弹出对话框中,直接点击“OK”,如下图所示:

图 1.3.35 设置工作空间

到这里,我们已经完成了ZYNQ嵌入式系统的硬件设计部分。接下来需要到SDK软件中进行应用程序开发,也就是软件设计部分。1.4软件设计在硬件设计的最后,我们启动了软件开发环境(SDK,Software Development Kit),如下图所示:

图 1.4.1 SDK开发环境界面

SDK打开后,主页面会显示硬件描述文件system.hdf的内容。如图 1.4.1所示,system.hdf标签页显示了整个PS系统的地址映射信息。大家应该还记得,在启动SDK之前,我们将硬件以一个ZIP压缩文件(system_wrapper.hdf)的形式导出到软件的工作空间。在SDK启动时,该文件会自动解压,大家可以在图 1.4.1的左侧看到解压后的所有文件。其中,前四个文件(ps7_init_gpl.c、ps7_init_gpl.h、ps7_init.c和ps7_init.h)包含了Zynq SOC处理系统的初始化代码,以及DDR、时钟、pll和MIO的初始化设置信息。在初始化过程中,SDK使用这些信息去配置相应的模块,使得应用程序能够在PS上运行。step5:在SDK中创建应用工程5-1 在菜单栏选择File > New > Application Project, 新建一个SDK应用工程。

图 1.4.2 新建应用工程

5-2 在弹出的对话框中,输入工程名“hello_world”,其它选项保持默认即可,点击“Next”。

图 1.4.3 配置工程

5-3 选择工程模版Hello World,然后点击“Finish”。

图 1.4.4 选择工程模版Hello World

5-4 SDK创建了一个hello_world应用工程和hello_world_bsp板级支持包(BSP)工程。同时工具会自动对工程进行编译,并生成ELF文件“hello_world.elf”,如下图所示:

图 1.4.5 工程创建后的界面

另外工程创建完成后,SDK主界面会打开BSP工程目录下的system.mss文件。MSS是英文Microprocessor Software Specification的缩写,即微处理器软件说明。该文件包含BSP的操作系统信息、硬件设计中各个外设的软件驱动等信息。5-5 双击打开hello_world/src工程目录下helloworld.c文件,可以看到源代码如下:

1 #include 2 #include "platform.h"3 #include "xil_printf.h"45 int main()6 {7 init_platform();89 print("Hello World\n\r");1011 cleanup_platform();12 return 0;13 }

复制代码

可以看到程序中主函数调用了3个函数,分别是init_platform()、cleanup_platform()和print()函数。我们将鼠标停留在各个函数名上,SDK就会显示该函数的声明。如果想查看函数的定义,可以按住Ctrl键不放,用鼠标点击相应的函数,就会跳转到其定义的地方。init_platform和cleanup_platform函数定义如下:

图 1.4.6 init_platform和cleanup_platform函数定义

可以看到init_platform函数的作用是使能caches和初始化uart;cleanup_platform函数的作用是取消使能caches。实际上这两个函数在该工程中并没有启动任何作用,因为这两个函数是针对于特定平台如Microblaze的,对于我们使用的ZYNQ平台而言是不起作用的,所以main函数中只需包含第9行的print语句就可以了,出于平台的通用性和可移植性,此处我们保留这两个函数。另外需要注意程序中打印字符串“Hello World”使用的是print()函数,而不是C语言里的printf()函数。print()函数是Xilinx定义的一个用于打印字符串的函数,调用该函数需要包含头文件“xil_printf.h”。5-6 在我们修改并保存源文件后,SDK会自动对工程进行编译。编译进度可以在工具下方的控制台面板(Console)中进行查看,编译完成后控制台会显示信息“Finished building”,如下图所示:

图 1.4.7 编译完成

我们也可以在工具栏中点击“Build All”或通过快捷键Ctrl+B来编译工程,如下图所示:

图 1.4.8 编译工程

到这里我们已经完成了本次实验的软件设计部分。1.5下载验证首先我们将下载器与领航者底板上的JTAG接口连接,下载器另外一端与电脑连接。然后使用Mini USB连接线将开发板左侧的USB_UART接口与电脑连接,用于串口通信。最后连接开发板的电源,并打开电源开关。如下图所示:

图 1.5.1 领航者ZYNQ开发板实物图

注意第一次连接领航者底板上的USB_232接口时,需要安装USB串口驱动。在开发板随附的资料中找到“6_软件资料/1_软件/CH340驱动(USB串口驱动)”文件夹,双击打开文件夹中的“SETUP.EXE”进行安装,驱动安装界面如下图所示。界面中提示INF文件为CH341SER.INF,我们不需要理会(CH341,CH340驱动是共用的),直接点安装即可。

图 1.5.2 安装USB串口驱动

step6:板级验证6-1 在SDK软件的下方,找到SDK Terminal窗口。如果界面中没有找到该窗口,或者操作过程中把该窗口给关闭了,则可以通过在菜单栏中选择Window > Show View > Other,在Show View窗口中搜索添加SDK Terminal。

图 1.5.3 SDK软件自带的串口终端

如上图所示,在SDK Terminal窗口中点击右上角的加号“+”连接串口,并在弹出的窗口中对串口进行设置。设置的参数需要与硬件设计过程中配置的UART0保持一致,即波特率为115200,数据位为8位,停止位为1位。如下图所示:

图 1.5.4 设置UART串口

需要注意的是,在设置串口端口(Port)时,在下拉列表中可能会看到多个可选端口。我们需要选择与领航者底板上的串口所连接的端口,具体的端口号可在计算机设备管理器中查看。因为底板上使用的USB转串口芯片型号为CH340,因此在设备管理器中找到USB-SERIAL CH340所对应的端口,在我这台电脑上该端口号为COM12。如下图所示:

图 1.5.5 查看串口端口

6-2 下载程序。右键点击hello_world工程,在弹出的菜单栏中选择Run as > 1 Launch on Hardware (sysntem Debugger),如下图所示:

图 1.5.6 下载程序6-3 下载完成后,应用程序会将字符串“Hello World”通过ZYNQ PS端的串口模块UART0发送出去。在SDK Terminal窗口可以看到上位机接收到的字符串,如下图所示:

图 1.5.7 程序运行结果程序成功打印出了“Hello World”字符串,说明本次实验在领航者ZYNQ开发板上面下载验证成功。

熟悉vivado的好处2

在之前本公众号写过两篇关于工具更新对仿真调试提高效率的文章,《【干货】推荐一款FPGA仿真调试鸟枪换炮的工具!》以及《NCVerilog+SimVision+Vivado仿真环境搭建》,详细描述了Linux环境下仿真环境搭建可以缩短五倍以上的仿真时间。本文仍是实验室学生张仲禹所写,介绍了自己开发的小工具Vivado Batch Mode Tool,通过使用它可以很简单的做到从GUI过渡到命令行使用,希望大家都能用上更好更快的工具,在紧张的工作时间里创造更多的价值!

手点Vivado GUI也太低效了,关注“Z胖实验室”公众号,公众号内回复 Vivado脚本 获得链接,也可在头条给我留言告知我邮箱。

Vivado Batch Mode就如其字面意思,就是Vivado的批处理模式,用另一种说法也就是使用shell的非GUI(图形界面)交互模式。但是要注意,非GUI模式还有一种tcl Mode,也就是使用tcl命令的交互模式,这不等同于我们这里所说的Batch mode。或者你可以更简单的把它理解为通过命令行与Vivado进行交互。

在Batch mode下Vivado使用起来更加快速,操作更加明确简洁,可以大大的提高工作效率,提高生产力。

为此,为了实验室同学们能更加方便的使用Vivado Batch mode,我写了这个小工具Vivado Batch Mode Tool,通过使用它就可以很简单的做到从GUI过渡到命令行使用,希望大家都能用上更好更快的工具,在紧张的工作时间里创造更多的价值!

需要一提的是,本工具仅仅是一个简单的脚本,使用Shell和tcl进行实现(十分简陋且结构简单),主要用于实现我们日常开发的基础功能,这里作为抛砖引玉的作用,希望大家有更好的想法也可以动手去实现,推荐大家学习使用Python进行脚本编写,这样更有助于编写更加强大的脚本。

为什么要使用Batch Mode?

这里从两个方面分别进行说明,为什么要使用Vivado的Batch mode。

1、流程操作效率

我所谓的流程操作效率,是指在使用Vivado时,通过键盘输入、鼠标点击以及进行等待等实际外部操作的效率。例如我需要打开一个Vivado工程,并进行Synthesis,那么在GUI下是这样的流程操作:点击打开Vivado GUI并等待----用Vivado点击打开对应的.xpr文件并等待----点击run Synthesis并点击确认----等待----Synthesis完成。

而如果使用Batch mode,那么只需要在Terminal输入以下命令:

Vivado -mode batch -source syn.tcl XXX.xpr

其中syn.tcl是一个提前写好了tcl命令用于指示Vivado进行Synthesis操作的tcl文件,这也仅需要几行简单的代码即可。

从这里已经可以看出,在有一个提前准备好的脚本的情况下,通过脚本指挥,自动的去下达命令,可以极大地减少流程操作,可能只需要输入几个字母再按一下回车,就可以执行一套较为复杂的操作。

上面举例中的进行Synthesis还算是一个较为简单的操作,很明显在越复杂的操作中,使用Batch mode越能带来更高的流程操作效率提升。

一种简单的理解方式是,你提前将需要做的事情都告诉了电脑,然后你就玩去了,电脑按照你提供给他的事务列表逐个逐个自己去进行,这期间不会再来烦你。

更为生动的GUI和Batch mode在流程操作上的对比就像这样:

GUI模式:

第一天

妈妈:你快回屋里去。 我:好的。

妈妈:坐下来。 我:好的。

妈妈:快写作业。 我:好的。

我:我能玩电脑吗? 妈妈:不行。

第二天、第三天……

相同的对话每天重复。

Batch 模式:

第一天

妈妈:你快回屋里去写作业,不准玩电脑。

我:好的。

第二天、第三天……

妈妈:我之前说的你忘了?快去。

我:好的。

原本每天重复的长对话后面都只能用一句就代替了。

经过上面的对比,相信你已经对Batch mode在流程操作效率上的提升有了明确的认识,那么接下来再说说另一方面。

2、运行效率

运行效率指的就是Vivado在执行具体操作的时候其自身运行计算的效率、速度。这里我并没有深究让运行效率提升的具体原因,个人猜测一部分原因是因为不使用GUI而释放了很多原先被GUI占用的资源,可能还有跟GUI占用的系统中断更多有关吧(把这一条归到前一条也没问题),有兴趣的同学可以去具体研究一下,我这里只说对比实验的结果。

我用一台CPU为i7-8700,16G DDR4 2666MHz 内存的PC,分别使用GUI和Batch mode对同一个Vivado工程从Synthesis跑到Write Bitstream这样一个完整的过程。

GUI花了45分钟时间,Batch mode花了18分钟。

GUI:“我起了,被秒了,有什么好说的。”

Batch mode在运行效率上的优势太明显,不需要再说更多了吧。

综合以上两点,使用Batch mode既能提高流程操作效率,解放自己的双手,还可以大幅提高运行效率,缩短运行等待时间,直接有效的提高使用Vivado的整体效率,使开发速度大大加快。这些,就是我推荐使用Batch mode的原因。

要使用Batch Mode的一些不便

正如前面提到的syn.tcl文件,要指挥Vivado执行任何操作,都需要用tcl语言来下达命令,也就是说你还需要会用tcl语言把要做的事情告诉Vivado才行,这就增加了难度。

TCL语言全称是Tool Command Language,一般简写成tcl(读音同tickle),它是许多的EDA工具都使用的一种语言,既有tcl原生的语法,也有各家EDA自己定义的语法,Vivado的tcl语法可以参照Xilinx UG835文档,很全面的手册。或者你也可以参照着平常使用Vivado工程时出现的vivado.jou这个文件,它里面记录了你这一次从打开到关上Vivado整个过程中按顺序每一步使用的tcl命令,我个人更偏向于用后者作为主要材料学习,然后随时翻看UG835文档作为补充讲解。

另外,除了需要tcl语言来写具体的命令,还需要一个框架来进行流程控制,就好像你知道Synthesis的命令是什么,也知道Implement的命令是什么样,但是你还需要什么时候用什么命令,用完之后再做什么,什么时候停止......等等这些都要考虑在内。这个框架根据需求可以很简单也可以很复杂,同时它也需要再使用另一种语言来搭建,常见的有Shell、Perl以及Python。这些就又为写一个脚本增加了难度。

因为这些原因,许多人对Batch mode望而却步,毕竟都是从Windows过来的人,不看图形界面就发慌,关GUI是不可能关的,这辈子都不可能关的,写脚本又不会,就只有点来点去才能勉强应付的了生活这样子。

但是,不用担心!

我给你都准备好了,我把一切都放在那里了,One Piece是......(不好意思串场了)这是一个一个简陋但是又能实现基本功能的脚本,暂且叫它Vivado Batch Mode Tool吧,我尽可能让它的在Terminal中能显示出一个类似GUI的操作界面。可能你用了之后会觉得“Batch mode比GUI好多了!里面各个东西都实用,界面又简洁,我超喜欢Batch Mode的!”

Vivado Batch Mode Tool介绍与使用方法

1、Vivado Batch Mode Tool功能介绍

本工具的初衷是能为本人所在实验室的各位同学们提供一个方便的途径去接触使用Vivado Batch mode,因此需要方便的与Vivado工程配合使用,于是便设计成了类似外置助手工具这样的框架。

Vivado Batch Mode Tool可以使用户方便的使用Vivado的Batch mode,仅需要输入提供的选项就可以做到基础的Synthesis、Implement、Write Bitstream以及Program Device这些操作,相当于为用户准备了一个不同于GUI的操作界面,可以较好的服务于习惯GUI的用户。本工具仅能实现一些基础必要的功能,一些更为复杂的特别是需要用户自己定义的(例如Debug Core)仍然需要通过GUI完成,在工具中也提供了进入GUI的选项。

2、Vivado Batch Mode Tool文件总览

Vivado Batch Mode Tool我将其放入一个文件夹内,如下图。

其中包含了这样的一个文件夹和两个文件,如下图。这其中Vivado_init.tcl的作用我已经写在它的注释里了,不希望每一次打开vivado都产生两个备份的.log和.jou的同学可以看一看它。

在tcl_dir内有7个.tcl文件,如下图。

这些就是这个脚本的全貌。

3、Vivado Batch Mode Tool使用介绍

1)将Vivado_bat_mod_tool文件夹放置在与你的Vivado工程的.xpr同一级目录下,如下图。

2)修改文件夹内的Vivado_batch_mode_tool这个文件的权限为允许作为可执行文件,可以使用chmod命令,也可以右键----Properties----Permission----下方勾选Allow executing file as program。

3)在Vivado_bat_mod_tool文件夹这一级使用Terminal,运行Vivado_batch_mode_tool:

./Vivado_batch_mode_tool

4)如果文件夹放置正确,则会检测到Vivado工程,显示如下的界面:

如果文件夹放置不正确,则会报错,如下图:

5)下面介绍各个选项的使用,请根据需要,输入相应的选项并回车即可。

syn:仅执行Synthesis操作,执行完会询问是否需要打开 Synthesis Design的GUI界面,请输入y/n来决定是否打开。这里是为了当一些工程需要添加debug core的时候,可以在综合完成后,进入GUI去set Debug,设置完成后再手动关闭GUI即可。

imp:仅执行Implement操作,执行完会询问是否需要打开 Implemention Design的GUI界面,请输入y/n来决定是否打开。这里是为了有时需要在实现完成后检查布线图。

bit:仅执行Write Bitstream操作,会将生成的.bit文件和.ltx文件(如果有的话)放置在Vivado_bat_mod_tool文件夹中的bitstream文件夹内。

syn_imp:连续执行Synthesis和Implement,执行完会询问是否需要打开 Implemention Design的GUI界面,请输入y/n来决定是否打开。

all:连续执行Synthesis、Implement和Write Bitstream。

prog:将bitstream内的[current_project].bit下载入FPGA。如果没有发现匹配的Device则会报错。注意,目前此脚本还仅能下载.bit文件,如果有.ltx文件请进入GUI去下载,毕竟抓信号有时候还是需要用GUI观察。

gui:使用GUI打开这个Vivado工程。

exit:退出脚本。

6)每一次执行完之后只需要按回车就可以返回主界面,不要反复开关脚本。

使用实例

接下来,我将通过讲解一次完整的从Synthesis到Program Device的操作来为大家提供一个使用这个脚本的实例。

1)如前文描述一样放置正确路径并打开脚本,得到下图:

2)单独执行Synthesis(当然也可以一步到位执行all),输入syn并回车得到下图。

然后Vivado就会开始对你当前的工程进行Synthesis,完成之后会有询问是否要打开Synthesis Design,如下图。

不需要就输入n然后回车,如下图。

需要打开Synthesis Design则输入y并回车,然后就会打开Synthesis Design的GUI。

下图是打开的Synthesis Design GUI界面。

之后关掉GUI时也会显示

只需要按回车就可以返回主界面。

3)直接执行all,从Synthesis跑到Write Bitstream,输入all并回车,如下图。

然后Vivado就会开始自动的先执行Synthesis,再执行Implemention,最后执行Write Bitstream。完成后会有如下图的提示。

同时bitstream文件夹下会出现.bit文件,有debug core时还会出现.ltx文件。

4)最后我要进行Program Device操作

此时我的PC上没有连接任何FPGA板,如果此时执行prog,则会出现下图的报错。

我现在就去拿块板子插上。

好的板子插上了,我们现在再来prog一下。

Program完成后会有提示,如下图。

并且此时开发板上是这样的

没错它就是个流水灯。

全程完成,操作少,速度快,易掌握。

只需要执行all和prog就能完成这一系列的操作。

写在最后

希望看完了以上内容的你能够掌握这种Vivado的Batch mode用法,并能够去开发自己的脚本工具。

希望本工具能够起到抛砖引玉的作用,带给以前没有接触过使用脚本进行开发的同学们一个新的体验,然后打开一个新的大门,提高更多的能力。

目前这个Vivado Batch Mode Tool V1.0也是我关于Vivado Batch mode的第一个脚本,比较简陋的shell脚本,也希望后面我也加强学习,等到V2.0的时候给大家带来更功能强大的Python版本的脚本。

全文完。

熟悉vivado的好处3

做FPGA样机和做芯片的思路其实是有差异的。为了追求好的性能,节省成本,降低功耗(PPA),芯片设计者往往把事情做到极致,去做验证时把各种覆盖率尽可能做到100%,把每个模块电路结构优化到面积最小,通过Power Gating和Clock Gating等技术把功耗降到最低,争取把每次流片(烧钱)的风险降到最低;相比芯片设计流程,FPGA样机的开发人员往往不太注重上述要求,虽然有着与做芯片相同的目标和追求,但往往因为FPGA的可编程性,即便后续发现问题,也可以通过修改代码再次烧写bit文件的方式来弥补,出错成本相对低了很多。但如果按照做芯片的方式来做FPGA样机,肯定会带来更好的结果,甚至可以大幅度的降低FPGA开发时间。在这个过程中,就需要把常规的做FPGA的方式进行修正,比如经常采用的跟FPGA编译工具联合仿真的办法就不太适合做芯片的验证了。本文就探讨如何把Vivado与ModelSim联合仿真修改为单独采用ModelSim进行仿真。

在本公众号上一篇文章(【干货】推荐一款FPGA仿真调试鸟枪换炮的工具!)中就曾提到,隔行如隔山,做芯片的人永远无法理解只做FPGA样机的人在某些情况下不做仿真就直接上板的做法,非芯片设计出身只做FPGA样机的人也不知道这个世界上还存在更为高效的Verilog或VHDL语言的仿真工具和仿真方法,也不理解为了把一个芯片做到极致,必须严格要求代码规范的做法。为了能够使用上一篇文章中高效的Verdi或者SimVision仿真调试工具,脱离Vivado等仿真工具单独搭建仿真环境的就成为比较急迫的需求了。

本公众号之前也曾经发布过一篇相关的文章,用Modelsim独立仿真带Vivado IP核的仿真工程,也是实现采用ModelSim单独搭建仿真环境的一种方法,但文中所述方法仍未彻底摆脱Vivado的环境,适用的场景也受到限制,某些工程中还会出错。因此,本文从最原始文件搭建仿真环境的思路出发,尝试着研究脱离Vivado单独建仿真环境的过程中都会遇到什么问题,采用什么样的方法比较容易解决,笔者试了好几个工程,总结出一套相对完善的解决思路,来分享给大家。

FPGA开发最不理解的芯片设计中的操作1、做芯片的仿真最后都不用图形界面

与刚开始做FPGA开发时都在图形界面下操作的仿真方法不同,做大规模芯片设计时的仿真常常不调用图形界面,都是采用命令行的形式做的仿真。

上图就是采用简单的windows下的批处理调用modelsim进行的一个仿真过程,这个简单的批处理,就是脚本。也是本文最终要实现的目标。

set PROJECT_PATH=%cd% ::vsim -do sim.do vsim -c -do sim.do

脚本,是芯片设计人员必须要掌握的基本技能。在芯片设计的各个阶段,脚本的作用是非常巨大的。代码仿真,可以使用脚本来进行仿真环境的搭建,综合的约束文件,必须采用脚本来提前对综合过程中的各种要求进行说明,后端就更不用说了。因为整个芯片的设计流程,每个流程的所有中间信息都是靠文本来储存的,RTL代码,netlist,后端的颜色文件,流片用的GDSII等等,对文本进行随意的操作处理就是一名IC设计人员的基本技能。

如下图就是一个简单的采用NCVerilog进行仿真的脚本。

#!/bin/sh echo "\`include \"../testcase166/$1.v\"" > testcase.v sed "s//wave.shm//wave$1.shm/g" ../testbench/testbench.v > testbench.tmp cp ../testbench/testbench.v ../testbench/testbench.bak cp testbench.tmp ../testbench/testbench.v rm -f testbench.tmp ncverilog -f ../filelist/filelist.v +access+rwc -l ../log/log/$1.log mv ../testbench/testbench.bak ../testbench/testbench.v rm -f testcase ~

而下图则是一个采用TCL语言描述的Design Complier综合脚本的开头部分。

sh date remove_design -designs ########################## #set library # ########################## set search_path [list /tools/lib/smic25/feview_s/version1/STD/Synopsys \ /tools/lib/smic25/feview_s/version1/STD/Symbol/synopsys] set target_library { smic25_tt.db } set link_library { smic25_tt.db } set symbol_library { smic25.sdb } ########################## #Paths variables # ########################## set main_dir ../.. set RTL_ROOT_PATH $main_dir/hdl set NETLIST_PATH $main_dir/sim/syn/netlist set RPT_PATH $main_dir/sim/syn/log set DB_PATH $main_dir/sim/syn/db set SDF_PATH $main_dir/sim/syn/sdf ########################## #void warning Info # ########################## suppress_message VER-130 suppress_message VER-129 suppress_message VER-318 suppress_message ELAB-311 suppress_message VER-936 ################################ #read&link&Check design# ################################

2、做芯片的仿真最后都不看波形

在做芯片仿真时,无论是采用自己搭建的简单仿真环境还是UVM的仿真环境,最后的形式常常是把所有的testcase都集中到仿真环境中,只需敲一个命令,回车,所有的testcase就能够全部运行下去。而仿真过程的错误,也都被记录到log文件中,无论是运行的对与错,都可以在log文件中看到。如下图就是所有的testcase截图,每个case运行的结果也会保存到另外一个log目录下。

而FPGA开发人员,则不会去建立如此完善的仿真环境,往往是简单的搭建一个某种功能模式下的仿真环境仿一下过了,就上板了。

采用ModelSim单独仿真

1、整理RTL代码及仿真代码

如果要用ModelSim单独仿真,并且需要搭建类似于上面描述的采用脚本形式来仿真的仿真环境,那么第一步就需要从Vivado工程中把相应的Verilog代码整理出来。

Vivado跟Quartus在仿真时采用的思路是不一样的,对于Quartus而言,你可以很容易就能脱离开Quartus单独搭建一个ModelSim或者VCS的仿真环境,因为Quartus所有的IP核或者原语库之类的内容全部都是以verilog或者VHDL文件存储的,建仿真环境时,只需要到Quartus的安装路径下找一个叫EDA的目录下找sim_lib的子目录下找相应的.v文件添加到仿真工程里就可以了,常见的库文件主要有三个,220model.v,altera_mf.v和cyclone_atoms.v(或者是别的FPGA型号)。见本公众号之前的文章有详细描述:用Quartus II和ModelSim做后仿真(时序仿真)。

在Vivado中也有类似于Quartus中的库文件,在Vivado工程目录下,如下图所示。

然后,整体拷贝ip文件夹到自己想搭建的modesim仿真环境目录下:

上图中rtl文件夹就是自己原来的设计文件,tb则是一些仿真用的.v文件。

2、编写脚本sim.do文件

一个比较简单的modelsim脚本文件如下。

vlib work vlog -f ./rtl.f vsim -novopt work.tb_crossbar_top do wave.do run 10us

上面的脚本的具体含义,大家都可以百度搜索找到。需要说明的是所有工程中的文件的路径是需要写到一个rtl.f的文件夹下的,具体源代码可以参考本公众号之前的文章:如何快速生成Verilog代码文件列表?(内附开源C代码),需要注意的是,生成的文件路径地址中的斜杠与modelsim脚本中要求的斜杠刚好相反,可以直接采用文本编辑器替换掉,也可以添加以下子函数到C代码中简单修改一下。

void xiegang(char* s) { int i,j,k; char buf[800]=" "; char buf1[800]=" "; memset(buf,0,800); memset(buf1,0,800); strcpy(buf,s); strcpy(buf1,s); for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3