如何将 vhdl 中的频率设置为 0.01 Hz?

Posted

技术标签:

【中文标题】如何将 vhdl 中的频率设置为 0.01 Hz?【英文标题】:How to set frequency in vhdl at 0.01 Hz? 【发布时间】:2021-11-15 12:00:03 【问题描述】:

我需要在 vhdl 中除频,因此得到的频率将为 0.01 Hz,但我不知道该怎么做。我尝试使用通用地图,但后来出现错误。我正在使用 Nexys3。我知道 Nexys3 的频率是 100 MHz,所以我试着把它分成 0.01。

entity stotinkasekunde is
port (
    izlaz: out std_logic_vector(3 downto 0);
    led: out std_logic_vector(6 downto 0);
    clk, ss: in std_logic
);
end stotinkasekunde;

architecture Behavioral of stotinkasekunde is
signal clk_o: std_logic;
signal temp: std_logic_vector(3 downto 0);
begin
s1: entity work.frekdiv generic map(10000000000) port map(clk, clk_o);
process (clk_o)
begin
    if (clk_o'event and clk_o='1') then
        if (ss='1') then
            temp <= temp+1;
            if (temp >= 1010) then
                temp <= "0000";
            end if;
        end if;
    end if;
end process;

错误:第 18 行:文字 10000000000 超出最大整数值。

【问题讨论】:

你知道输入频率吗?因为这看起来像是来自 Nexys3 上的时钟源? 我希望现在好多了。 您可以检查它是否与1000 的分隔器一起使用,如果可以,则您知道您对frekdiv 组件的使用是正确的,然后您可以简单地级联多个分隔器。跨度> @user16145658 我想你算错了零。泛型中的值是 10,000,000,000 ,在大多数(如果不是全部?)实现也限制整数的 32 位之外。 您没有向我们展示相关实体frekdiv。如果这是您自己的,请考虑重新设计它以启用更大的除数。如果无法更改,请考虑使用两个级联实例。 【参考方案1】:

对于 100Mhz 特别是首先将问题分解为两部分

    将频率除以 2 的最高可除幂,以便通过使用此处使用位魔术表达式 (n & (~(n - 1))) 的方法将输入时钟除以 2 的整数最高幂找到该数字或尝试从 1 次方到 2 的 26 次方最接近该数字但因数低于 2 的所有系列,换句话说,100000000 / 2^26 = 1.490116 作为系列的上限(https://www.geeksforgeeks.org/highest-power-of-two-that-divides-a-given-number/ )

    然后是 2 的非整数幂(https://www.slideshare.net/DeepakFloria/divide-by-n-clock, https://en.wikipedia.org/wiki/Frequency_divider)

    除以 25 的幂 然后是 10 的幂

因此,得到的时钟分频计算可以写成 100000000 Hz / ((2^8)* (25 ^ 4) * (10)) 正好等于 0.1 Hz

注意事项:

我们如何找到一个最右边的设置位相同且所有其他位都为 0 的数字?

记住:总体方案是取 100000000Hz 然后除以 2 的最大偶数幂(为什么偶数,因为 2 的幂已经是偶数了,提示基数为 2...)

然后继续将 390625 Hz 除以 25 的幂,特别是因为 625 作为数字 625、25^2 和 2 390000 的最低部分,减去 25 时的剩余部分,很好625 本身的幂,使得原来可以被 25 整除。

除以 25,除以 25,除以 25,除以 25 然后除以 10 得到 0.1 Hz

如何实施:

除以 2 可以通过使用 mod-n 计数器来完成,在我们的例子中 n 是 2 的幂,或者某种移位寄存器、约翰逊计数器等......

除以 25(或 25 的幂),或除以 10

两者都使用下面链接中的示例方案,但不使用相同的数字

https://electronics.stackexchange.com/a/61607/20332

或者,使用 Xilinx 时钟向导生成此模块

https://electronics.stackexchange.com/a/61620/20332

除以 25 可能作为 FPGA 上的现有资源提供,但如果没有,请参阅 wiki (https://en.wikipedia.org/wiki/Frequency_divider) 了解更多信息。

最后,确保运行行为模拟以找到标记放置在缩小的结果时钟上升沿上,到下一个上升沿,以便能够测量输出波形中生成的结果时钟的周期,并验证这是正确的,如果我使用正确的术语,则基于您的 VHDL 时间尺度,因为这是 Verilog HDL 中的术语,当然当我使用 Verilog 时。

【讨论】:

以上是关于如何将 vhdl 中的频率设置为 0.01 Hz?的主要内容,如果未能解决你的问题,请参考以下文章

周期1s频率1Hz秒信号方波

STM32如何设置PWM波的频率为10HZ

信号取样与取样定理matlab编程

verilog编写可调PWM波形

python如何表示0~10秒的时间戳,频率为10Hz?

如何提高 MPMediaItem 的频率范围? (如参数均衡器,例如,将 500 Hz 提高 12 dB)