在vivado安装教程程序中怎么找到几个名字一样的名称

本文将给出通过Vivado IDE开发Zynq平台上PS裸机应用程序的流程。通过与本系列博客(三)对比,读者将看到Vivado开发更高效、快捷。
MP3我们都听过,现在我们可以用ZED-Board来听。
本文将给出通过Vivado IDE开发Zynq平台上PS裸机应用程序的流程。通过与本系列博客(三)对比,读者将看到Vivado开发更高效、快捷。
MP3我们都听过,现在我们可以用ZED-Board来听。板子上有音频芯片ADAU1761,可以实现录音、放音,但不具有MP3解码功能。Zynq 双核ARM9做MP3软件解码应该是可以实现的,但是博主本人有一颗VS1003,可以实现MP3硬件解码,软件将得以简化,对MP3解码原理感兴趣的可以深入研究如何利用CortexA9+ADAU1761实现MP3播放。电路图如下:
利用Zynq MIO实现VS1003控制,这样只和PS有关,PL完全可以丢弃。在本节基础上,读者可以尝试将SPI模块移到PL上实现,这样可以降低PS部分IO读写频率,提高CPU利用率。实物连接图如下:
Zynq板子外接用排母,为了使用杜邦线,需要一个双公排针,可以用普通单排2.54mm排针压制而成
下面介绍软件开发流程。建立Vivado工程,命名为MP3Player,过程遵循上节Vivado建立工程步骤,略。
进入IDE后,点击左侧流程管理器中的IPI Integrator下的Create Block Design。 这个工具是2013.1版本后才出现的,将取代XPS完成系统集成。
在编辑区右键,选择Add IP...,名称保持默认design_1.bd
搜索框中输入zynq,双击第一个,添加IP到电路图中。
添加完成后,自动进行布线连接,点下图中圆圈区域 Run Block Automation。
等待完成,结果如下图所示。
可以看到,DDR和固定IO自动进行了连接。这是因为我们建立工程时选择了ZedBoard DVK,这样就能按照板子描述自动连接引脚到相应外设。
另外看到,默认状态下使能了M_AXI_GP0,可以将PL部分带AXI从接口的IP连接到PS进行控制。本节不需要,所以必须禁用,否则验证设计时会报错。双击方块,见下图
看到了熟悉又陌生的画面,有些像XPS中Zynq视图,但精简了很多。单击左侧“PS-PL Configuration",界面如下:
将AXI GP0接口后的勾取消选择,确认,回到IPI。
验证设计,在空白处右键,点击Validate Design。无误,点确认即可。
在上图位置点Generate Block Design,确认。
在Sources窗口中找到design_1,右键选择生成顶层HDL包装。确认。
直接点左侧流程中的Generate Bitstream,一步到位。完成比特流大约需要5~8min。
完成后,先Open Implementated Design,再导出到SDK。
完成后,先Open Implementated Design,再导出到SDK。如果没有做这一步,上图中第二项会变成灰色。
后面就是SDK开发了,和本系列教程(三)中相同。建立Application工程,C工程,模板helloworld。将代码改为下面:
#include &stdio.h&
#include "platform.h"
#define MIO_BASE 0xE000A000
#define DATA0 0x40
#define DATA0_RO
#define DIRM_0 0x204
#define OEN_0 0x208
void delay(unsigned int t)
unsigned int i,j;
for(j=0;j&t;j++)
for(i=0;i&600;i++);
/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function
/*---------------------------------------------------------------------------------------------------------*/
#define VS_XRESET_0
DrvGPIO_ClrBit(MIO_BASE + DATA0,12)
#define VS_XRESET_1
DrvGPIO_SetBit(MIO_BASE + DATA0,12)
#define VS_DREQ
DrvGPIO_GetBit(MIO_BASE + DATA0_RO,11)
#define VS_XDCS_0 DrvGPIO_ClrBit(MIO_BASE + DATA0,10)
#define VS_XDCS_1 DrvGPIO_SetBit(MIO_BASE + DATA0,10)
#define VS_XCS_0 DrvGPIO_ClrBit(MIO_BASE + DATA0,13)
#define VS_XCS_1 DrvGPIO_SetBit(MIO_BASE + DATA0,13)
#define SPI_MOSI_0 DrvGPIO_ClrBit(MIO_BASE + DATA0,0)
#define SPI_MOSI_1 DrvGPIO_SetBit(MIO_BASE + DATA0,0)
#define SPI_SCL_0 DrvGPIO_ClrBit(MIO_BASE + DATA0,9)
#define SPI_SCL_1 DrvGPIO_SetBit(MIO_BASE + DATA0,9)
void DrvGPIO_ClrBit(volatile unsigned int * p,int idx);
void DrvGPIO_SetBit(volatile unsigned int * p,int idx);
unsigned char DrvGPIO_GetBit(volatile unsigned int * p,int idx);
void init_vs1003(void);
void VS_Reset(void); //VS1003软复位及初始化
void VS_Write_Reg(unsigned char addr,unsigned char hdat,unsigned char ldat); //向VS1003的功能寄存器写入一个字
unsigned int VS_Read_Reg(unsigned char addr); //从VS1003的功能寄存器读取一个字
void VS_Send_Dat(unsigned char dat); //向VS1003发送音频数据
void VS_Flush_Buffer(void); //清空VS1003的数据缓冲区
void VS_sin_test(unsigned char x); //正弦测试
void LoadPatch(void); //为VS1003打补丁
void SPI_WriteByte(unsigned char x);
#include "mp3.h"
void print(char *str);
int main()
init_platform();
print("Hello World\n\r");
init_vs1003();
VS_Reset(); //VS1003复位初始化
VS_sin_test(200); //正弦测试,可以听到一声滴
VS_Flush_Buffer();
for(i = 0;i&sizeof(mp3_table);i++)
VS_Send_Dat(mp3_table[i]);
DrvGPIO_ClrBit(MIO_BASE + DATA0,7);
delay(40000);
DrvGPIO_SetBit(MIO_BASE + DATA0,7);
delay(40000);
void DrvGPIO_ClrBit(volatile unsigned int * p,int idx)
(*p) &= ~(1&&idx);
void DrvGPIO_SetBit(volatile unsigned int * p,int idx)
(*p) |= (1&&idx);
unsigned char DrvGPIO_GetBit(volatile unsigned int * p,int idx)
return (((*p)&(1&&idx))&&idx);
void init_vs1003(void)
DrvGPIO_SetBit(MIO_BASE + OEN_0,7);
DrvGPIO_SetBit(MIO_BASE + DIRM_0,7);
DrvGPIO_SetBit(MIO_BASE + OEN_0,0);
DrvGPIO_SetBit(MIO_BASE + DIRM_0,0);
DrvGPIO_SetBit(MIO_BASE + OEN_0,9);
DrvGPIO_SetBit(MIO_BASE + DIRM_0,9);
DrvGPIO_SetBit(MIO_BASE + OEN_0,10);
DrvGPIO_SetBit(MIO_BASE + DIRM_0,10);
DrvGPIO_SetBit(MIO_BASE + OEN_0,12);
DrvGPIO_SetBit(MIO_BASE + DIRM_0,12);
DrvGPIO_SetBit(MIO_BASE + OEN_0,13);
DrvGPIO_SetBit(MIO_BASE + DIRM_0,13);
void SPI_WriteByte(unsigned char x)
unsigned char i=0;
for(i=0;i&8;i++)
if(x&0x80)
SPI_MOSI_1;
SPI_MOSI_0;
SPI_SCL_0;
SPI_SCL_1;
/******************************************************************
- 功能描述:向VS1003的功能寄存器中写入数据(一个字,即两个字节)
- 隶属模块:VS1003B模块
- 函数属性:外部,用户可调用
- 参数说明:addr是功能寄存器的地址
hdat是要写入的高字节
ldat是要写入的低字节
- 返回说明:无返回
******************************************************************/
void VS_Write_Reg(unsigned char addr,unsigned char hdat,unsigned char ldat)
while(!VS_DREQ);
//VS1003的DREQ为高电平时才接收数据
//打开片选,SCI有效,这样才能对功能寄存器进行读写
SPI_WriteByte(0x02);
//写入操作码0x02
(功能寄存器写操作)
SPI_WriteByte(addr);
//写入寄存器地址
SPI_WriteByte(hdat);
//写入高字节
SPI_WriteByte(ldat);
//写入低字节
//关闭片选,SCI无效
/******************************************************************
- 功能描述:VS1003软复位及初始化(设置时钟频率及音量)
- 隶属模块:VS1003B模块
- 函数属性:外部,用户可调用
- 参数说明:无
- 返回说明:无
******************************************************************/
void VS_Reset(void)
VS_XRESET_1;
delay(100);
VS_XRESET_0;
delay(100);
VS_XRESET_1; //硬件复位,XRESET低电平有效
delay(100);
VS_Write_Reg(0x00,0x08,0x04);//软件复位,向0号寄存器写入0x0804
SM_SDINEW为1
SM_RESET为1
VS_Write_Reg(0x03,0x98,0x00);//时钟设置,向3号寄存器写入0x9800
SC_FREQ为0
VS_Write_Reg(0x0b,0x00,0x00);//音量设置,左右声道均最大音量
VS_XDCS_0;
//打开数据片选,注意此时XCS(片选)为高电平,SDI有效
SPI_WriteByte(0);
//写入数据,这里写入4个0,是无关数据,用来启动数据传输
SPI_WriteByte(0);
SPI_WriteByte(0);
SPI_WriteByte(0);
VS_XDCS_1;
//关闭数据片选,SDI无效
/******************************************************************
- 功能描述:向VS1003写入一个字节的音频数据(即用于播放的数据)
注:调用前先将VS_XDCS置为0,打开数据片选
- 隶属模块:VS1003B模块
- 函数属性:外部,用户可调用
- 参数说明:dat是要写入的字节
- 返回说明:无
******************************************************************/
void VS_Send_Dat(unsigned char dat)
VS_XDCS_0;
//打开SDI,此时可以向VS1003写入音频数据
while(!VS_DREQ);
//VS1003的DREQ为高才能写入数据
SPI_WriteByte(dat);//通过SPI向VS1003写入一个字节的音频数据
VS_XDCS_1;
/******************************************************************
- 功能描述:向VS1003写入2048个0,用于清空VS1003的数据缓冲区
注:在播放完一个完整的音频(如一首完整的MP3)后,调用
此函数,清空VS1003数据缓冲区,为下面的音频数据(如下
一首MP3)作准备。
- 隶属模块:VS1003B模块
- 函数属性:外部,用户可调用
- 参数说明:无
- 返回说明:无
******************************************************************/
void VS_Flush_Buffer(void)
VS_XDCS_0;
//打开数据片选,即开启SDI传输
for(i=0;i&2048;i++)
VS_Send_Dat(0);
VS_XDCS_1;
//关闭数据片选
/******************************************************************
- 功能描述:正弦测试,这是测试VS1003芯片是否正常的有效手段!!
- 隶属模块:VS1003B模块
- 函数属性:外部,用户可调用
- 参数说明:x决定了正弦测试中产生的正弦波的频率,直接影响听到的
声音的频率
- 返回说明:无
******************************************************************/
void VS_sin_test(unsigned char x)
VS_Write_Reg(0x00,0x08,0x20);//启动测试,向0号寄存器写入0x0820
SM_SDINEW为1
SM_TEST为1
while(!VS_DREQ);
//等待DREQ变为高电平
VS_XDCS_0;
//打开数据片选 SDI有效
SPI_WriteByte(0x53);//写入以下8个字节,进入正弦测试
SPI_WriteByte(0xef);
SPI_WriteByte(0x6e);
SPI_WriteByte(x);
//参数x用来调整正弦测试中正弦波的频率
FsIdx (b7~b5):采样率表索引
S (b4~b0):正弦波的跃速
频率F=Fs X S / 128
SPI_WriteByte(0);
//比如x=126 (0b 011 11110) FsIdx=011=3
Fs=22050Hz
S=11110=30
F=22050Hz X 30 /128 =5168 Hz
SPI_WriteByte(0);
SPI_WriteByte(0);
SPI_WriteByte(0);
delay(6000);
//这里延时一段时间,为了听到“正弦音”
SPI_WriteByte(0x45);//写入以下8个字节,退出正弦测试
SPI_WriteByte(0x78);
SPI_WriteByte(0x69);
SPI_WriteByte(0x74);
SPI_WriteByte(0);
SPI_WriteByte(0);
SPI_WriteByte(0);
SPI_WriteByte(0);
VS_XDCS_1;
//关闭数据片选 ,SDI无效
音频文件需要转换为C头文件,可以用matlab实现:
f = fopen('222.mp3','rb');
a = fread(f,'uint8');
fclose(f);
fb = fopen('D:\Tutor_My\MP3Player\MP3Player.sdk\SDK\SDK_Export\mp3\src\mp3.h','w');
fprintf(fb,'const unsigned char mp3_table[] = {\r\n');
fprintf(fb,'0x%02x,\r\n',a(1:end));
fprintf(fb,'\r\n};');
fclose(fb);
下载比特流,运行。通过耳机可以听到你转换的mp3。
完成上述工程,只需要10min,操作完全由Vivado+SDK完成,操作十分简单集中。
用云栖社区APP,舒服~
【云栖快讯】快速解决数据库难题,云数据库经典案例及最佳实践直播专场!阿里云数据库专家团队成员倾囊相授!赶紧报名。&&
云上企业级一站式智能研发协同平台,为企业用户提供从需求、编码到测试、发布、反馈等端到端的持续交付服务。
通过在客户自己的数据中心内交付完整的阿里云软件堆栈,阿里云专有云帮助政企客户向混合云架构平滑演进,实现从IT时代...
为金融行业提供量身定制的云计算服务,具备低成本、高弹性、高可用、安全合规的特性。帮助金融客户实现从传统IT向云计...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017云栖大会·上海峰会火热报名中
Loading...UPGRADE YOUR BROWSER
We have detected your current browser version is not the latest one.
uses the latest web technologies to bring you the best online experience possible. Please upgrade to
supported browser:,
. Thank you!
分享此页面
Xilinx 新用户?
一经登录,表示您同意 Xilinx
AR# 6 版安装 - Vivado 2014.x 版安装程序的已知问题。
2014 版安装 - Vivado 2014.x 版安装程序的已知问题。
Description
该答复记录列出了 Vivado 2014.x 各版本中安装程序的已知问题。
每个已知问题都包含一个答案记录链接,答案记录中含有关于该问题的附加信息。
Vivado 2014.1 版的安装变化
Vivado 设计套件 2014.1 版采用全新基于 Web 、具有更丰富特性的安装程序。
尤其是该安装程序能够先部分地安装可用工具和器件,然后根据需要添加其它器件或工具。
如欲查看 Vivado 2014.1 安装及版本说明指南,敬请访问:
敬请参见: 了解 2014年安装解决方案中心。
敬请参见:了解 Vivado 2014 安装程序的故障排除信息。
Vivado 2014.4版中未解决的问题
- 在 Ubuntu 13 OS (不支持)上Web 安装失败
- 登录认证失败,并提示&警告:无法验证用户私人证书&
- 在 64 位系统(不支持)上安装 32 位安装程序时崩溃
- rdi_xsdkw.exe 被 Symantec 和AVG 病毒扫描工具误判为病毒/恶意软件
- Vivado 2014.x 版没有提供完整的产品化批处理安装选项
& Vivado 安装程序在取消安装后未能清除所有文件
& 下载文件错误:如果从写保护区域安装,不能写入到 .../payload
- 如果在 Ubuntu 上使用 sudo 以正常用户身份安装,Vivado 无法运行。
- 在 Ubuntu 上以根目录形式运行安装,会出现:&错误:安装程序不能启动。 无法初始化 sun.awt.X11GraphicsEnvironment 类别。
- 在创建项目时 Vivado 无法写入到 Ubuntu Linux 14.04 LTS(64位)机器上的 .Xilinx 目录
Vivado 2014.4版中已解决的问题
- 当 %USERPROFILE% 包含空白字符时,Windows 上的 Vivado 安装立即失败
Vivado 2014.3 版中已解决的问题
-&添加设计工具或器件&无法让我只添加安装后选项
- 如果安装路径中包含惊叹号,xsetup 会打开启动画面然后在不报错的情况下退出&
- 如果用户 ID 名称中包含空格,安装失败
- 在 Windows XP 上的控制面板卸载时,显示 Vivado、DocNav和 XiC&的文件大小相同。
Vivado 2014.2版中已解决的问题
&
- 系统路径中的无效字符导致安装程序无法运行并提示信息&加载本地 lib时出错&。
- XILINX_VIVADO 和LD_LIBRARY_PATH 环境变量未在设置文件 64.bat/sh 中设置。
-&如果先正确选择&从本地存档安装&,然后选择&下载安装&,下载会立即失败
- 实现 Artix 设计时会提示警告 [Board 49-26] 无法使用 WebPack 安装程序添加板部件 :kc705:part0
- 如果文档浏览器(DocNav)打开但不能自动关闭,Vivado 2014.x 版软件会中断
本答复记录是否对您有帮助?
03/13/2015
Vivado Design Suite - 2014.1
Vivado Design Suite - 2014.2【Vivado使用误区与进阶】XDC约束技巧之时钟篇
【Vivado使用误区与进阶】XDC约束技巧之时钟篇
发布: | 作者: | 来源:
| 查看:471次 | 用户关注:
Xilinx 的新一代设计套件Vivado中引入了全新的约束文件XDC,在很多规则和技巧上都跟上一代产品ISE中支持的UCF大不相同,给使用者带来许多额外挑战。Xilinx工具专家告诉你,其实用好XDC很容易,只需掌握几点核心技巧,并且时刻牢记:XDC的语法其实就是Tcl语言。XDC的优势XDC是Xilinx Design Constraints的简写,但其基础语法来源于业界统一的约束
Xilinx 的新一代设计套件Vivado中引入了全新的约束文件XDC,在很多规则和技巧上都跟上一代产品ISE中支持的UCF大不相同,给使用者带来许多额外挑战。Xilinx工具专家告诉你,其实用好XDC很容易,只需掌握几点核心技巧,并且时刻牢记:XDC的语法其实就是Tcl语言。XDC的优势XDC是Xilinx Design Constraints的简写,但其基础语法来源于业界统一的约束规范SDC(最早由Synopsys公司提出,故名Synopsys Design Constraints)。所以SDC、XDC跟Vivado Tcl的关系如下图所示。XDC的主要优势包括:● 统一了前后端约束格式,便于管理; & & & & & & & & & & & & & ● 可以像命令一样实时录入并执行; ● 允许增量设置约束,加速调试效率; ● 覆盖率高,可扩展性好,效率高; ● 业界统一,兼容性好,可移植性强;XDC在本质上就是Tcl语言,但其仅支持基本的Tcl语法如变量、列表和运算符等等,对其它复杂的循环以及文件I/O等语法可以通过在Vivado中source一个Tcl文件的方式来补充。(对Tcl话题感兴趣的读者可以参考作者的另一篇文章《Tcl在Vivado中的应用》)XDC与UCF的最主要区别有两点:1. XDC可以像UCF一样作为一个整体文件被工具读入,也可以在实现过程中被当作一个个单独的命令直接执行。这就决定了XDC也具有Tcl命令的特点,即后面输入的约束在有冲突的情况下会覆盖之前输入的约束(时序例外的优先级会在下节详述)。另外,不同于UCF是全部读入再处理的方式,在XDC中,约束是读一条执行一条,所以先后顺序很重要,例如要设置IO约束之前,相对应的clock一定要先创建好。2. UCF是完全以FPGA的视角看问题,所以缺省认为所有的时钟之间除非预先声明是同步的,否则就视作异步而不做跨时钟域时序分析;XDC则恰恰相反,ASIC世界的血缘背景决定了在其中,所有的时钟缺省视作全同步,在没有时序例外的情况下,工具会主动分析每一条跨时钟域的路径。XDC的基本语法XDC的基本语法可以分为时钟约束、I/O约束以及时序例外约束三大类。根据Xilinx的UltraFast设计方法学中Baseline部分的建议(UG949中有详细介绍),对一个设计进行约束的先后顺序也可以依照这三类约束依次进行。本文对可以在帮助文档中查到的基本XDC语法不做详细解释,会将重点放在使用方法和技巧上。时钟约束时钟约束必须最早创建,对7系列FPGA来说,端口进来的主时钟以及GT的输出RXCLK/TXCLK都必须由用户使用create_clock自主创建。如果是差分输入的时钟,可以仅仅在差分对的P侧用get_ports获取端口,并使用create_clock创建。例如,Vivado自动推导的衍生时钟MMCM/PLL/BUFR的输出作为衍生时钟,可以由Vivado自动推导,无需用户创建。自动推导的好处在于当MMCM/PLL/BUFR的配置改变而影响到输出时钟的频率和相位时,用户无需改写约束,Vivado仍然可以自动推导出正确的频率/相位信息。劣势在于,用户并不清楚自动推导出的衍生钟的名字,当设计层次改变时,衍生钟的名字也有可能改变。这样就会带来一个问题:用户需要使用这些衍生钟的名字来创建I/O约束、时钟关系或是时序例外等约束时,要么不知道时钟名字,要么时钟名字是错的。推荐的做法是,由用户来指定这类衍生时钟的名字,其余频率等都由Vivado 自动推导。这样就只需写明create_generated_clock 的三个option,其余不写即可。如下所示。当然,此类情况下用户也可以选择完全由自己定义衍生时钟,只需补上其余表示频率/相位关系的option,包括-multiply_by 、-devide_by 等等。需要注意的是,一旦Vivado在MMCM/PLL/BUFR 的输出检测到用户自定义的衍生时钟,就会报告一个Warning,提醒用户这个约束会覆盖工具自动推导出的衍生时钟(例外的情况见文章下半段重叠时钟部分的描述),用户须保证自己创建的衍生钟的频率等属性正确。用户自定义的衍生时钟工具不能自动推导出衍生钟的情况,包括使用寄存器和组合逻辑搭建的分频器等,必须由用户使用create_generated_clock 来创建。举例如下,I/O约束在设计的初级阶段,可以不加I/O约束,让工具专注于满足FPGA内部的时序要求。当时序要求基本满足后,再加上I/O约束跑实现。XDC中的I/O约束有以下几点需要注意:1. 不加任何I/O约束的端口时序要求被视作无穷大。2. XDC中的set_input_delay / set_output_delay对应于UCF中OFFSET IN / OFFSET OUT,但视角相反。OFFSET IN / OFFSET OUT是从FPGA内部延时的角度来约束端口时序,set_input_delay / set_output_delay则是从系统角度来约束。3. 典型的I/O时序,包括系统同步、源同步、SDR和DDR等等,在Vivado图形界面的XDC templates中都有示例。2014.1版后还有一个Timing Constraints Wizard可供使用。时序例外约束时序例外约束包括set_max_delay/set_min_delay,set_multicycle_path,set_false_path等,这类约束除了要满足XDC的先后顺序优先级外,还受到自身优先级的限制。一个总的原则就是针对同一条路径,对约束目标描述越具体的优先级越高。不同的时序例外约束以及同一约束中不同条件的优先级如下所示:举例来说,依次执行如下两条XDC,尽管第二条最后执行,但工具仍然认定第一条约束设定的15为clk1到clk2之间路径的max delay值。再比如,对图示路径依次进行如下四条时序例外约束,优胜者将是第二条。但如果再加入最后一条约束,false path的优先级最高,会取代之前所有的时序例外约束。高级时钟约束约束最终是为了设计服务,所以要用好XDC就需要深入理解电路结构和设计需求。接下来我们就以常见FPGA设计中的时钟结构来举例,详细阐述XDC的约束技巧。时序的零起点用create_clock定义的主时钟的起点即时序的&零起点&,在这之前的上游路径延时都被工具自动忽略。所以主时钟创建在哪个&点&很重要,以下图所示结构来举例,分别于FPGA输入端口和BUFG输出端口创建一个主时钟,在时序报告中体现出的路径延时完全不同,很明显sysclk_bad的报告中缺少了之前一段的延时,时序报告不可信。时钟定义的先后顺序时钟的定义也遵从XDC/Tcl的一般优先级,即:在同一个点上,由用户定义的时钟会覆盖工具自动推导的时钟,且后定义的时钟会覆盖先定义的时钟。若要二者并存,必须使用 -add 选项。上述例子中BUFG的输出端由用户自定义了一个衍生钟clkbufg,这个衍生钟便会覆盖此处原有的sysclk。此外,图示BUFR工作在bypass模式,其输出不会自动创建衍生钟,但在BUFR的输出端定义一个衍生钟clkbufr,并使用-add 和 -master_clock 选项后,这一点上会存在sysclk和clkbufg两个重叠的时钟。如下的Tcl命令验证了我们的推论。同步时钟和异步时钟不同于UCF约束,在XDC中,所有的时钟都会被缺省认为是相关的,也就是说,网表中所有存在的时序路径都会被Vivado分析。这也意味着FPGA设计人员必须通过约束告诉工具,哪些路径是无需分析的,哪些时钟域之间是异步的。如上图所示,两个主时钟ssclkin和sysclk由不同的端口进入FPGA,再经由不同的时钟网络传递,要将它们设成异步时钟,可以使用如下约束:其中,-include_generated_clocks 表示所有衍生钟自动跟其主时钟一组,从而与其它组的时钟之间为异步关系。不加这个选项则仅仅将时钟关系的约束应用在主时钟层面。重叠(单点多个)时钟重叠时钟是指多个时钟共享完全相同的时钟传输网络,例如两个时钟经过一个MUX选择后输出的时钟,在有多种运行模式的设计中很常见。如下图所示,clk125和clk250是clkcore_buf的两个输入时钟,不约束时钟关系的情况下,Vivado会对图示路径做跨时钟域(重叠时钟之间)分析。这样的时序报告即便没有违例,也是不可信的,因为clk125和clk250不可能同时驱动这条路径上的时序元件。这么做也会增加运行时间,并影响最终的实现效果。如果clk125和clk250除了通过clkcore_buf后一模一样的扇出外没有驱动其它时序元件,我们要做的仅仅是补齐时钟关系的约束。在很多情况下,除了共同的扇出,其中一个时钟或两个都还驱动其它的时序元件,此时建议的做法是在clkcore_buf的输出端上创建两个重叠的衍生钟,并将其时钟关系约束为-physically_exclusive 表示不可能同时通过。这样做可以最大化约束覆盖率,也是ISE和UCF中无法做到的。其它高级约束时钟的约束是XDC的基础,熟练掌握时钟约束,也是XDC约束技巧的基础。其它高级约束技巧,包括复杂的CDC(Clock Domain Crossing)约束和接口时序(SDR、DDR、系统同步接口和源同步接口)约束等方面还有很多值得注意的地方。这一系列《XDC约束技巧》文章还会继续就上述所列方向分篇详述,敬请关注作者的后续更新,以及Xilinx 官方网站和中文论坛上的更多技术文章。Ally Zhou
于Xilinx上海Office
本页面信息由华强电子网用户提供,如果涉嫌侵权,请与我们客服联系,我们核实后将及时处理。
应用与方案分类
&&& 目前,处理器性能的主要衡量指标是时钟你的位置:
&& 详细内容
【Vivado使用误区与进阶】Tcl在Vivado中的应用
热度126票&&浏览2274次
时间:日 20:36
&Xilinx的新一代设计套件Vivado相比上一代产品ISE,在运行速度、算法优化和功能整合等很多方面都有了显著地改进。但是对初学者来说,新的约束语言XDC以及脚本语言Tcl的引入则成为了快速掌握Vivado使用技巧的最大障碍,以至于两年多后的今天,仍有很多用户缺乏升级到Vivado的信心。&& & & &&本文介绍了Tcl在Vivado中的基础应用,希望起到抛砖引玉的作用,指引使用者在短时间内快速掌握相关技巧,更好地发挥Vivado在FPGA设计中的优势。Tcl的背景介绍和基础语法&& & & &&Tcl(读作tickle)诞生于80年代的加州大学伯克利分校,作为一种简单高效可移植性好的脚本语言,目前已经广泛应用在几乎所有的EDA工具中。Tcl 的最大特点就是其语法格式极其简单甚至可以说僵化,采用纯粹的 [命令 选项 参数] 形式,是名副其实的“工具命令语言”( 即Tcl的全称Tool Command Language)。&& & & &&实际上Tcl的功能可以很强大,用其编写的程序也可以很复杂,但要在Vivado或大部分其它EDA工具中使用,则只需掌握其中最基本的几个部分。&& & & &&注: 在以下示例中,% 表示Tcl的命令提示符,执行回车后,Tcl会在下一行输出命令执行结果。 // 后是作者所加注释,并不是例子的一部分。&设置变量&&打印&&& & & &&打印主要通过puts语句来执行,配合特殊符号,直接决定最终输出内容。文件I/O&&& & & &&可以看到Tcl对文件的操作也是通过设置变量,改变属性以及打印命令来进行的。上述写文件的例子中通过puts命令在my_file.txt文件中写入两行文字,分别为“Hello World!” 和myVar变量的值,然后在读文件操作中读取同一文件的内容。控制流和循环命令&& & & &&Tcl语言中用于控制流程和循环的命令与C语言及其它高级语言中相似,包括if、while、for和foreach等等。& & & &&& & & &&具体使用可以参考如下示例:&&子程序/过程&& & & &&Tcl中的子程序也叫做过程(Procedures),Tcl正是通过创建新的过程来增强其内建命令的能力,提供更强的扩展性。具体到Vivado的使用中,用户经常可以通过对一个个子程序/过程的创建来扩展或个性化Vivado的使用流程。&&&&一些特殊符号&&& & & &&& & & &&Tcl语言的基本语法相对简单,但要熟练掌握仍需日常不断练习。Xilinx网站上有很多相关资料,这里推荐两个跟Tcl相关的文档 UG835 和 UG894 ,希望对大家学习Vivado和Tcl有所帮助。&&在Vivado中使用Tcl定位目标&& & & &&在Vivado中使用Tcl最基本的场景就是对网表上的目标进行遍历、查找和定位,这也是对网表上的目标进行约束的基础。要掌握这些则首先需要理解Vivado对目标的分类。&目标的定义和定位&& & & &&如上图所示,设计顶层的I/O称作ports,其余底层模块或是门级网表上的元件端口都称作pins。而包括顶层在内的各级模块,blackbox以及门级元件,都称作cells。连线称作nets,加上XDC中定义的clocks,在Vivado中一共将网表文件中的目标定义为五类。要选取这五类目标,则需用相应的get_*命令,例如get_pins等等。&get_ports&& & & &&ports仅指顶层端口,所以get_ports的使用相对简单,可以配合通配符“* ”以及Tcl语言中处理list的命令一起使用。如下所示,& &get_cells/get_nets& & & &&& & & &&不同于ports仅指顶层端口,要定位cells和nets则相对复杂,首先需要面对层次的问题。这里有个大背景需要明确:Vivado中Tcl/XDC对网表中目标的搜索是层次化的,也就是一次仅搜索一个指定的层次current_instance,缺省值为顶层。&& & & &&以下图所示设计来举例,若要搜索A(不含a1,a2)层次内的所有cells和名字中含有nt的nets, 有两种方法:&& && &&&
对本篇资讯内容的质量打分:
当前平均分:-0.22 (65次打分)
【已经有61人表态】
[感动最多的]
[路过最多的]
[高兴最多的]
[难过最多的]
[搞笑最多的]
[愤怒最多的]
[无聊最多的]
[同情最多的]

我要回帖

更多关于 vivado fpga烧录程序 的文章

 

随机推荐