【问题标题】:VHDL - determining counter periodVHDL - 确定计数器周期
【发布时间】:2012-08-31 01:57:10
【问题描述】:

亲爱的 SO 知识分子,

我只是想澄清一些关于确定迭代完整循环所需时间的疑虑。 考虑我有一个 50Mhz 时钟,这意味着时钟周期是 20 ns。

现在,如果我有一个从 0 计数到 500 的计数器,这个计数器是否需要 20ns x 500 = 10 us 才能完成整个循环?

谢谢。

【问题讨论】:

    标签: counter vhdl clock frequency period


    【解决方案1】:

    简短回答:是的。

    长答案:在 FPGA 中,您对硬件进行编程。您使用的 process 语句并行运行,而不是像 C/C++/等那样按顺序运行。代码在普通微处理器上运行。

    例子:

    signal sig_a : UNSIGNED(3 downto 0) := (others => '0');
    signal sig_b : SIGNED(7 downto 0) := (others => '0');
    signal sig_c : std_logic := '0';
    
    process(clk)
    begin
        if(rising_edge(clk)) then
            sig_a <= sig_a + 1;
            sig_b <= sig_b - 1;
            sig_c <= not sig_c;
        end if;
    end process;
    

    每当您收到一个时钟信号(每 20ns,50 MHz 时钟),进程内的所有三个语句都会同时执行。所有三个信号都将在触发器中实现,因此当传播延迟结束时(请参阅您的 FPGA 数据表以获取您设备的确切值),所有三个信号都将具有它们的新值。

    因此,该过程不会“等待”语句完成,而是由时钟“触发”。这将在时钟的每个上升沿发生,因此要执行 500 次语句,您需要 500 个时钟周期 = 50 MHz 时为 10 us。

    【讨论】:

    • 从技术上讲,每次 clk 更改都会触发该过程。这可以是上升沿或下降沿,或转换到其他状态(例如 U 或 X)。因为进程内的所有语句都包含在 if (rising_edge(clk)) 中,所以整体效果如你所说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 2013-12-24
    • 2018-02-04
    • 1970-01-01
    • 2015-04-04
    • 2015-04-25
    相关资源
    最近更新 更多