سؤال

أحتاج إلى فليب بالتخبط الذي يتفاعل على حواف إشارات مختلفة. شيء من هذا القبيل:

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

هل توجد مثل هذه التقليب أو هل هناك بعض الأساليق الأخرى التي يمكنني استخدامها؟ أحتاج إلى أن يكون هذا مواعدا على xilinx virtex-5 fpga. شكرا

هل كانت مفيدة؟

المحلول

ما سأفعله عادة في هذه الحالة هو الاحتفاظ بإصدار متأخر من كل من إشارات التحكم وإنشاء نبض ساعة واحدة على حدة عرض كل إشارة. أود بعد ذلك استخدام هذه النبضات لقيادة FSM صغيرة لتوليد إشارة "بت". إليك بعض 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