Синтез HDL жалуется на отсутствие сигналов в списке чувствительности

Здравствуйте, у меня есть этот простой процесс VHDL (сгенерированный из кода MyHDL):

DIGIPOT_CONTROLLER_CONNECTCLOCK: process (delayedClock) is
begin
    if to_boolean(clkEn) then
        if to_boolean(delayedClock) then
            scl_d <= '0';
        else
            scl_d <= 'Z';
        end if;
    else
        if to_boolean(sclIdleValue) then
            scl_d <= 'Z';
        else
            scl_d <= '0';
        end if;
    end if;
end process DIGIPOT_CONTROLLER_CONNECTCLOCK;

Оригинальный код MyHDL:

@always(delayedClock)
def connectClock():
    if(clkEn):
        if(delayedClock):
            scl_d.next = False
        else:
            scl_d.next = None
    else:
        if(sclIdleValue):
            scl_d.next = None
        else:
            scl_d.next = False

В моделировании он работает отлично (как симулятор ISIM, так и MyHDL), но когда я пытаюсь синтезировать его в Spartan 6, он выдает следующие предупреждения: clken должен быть в списке чувствительности процесса sclidlevalue должен быть в списке чувствительности процесса

Насколько я понимаю, он каким-то образом сделал вывод, что этот процесс должен быть чувствителен к сигналам clkEn и sclIdleValue. Но, конечно, это не то, что я имел в виду. Я хочу, чтобы он менял вывод только тогда, когда delayedClock меняет свое состояние, а не когда clkEn или sclIdleValue меняют свои соответствующие состояния.

Это что-то, чего нельзя было сделать в архитектуре Spartan 6? Или я должен описать процесс иначе, чтобы иметь предполагаемое поведение?


person Bruno Kremel    schedule 04.04.2013    source источник
comment
delayedClock сигнал ваших часов? Если нет (что я предполагаю), как это зависит от вашего тактового сигнала? Если delayedClock не является тактовым сигналом, ваш процесс является комбинационным (в отличие от последовательного) процессом.   -  person simon    schedule 04.04.2013
comment
Это тактовая частота 100 кГц, сгенерированная в моем модуле I2C (этот код является частью модуля I2C) из тактовой частоты 150 МГц, задержанная на половину периода (разница между SCL и SDA). Проблема с этим в том, что мне нужно, чтобы он был чувствителен как к восходящему, так и к заднему фронту этого delayedClock... и, следовательно, он выводит комбинаторную логику...   -  person Bruno Kremel    schedule 04.04.2013
comment
То, что вы хотите, неясно: вы говорите, что я хочу, чтобы он менял вывод только тогда, когда delayedClock меняет свое состояние, но (а) при всех изменениях состояния? (b) когда другие сигналы меняются, когда delayedClock высокий? или (c) только на восходящем_крае (delayedClock)? Если (c), то, по крайней мере, вам нужно использовать функциюrising_edge, но есть еще одна проблема: clkEn false, есть несинхронизированные действия, которые НЕ БУДУТ правильно синтезироваться. Я бы сделал if Rising_edge(delayedClock) then ... самым внешним оператором.   -  person user_1818839    schedule 04.04.2013
comment
Брайан: Я думал, что смогу сделать процесс чувствительным как к переднему, так и к заднему фронту именно таким образом (что я не определяю рост/спад). Я мог бы обойти это, удвоив частоту delayedClock и имея чувствительность на нарастающем фронте. сигнал).. Для примечания.. в моделировании он работает по назначению, он оценивает процесс только тогда, когда задержанные часы растут или падают.   -  person Bruno Kremel    schedule 04.04.2013
comment
Если выходы процесса должны быть регистрами, это невозможно (по крайней мере, для архитектуры Spartan 6, в которой нет триггеров, чувствительных к двойному фронту). Если выходы процесса являются комбинационными, какой смысл иметь сигнал, который может изменяться с частотой 200 МГц, когда частота ваших внутренних часов составляет всего 100 МГц?   -  person simon    schedule 04.04.2013
comment
На самом деле, даже если он изменяется как по переднему, так и по заднему фронту, он создает сигнал с частотой 100 кГц ... clkEn и sclIdleValue предназначены только для создания условий запуска и остановки I2C. Как я уже сказал, это работает в моделировании, но я не мог понять, как переписать, так как он имеет такое же поведение после синтеза..   -  person Bruno Kremel    schedule 04.04.2013


Ответы (1)


Наконец-то я понял, что это результирующий код MyHDL:

@always(delayedClock.posedge, reset.posedge)
def connectClock():
    if(reset == 1):
        delayedClock_int.next = True
    else:
        delayedClock_int.next = not delayedClock_int
        if(clkEn):
            if(delayedClock_int):
                scl_d.next = False
            else:
                scl_d.next = None
        else:
            if(sclIdleValue):
                scl_d.next = None
            else:
                scl_d.next = False

и (сгенерированный) VHDL:

DIGIPOT_CONTROLLER_CONNECTCLOCK: process (delayedClock, reset) is
begin
    if (reset = '1') then
        delayedClock_int <= '1';
    elsif rising_edge(delayedClock) then
        delayedClock_int <= to_std_logic((not to_boolean(delayedClock_int)));
        if to_boolean(clkEn) then
            if to_boolean(delayedClock_int) then
                scl_d <= '0';
            else
                scl_d <= 'Z';
            end if;
        else
            if to_boolean(sclIdleValue) then
                scl_d <= 'Z';
            else
                scl_d <= '0';
            end if;
        end if;
    end if;
end process DIGIPOT_CONTROLLER_CONNECTCLOCK;

Мне пришлось сделать часы с задержкой в ​​два раза больше частоты (а затем разделить их на два в моем процессе connectClock), таким образом, он дает тот же результат, что и исходный процесс, и его можно синтезировать без предупреждения. Причина поэтапного отключения часов - это SCL I2C. форма волны, как показано здесь: введите здесь описание изображения

person Bruno Kremel    schedule 04.04.2013