Перейти к содержанию
    

Собственно сам код:

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity adder is
port (
   in1     : in     std_logic;
   in2     : in     std_logic;
   out1    : out         std_logic
);

end adder;

architecture abstract of adder is

signal s1: std_logic;

begin

process (in1, in2)
begin

    s1 <= in1 and in2;
    out1 <= s1;
    out1 <= in1;

end process;

end abstract;

 

Вопросы:

1. Цитата из книги: "Для каждого сигнала в теле процесса может стоять только один оператор присваивания значения (только один источник)." - Почему не выдается ошибки при компиляции? Ведь я присваиваю сигналу out1 два разных значения?

 

2. Зачем вводят вспомогательный сигнал s1? Почему нельзя просто без процесса написать

out1 <= in1 and in2;

 

3. Почему опретор присваивания значения сигналу в теле процесса называют последовательным? Ведь благодаря механизму дельта-задержек он по сути является параллельным?

 

Проясните, пожалуйста, данные непонятки.

Изменено пользователем Titus

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно сам код:

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity adder is
port (
   in1     : in     std_logic;
   in2     : in     std_logic;
   out1    : out         std_logic
);

end adder;

architecture abstract of adder is

signal s1: std_logic;

begin

process (in1, in2)
begin

    s1 <= in1 and in2;
    out1 <= s1;
    out1 <= in1;

end process;

end abstract;

 

Вопросы:

1. Цитата из книги: "Для каждого сигнала в теле процесса может стоять только один оператор присваивания значения (только один источник)." - Почему не выдается ошибки при компиляции? Ведь я присваиваю сигналу out1 два разных значения?

 

2. Зачем вводят вспомогательный сигнал s1? Почему нельзя просто без процесса написать

out1 <= in1 and in2;

 

3. Почему опретор присваивания значения сигналу в теле процесса называют последовательным? Ведь благодаря механизму дельта-задержек он по сути является параллельным?

 

Проясните, пожалуйста, данные непонятки.

 

 

1. по идее должен был бы выдать, но скорее всего выдаст его при синтезе, то есть если нажмете синтезировать, получитие еррор что оут имеет 2 источника.

 

2, 3. По моему последовательный это :=, и вообще надо говорить про блокирующий и не блокирующий

 

смысл такой

 

допустим у нас есть целое а, б, ц

и есть

a<=b;

c<=a;

 

и

a:=b

c:=a

 

что будет в первом случае и во втором.

 

в первом

 

за один такт выполниться 2 присвоения одновременно, но в C будет записано состояние А до фронта, при этом в А будет записано состояние Б до фронта. То есть С сохранит как бы старое значение А, а А сохранит старое значение Б, на случай если Б вы в этом такте тоже измените.

 

во второй конструкции

 

в С будет присвоено А, но только после того как в А присвоится Б, то есть во втором случае А, Б, Ц будут иметь одно и тоже значение.

 

 

оператор <= как бы изображает соединение Д триггеров, у которых клок единый, а данные соединены по средствам <=. И поэтому

a<=b

b<=c

c<=d

 

по сути сдвиговый регистр который каждый такт будет сдвигаться в сторону А, и заполняться сигналами с Д.

 

 

надеюсь понятно что я имел ввиду:)...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. по идее должен был бы выдать, но скорее всего выдаст его присинтезе, то есть если нажмете синтезировать, получитие еррор что оутимеет 2 источника.

Первое -- это как бы дефолтовое значение. Но я так не пишу.

2, 3. По моему последовательный это :=, и вообще надо говорить про блокирующий и не блокирующий

 

В VHDL нет блокирующего и не блокирующего. Это термины Верилога.

 

допустим у нас есть целое а, б, ц

и есть

a<=b;

c<=a;

 

за один такт выполниться 2 присвоения одновременно,

А нет никаких тактов... :)

 

оператор <= как бы изображает соединение Д триггеров, у которых клок единый, а данные соединены по средствам <=

А нет никаких тактов... :)

Изменено пользователем andrew_b

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По моему так:

Процесс является неделимой единицей используемой при моделировании. Отсюда понятие дельта-задержки к операторам ВНУТРИ процесса неприменимо (а применимо ко всему процессу вцелом).Именно поэтому операторы внутри процесса называются последовательными, т.е выполняющимися при моделировании не параллельно, а друг за другом. Таким образом присваивание "out1 <= s1" в Вашем примере можно опустить - оно не на что не влияет.

Что касается 2 вопроса - промежуточный сигнал вводят в том случае, если результат используется где-то еще в теле модуля, поскольку присваивание типа "x <= out1 and y" вызовет ошибку компиляции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

TO Golikov A:

С этим я разобрался. В примере вы приводите примеры присваивания значений сигналам и переменным. Здесь все ясно.

 

 

 

По моему так:

Процесс является неделимой единицей используемой при моделировании. Отсюда понятие дельта-задержки к операторам ВНУТРИ процесса неприменимо (а применимо ко всему процессу вцелом).Именно поэтому операторы внутри процесса называются последовательными, т.е выполняющимися при моделировании не параллельно, а друг за другом. Таким образом присваивание "out1 <= s1" в Вашем примере можно опустить - оно не на что не влияет.

 

TO Asb:

Тогда вопрос такой, что буде в out1 после завершегия процесса, старое или новое значение S1? Ведь опраторы должны выполнятся последовательно?

process (in1, in2)
begin

    s1 <= in1 and in2;
    out1 <= s1;
    
end process;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что буде в out1 после завершегия процесса, старое или новое значение S1? Ведь опраторы должны выполнятся последовательно?

process (in1, in2)
begin

    s1 <= in1 and in2;
    out1 <= s1;
    
end process;

А самому посмотреть? Квартус, например, из этого делает простой AND2(при этом выдает предупреждение, что сигнал используется внутрипроцесса, но не занесен в список чувствительности). То бишь, значениебудет новое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что буде в out1 после завершегия процесса, старое или новое значение S1? Ведь опраторы должны выполнятся последовательно?

process (in1, in2)
begin

    s1 <= in1 and in2;
    out1 <= s1;
    
end process;

А самому посмотреть? Квартус, например, из этого делает простой AND2(при этом выдает предупреждение, что сигнал используется внутрипроцесса, но не занесен в список чувствительности). То бишь, значениебудет новое.

 

 

ой эт я и впрямь лажанулся чет... клоков то и вправду нет...

 

 

тогда однозначно

при записи

 

s1 <= in1 and in2;

out1 <= s1;

 

в оут1, будет записан in1 and in2. то есть новое значение s1. это же просто схема соединенная проводками. я думаю даже задержек распространения при такой записи не будет... ( я имею ввиду задержки между тем как с станет равно анду и выход станет равен с, то есть анду)

один только момент, что делать с двойным присвоением сигнала?

при записи

 

s1 <= in1 and in2;

out1 <= s1;

out1 <= in1;

 

по логике вроде как последняя запись должна сработать, но схема не однозначна! Проверил в ИСЕ, и правда синтезиться без ошибок и варнингов, но симулиться не хочет, а если посмотреть РТЛ то там просто ин1 на оут1 подан, то есть последняя запись строиться...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я думаю даже задержек распространения при такой записи не будет

 

Это однозначно!

 

по логике вроде как последняя запись должна сработать

Я тож пробовал, у меня на выход последнее присвоение подается... А Вы симулировали во встроенном в ИСЕ симуляторе или, там скажем, в том же ModelSim'е?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Цитата из книги: "Для каждого сигнала в теле процесса может стоять только один оператор присваивания значения (только один источник)." - Почему не выдается ошибки при компиляции? Ведь я присваиваю сигналу out1 два разных значения?

Что за книга? Сейчас лениво лезть в стандарт, попробую обойтись собственным мозгом...

 

Для начала необходимо отметить различие оператора последовательного присвоения сигналу и оператора параллельного присвоения сигналу (хотя для обоих операторов запись выглядит одинаково - <=). Оператор последовательного присвоения сигналу, как впрочем и любой другой последовательный оператор VHDL, подобен операторам традиционных языков программирования. Операторы этого типа обязательно вложены в оператор process или подпрограмму и выполняются последовательно друг за другом в порядке записи. Результаты исполнения последовтельных операторов недоступны прочим программным модулям по крайней мере до того, как будет выполнен оператор ожидания wait, или не будут выполнены до конца все процессы, инициированные общим событием (записанным в списке чувствительности). Это можно трактовать так, что с точки зрения окружения все операторы, в теле процесса исполняются одномоментно (нечто подобное в своем сообщении написал Asb). Исполнение параллельных операторов инициируется не по последовательному, а по событийному принципу, т.е. они исполняются тогда, когда реализация других операторов программы создала условия для их исполнения.

 

Теперь практическое занятие :) - уберите из кода оператор процесса:

architecture abstract of adder is
   signal s1: std_logic;
begin

   s1 <= in1 and in2;
   out1 <= s1;
   out1 <= in1;

end abstract;

Компилятор обязательно матюгнется чем-то вроде: "Error (10031): Net "s1" at adder.vhd(27) is already driven by input port "in1", and cannot be driven by another signal".

 

Често сказать не знаю, почему компилятор Quartus'а отлавливет только ситуацию с параллельными операторами присвоения сигналов (ModelSim, к слову сказать, молчит и в том и в другом случае). Ну так это на совести производителя EDA. А если хотите докопаться до истины и обратиться с жалобой в гаагский суд, то поищите в IEEE 1076 нечто вроде Sequential Statement + signal.

 

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

 

2. Зачем вводят вспомогательный сигнал s1? Почему нельзя просто без процесса написать

out1 <= in1 and in2;

 

В данном случае просто для того, чтобы код пообъемнее выглядел :) . Но вот скажем, если написать как-то так :

if RISING_EDGE( clock ) then
   s1 <= in1 and in2;
   out1 <= s1;
end if;

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

 

3. Почему опретор присваивания значения сигналу в теле процесса называют последовательным? Ведь благодаря механизму дельта-задержек он по сути является параллельным?

Блин, Я бы щас расписал, но кончаются чернила в клавиатуре (особенно на клавише 'а'). Вообщем если ситуация не прояснилась после прочтения ответа н первый вопрос, то читайте "Проектирование систем на микросхемах программируемой логики", Грушвицкий, Мурсаев,Угрюмов > Глава 3

 

По моему последовательный это :=

:= - это последовательный оператор присвоения переменной

 

оператор <= как бы изображает соединение Д триггеров, у которых клок единый, а данные соединены по средствам <=

А нет никаких тактов... :)

Во-во, "... а есть только одно сплошное глобальное гонево с понтом где-то что-то есть. А на самом деле нигде ничего нету. Вот, врубись мужик как клево - нигде вообще совсем ничего нету..." (Дмитрий Гайдуков, про войну) :)

 

 

 

P.S.: В процессе тестирования исходного кода напоролся на интересную вещь - ModelSim как-то странно интерпретирует вот этот код

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity adder is
port (
   in1     : in     std_logic;
   in2     : in     std_logic;
   out1    : out    std_logic
);
end adder;

architecture abstract of adder is

   signal s1: std_logic;

begin

process (in1, in2)
begin

    s1 <= in1 and in2;
    out1 <= s1;

end process;

end abstract;

 

LIBRARY IEEE;
    USE IEEE.std_logic_1164.all;

ENTITY adder_tb IS
END adder_tb;

ARCHITECTURE rus OF adder_tb IS

component adder
port (
   in1     : in     std_logic;
   in2     : in     std_logic;
   out1    : out         std_logic
);
end component;

signal s_in1, s_in2, s_out1 : std_logic;

BEGIN

inst: adder
port map(s_in1, s_in2, s_out1);

s_in1 <= '0', '1' after 10 ns;
s_in2 <= '1', '0' after 50 ns, '1' after 100 ns;

END rus;

Вместо И почему-то на времянке отображается И-НЕ :blink: Чё за фигня?

post-562-1155840879_thumb.jpg

А если оператор процесса убрать, то все нормально.

post-562-1155840894_thumb.jpg

Изменено пользователем maksya

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин, фигня с инетом. Когда сообщение добавлял в браузере ошибка вылетала. Пару раз повторил, а оказалось, что запрос все-таки проходил.

 

2 модераторы: удалите пожалуйста лишние сообщения. Я бы и сам это сделал, если была бы возможность.

Изменено пользователем maksya

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потестировал сегодня код в своем PostScriptum. Вообщем если в список чувствительности добавить s1, то моделируется нормально (элемент "И"). Выводы наверное буду позже делать, т.к. подошло время обедать :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чего-то я не понял.

Здесь утверждают, что после процесса

process (in1, in2)
begin

    s1 <= in1 and in2;
    out1 <= s1;
    
end process;

 

out1 будет содержать новые значения. Но симулятор выдает как раз старое значение.

 

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

 

Так что мне кажется,что Golikov A и andrew_b в данном случае не правы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересно наблюдать за дискуссией. Половина ответов по принципу: я этого не знаю, но сейчас расскажу.

Есть же БИБИЛО. У Полякова на 36 странице все расписано: будет присвоено старое значение через бесконечно малое дельта Т.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так что мне кажется,что Golikov A и andrew_b в данном случае не правы.

Да я тут вообще ни при чем. :biggrin: Я просто загнал этот код в Квартус и посмотрел результат синтеза.

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

Изменено пользователем andrew_b

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересно наблюдать за дискуссией. Половина ответов по принципу: я этого не знаю, но сейчас расскажу.
Это, извините, камень в чей огород?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...