亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> VHDL

如何在 VHDL 中创建时钟进程

绝大多数 VHDL 设计使用时钟逻辑 ,也称为同步逻辑顺序逻辑 .时钟进程仅由主时钟信号触发,而不是在任何其他输入信号发生变化时触发。

时钟逻辑的基本构建块是一个称为触发器的组件 .它有不同的变体,在本教程中,我们将重点介绍带负复位的正沿触发触发器:

触发器是一个采样保持电路,这意味着它会在时钟信号的上升沿到达时将值从输入复制到输出。然后输出保持稳定在采样值,直到时钟的下一个上升沿,或直到产生复位信号。

这篇博文是基本 VHDL 教程系列的一部分。

所有时钟进程同时触发,并将立即读取它们的输入。同时,他们将输出上一次迭代的结果。时钟信号有效地在数据流中创建时间步长。这使得设计人员可以管理创建复杂、深入的逻辑。他或她可以将算法的动作分解为在时钟周期发生的事件。

触发器或触发器数组有时称为寄存器 ,是一样的。

时钟进程的敏感度列表通常只包含时钟信号。这是因为时钟进程仅由时钟信号的侧翼触发,其他输入信号根本不会使其唤醒。

这是使用同步重置创建时钟进程的模板:
process(Clk) is
begin
    if rising_edge(Clk) then
        if nRst = '0' then
            <reset all output signals here>
        else
            <main logic here>
        end if;
    end if;
end process;

运动

在本视频教程中,我们将学习如何在 VHDL 中创建时钟进程:

触发器 testbench 的最终代码 :

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T17_ClockedProcessTb is
end entity;

architecture sim of T17_ClockedProcessTb is

    constant ClockFrequency : integer := 100e6; -- 100 MHz
    constant ClockPeriod    : time    := 1000 ms / ClockFrequency;

    signal Clk    : std_logic := '1';
    signal nRst   : std_logic := '0';
    signal Input  : std_logic := '0';
    signal Output : std_logic;

begin

    -- The Device Under Test (DUT)
    i_FlipFlop : entity work.T17_FlipFlop(rtl)
    port map(
        Clk    => Clk,
        nRst   => nRst,
        Input  => Input,
        Output => Output);

    -- Process for generating the clock
    Clk <= not Clk after ClockPeriod / 2;

    -- Testbench sequence
    process is
    begin
        -- Take the DUT out of reset
        nRst <= '1';

        wait for 20 ns;
        Input <= '1';
        wait for 22 ns;
        Input <= '0';
        wait for 6 ns;
        Input <= '1';
        wait for 20 ns;

        -- Reset the DUT
        nRst <= '0';

        wait;
    end process;

end architecture;

触发器模块的最终代码 :

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T17_FlipFlop is
port(
    Clk    : in std_logic;
    nRst   : in std_logic; -- Negative reset
    Input  : in std_logic;
    Output : out std_logic);
end entity;

architecture rtl of T17_FlipFlop is
begin

    -- Flip-flop with synchronized reset
    process(Clk) is
    begin

        if rising_edge(Clk) then
            if nRst = '0' then
                Output <= '0';
            else
                Output <= Input;
            end if;
        end if;

    end process;

end architecture;

我们按下运行后 ModelSim 中的波形窗口,并在时间轴上放大:

分析

从波形中我们可以看出,输出信号只在时钟信号的每个上升沿更新。仅当时钟信号从“0”变为“1”时才对输入信号进行采样。从大约 45 ns 开始的输入信号的负倾角完全消失。它没有被复制到输出,因为它在时钟的两个上升沿之间,因此它被忽略了。

此动画说明了输出如何对不断变化的输入和时钟信号做出反应:

垂直线表示输入信号与时钟上升沿的关系。

特别注意从 20 ns 开始的输入信号上的一个正脉冲。它与时钟同步,并且正好是一个时钟周期长。输出不是瞬间反应,而是延迟了一个时钟周期。

当我学习 VHDL 时,我发现这特别难以理解。时钟的上升沿与输入的上升沿同步,那么触发器如何选择一个值或另一个值呢?

模拟器使用时间步长以可预测的方式对事件进行建模,并且信号在零时间内传播。因为触发器在更新输出的同时读取输入,所以它会看到输入的旧值并将其复制到输出。

在此处阅读有关 VHDL 时间步长的更多信息:Delta 周期解释

我应该在这个答案中补充一点,这不是真的 这个怎么运作。在物理世界中,信号需要时间来传播,我们不知道它何时到达触发器。这些传播延迟是由将 VHDL 代码转换为网表的软件过程(布局和布线)自动为我们估算的。

实际上,输入必须在时钟上升沿前后保持稳定几纳秒:

这些关键时间段称为建立和保持时间。幸运的是,这不是您通常必须考虑的事情。当纯粹使用时钟逻辑时,这些问题由将 VHDL 代码转换为网表的软件来处理。

外卖

参加基本 VHDL 测验 - 第 3 部分 »

转到下一个教程 »


VHDL

  1. 如何在 VHDL 中创建字符串列表
  2. 如何为 VHDL 代码锁定模块创建 Tcl 驱动的测试平台
  3. 如何在 VHDL 测试平台中停止仿真
  4. 如何在 VHDL 中创建 PWM 控制器
  5. 如何在 VHDL 中生成随机数
  6. 如何在 VHDL 中创建环形缓冲区 FIFO
  7. 如何创建自检测试平台
  8. 如何在 VHDL 中创建链接列表
  9. 如何在 VHDL 中的进程中使用过程
  10. 如何在 VHDL 中使用不纯函数
  11. 如何在 VHDL 中使用函数
  12. 如何在 VHDL 中创建有限状态机