【问题标题】:The clock speed is two times faster when the clock duty cycle is 50%时钟占空比为 50% 时,时钟速度快两倍
【发布时间】:2022-01-14 06:50:20
【问题描述】:

我想在FPGA板上生成102Hz时钟(带有旋风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];

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

【问题讨论】:

  • 在 std_logic_vector 上进行数学运算充其量是狡猾的;尤其是因为它没有传达您的设计意图。使用numeric_std.unsigned 很明显,您的意图是无符号算术,没有符号,比较运算符&lt; 之类的东西会有更少的惊喜。正如 toolic 所说,如果您想要的不仅仅是指针和猜测,请让您的 sn-ps 完整、可编译和可运行(包括测试平台)。

标签: vhdl verilog fpga quartus intel-fpga


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 2017-09-24
    • 1970-01-01
    • 2020-12-31
    • 2020-03-10
    • 2014-09-16
    • 1970-01-01
    • 2019-12-28
    相关资源
    最近更新 更多