【问题标题】:Verilog Counter - 50MHz to 1Hz clockVerilog 计数器 - 50MHz 至 1Hz 时钟
【发布时间】:2018-03-27 19:13:11
【问题描述】:

如何使用此 Verilog 代码生成 1Hz 时钟信号,同时保持计数功能? Maxval 使计数器能够计数到某个值,然后通过复位回到 0 并重新开始。或者,如果它达到最大值,它只会重置并再次计数。问题是,我的 FPGA 有一个 50Mhz 时钟,但我需要使用这个带有 1Hz 和 2Hz 时钟的计数器。有关为此目的调整此代码的任何提示?

module clocktime(input clk, freerun, Reset, output, input[7:0] Maxval, output reg[7:0] Count, output reg Carry);
    always @ (posedge clk or posedge Reset) begin
        if ( Reset ) begin
            Count <= 0;
            Carry <= 0;
            end
        else
            if ( freerun )
                if ( Count < Maxval ) begin
                    Count <= Count + 8'd1;
                    Carry <= 0;
                    end
                else begin
                    Count <= 0;
                    Carry <= 1;
                    end
        end
endmodule

【问题讨论】:

    标签: verilog


    【解决方案1】:

    首先增加MaxvalCount 变量的宽度。您需要 26 位才能容纳 5000 万个。现在使用 8 位,您最多可以将时钟除以 255。

    要获得额外的输出(1hz、2hz),您可以执行以下操作:

    module top(clk50, reset, out_1hz, out_2hz);
    input clk50;
    input reset;
    output out_1hz;
    output out_2hz;
    
    reg[25:0] clk50_divisor = 12500000;
    reg [1:0] div2_4;
    
    assign out_1hz = div2_4[1];
    assign out_2hz = div2_4[0];
    
    wire tmp_4hz;
    
    clocktime div_clk50(
        .clk(clk50),
        .freerun(1),
        .Reset(reset), 
        .Maxval(clk50_divisor),
        .Carry(tmp_4hz));
    
    
    always @(posedge tmp_4hz)
        div2_4 <= div2_4 + 1'd1;
    
    /* another option, might be better in your particular case,
       or not different at all
    
    always @(posedge clk50)
    if (tmp_4hz)
       div2_4 <= div2_4 + 1'd1;
    
    */
    
    endmodule
    
    module clocktime(clk, freerun, Reset, Maxval, Count, Carry);
    
    input clk;
    input freerun;
    input Reset;
    input [25:0] Maxval;
    output reg[25:0] Count;
    output reg Carry;
    
        always @ (posedge clk or posedge Reset) begin
            if ( Reset ) begin
                Count <= 0;
                Carry <= 0;
                end
            else
                if ( freerun )
                    if ( Count < Maxval ) begin
                        Count <= Count + 8'd1;
                        Carry <= 0;
                        end
                    else begin
                        Count <= 0;
                        Carry <= 1;
                        end
            end
    
    endmodule
    

    【讨论】:

    • 此代码将在Carry 输出上以clk/Maxval 的频率生成短脉冲(1 个时钟周期宽度)。如果您需要 1Hz 和 2Hz 输出,您可以将时钟除以 2500 万以在 Carry 上获得 2Hz,并使用该输出翻转额外的寄存器以获得 1Hz 的曲折。
    • 那么您需要特定的占空比吗?如果曲流适合您,则将 Maxval 设置为 1250 万,并将该进位输入另一个 2 位计数器的时钟(单调向上计数),使其进一步除以 2 和 4。
    • 模拟您的代码并在波形显示中查看Count 的 MSB 的行为方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2020-01-10
    • 2021-11-29
    • 2016-02-10
    • 1970-01-01
    相关资源
    最近更新 更多