Matrix 使信号等待到下降边缘
这个信号应该是零,直到另一个信号Start=0。我怎样才能做到这一点?以下是相关代码: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;
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)