如何将 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 具体 首先将问题分解为两部分
将频率除以 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的非整数次方(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 时肯定。
我需要在 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 具体 首先将问题分解为两部分
将频率除以 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的非整数次方(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 时肯定。