创建基本时钟周期约束。(验证我们的设计能否在期望的频率上运行)
(学习记录,晚一点会做实验传上来的。)
时钟基本概念:https://blog.csdn.net/wordwarwordwar/article/details/78259208
时序约束的基本概念:https://blog.csdn.net/zz_Caleb/article/details/84453792
- 约束是如何构成的
- 时序约束
- 物理约束
- 当前的约束是用在哪个过程中
- 通常情况下,时序约束是在综合和实现的时候都会用到,物理约束一般是在实现的时候会被用到。
- 或
- 如果我们有多个约束文件,我们一定需要一个target文件,用于保存最新额约束。方法是左键选择
- 时钟描述
- 基本要素
- 时钟周期
- Period=10
- 占空比
- Waveform={0,5} //0指上升沿,5指下降沿,单位是ns不用谢
- 相位
- 时钟周期
- 主时钟(primary clock)这是我们首先要确定的。
- 实际上指的是板子上的晶振。
- (sysclk是package pin上的管脚)
- 对于GTH Transceivers :http://www.bubuko.com/infodetail-2087865.html
- 基本要素
- 生成时钟(Generated clock)
- 用户自定义的生成时钟
- 通过进行定义。
- 通常用户定义的时钟,是通过RTL代码描述的时钟。
- 举例如下:
- 二分频时钟源
- 先要定义primary clock source point
- 再确定生成时钟的位置(蓝色)
- –source:用get_ports指定
- –name:生成时钟的名字
- –divide_by 2:生成时钟的位置
- 第二种方式是我们使用get_pin
- –source:rega的时钟端口
- 第三种方式
- 编号从1开始,clkin的第一个上升沿对准clkdiv2的第一个边沿。Clkdiv2的下降沿对应clkin的第三个边沿。clkdiv2的第二个上升沿对应clkin的第五个沿。
- 自动推断出来的时钟(我们不需要进行约束,只需要对primary time进行约束即可)
- 我们着重注意-source属性
- 典型应用:时钟进来以后通过MMCM或者PLL生成不同的时钟。通常我们会调用MMCM的这个Ip包。
- 生成时钟的名字,就是与clkout连接的net上的名字(cpiclk)。
- 当我们使用Clocking wizard ip核的时候,我们可以对port 进行rename。
- ?:https://blog.csdn.net/u011327754/article/details/79780999
- 用户自定义的生成时钟
- Report_clocks命令
- Propagated:表面时钟的特性,波形抖动,会往后传播。
- Generated:生成时钟。
- 时钟分组(clock Group)
- 时钟分类(通常vivado认为时钟都是相关的,所以如果我们实际项目中有时钟来自于两个不同的晶振,我们需要时钟约束告诉fpga时钟是不相关的。)
- 同步时钟
- 使用creat_clock进行时钟约束。
- 异步时钟
- 我们要告诉这两个源时钟源是没有关系的。
- Unexpandable clocks
- 因为launch edge和capture edge的时钟不同步,所以在我们做setup分析的时候,建立于两的值会有两个。(如图红色虚线)他最终会使用较短的时间作为建立时的requerament(及最小公倍数)。
- 但是如果这个最小公倍数不存在或者很难找到(比如clk0=5.125ns clk1=6.666ns)那么 Path requirement between two clocks are not reasonable。
- 需要通过方法进行约束
- Exclusive clock group
- 因为多路选择器的存在,Clk0和clk1不可能同时工作。
- 同步时钟
- 时钟分类(通常vivado认为时钟都是相关的,所以如果我们实际项目中有时钟来自于两个不同的晶振,我们需要时钟约束告诉fpga时钟是不相关的。)
- 特性
- 所有的时钟都是默认相关的
- 对于异步时钟我们可以通过set_clock_group创建时钟组,但是我们需要很好的设计保证可靠性。
- 约束时钟频率
- 如果我们的设计是差分时钟,我们只用去约束p端口对应的时钟即可。