ПЛИС: почему нельзя сделать по-другому?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

Добрый вечер. Опять вопрос по плис.
Продолжаю вникать, сделать простенький проект: на вход идет клок (50 мгц), на выходе шина 8 бит - на светодиоды.
Сделал 24бит каунтер, которым понизил частоту до герца. Решил поморгать светодиодами. Все получилось нормально.

process(CLK) при достижении каунтером 50 000 000 дрыгал сигналом Tick, process(Tick) при Tick='1' выводил в леды (LEDs) вектор "11111111", при Tick='0' выводил туда "00000000".

Потом я решил проект усложнить, сделать бегущий огонек. И тут я совсем не понимаю логики. Сначала я объявил переменную LedState типа BIT_VECTOR = "10000000", в process(tick) написал такой код:

LedState:=LedState ror 1;
LEDs<=to_stdLogicVector(LedState);

Синтез прошел, а при генерации файла прошивки получил
ERROR:PhysDesignRules:368 - The signal <LED_NET<0>_OBUF> is incomplete. The
signal is not driven by any source pin in the design.

ERROR:PhysDesignRules:10 - The network <LED_NET<0>_OBUF> is completely unrouted.
(такой эррор для всех ледов, остальные строки опускаю, ибо только номером леда отличаются)

Бился, бился - не могу понять в чем дело. Попробовал ради эксперемента сделать не переменную а сигнал, потом сделал его типом интежер и хотел привести инт к вектору и выводить на леды бинарное значение как conv_std_logic_vector(LedState,8) - то же самое.

Потом переписал код в виде

Код: Выделить всё

--Работающий код!
process(Tick)
 begin
 
	if rising_edge(Tick) then
	LedState<=LedState ror 1;
		for i in 0 to 7 loop
			if(LedState(i)='1') then
				LEDs(i)<='1';
			else
				LEDs(i)<='0';
			end if;
		end loop;
	end if;
end process;
и заработало.

Поясните, чем неправилен первый подход?
Последний раз редактировалось Ra Чт окт 28, 2010 22:20:05, всего редактировалось 2 раза.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Насколько понимаю проблему ошибка Ваша в том что пытаетесь сдвигать вектор командой от микроконтроллера ror, среди идентификаторов такую в хдле не нашел...
Для организации сдвига необходимо описать цепочку Д-триггеров (замкнутое кольцо) с объединенными тактовыми входами. Тогад при подаче тактирования будет бежать в одном направлении.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Реклама
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

Meteor, ну что вы, ROR находится в одной из подключаемых библиотек, во всех книжках есть...
Правда, в книжках сказано что операндом может являться как BIT_VECTOR, так и STD_LOGIC_VECTOR, но на второй он у меня почему то ругается при синтезе, говоря что неправильный операнд (это мне тоже непонятно).

Да и потом, я же сказал, в конце я, отчаявшись, решил что дело-таки в ROR, и заменил его просто инкрементом интежера, с конвертом этого интежера потом таким образом: conv_std_logic_vector(LedState,8) и записью получившегося вектора в LEDs
это вызвало такую же ошибку.

К тому же - вероятно, вы не обратили внимания: в работающем варианте тоже используется ROR, и все работает, но там по-другому немного это все организовано (я же привел рабочий код).
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

А полный код всего проекта можно?
Реклама
Эиком - электронные компоненты и радиодетали
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

Омг, мистика какая-то...
Я тот код затер, поэтому сейчас попробовал по памяти восстановить - заработало)

Всем спасибо за участие)
Реклама
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

Скорей всего, была какая-то глупая ошибка по невнимательности: сам пару раз на такое нарывался, но не смог вспомнить, в чём именно дело было, потому и попросил полный текст.
Реклама
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пт ноя 16, 2007 13:52:44
Откуда: Рига, Латвия

Сообщение Pe3ucTop »

Мда, а цыкл с какой частотой :)
Хотя с циклами мало дела имел, но по моему не правильно :
LedState:=LedState ror 1;
Операции сдвига кажется действуют только при присвоении типа : "<=" и не действуют при ":=".. могу и ошибаться - работаю с Verilog..
Может ещё "ror" работает только с std_ulogic и производныи этого типа..
В вашем случае советую попробовать:
LedState:=LedState(0) & LedState(7 downto 1); заметка "&" не функция "AND" , а "конкатенация" т.е. соединение/склеивание..
И вопрос, а переменные у вас где-то определяются ??
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»