当时钟占空比为 50% 时,时钟速度快两倍

The clock speed is two times faster when the clock duty cycle is 50%

我想在FPGA板上生成102Hz的时钟(带cyclone 3的) 硬件上的原始时钟是 50MHz,所以我将它除以 490196 得到 102Hz 时钟 但是当我将占空比设置为 50%

时,时钟速度快了两倍
    signal div_490196_counter: std_logic_vector(18 downto 0);
        ...
    process(clk,reset,div_490196_counter)
    begin
        if(reset='0') then
            div_490196_counter <= (others=>'0');
        elsif(rising_edge(clk)) then
            if(div_490196_counter = 490165) then
                div_490196_counter <= (others=>'0');
            else 
                div_490196_counter <= div_490196_counter+1;
            end if;
        end if;
    end process;
    clk_102Hz <= '1' when (div_490196_counter < 245098) else '0';

我尝试使用 Verilog,但结果是一样的:

reg[18:0] div_490196_counter;
...
always@(posedge clk or negedge reset)
begin
    if(reset == 1'b0)
        div_490196_counter = 0;
    else
        if(div_490196_counter == 490165)
            div_490196_counter = 0;
        else
            div_490196_counter = div_490196_counter + 1;
end

assign clk_102Hz = (div_490196_counter < 245098)? 1'b1 : 1'b0;

只有我切换到非50%占空比时钟才能解决问题:

clk_102Hz <= div_490196_counter(18);

或在 verilog 中:

assign clk_102Hz=div_490196_counter[18];

但为什么会这样呢? 我以为结果应该是一样的

您的 clk_102Hz 的两个版本在模拟中的行为应该或多或少相同。但是,请注意此版本不能很好地用作硬件时钟:

assign clk_102Hz = (div_490196_counter < 245098)? 1'b1 : 1'b0;

原因是在现实生活中,比较运算符会在一段时间内发生(不像模拟中那样立即发生),因此 clk_102Hz 输出可能会在某些 [=13= 的计算过程中出现故障] 值转换。对于为什么您观察到的频率恰好是预期频率的两倍,我没有准确的解释,但这通常是不可预测的。

要解决这个问题,只需通过由 clk 计时的触发器发送 clk_102Hz 信号即可。