zoukankan      html  css  js  c++  java
  • FPGA中多时钟切换(无毛刺):通过代码的方式

    前言

    在实际的项目开发中,一个逻辑块在不同的时刻可能需由不同的时钟进行驱动。

    比如存在clk1,clk2,有always@(posedge i_clk)需要执行,在0时刻使用clk1进行驱动,在1时刻使用clk2进行驱动,则需要进行时钟切换。

    参考文档

    Glitch free clock switching circuit design (Verilog)

    流程

    源语的方式:

    Altera和XIlinx均提供了时钟切换的源语,不过相关的源语都有相应的限制。

    代码的方式:

    两个时钟切换最简单的使用sel就可以进行切换:

    assign o_clk_sel = w_sel ? i_clk1 : i_clk0;

    但上述方式显然会存在问题,产生时钟毛刺。因为w_sel跳变时刻是随机的。

    参考上述链接中的结构进行编码并仿真:

    代码可如下所示:

    module clk_sel (
        input      i_clk_0      ,
        input      i_clk_1      ,
        input      i_sel        ,
        output     o_clk_sel
    
    );
    
    reg r_clk_0_pos = 1'b0;
    reg r_clk_0_neg = 1'b0;
    reg r_clk_1_pos = 1'b0;
    reg r_clk_1_neg = 1'b0;
    always @(posedge i_clk_0)
    begin
        r_clk_0_pos <= ~r_clk_1_neg & i_sel;
    end 
    always @(negedge i_clk_0)
    begin
        r_clk_0_neg <= r_clk_0_pos;
    end
    
    always @(posedge i_clk_1)
    begin
        r_clk_1_pos <= ~r_clk_0_neg & (~i_sel);
    end 
    always @(negedge i_clk_1)
    begin
        r_clk_1_neg <= r_clk_1_pos;
    end
    
    wire w_clk_0;
    wire w_clk_1;
    assign w_clk_0 = r_clk_0_neg & i_clk_0;
    assign w_clk_1 = r_clk_1_neg & i_clk_1;
    
    assign o_clk_sel = w_clk_0 | w_clk_1;
    
    endmodule
    

    仿真:可以看到没有异常的毛刺产生。

    当然,具体实际上板子还需验证。

    Q:不知道这种方法跟使用FPGA的源语有何异同。

    以上。

  • 相关阅读:
    Codeforces Round #174 (Div. 1 + Div. 2)
    Codeforces Round #176 (Div. 1 + Div. 2)
    [ARC101C] Ribbons on Tree 解题报告
    [CTS2019]珍珠 解题报告
    CF1349D Slime and Biscuits 解题报告
    [PKUWC2018]猎人杀 解题报告
    AGC047 解题报告
    肯德基 解题报告
    [GXOI/GZOI2019]旧词 解题报告
    [ARC084B] Small Multiple 解题报告
  • 原文地址:https://www.cnblogs.com/kingstacker/p/15798719.html
Copyright © 2011-2022 走看看