titus 0 17 августа, 2006 Опубликовано 17 августа, 2006 (изменено) · Жалоба Собственно сам код: 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. Почему опретор присваивания значения сигналу в теле процесса называют последовательным? Ведь благодаря механизму дельта-задержек он по сути является параллельным? Проясните, пожалуйста, данные непонятки. Изменено 17 августа, 2006 пользователем Titus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 августа, 2006 Опубликовано 17 августа, 2006 · Жалоба Собственно сам код: 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 по сути сдвиговый регистр который каждый такт будет сдвигаться в сторону А, и заполняться сигналами с Д. надеюсь понятно что я имел ввиду:)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 17 августа, 2006 Опубликовано 17 августа, 2006 (изменено) · Жалоба 1. по идее должен был бы выдать, но скорее всего выдаст его присинтезе, то есть если нажмете синтезировать, получитие еррор что оутимеет 2 источника. Первое -- это как бы дефолтовое значение. Но я так не пишу. 2, 3. По моему последовательный это :=, и вообще надо говорить про блокирующий и не блокирующий В VHDL нет блокирующего и не блокирующего. Это термины Верилога. допустим у нас есть целое а, б, ц и есть a<=b; c<=a; за один такт выполниться 2 присвоения одновременно, А нет никаких тактов... :) оператор <= как бы изображает соединение Д триггеров, у которых клок единый, а данные соединены по средствам <= А нет никаких тактов... :) Изменено 17 августа, 2006 пользователем andrew_b Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Asb 1 17 августа, 2006 Опубликовано 17 августа, 2006 · Жалоба По моему так: Процесс является неделимой единицей используемой при моделировании. Отсюда понятие дельта-задержки к операторам ВНУТРИ процесса неприменимо (а применимо ко всему процессу вцелом).Именно поэтому операторы внутри процесса называются последовательными, т.е выполняющимися при моделировании не параллельно, а друг за другом. Таким образом присваивание "out1 <= s1" в Вашем примере можно опустить - оно не на что не влияет. Что касается 2 вопроса - промежуточный сигнал вводят в том случае, если результат используется где-то еще в теле модуля, поскольку присваивание типа "x <= out1 and y" вызовет ошибку компиляции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
titus 0 17 августа, 2006 Опубликовано 17 августа, 2006 · Жалоба TO Golikov A: С этим я разобрался. В примере вы приводите примеры присваивания значений сигналам и переменным. Здесь все ясно. По моему так: Процесс является неделимой единицей используемой при моделировании. Отсюда понятие дельта-задержки к операторам ВНУТРИ процесса неприменимо (а применимо ко всему процессу вцелом).Именно поэтому операторы внутри процесса называются последовательными, т.е выполняющимися при моделировании не параллельно, а друг за другом. Таким образом присваивание "out1 <= s1" в Вашем примере можно опустить - оно не на что не влияет. TO Asb: Тогда вопрос такой, что буде в out1 после завершегия процесса, старое или новое значение S1? Ведь опраторы должны выполнятся последовательно? process (in1, in2) begin s1 <= in1 and in2; out1 <= s1; end process; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 17 августа, 2006 Опубликовано 17 августа, 2006 · Жалоба что буде в out1 после завершегия процесса, старое или новое значение S1? Ведь опраторы должны выполнятся последовательно? process (in1, in2) begin s1 <= in1 and in2; out1 <= s1; end process; А самому посмотреть? Квартус, например, из этого делает простой AND2(при этом выдает предупреждение, что сигнал используется внутрипроцесса, но не занесен в список чувствительности). То бишь, значениебудет новое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 августа, 2006 Опубликовано 17 августа, 2006 · Жалоба что буде в 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 подан, то есть последняя запись строиться... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rundll 0 17 августа, 2006 Опубликовано 17 августа, 2006 · Жалоба я думаю даже задержек распространения при такой записи не будет Это однозначно! по логике вроде как последняя запись должна сработать Я тож пробовал, у меня на выход последнее присвоение подается... А Вы симулировали во встроенном в ИСЕ симуляторе или, там скажем, в том же ModelSim'е? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksya 0 17 августа, 2006 Опубликовано 17 августа, 2006 (изменено) · Жалоба 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: Чё за фигня? А если оператор процесса убрать, то все нормально. Изменено 17 августа, 2006 пользователем maksya Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksya 0 17 августа, 2006 Опубликовано 17 августа, 2006 (изменено) · Жалоба Блин, фигня с инетом. Когда сообщение добавлял в браузере ошибка вылетала. Пару раз повторил, а оказалось, что запрос все-таки проходил. 2 модераторы: удалите пожалуйста лишние сообщения. Я бы и сам это сделал, если была бы возможность. Изменено 17 августа, 2006 пользователем maksya Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksya 0 18 августа, 2006 Опубликовано 18 августа, 2006 · Жалоба Потестировал сегодня код в своем PostScriptum. Вообщем если в список чувствительности добавить s1, то моделируется нормально (элемент "И"). Выводы наверное буду позже делать, т.к. подошло время обедать :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
titus 0 18 августа, 2006 Опубликовано 18 августа, 2006 · Жалоба Чего-то я не понял. Здесь утверждают, что после процесса process (in1, in2) begin s1 <= in1 and in2; out1 <= s1; end process; out1 будет содержать новые значения. Но симулятор выдает как раз старое значение. По моему там должно быть как раз старое значение. Ведь при наступлении события, инициирующий процесс, используются значения сигналов, соответствующих моменту наступления этого события. Так что мне кажется,что Golikov A и andrew_b в данном случае не правы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 18 августа, 2006 Опубликовано 18 августа, 2006 · Жалоба Интересно наблюдать за дискуссией. Половина ответов по принципу: я этого не знаю, но сейчас расскажу. Есть же БИБИЛО. У Полякова на 36 странице все расписано: будет присвоено старое значение через бесконечно малое дельта Т. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 18 августа, 2006 Опубликовано 18 августа, 2006 (изменено) · Жалоба Так что мне кажется,что Golikov A и andrew_b в данном случае не правы. Да я тут вообще ни при чем. Я просто загнал этот код в Квартус и посмотрел результат синтеза. А вообще, пишите код так, чтобы никаких неоднозначностей не было, понеже симулятор и синтезатор могут понять вас по-разному. Изменено 18 августа, 2006 пользователем andrew_b Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksya 0 18 августа, 2006 Опубликовано 18 августа, 2006 · Жалоба Интересно наблюдать за дискуссией. Половина ответов по принципу: я этого не знаю, но сейчас расскажу.Это, извините, камень в чей огород? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться