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



我需要在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超过最大整数值。

对于100Mhz特别是从把问题分成两部分开始

  1. 将频率除以2的最高可整除幂,从而将输入时钟除为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的幂

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

指出:

如何找到一个最右边集合位和其他位都为0的数?

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

然后继续除以390625 Hz,它本身是25的幂,特别是因为625是数字625的最低部分,25^2和2390000,当你减去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时,可以肯定。

最新更新