Xilinx FPGA时序约束简单实例

问题阐述

源自通信算法的一个工程,存在两种频率,基带算法频率和中频频率,记为clk_1和clk_2,分别为2kHz与100kHz,对于FPGA为低频时钟。以接收端为例,接收端接收到频率为clk_1的中频信号后需经过变频等操作,变换到基带的clk_2,因此涉及到多bit信号快时钟域到慢时钟域的处理问题,相反的发射端是慢时钟域到快时钟域的问题。这里以接收端为例说明时序约束的方法。

1. 时钟分析

使用的FPGA为ZYNQ7020,时钟为50MHz,由PS端产生,如图所示。
在这里插入图片描述
由于clk_1和clk_2频率过低,MMCM和PLL无法生成,因此采用计数器来实现时钟分频。分频代码:

module clk_gen(
    input sys_clk, //系统时钟
    input sys_rst_n,
    
    output reg clk_1, //基带时钟 2k 
    output reg clk_2 //中频时钟 100k
    );

reg [5:0] clk_cnt_1;
reg [9:0] clk_cnt_2;

always @(posedge sys_clk or negedge sys_rst_n) begin
    if(sys_rst_n==1'b0)begin
        clk_cnt_1<=5'b0;
        clk_cnt_2<=10'b0;
        clk_1<=1'b0;
        clk_2<=1'b0;
    end    
    else if(clk_cnt_1<6'd49)begin
        if(clk_cnt_2<10'd249)begin
            clk_cnt_2<=clk_cnt_2+1'b1;
        end
        else begin
            clk_cnt_2<=10'b0;
            clk_2<=~clk_2;
            clk_cnt_1<=clk_cnt_1+1'b1;
        end
        end
        else begin
            if(clk_cnt_2<10'd249)begin
                clk_cnt_2<=clk_cnt_2+1'b1;
            end
            else begin
                clk_cnt_1<=5'b0;
                clk_cnt_2<=10'b0;
                clk_1<=~clk_1;
                clk_2<=~clk_2;
            end
        end  

仿真:
在这里插入图片描述

2. 添加时钟约束

对整个工程综合、实现,看到timing如下:
在这里插入图片描述

此时时序没有报错,但实际是因为没有做时序约束引起的,在tcl运行命令:

report_clock_networks -name timing

打开"clock networks":
在这里插入图片描述
这里两个未约束时钟就是clk_1,clk_2:
在这里插入图片描述
右键时钟,选择"create generated clock"
在这里插入图片描述
设置名字,来源时钟,分频系数:
在这里插入图片描述

在这里插入图片描述
此时再查看"clock networks",时钟都被约束:
在这里插入图片描述
输入命令:

report_clocks

可以查看:
在这里插入图片描述
generated clocks:
在这里插入图片描述
此时再查看xdc文件,多了这两条:

create_generated_clock -name clk_2 -source [get_pins system_i/top_module_0/sys_clk] -divide_by 500 -add -master_clock clk_fpga_0 [get_pins system_i/top_module_0/inst/u_receiver/u_clk_gen/clk_2_reg/Q]
create_generated_clock -name clk_1 -source [get_pins system_i/top_module_0/sys_clk] -divide_by 25000 -add -master_clock clk_fpga_0 [get_pins system_i/top_module_0/inst/u_receiver/u_clk_gen/clk_1_reg/Q]

3. 时序调试

再进行综合,实现,时序出现错误:
在这里插入图片描述
查看报告主要是clk_2到clk_1出现了建立时间的错误:
在这里插入图片描述
这属于多bit信号跨时钟域处理问题,常见的方法异步FIFO、DMUX等,网上资料很多,但我们这个时钟频率很低,不需要用到这么复杂的方法。
查看"clocking summary":

“waveform"里有时钟的相位信息,clk_1和clk_2是相位偏移为0的时钟,clk_1时钟域对clk_2时钟域采样的时候,二者的时钟沿差不多是重合的,猜测可能在数据变化的时候进行了采样,从而可能会产生亚稳态。但是如果让clk_1和clk_2的相位错开,在clk_2高电平或低电平的中间对数据进行采样,因为clk_2的时钟频率对FPGA来说是很低的,在数据稳定时进行采样可能可以避免亚稳态的出现。
所以我们做一个小的修改,删除xdc里的对clk_2时钟约束,然后对其重新设置:
在这里插入图片描述
其他设置都相同,不同的是在"derive from source clock waveform"里选择"by clock edges”,设置的是前三个上升沿或下降沿。
再重新进行综合,xdc文件里也多了代码:

create_generated_clock -name clk_2 -source [get_pins system_i/top_module_0/sys_clk] -edges {1 2 3} -edge_shift {2500.000 7500.000 12500.000} -add -master_clock clk_fpga_0 [get_pins system_i/top_module_0/inst/u_receiver/u_clk_gen/clk_2_reg/Q]

此时的"waveform":
在这里插入图片描述
此时时序也不再报错:
在这里插入图片描述
后续再修改一下clk_gen的代码,来修改下clk_2的初始相位应该就可以了。

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Xilinx FPGA工程例子源码 VERILOG设计源码78个合集: 1024点FFT快速傅立叶变换.zip AD7266的Verilog驱动程序.zip BOOTLOADER (基于Platform Flash).rar ChipScope使用示例.zip DDR SDRAM控制器verilog代码.zip DDR SDRAM控制器参考设计VHDL.zip DDR2 Controller.zip EDK9.1嵌入式开发实验代码.zip EDK中PS2自定义IP.zip FFT变换的IP核的源代码.zip FM收音机的解码及控制器VHDL语言实现.zip FPGA实现CAN总线控制器源码.rar FPGA语音通信平台设计实例.zip IP camera的开源系统.zip LCD IP CORE.zip LCD12864 在Spartan-3E实现代码.zip PCI Express IP核应用参考设计.zip PCI Express标准概述.zip PCIE DMA例子.zip PCI总线IP核(华为的商用).zip PCI的核.zip PICOBLAZE控制LCD1602的源码.zip PS2键盘控制程序.zip Sparten3E的EDK实验.zip System Generator的设计实例.rar The SDRAM controller is designed for the Virtex V300bg432-6.zip ucos_ii 在microblaze平台上的移植.zip USB IP核.zip USB2.0 IP核源代码.zip USB大容量存储开发板CPLD代码.zip USB接口应用系统设计实例.zip USB接口控制器参考设计VHDL代码(Xilinx).zip USB通信全套资料.zip Verilog实现闰年的判断(ISE8.21中调试通过).zip Verilog编写的信道估计.zip Verilog编写的基于SPARTAN板的VGA接口显示程序.zip VGA显示IP核(包括驱动).zip VHDL实现对图像的采集和压缩.zip VHDL编写的PCI代码(PCI2.2兼容).zip xilinx 3s400开发板厂家光盘源码(按键防抖动).zip Xilinx DDR2存储器接口调试代码.rar Xilinx DDR3最新VHDL代码(通过调试).rar Xilinx EDK工程一例MicroBlaze内置USB固件程序.rar Xilinx EDK设计试验.rar Xilinx ISE9.x FPGA_CPLD设计指南(原书光盘上的源码).zip Xilinx Sdram 参考设计:含Verilog和VHDL版本级详细说明文档.rar Xilinx SPARTAN-3E入门开发板实例.zip Xilinx sparten3E 键盘和开发板的通信和LCD的字符显示.zip Xilinx spratan3 xcs100E(VGA PS2).zip Xilinx TCP_IP协议实现.rar Xilinx 公司BASYs开发板自带的Demo程序.zip Xilinx 公司的加法器核.rar Xilinx 官方网站提供的一个利用DCT进行图像压缩的设计参考.rar Xilinx 提供的频率发生器的VHDL源码.zip Xilinx 提供的高速多状态编码8b_10b编码器.zip Xilinx 的Basys板VGA显示图片原码.zip Xilinx 的I2C工程.zip Xilinx 的IP:1024点FFT快速傅立叶变换.rar Xilinx 的用于设计SMBus控制器的源程序.zip Xilinx 高级试验的代码.rar Xilinx.CPLD源码参考设计.zip 兼容opencores.org的I2C slave的RTL代码.zip 在FPGACPLD中实现AD或DA的文章(英文Verilog).zip 在FPGA上实现CRC算法的程序.zip 基于FPGA_CPLD和USB技术的无损图像采集卡.zip 基于FPGA实时处理的双目测距系统.zip 基于Spartan3E的串口调试和检测程序.rar 基于Spartan3火龙刀系列FPGA开发板制作的VGA实验例程.rar 基于XILINX的SPARTAN板的VGA接口显示程序.rar 基于XILINX的XC3系列FPGA的VGA控制器的VHDL源程序.rar 实现在Sparton-3E板卡上的按键及开关的控制.zip 实现基于spartan3与CAN总线连接后的的汽车时速的模拟仿真.zip 扩频接收机设计实例.zip 摄像头的硬件函数(IP核).zip 用FPGA实现数字锁相环.zip 用FPGA模拟VGA时序,PS_2总线的键盘接口VHDL源

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值