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

How to set frequency in vhdl at 0.01 Hz?

我需要在 vhdl 中分频,这样得到的频率将为 0.01 Hz,但我不知道该怎么做。我尝试使用通用地图,但后来出现错误。我正在使用 Nexys3。我知道Nexys3的频率是100MHz,所以我试着把它分频到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 超出最大整数值。

对于 100Mhz 具体 首先将问题分解为两部分

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

  2. 然后通过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 的幂,或者某种移位寄存器,Johnson 计数器等...

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

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

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 时肯定。