fanatik 0 21 марта, 2013 Опубликовано 21 марта, 2013 (изменено) · Жалоба Начинаю изучать vhdl. На картинке для примера я изобразил схемку которую хочу описать. Она состоит из двух триггеров, инвертора и элемента 2и. Что бы самому не описывать работу этих элементов решил использовать библиотеки из Quartus. Но у меня возникли сложности с ними. Выходы параметризованных модулей имеют разный тип. Как решить эту проблему? И как это сделать грамотно? Вот мой код. library ieee; use ieee.std_logic_1164.all; library lpm; use lpm.lpm_components.all; entity progect is port( vhod_1 : in std_logic_vector(0 downto 0); vhod_2 : in std_logic_vector(0 downto 0); clk : in std_logic; outp : out std_logic_vector(0 downto 0)); end progect; architecture struct of progect is signal a : std_logic_vector(0 downto 0); signal b : std_logic_vector(0 downto 0); signal c : std_logic_vector(0 downto 0); begin g1 : lpm_ff generic map (lpm_width => 1) port map (data => vhod_1, clock => clk, q => a); g2 : lpm_inv generic map (lpm_width => 1) port map (data => a, result => b); g3 : lpm_ff generic map (lpm_width => 1) port map (data => vhod_2, clock => clk, q => c); g4 : lpm_and generic map (lpm_width => 1, lpm_size => 2) port map (data(0) => b, data(1) => c, result => outp); -- в 24-й строке выдает ошибку: Error (10382): VHDL error at progect.vhd(24): index of object of array type STD_LOGIC_2D must have 2 dimensions end struct; Изменено 21 марта, 2013 пользователем fanatik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sekat 0 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба Начинаю изучать vhdl. На картинке для примера я изобразил схемку которую хочу описать. Она состоит из двух триггеров, инвертора и элемента 2и. Что бы самому не описывать работу этих элементов решил использовать библиотеки из Quartus. Но у меня возникли сложности с ними. Выходы параметризованных модулей имеют разный тип. Как решить эту проблему? И как это сделать грамотно? Жуть. Зачем описывать через lpm примитивные функции. Обычно так реализуют только схемный ввод. Вы уже на 3-х элементах получили практически нечитаемый исходник. Может лучше эти функции реализовать вот так? process (clk) begin if rising_edge(clk) then a<=vhod1; b<=vhod2; end if; outp<=c and not b; end process 3 строки функционала и все сразу понятно и работает. Используйте библиотеки для каких-нибудь сложных функций - PLL, умножители и т.д., эквивалент которых реализован в проприетарных конструкциях FPGA производителя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба решил использовать библиотеки из Quartus. Для таких простых вещей в Квартусе есть шаблоны. Они Вам и нужны... Если не знаете, где их искаить, то поситайте у меня на сайте в статьях "Краткий Курс", раздел о "аппарано-независимой" (кажется там)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
crono 0 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба Жуть. Зачем описывать через lpm примитивные функции. Обычно так реализуют только схемный ввод. Вы уже на 3-х элементах получили практически нечитаемый исходник. Может лучше эти функции реализовать вот так? process (clk) begin if rising_edge(clk) then a<=vhod1; b<=vhod2; end if; outp<=c and not b; end process 3 строки функционала и все сразу понятно и работает. Используйте библиотеки для каких-нибудь сложных функций - PLL, умножители и т.д., эквивалент которых реализован в проприетарных конструкциях FPGA производителя. К слову сказать, процесс написан неправильно. Похоже, тема списка чувствительности осталась неусвоенной:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sekat 0 22 марта, 2013 Опубликовано 22 марта, 2013 (изменено) · Жалоба К слову сказать, процесс написан неправильно. Похоже, тема списка чувствительности осталась неусвоенной:) Спасибо за здоровую критику. process (clk) begin if rising_edge(clk) then a<=vhod1; с<=vhod2; end if; outp<=c and not a; end process Да напутано с сигналами было. А при чем тут список чувствительности? Изменено 22 марта, 2013 пользователем Sekat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
crono 0 22 марта, 2013 Опубликовано 22 марта, 2013 (изменено) · Жалоба Она состоит из двух триггеров, инвертора и элемента 2и. Как правило стараются защелкивать в триггере выход схемы/узла/модуля. Соответственно, схему нужно изменить. Если Вашими терминами, то она должна состоять из инвертора, элемента 2и и одного триггера. Спасибо за здоровую критику. А если не так загадочно, а поподробнее? Да какие загадки. Если в списке чувствительности только тактовый сигнал, то вся логика должна находиться внутри if rising_edge(clk) then end if; все что находится за if rising_edge(clk)... end if; становится асинхронным, соответственно, либо в отдельный процесс и в список чувствительности все сигналы, которые влияют на выход. В данном случае сигнал c и сигнал a; Либо делать синхронным и вставлять внутрь if rising_edge(clk)... end if; А в том виде, в котором процесс написан он работать не будет. Ну уж если до конца, то process (clk) begin if rising_edge(clk) then outp <= vhod1 and not vhod2; end if; end process; Изменено 22 марта, 2013 пользователем crono Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sekat 0 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба все что находится за if rising_edge(clk)... end if; становится асинхронным, соответственно, либо в отдельный процесс и в список чувствительности все сигналы, которые влияют на выход. В данном случае сигнал c и сигнал a; Либо делать синхронным и вставлять внутрь if rising_edge(clk)... end if; А в том виде, в котором процесс написан он работать не будет. Ну уж если до конца, то process (clk) begin if rising_edge(clk) then outp <= vhod1 and not vhod2; end if; end process; Истинно так! То что было написано мною работать будет, но с задержкой на 1 такт, что безусловно является ошибкой и той самой ловушкой в списке чувствительности, с которой лучше не попадаться. Хотелось топикстартеру выдать VHDL код, наиболее близкий к его структурной схеме, однако поскольку в таком стиле никогда еще не писАл - то вот и попался. Есть еще вопрос начинающего - продолжу в своей теме. А топикстартеру посоветую как начинающий начинающему - начинайте изучение и освоение языка не перетягивая за собой схемное наследие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
crono 0 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба Истинно так! То что было написано мною работать будет, но с задержкой на 1 такт. У Вас есть уверенность - это хорошо. У меня нет. К тому же что такое "работать"? Если на модели как-то выходные сигналы поменялись в результате изменения входных - это еще не значит "работать". Для курсовой, может быть, и пойдет, а во что это выльется после работы синтезатора, я представить себе не могу, да и не хочу по той причине, что не сделаю так никогда. Но, думаю, вероятность того что поведение на модели и в ПЛИС будет различаться высока. Поэтому для меня то что было написано скорее не будет работать, чем будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба работать будет, но с задержкой на 1 тактНа полтакта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sekat 0 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба У Вас есть уверенность - это хорошо. У меня нет. К тому же что такое "работать"? Если на модели как-то выходные сигналы поменялись в результате изменения входных - это еще не значит "работать". Для курсовой, может быть, и пойдет, а во что это выльется после работы синтезатора, я представить себе не могу, да и не хочу по той причине, что не сделаю так никогда. Но, думаю, вероятность того что поведение на модели и в ПЛИС будет различаться высока. Поэтому для меня то что было написано скорее не будет работать, чем будет. С практической точки зрения Вы безусловно правы. Если есть возможность обойти рискованные места - лучше их обойти заранее, чем потом собирать проблемы. Однако, есть и другая сторона. С точки зрения правил языка, как должна работать данная конструкция? И почему, если на нее распространяются эти правила языка, ее не сможет правильно собрать синтезатор? Одно дело, если он скажет - не могу, извини и выдаст ошибку. Другое дело, если он втихаря соберет что-то, что работать не будет. Судя по вашему описанию вы полагаете именно второй вариант развития событий? На полтакта. Симулятор действительно выдает задержку на полтакта. А почему? Ведь в списке чувствительности только rising_edge? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
crono 0 22 марта, 2013 Опубликовано 22 марта, 2013 (изменено) · Жалоба А почему? Ведь в списке чувствительности только rising_edge? В списке чувствительности clk. Процесс срабатывает на каждое изменение сигналов в списке чувствительности и на положительный фронт и на отрицательный. Изменено 22 марта, 2013 пользователем crono Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sekat 0 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба В списке чувствительности clk Истинно так. К концу рабочего дня и тем более недели мозг устает! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fanatik 0 4 апреля, 2013 Опубликовано 4 апреля, 2013 · Жалоба Вроде разобрался как использовать библиотеку lpm в проекте. теперь возникла загвоздка в другом, не пойму, как сформировать одиночный импульс по переднему фронту входного сигнала, что бы он был синфазный с глобальными тактами? Точнее получилось сформировать одиночный импульс длительностью в один такт глобальной частоты при помощи задержки на триггере, но его передний фронт не совпадает с передним фронтом тактов. Может есть какой-то устоявшийся прием для реализации такой функции? :1111493779: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться