前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FPGA奇数分频

FPGA奇数分频

作者头像
数字芯片社区
发布2020-07-20 15:49:06
9790
发布2020-07-20 15:49:06
举报
文章被收录于专栏:数字芯片数字芯片

设计中尽量还是要避免使用自己计数分频得到的时钟,去使用厂家自带的分频IP(如Vivado中的clock wizard)。

偶数分频比较简单,这里略过。

对于不要求占空比为50%的奇数分频,也比较简单,直接模N计数,期间进行两次翻转就可以了。

这里重点介绍要求占空比为50%的奇数分频。

步骤:

  1. 在时钟上升沿,进行模N计数,选定到某个值(比如选择1)时翻转,经过(N-1)/2 个时钟再进行翻转,产生一个临时时钟clk_p;

  2. 在时钟下降沿,进行模N计数,选定到某个值(和上升沿选定的值相同)时翻转,经过(N-1)/2 个时钟再进行翻转,产生一个临时时钟clk_n;

  3. 输出时钟clk_o = clk_p | clk_n;

图解:(假如需要5分频)

Verilog代码:

代码语言:javascript
复制
timescale 1ns/1ps 

module CLK_DIV5(
    input   clk_i,
    input   rst_n,
    output  clk_o
    );
 
    reg [2:0] cnt1,cnt2;
    reg clk_p,clk_n;
           
//*********************
//MAIN CORE
//*********************        
always @(posedge clk_i,negedge rst_n)
    if(!rst_n) begin
        cnt1 <= 3'b0;
        clk_p <= 1'b0;
    end 
    else begin
        if(cnt1 == 3'b100) begin
            cnt1 <= 3'b0;
            clk_p <= clk_p;
        end
        else begin
            cnt1 <= cnt1 + 1'b1;
            if(cnt1 == 3'b1 || cnt1 == 3'b11)
                clk_p <= ~clk_p;
        end
    end

always @(negedge clk_i,negedge rst_n)
    if(!rst_n) begin
        cnt2 <= 3'b0;
        clk_n <= 1'b0;
    end 
    else begin
        if(cnt2 == 3'b100) begin
            cnt2 <= 3'b0;
            clk_n <= clk_n;
        end
        else begin
            cnt2 <= cnt2 + 1'b1;
            if(cnt2 == 3'b1 || cnt2 == 3'b11)
                clk_n <= ~clk_n;
        end
    end
    
    assign clk_o = clk_p | clk_n;
endmodule

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数字ICer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档