如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章