Страница 1 из 1

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

Добавлено: Чт окт 28, 2010 21:55:51
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;
и заработало.

Поясните, чем неправилен первый подход?

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

Добавлено: Чт окт 28, 2010 22:05:37
Meteor
Насколько понимаю проблему ошибка Ваша в том что пытаетесь сдвигать вектор командой от микроконтроллера ror, среди идентификаторов такую в хдле не нашел...
Для организации сдвига необходимо описать цепочку Д-триггеров (замкнутое кольцо) с объединенными тактовыми входами. Тогад при подаче тактирования будет бежать в одном направлении.

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

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

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

К тому же - вероятно, вы не обратили внимания: в работающем варианте тоже используется ROR, и все работает, но там по-другому немного это все организовано (я же привел рабочий код).

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

Добавлено: Пт окт 29, 2010 00:43:53
SII
А полный код всего проекта можно?

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

Добавлено: Пт окт 29, 2010 01:18:51
Ra
Омг, мистика какая-то...
Я тот код затер, поэтому сейчас попробовал по памяти восстановить - заработало)

Всем спасибо за участие)

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

Добавлено: Пт окт 29, 2010 01:44:02
SII
Скорей всего, была какая-то глупая ошибка по невнимательности: сам пару раз на такое нарывался, но не смог вспомнить, в чём именно дело было, потому и попросил полный текст.

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

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