【问题标题】:Converting a 1 second clock into a 0.1 second clock将 1 秒时钟转换为 0.1 秒时钟
【发布时间】:2021-04-23 01:35:09
【问题描述】:

我有一个时钟频率为 50 MHz 的 fpga 板,我有这个功能可以将信号转换为 1 秒时钟。我想知道我应该进行哪些调整才能获得 0.1 秒而不是 1 秒的输出。

use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity clk_gen is
port(
  clk_50M: in std_logic; 
  clk_1s: out std_logic
   );
end clk_gen;

architecture arch of clk_gen is
    signal p_reg: unsigned(31 downto 0);
    constant PHA: unsigned(31 downto 0):= x"00000056"; 

begin
   -- ddfs for 1-sec pulse (based on 50 MHz clk)
   process(clk_50M)
   begin
      if (clk_50M'event and clk_50M='1') then
         p_reg <= p_reg + PHA;
      end if;
   end process;
    clk_1s <= p_reg(31);
end arch;

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 你了解算法,即这段代码在做什么吗?如果是,请向我解释一下,所以我确定你会这样做。因为如果你这样做了,你应该能够自己解决这个问题,如果你不这样做,你有很多东西要学。你不能指望我们为你做你的工作。
  • 我认为你的代码没有做任何事情,因为 p_reg 一直保持 (others => 'U') ...你需要的是一个频闪发生器。

标签: vhdl fpga


【解决方案1】:

50Mhz FPGA 时钟意味着一秒内有 50,000,000 (50e6) 个时钟边沿。

因此,如果您想要 1/10 秒,只需将 50 Mhz 时钟除以 10 即可获得需要通过的时钟边沿总数以获得 0.1 秒延迟。

50,000,000 / 10 = 5,000,000 个时钟边沿

我不确定您的 VHDL 是做什么的;没有计数器或值更改...

简单描述应该做什么......

process(50_Mhz)
begin
if rising_edge(50_Mhz) then
    if counter < 5000000 then
        counter <= counter + 1;
    else
        counter <= 0; -- when it get's here .1 seconds have passed
    end if;
end if;

当然这还不完整。您必须适当地声明变量并在 0.1 秒过后切换您想要的信号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2015-05-18
    • 2012-06-15
    • 2015-06-02
    • 2011-09-01
    相关资源
    最近更新 更多