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

проблема с lpm

Начинаю изучать vhdl. На картинке для примера я изобразил схемку которую хочу описать.

 

850480b935bf.jpg

 

Она состоит из двух триггеров, инвертора и элемента 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;

 

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

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


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

Начинаю изучать 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 производителя.

 

 

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


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

решил использовать библиотеки из 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 производителя.

К слову сказать, процесс написан неправильно. Похоже, тема списка чувствительности осталась неусвоенной:)

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


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

К слову сказать, процесс написан неправильно. Похоже, тема списка чувствительности осталась неусвоенной:)

 

Спасибо за здоровую критику.

 

process (clk)
begin
if rising_edge(clk) then
a<=vhod1;
с<=vhod2;
end if;
outp<=c and not a;
end process

 

Да напутано с сигналами было.

А при чем тут список чувствительности?

 

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

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


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

Она состоит из двух триггеров, инвертора и элемента 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;

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

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


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

все что находится за 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 код, наиболее близкий к его структурной схеме, однако поскольку в таком стиле никогда еще не писАл - то вот и попался.

Есть еще вопрос начинающего - продолжу в своей теме.

 

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

 

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


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

Истинно так! То что было написано мною работать будет, но с задержкой на 1 такт.

У Вас есть уверенность - это хорошо. У меня нет. К тому же что такое "работать"? Если на модели как-то выходные сигналы поменялись в результате изменения входных - это еще не значит "работать". Для курсовой, может быть, и пойдет, а во что это выльется после работы синтезатора, я представить себе не могу, да и не хочу по той причине, что не сделаю так никогда. Но, думаю, вероятность того что поведение на модели и в ПЛИС будет различаться высока. Поэтому для меня то что было написано скорее не будет работать, чем будет.

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


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

У Вас есть уверенность - это хорошо. У меня нет. К тому же что такое "работать"? Если на модели как-то выходные сигналы поменялись в результате изменения входных - это еще не значит "работать". Для курсовой, может быть, и пойдет, а во что это выльется после работы синтезатора, я представить себе не могу, да и не хочу по той причине, что не сделаю так никогда. Но, думаю, вероятность того что поведение на модели и в ПЛИС будет различаться высока. Поэтому для меня то что было написано скорее не будет работать, чем будет.

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

Однако, есть и другая сторона. С точки зрения правил языка, как должна работать данная конструкция? И почему, если на нее распространяются эти правила языка, ее не сможет правильно собрать синтезатор? Одно дело, если он скажет - не могу, извини и выдаст ошибку. Другое дело, если он втихаря соберет что-то, что работать не будет. Судя по вашему описанию вы полагаете именно второй вариант развития событий?

 

 

 

На полтакта.

Симулятор действительно выдает задержку на полтакта. А почему? Ведь в списке чувствительности только rising_edge?

 

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


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

А почему? Ведь в списке чувствительности только rising_edge?

В списке чувствительности clk. Процесс срабатывает на каждое изменение сигналов в списке чувствительности и на положительный фронт и на отрицательный.

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

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


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

В списке чувствительности clk

Истинно так. К концу рабочего дня и тем более недели мозг устает!

 

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


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

Вроде разобрался как использовать библиотеку lpm в проекте.

 

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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