gpt4 book ai didi

VHDL 短格式触发上升沿 Action

转载 作者:行者123 更新时间:2023-12-01 08:02:11 25 4
gpt4 key购买 nike

我想知道是否有更短的方法来触发不是时钟的信号边沿。

考虑以下示例:

  signal clock               : std_logic;
signal ready : std_logic; -- comes from some slow component
signal last_ready : std_logic;
signal some_rare_condition : std_logic;

----------------------------------

process (clock) is
begin

if rising_edge (clock) then

if (some_rare_condition = '1') then

if (ready = '1') and (last_ready = '0') then
-- do something here, writing data to UART for example.
end if;

last_ready <= ready;

end if;
end if;
end process;

在这里,如果“就绪”信号出现上升沿,我想做点什么。只有在 some_rare_condition 为真时才应评估上升沿。

我目前只记得锁存器中就绪信号的最后状态,并自己构建边沿检测逻辑。

问题:有没有更短、更优雅的方法来做到这一点?

我正确的做法工作得很好,但我用所有这些 last_ready 信号弄乱了我的代码。这似乎是一个如此普遍的范例,以至于我想我错过了一些帮助我保持代码干净和精简的语言或库结构。

最佳答案

您可以在两行中编写上升沿或下降沿检测:

  • 一个简单的 D-FF 来注册旧信号
  • 上升沿比较

示例代码:

signal MMCM_Locked      : STD_LOGIC;
signal MMCM_Locked_d : STD_LOGIC := '0';
signal MMCM_Locked_re : STD_LOGIC;

-- detect rising edge on CMB locked signals
MMCM_Locked_d <= MMCM_Locked when rising_edge(Control_Clock);
MMCM_Locked_re <= not MMCM_Locked_d and MMCM_Locked;

编辑 1

当然,您还可以通过定义一些 FF 函数(这仍然是可综合的!)为这个单行 D-FF 添加启用。

-- d-flipflop with reset and enable
function ffdre(q : STD_LOGIC; d : STD_LOGIC; rst : STD_LOGIC := '0'; en : STD_LOGIC := '1') return STD_LOGIC is
begin
return ((d and en) or (q and not en)) and not rst;
end function;

function ffdre(q : STD_LOGIC_VECTOR; d : STD_LOGIC_VECTOR; rst : STD_LOGIC := '0'; en : STD_LOGIC := '1') return STD_LOGIC_VECTOR is
begin
return ((d and (q'range => en)) or (q and not (q'range => en))) and not (q'range => rst);
end function;

-- d-flipflop with set and enable
function ffdse(q : STD_LOGIC; d : STD_LOGIC; set : STD_LOGIC := '0'; en : STD_LOGIC := '1') return STD_LOGIC is
begin
return ((d and en) or (q and not en)) or set;
end function;

-- t-flipflop with reset and enable
function fftre(q : STD_LOGIC; rst : STD_LOGIC := '0'; en : STD_LOGIC := '1') return STD_LOGIC is
begin
return ((not q and en) or (q and not en)) and not rst;
end function;

-- rs-flipflop with dominant rst
function ffrs(q : STD_LOGIC; rst : STD_LOGIC := '0'; set : STD_LOGIC := '0') return STD_LOGIC is
begin
return (q or set) and not rst;
end function;

-- rs-flipflop with dominant set
function ffsr(q : STD_LOGIC; rst : STD_LOGIC := '0'; set : STD_LOGIC := '0') return STD_LOGIC is
begin
return (q and not rst) or set;
end function;

例子:

mySignal_d <= ffdre(q => mySignal_d, d => mySignal, en => myEnable) when rising_edge(Clock);

关于VHDL 短格式触发上升沿 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27229600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com