Matrix 使信号等待到下降边缘

Matrix 使信号等待到下降边缘,matrix,signals,vhdl,Matrix,Signals,Vhdl,这个信号应该是零,直到另一个信号Start=0。我怎样才能做到这一点?以下是相关代码: din<=0; wait until falling_edge(start); for i in 0 to 63 loop wait until clk = '1' and clk'event; if i = 0 then Start <= '1','0' after clk_period;

这个信号应该是零,直到另一个信号Start=0。我怎样才能做到这一点?以下是相关代码:

        din<=0;
        wait until falling_edge(start);

    for i in 0 to 63 loop
        wait until clk = '1' and clk'event;
        if i = 0 then
            Start <= '1','0' after clk_period;
        end if;
            if (i < 24) then 
                din <= 255;
            elsif (i > 40) then
                din <= 255;
            else
                din <= 0;
            end if;

        end loop;

    wait;

din
我的信号应该是零,直到另一个信号Start=0。我如何才能做到这一点?

也许你可以使用一个握手信号,把它放在这个过程的敏感列表中。它的行为类似于重置信号

process (handshake_s, ...)
begin
  if (handshake_s = '1') then  -- failing edge of start
    din <= 0;
  else
    -- do something
  end if;
end process;
过程(握手,…)
开始
如果(握手='1'),那么——开始的失败边缘

din
我有一个信号,在另一个信号Start=0之前,该信号应为零。我如何才能做到这一点?

也许你可以使用一个握手信号,把它放在这个过程的敏感列表中。它的行为类似于重置信号

process (handshake_s, ...)
begin
  if (handshake_s = '1') then  -- failing edge of start
    din <= 0;
  else
    -- do something
  end if;
end process;
过程(握手,…)
开始
如果(握手='1'),那么——开始的失败边缘
din首先,我假设(并希望)您正在编写一个测试台。如果不是,您应该避免使用wait语句,因为这些语句在合成工具中的支持非常有限

即使在测试台中,最好仅使用基于时间的等待或after语句来生成时钟,并使所有其他信号依赖于事件(例如,
上升沿(clk)
)。这避免了在增量周期0期间多个信号随时钟变化的问题

对于典型寄存器,请考虑以下代码:

process(clk) begin
    if(rising_edge(clk)) then
        a <= b;
    end if;
end process;
  • 在时间0 delta 0时,
    clk
    更改为“1”,而
    b
    将更改为“1”
  • 在时间0 delta 1时,寄存器进程将运行,因为
    clk
    已更改,
    a
    将更改为“1”
  • 不存在进一步的灵敏度,因此时间将以1ns更新到下一个事件
  • 在时间1增量0时,
    clk
    更改为“0”
  • 在时间1 delta 1,由于
    clk
    更改,寄存器进程运行,但由于
    上升沿(clk)
    为false,因此不会发生任何事情
  • 上述重复时间为2-9 ns
  • 在时间10增量0时,
    clk
    更改为“1”,而
    b
    更改为“0”。请注意,
    clk
    b
    在相同的增量周期中变化
  • 在时间10 delta 1时,寄存器进程运行并且
    a
    更改为“0”!就结果而言,这意味着
    b
    在上升时钟边缘之前发生了变化
即使这种行为在这个简单的系统中是可以理解的,它也会导致一些难以发现的模拟错误。因此,最好以适当的时钟为所有信号的基础

process begin
    -- Initialize b to 1.
    b <= '1';
    -- Wait for 5 cycles.
    for i in 1 to 5 loop
        wait for rising_edge(clk);
    end loop;
    -- Set b to 0.
    b <= '0';

    -- Done.
    wait;
end process;
过程开始
--将b初始化为1。
首先,我假设(并希望)您正在编写一个测试台。如果不是,您应该避免使用wait语句,因为这些语句在合成工具中的支持非常有限

即使在测试台中,最好仅使用基于时间的等待或after语句来生成时钟,并使所有其他信号依赖于事件(例如,
上升沿(clk)
)。这避免了在增量周期0期间多个信号随时钟变化的问题

对于典型寄存器,请考虑以下代码:

process(clk) begin
    if(rising_edge(clk)) then
        a <= b;
    end if;
end process;
  • 在时间0 delta 0时,
    clk
    更改为“1”,而
    b
    将更改为“1”
  • 在时间0 delta 1时,寄存器进程将运行,因为
    clk
    已更改,
    a
    将更改为“1”
  • 不存在进一步的灵敏度,因此时间将以1ns更新到下一个事件
  • 在时间1增量0时,
    clk
    更改为“0”
  • 在时间1 delta 1,由于
    clk
    更改,寄存器进程运行,但由于
    上升沿(clk)
    为false,因此不会发生任何事情
  • 上述重复时间为2-9 ns
  • 在时间10增量0时,
    clk
    更改为“1”,而
    b
    更改为“0”。请注意,
    clk
    b
    在相同的增量周期中变化
  • 在时间10 delta 1时,寄存器进程运行并且
    a
    更改为“0”!就结果而言,这意味着
    b
    在上升时钟边缘之前发生了变化
即使这种行为在这个简单的系统中是可以理解的,它也会导致一些难以发现的模拟错误。因此,最好以适当的时钟为所有信号的基础

process begin
    -- Initialize b to 1.
    b <= '1';
    -- Wait for 5 cycles.
    for i in 1 to 5 loop
        wait for rising_edge(clk);
    end loop;
    -- Set b to 0.
    b <= '0';

    -- Done.
    wait;
end process;
过程开始
--将b初始化为1。
bTestbench还是RTL代码

对于测试台,您的编码风格基本上是正常的,但是,您的信号开始有问题,在时钟上升沿期间永远不会是“1”。它会在时钟上升沿后立即转到“1”,并将与时钟同时返回到“0”,或在时钟之前返回1个增量周期(取决于您的时钟设置)。无论哪种方式,任何运行在上升沿时钟上的东西,例如您的设计,都不会将其视为“1”

避免这种情况的一种简单方法是在所有测试台输出上使用标称延迟(TPPeriod_Clk的25%),这些输出将发送到DUT(被测设备)。脉冲的模式如下所示

wait until clk = '1' ;  -- I recommend using rising_edge(Clk) for readability
Start <= '1' after tpd, '0' after tpd + tperiod_clk ; 
测试台还是RTL代码

对于测试台,您的编码风格基本上是正常的,但是,您的信号开始有问题,在时钟上升沿期间永远不会是“1”。它会在时钟上升沿后立即转到“1”,并将与时钟同时返回到“0”,或在时钟之前返回1个增量周期(取决于您的时钟设置)。无论哪种方式,任何运行在上升沿时钟上的东西,例如您的设计,都不会将其视为“1”

避免这种情况的一种简单方法是在所有测试台输出上使用标称延迟(TPPeriod_Clk的25%),这些输出将发送到DUT(被测设备)。脉冲的模式如下所示

wait until clk = '1' ;  -- I recommend using rising_edge(Clk) for readability
Start <= '1' after tpd, '0' after tpd + tperiod_clk ; 
-- Counter to count from 0 to 63.  Use  "+ 1".  Use "mod 64" if using type integer.
-- Start logic = decoder (can be coded separately) 
-- Din Logic = decoder (can be coded separately)