Vhdl 如何实现导数,并产生几十个时钟周期的延迟?

Vhdl 如何实现导数,并产生几十个时钟周期的延迟?,vhdl,delay,Vhdl,Delay,我有uart实体,它有以下信号(我只写相关的-for-tx) 我有另一个块,当数据流输出确认发生变化(从高到低)加上50个时钟周期的延迟时,其启用输入应仅在一个时钟内更改为高 我想我应该推导出数据流输出确认,但我不确定是否能实现这一点,以及延迟(可能与计数器有关)。假设您可以访问数据流输出确认信号(这是一个输入,因此来自其他地方),并且您希望检测高到低的转换,你所需要的只是一个失败和一点逻辑。移位寄存器可以提供50个周期的延迟 如果在旧事件的50个周期内出现新事件,使用移位寄存器而不是计数器也可

我有uart实体,它有以下信号(我只写相关的-for-tx)

我有另一个块,当
数据流输出确认发生变化(从高到低)加上50个时钟周期的延迟时,其启用输入应仅在一个时钟内更改为高


我想我应该推导出
数据流输出确认
,但我不确定是否能实现这一点,以及延迟(可能与计数器有关)。

假设您可以访问
数据流输出确认
信号(这是一个输入,因此来自其他地方),并且您希望检测高到低的转换,你所需要的只是一个失败和一点逻辑。移位寄存器可以提供50个周期的延迟

如果在旧事件的50个周期内出现新事件,使用移位寄存器而不是计数器也可以防止丢失旧事件。在如此浅的深度,它也将使用比计数器实现更少的逻辑;50个循环仅为一个SRL(取决于技术)

我使用了您现有的命名约定,并添加了一些后缀。你可能想用短一点的

...
   signal data_stream_out_ack_d  : std_logic; --one cycle delay of _ack
   signal data_stream_out_ack_fe : std_logic; --falling edge (delayed one cycle from the first '0' cycle)
   signal data_stream_out_ack_fe_delayed : std_logic_vector(50 downto 2); --index indicates delay relative to first '0' cycle of _ack
begin
    process(clk)
    begin
        if rising_edge(clk) then
            data_stream_out_ack_d  <= data_stream_out_ack; --store what _ack was
            data_stream_out_ack_fe <= data_stream_out_ack_d and not data_stream_out_ack; --if _ack was '1' and is now '0' (a falling edge) produce a pulse
            data_stream_out_ack_fe_delayed <= data_stream_out_ack_fe_delayed(49 downto 2) & data_stream_out_ack_fe; --shift register to produce delay
            --data_stream_out_ack_fe_delayed(50) pulses 50 cycles after _ack experiences a falling edge
        end if;
    end process;
...
。。。
信号数据流输出确认:标准逻辑--确认的一个周期延迟
信号数据流输出确认:标准逻辑--下降沿(从第一个“0”周期延迟一个周期)
信号数据流输出确认延迟:标准逻辑向量(50向下至2)--索引表示相对于确认的第一个“0”周期的延迟
开始
过程(clk)
开始
如果上升沿(clk),则

数据流输出确认到目前为止,您在实施延迟方面得到了什么?你看到了什么问题?欢迎来到StackOverflow。在StackExchange的这一部分中,我们将讨论代码错误。如果你想讨论电子设计(即使是VHDL),你应该在@J.H.Bonarius上提问。我不同意将设计问题转移到电气工程委员会。SO[vhdl]标记比EE.SE[vhdl]标记更受欢迎,我们的社区已经很小,我看不到拆分它有什么好处。此外,设计问题的答案往往比我们常规的低质量问题更有趣、更适用于全球(例如,“当合成错误解释出来时,为什么它不编译”,或者更糟糕的是:“我不理解HDL的基本功能”)。@QuantumRipple-这不是编程问题,不同于。您可以在这里和EESE找到VHDL标记,这些标记由相同的居民居住。有一种方法可以让抹黑主题变得不受欢迎,Stackoverflow不是搜索硬件设计答案的地方。过多的交叉和vhdl可能会迁移到EESE。VHDL编程问题或答案的质量会受到影响吗?@user1155120我想更深入地讨论这个问题;我希望有一个标签特定的元,因为这是很快成为离题的评论这个问题。我认为VHDL是一种特殊情况;它不适用于软件开发,因此永远不会满足大多数“主题”项目,它实际上可能更适合完全使用EESE,但事实上HDL问题的主要来源(4000对1500)也是如此,因此它本身比EESE更为广泛地被认可。HDL用户的设计问题类似于传统程序员的“软件算法”问题。我喜欢您使用
\u fe
的命名约定。我从没见过别人用它。。。然而,具有一个或多个抽头的可配置延迟单元由提供。像这样的函数可用于将给定的计时转换为类型
TIME
,并根据使用的时钟频率返回周期数。@Paebbels使用该组件或函数肯定没有什么错。它非常适合使用更结构化风格的人。在我的工作中,延迟几乎总是以周期来定义的,因此不需要时间转换(尽管在我需要它的时候看起来很有用!)。我也不认为使用26行(13行用于组件定义,12行用于输出,1行用于输出)来实例化组件实例是值得的,而使用两行移位寄存器(一行用于功能,一行用于信号定义)这更清楚地说明了底层逻辑是什么。我只是想概述一下,网络上已经有了实现的解决方案:)。。。不需要组件。您可以直接实例化实体。您不需要分配
Reset
Enable
,因为它们有默认表达式:)。。。使用纯粹基于周期的延迟不是很好移植。例如,如果您的实体运行在另一个具有不同时钟频率的FPGA或电路板上,则必须重新计算所有延迟。PoC组件可以自我调整大小/配置:)。你能给我们举一个触发器的例子和一个检测高低转换的逻辑吗?@amit rot这就是答案中的代码示例。当数据流输出确认从高到低时,
fe
信号在一个周期内变高。
...
   signal data_stream_out_ack_d  : std_logic; --one cycle delay of _ack
   signal data_stream_out_ack_fe : std_logic; --falling edge (delayed one cycle from the first '0' cycle)
   signal data_stream_out_ack_fe_delayed : std_logic_vector(50 downto 2); --index indicates delay relative to first '0' cycle of _ack
begin
    process(clk)
    begin
        if rising_edge(clk) then
            data_stream_out_ack_d  <= data_stream_out_ack; --store what _ack was
            data_stream_out_ack_fe <= data_stream_out_ack_d and not data_stream_out_ack; --if _ack was '1' and is now '0' (a falling edge) produce a pulse
            data_stream_out_ack_fe_delayed <= data_stream_out_ack_fe_delayed(49 downto 2) & data_stream_out_ack_fe; --shift register to produce delay
            --data_stream_out_ack_fe_delayed(50) pulses 50 cycles after _ack experiences a falling edge
        end if;
    end process;
...