2014-11-07 5 views
0

В моем кодировании, когда я пишу это утверждение, он моделируется, но не синтезируется. Зачем? Теперь, что я должен сделать, чтобы решить эту проблему ???Является ли rising_edge в VHDL синтезируемым

IF ((DS0='1' OR DS1='1')and rising_edge(DS0) and rising_edge(DS1) AND DTACK='1' AND BERR='1') THEN 
RV0 <= not RV; 
else 
RV0 <= RV; 

ответ

4

Самое важное, что нужно делать при проектировании FPGA, - это подумать об аппаратном обеспечении.

FPGA состоит из ряда аппаратных блоков с предопределенным набором входов и выходов - код, который вы пишете, должен иметь возможность сопоставлять эти блоки. Таким образом, даже если вы пишете синтаксически корректный код, это не значит, что он действительно может отображать на оборудовании под рукой.

Что ваш код пытается сделать это:

IF ((DS0='1' OR DS1='1')and rising_edge(DS0) and rising_edge(DS1) AND DTACK='1' AND BERR='1') THEN 
(...) 

Если DS0 и DS1 в настоящее время имеют нарастающий фронт (это означает, что они также как '1', делая первую часть с (DS='1' OR DS1='1') избыточностью), и если DTACK и BERR оба - 1, затем сделайте что-нибудь.

Для этого требуется входной блок, который принимает два тактовых входа (так как у вас есть два сигнала, которые вы хотите проверить для нарастающих фронтов одновременно), и такой блок не существует в какой-либо FPGA, с которой я столкнулся, - а также, как близко друг к другу, такие два события синхронизации должны рассматриваться как «одновременные»? Это не имеет смысла, если вы не укажете его в течение некоторого интервала, например, с помощью реального тактового сигнала реального времени (в смысле тактового сигнала, идущего на тактовый вход триггера), к образцу DS0 и DS1, как показано в Morten Zilmers.

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

В зависимости от среды среды IDE, которую вы используете, у вас может быть доступ к некоторым языковым шаблонам для проектирования различных блоков, которые могут помочь вам правильно описать доступные аппаратные блоки. В Xilinx ISE вы можете найти их в разделе «Редактирование»> «Языковые шаблоны», а затем, например, посмотрите на VHDL> «Конструкции синтеза»> «Примеры кодирования»> «Flip Flops».

+0

Я., я thnk U г вправо – Vaishali

2

В дополнение к хорошему ответу sonicwave о мышлении и синтезе на доступных элементов.

rising_edge функция обычно используется для обнаружения переднего фронта сигнала в , и синтез, как правило, используют этот сигнал в качестве входного сигнала часов к триггера или синхронное ОЗУ.

Если то, что вы хотите, чтобы обнаружить, когда оба DS0 и DS1 идет от '0' к '1' в «же» время, то такая проверка, как правило, на каждом нарастающем фронте в виде clock и обнаружении изменений удерживая значение от предыдущего восходящего clock.

код может выглядеть следующим образом:

... 
    signal CLOCK : std_logic; 
    signal DS0_PREV : std_logic; 
    signal DS1_PREV : std_logic; 
begin 
    process (CLOCK) is 
    begin 
    if rising_edge(CLOCK) then 
     if (DS0 = '1' and DS0_PREV = '0') and -- '0' to '1' change of DS0 
     (DS1 = '1' and DS1_PREV = '0') and -- '0' to '1' change of DS1 
     DTACK = '1' AND BERR = '1' then 
     RV0 <= not RV; 
     else 
     RV0 <= RV; 
     end if; 
     DS0_PREV <= DS0; -- Save value 
     DS1_PREV <= DS1; -- Save value 
    end if; 
    end process; 
...