Триггер срабатывает на фронте двух сигналов

StackOverflow https://stackoverflow.com/questions/1301673

  •  18-09-2019
  •  | 
  •  

Вопрос

Мне нужен триггер, который реагирует на фронты двух разных сигналов.Что-то вроде этого:

if(rising_edge(sig1)) then
    bit <= '0';
elsif(rising_edge(sig2)) then
    bit <= '1';
end if;

Существует ли такой шлепок или есть какой-то другой метод, который я мог бы использовать?Мне нужно, чтобы это можно было синтезировать на FPGA Xilinx Virtex-5.Спасибо

Это было полезно?

Решение

В этом случае я обычно сохраняю задержанную версию обоих управляющих сигналов и генерирую импульс шириной в один такт на нарастающем фронте каждого сигнала.Затем я использовал эти импульсы для управления крошечным автоматом, генерирующим «битовый» сигнал.Вот немного VHDL ниже.

--                                         -*-vhdl-*-
--  Finding edges of control signals and using the
-- edges to control the state of an output variable
--

library ieee;
use ieee.std_logic_1164.all;

entity stackoverflow_edges is
  port ( clk  : in std_ulogic;
     rst  : in std_ulogic;
     sig1 : in std_ulogic;
     sig2 : in std_ulogic;
     bito : out std_ulogic );

end entity stackoverflow_edges;

architecture rtl of stackoverflow_edges is

  signal sig1_d1  , sig2_d1   : std_ulogic;
  signal sig1_rise, sig2_rise : std_ulogic;

begin 

  -- Flops to store a delayed version of the control signals
  -- If the contorl signals are not synchronous with clk,
  -- consider using a bank of 2 delays and using those outputs
  -- to generate the edge flags
  delay_regs: process ( clk ) is 
  begin 
    if rising_edge(clk) then
      if rst = '1' then 
        sig1_d1 <= '0';
        sig2_d1 <= '0';
      else
        sig1_d1 <= sig1;
        sig2_d1 <= sig2;
      end if;
    end if;
  end process delay_regs;


  -- Edge flags
  edge_flags: process (sig1, sig1_d1, sig2, sig2_d1) is
  begin
    sig1_rise <= sig1 and not sig1_d1;
    sig2_rise <= sig2 and not sig2_d1;
  end process edge_flags;

  -- Output control bit
  output_ctrl: process (clk) is
  begin 
    if rst = '1' then
      bito <= '0';
    elsif sig1_rise = '1' then
      bito <= '1';
    elsif sig2_rise = '1' then
      bito <= '0';
    end if;
  end process output_ctrl;

end rtl;

Мне гораздо удобнее работать с verilog, поэтому дважды проверьте этот VHDL (любые комментарии приветствуются).

формы сигналов http://img33.imageshack.us/img33/893/stackoverflowvhdlq.png

В этом коде предполагается, что тактовый сигнал достаточно быстр, чтобы уловить все импульсы управляющего сигнала.Если сигналы управления не синхронизированы с часами, я бы оставил дальше задержанная версия задержанного управляющего сигнала (например, sig_d2) затем сделайте флаги из sig_d1 и sig_d2.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top