Почему неполные операторы if создают защелки во время синтеза в VHDL?

Почему, когда мы пытаемся синтезировать неполные операторы if в VHDL, синтезатор использует защелки вместо триггеров?

Объяснение с цифровой/схемной точки зрения было бы очень признательно.

IEEE Std 1076.6-2004 (синтез RTL, отозван) 6.2.1.1 Хранение, чувствительное к уровню, из процесса со списком чувствительности (или переменная) имеет явное назначение. б) Сигнал (или переменная) не имеет пути выполнения с <clock_edge> в качестве условия. в) Есть исполнения процесса, которые не выполняют явное назначение (через присвоение оператора) к сигналу (или переменной)». Присвоения удостоверений игнорируются. Обратите внимание на отсутствие края часов.

user1155120 19.07.2019 02:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
420
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Краткий ответ: потому что поведение защелки соответствует поведению неполной ЕСЛИ. А реестра нет.

if (A)
   B = C;

Если условие A истинно, а C изменяется, выход B следует сразу же за входом. Если A ложно, B сохраняет его значение. Такое поведение оператора IF соответствует поведению защелки. Таким образом, защелка - это то, что генерируется.

Вы не можете сгенерировать такое поведение с помощью регистра.

Постановка вопроса неверна. Защелка не предполагается вместо триггера.

Триггеры выводятся каждый раз, когда сигнал проходит через тактовый процесс, даже с неполным оператором IF. Например, следующий код выводит триггер:

process(clock) is
begin
   if rising_edge(clock) then
      if (A) then
         B <= C;
      end if;
   end if;
end process;

Защелки выводятся только в комбинаторных логических процессах, когда имеется неполный оператор IF. Это связано с тем, что неполный оператор if требует хранения информации, что невозможно с более простыми элементами комбинаторной логики (проводами и вентилями).

Регистры (и другая логика) выводятся (не создаются) из кода RTL. Создание экземпляра — это когда вы напрямую создаете экземпляр другого объекта. inst : entity work.dff port map (clk => clk, d=> d, q => q); и т. д.

Tricky 18.07.2019 22:30

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

Но в длинном ответе есть разные переменные: какой дизайн вы реализуете, какой инструмент вы используете и какая платформа является вашей целью.

Например. Quartus II 16.1, Cyclone V CSXFC6D6F31C6 такой код:

library ieee;
use ieee.std_logic_1164.all;

entity d_latch_test is
port 
(
    signal clk      : in std_logic;
    enable  : in std_logic;
    sr_in       : in std_logic;
    sr_out  : out std_logic
);

end entity;

architecture rtl of d_latch_test is

begin

process (clk)
begin
    if (rising_edge(clk)) then
        if (enable = '1') then
            sr_out <= sr_in;
        end if;
    end if;
end process;
end rtl;

Quartus Synthesis не скажет вам, что ваш код — защелка, но это D-триггер. Quartus RTL Viewer

Но! Он имеет асинхронный ввод.

Таким образом, вы можете сделать триггер из оператора if.

Другие вопросы по теме