Vivado自写分频模块的分频时钟的约束条件编写

一、原因

由于项目需要,整个工程需要在100kHz的时钟下运行,FPGA的clk:50MHz

二、方案分析

  1. 采用IP核得到分频时钟

clocking wizard

问题:MMCM和PLL都不能实现分频到100KHz这么低的频率

MMCM最小频率4.687MHz

PLL最小频率6.25MHz

  1. 自己写一个简单的分频模块

分频模块如下:

module divi_fre #(parameter DIVNUM=500,parameter WIDTH=9)(
input clk,
input rst_n,
output reg divi_clk
    );
reg [WIDTH-1:0] counter;
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        counter <= 'd0; 
    end
    else begin
        counter <= counter + 1'b1;
        if(counter==DIVNUM/2-1)
            counter <= 'd0;
    end

end
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        divi_clk <= 1'b0;
    end
    else begin
        if(counter == DIVNUM/2-1)begin
            divi_clk <= ~divi_clk;
        end
    end
end
    
endmodule

问题:自己写的分频模块直接使用是不可以的,需要在约束文件中进行时序约束

  1. 自写分频模块时钟时序约束

(1)打开implemented Design

查看分频模块的原理图

找到输出divi_clk

可以看到divi_clk_reg寄存器的C端口连接的是输入CLK(50MHz),Q端口连接的是divi_clk(100KHz)

(2)约束文件编写

create_clock -period 20.000 -name clk1 [get_ports clk]
create_generated_clock -name clk2 -source [get_pins u_divi_fre/divi_clk_reg/C] -divide_by 500 [get_pins u_divi_fre/divi_clk_reg/Q]
  1. clk1对应50MHz

20ns--->50MHz, get_ports对应clk

注:clk1和clk2只是随意取的名字,没有影响

  1. clk2对应100kHz

-divide_by后跟的是计算得到的分频值,50_000_000/100_000=500

-source后跟输入时钟,上面说到了divi_clk_reg寄存器的C端口连接的是输入CLK,注意这个定位到寄存器的时序约束需要从顶层一层一层传下来到管脚

[get_pins u_divi_fre/divi_clk_reg/Q]就输出的divi_clk了

其实应该直接get_ports到clk和divi也是可以的,但是因为我当时没这么写,后面改改

  • 11
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hanberwer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值