последовательная против комбинаторной логики (Verilog и VHDL)

Верно ли, что следующие коды Code-1 и Code-2 эквивалентны в Verilog:

Код 1

always@(posedge Clock or B or C) 
 begin
   if (B)
    A <= 0;
   else if (C)
    A <= 1; 
 end 

Код 2

 always@(posedge Clock or B or C) 
 begin
   if (B)
    A <= 0;
   else if (C)
    A <= 1; 
   else
    A <= A;
 end 

Верно ли то же самое и в VHDL?

Код-3

process (clk, preset, reset) 
 begin  
  if (preset = ‘1’) then 
   ff <= ‘1’; 
  elsif (reset = ‘1’) then 
   ff <= ‘0’; 
  elsif (clk=’1’ and clk’event) then 
   ff <= ff_d; 
 endif; 
end process

Код-4

process (clk, preset, reset) 
 begin  
  if (preset = ‘1’) then 
   ff <= ‘1’; 
  elsif (reset = ‘1’) then 
   ff <= ‘0’; 
  elsif (clk=’1’ and clk’event) then 
   ff <= ff_d;
  else
   ff <= ff; 
 endif; 
end process

Можно ли также сказать, что Код-3 и Код-4 - это одно и то же?

Как насчет того же самого комбинаторной логики? Можно ли сказать, что следующее эквивалентно (пример Verilog)?

код-5

  always @ ( * ) begin
    if ( Trigger ) begin
      A = Pass ;
    end
  end

код-6

  always @ ( * ) begin
    if ( Trigger ) begin
      A = Pass ;
    end
    else begin 
     A = A;
    end
  end

Можно ли также сказать, что Код-5 и Код-6 - это одно и то же? ж


person Rudy01    schedule 12.03.2014    source источник
comment
Коды 3 и 4 одинаковы.   -  person user_1818839    schedule 12.03.2014
comment
Используйте always@(posedge Clock) НЕ always@(posedge Clock or B or C)   -  person Morgan    schedule 12.03.2014
comment
См. Этот вопрос для 1 против 2, с оговоркой, что, как указал Морган, вы никогда не должны писать свой код таким образом: stackoverflow.com/questions/11007729/   -  person nguthrie    schedule 12.03.2014
comment
Я думаю, что @ Rudy01 имел в виду использовать асинхронные коды установки / сброса 1 и 2; always@(posedge Clock or posedge B or posedge C)   -  person Greg    schedule 12.03.2014
comment
Связанный вопрос: лучший способ кодирования D-триггера. Этот вопрос также включает vhdl, так что это не полный дубликат.   -  person Greg    schedule 12.03.2014
comment
@Greg: Мне всегда было интересно, что произойдет, если мы упустим какое-то условие. Я всегда кодировал асинхронную установку / сброс, как и код 3, однако я думаю, что код 4 - это то, что на самом деле реализует инструмент (правильно ли это)! Я предполагаю, что каждый раз, когда условие отсутствует, инструмент будет удерживать значение сигнала, независимо от того, является ли это последовательным или комбинаторным процессом! Но это было бы нормально в последовательном процессе, потому что это процесс, чувствительный к EDGE, однако это не будет нормально в комбинаторном процессе, поскольку он чувствителен к уровню!   -  person Rudy01    schedule 12.03.2014


Ответы (2)


  1. Код-1 и Код-2 одинаковы, но беспорядочно.
  2. Брайан Драммонд ответил, что Код-3 и Код-4 одинаковы.
  3. Код 5 и Код 6 одинаковы, и оба содержат одну и ту же ошибку.

Code-1 и Code-2 на основе обновленных комментариев Грега
Использование always@(posedge Clock or B or C) беспорядочно, потому что оно сочетает запуск по фронту и запуск по уровню.

Вам может понадобиться комбинаторный блок always @*, * дает вам автоматически составляемый список чувствительности (меньше ошибок, проще рефакторинг). Во время обучения иногда возникает идея целенаправленно предоставить неполный список чувствительности, чтобы получить желаемое поведение моделирования, Не делайте этого для RTL. При синтезе вы получите поведение always @*.

Чтобы подразумевать последовательный или триггер, используйте срабатывание фронта, т. Е.

// Flip-flop sync or no reset
always @(posedge clk) begin 

//Flip-flop with async active-low reset.
always @(posedge clk or negedge rst_n) begin

//Flip-flop with asyn active-low reset and async set
always @(posedge clk or negedge rst_n or posedge set) begin

Как отметил Грег, по крайней мере, начиная с 2001 года, можно использовать , списки, разделенные запятыми, вместо or.

Code-5 и Code-6 подразумевают комбинаторные блоки, которые поддерживают состояние, подразумевающее защелку.

Защелки по своей сути не плохи, но требуют осторожности, поэтому случайные защелки часто вызывают беспокойство и вызывают множество ошибок.

Триггер - это две защелки, расположенные одна за другой с инверсией часов. Это означает, что только 1 из 2 защелок открыта в данной точке. Одна защелка при включении прозрачна.

Если защелка открыта и закрывается рядом с данными обновления (положение часов), неопределенность времени означает, что вы можете зафиксировать старые или новые данные.

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

person Morgan    schedule 12.03.2014
comment
Ладно, я понимаю. Код-5 и Код-6 плохи, так как создают защелку. Я также согласен с тем, что мне не следует использовать always @ (posedge Clock или B или C), а вместо этого мне придется разделять процессы, один из которых всегда имеет @ (posedge Clock), а другой всегда (B или C). Но я видел, как люди часто используют этот стиль кодирования, когда я смотрел на код других людей, и поэтому я подумал, что это лучший способ кодирования. Но, видимо, это не так. - person Rudy01; 12.03.2014
comment
Я просто хочу добавить, что коды 1 и 2 выводят беспорядочную логику, потому что B и C чувствительны к изменению значения, а не к краю. Синхронный набор / сброс должен быть always @(posedge Clock). Асинхронный always @(posedge Clock or posedge B or posedge C) или always @(posedge Clock, posedge B, posedge C). В IEEE Std 1364-2001, раздел 9.7.4 Событие или оператор, ключевое слово or или символ запятой (,) используется как логическое событие или оператор. Их комбинацию можно использовать в одном выражении события. Списки чувствительности, разделенные запятыми, должны быть синонимами списков чувствительности, разделенных запятыми. - person Greg; 12.03.2014
comment
@ Rudy01, не используйте always@(B or C), используйте вместо этого always @* или always @(*). Все три являются списками чувствительности для комбинированной логики, однако последние два - это саморазвивающиеся списки. Это обезопасит вас, если в списке должны быть указаны дополнительные сигналы. - person Greg; 12.03.2014
comment
@Greg не стесняйтесь редактировать мои ответы в будущем, если вы сможете улучшить или добавить к ним. Если я не согласен с редактированием, я всегда могу вернуться. Я не возражаю, если они станут вики сообществами, если они помогут создавать хорошие ответы. - person Morgan; 12.03.2014

Основной ответ на ваш вопрос верен как для VHDL, так и для Verilog. Если вы отслеживаете каждый возможный путь через свой «процесс» (и все, по сути, разлагается на «процесс» как в VHDL, так и в Verilog), и «сигнал» не назначается в одном или нескольких путях, то этот сигнал сохраняет свое значение. на этих путях. Это должно быть, потому что вы этого не сделали. Нет никакой разницы, если вы явно добавите назначение, в котором говорится: «назначить сигнал самому себе», потому что это то же самое, что и не назначать сигнал вообще (при условии, что ваш код не чувствителен к дельта-задержкам, вы не сделали ничего особенного с заданными вручную задержками и т. д.). Нет никакой разницы, интерпретируется ли процесс как синхронизированный или комбинаторный.

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

Сказав все это, вам нужно придерживаться обычных шаблонов синтеза, чтобы получить что-то, что, как вы знаете, будет синтезировать, как задумано, а не просто правильно моделировать. Также обратите внимание, что ваши фрагменты №1 и №2 бесполезны и не эквивалентны №3 / №4 - нет ввода данных. и в защелках нет ничего плохого, если ваш поток инструментов может с ними справиться (т. е. проводить с ними временной анализ). И вам не нужны все скобки в VHDL, используйте rising_edge и т. Д.

person EML    schedule 14.03.2014