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

Вопрос практикам по CYCLONE V

11 minutes ago, RobFPGA said:

Это  тоже типичная ошибка.   Быстрое "решение" без анализа требований к системе и реальных возможностей их исполнения.  

При 10 ns цикле на входе и внутреннем (асинхронном) такте 4 ns нельзя гарантировать выполнение требований устранения метастабильности и выделении фронта за требуемое время цикла.   :unknw:

Удачи!  Rob.

Это я уже понял, что имею дело с метастабильностью!

7 minutes ago, Yuri124 said:

... Только отметить это в констрейнах.

Эх...   Где бы глянуть как эта магия творится?   Нигде толком не описано.

Хотя бы перечислите перечень, в каких констрейнах искать ответ!...

Спасибо!

10 minutes ago, Yuri124 said:

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

Формально временная диаграмма проста.  Все сигналы устанавливаются заранее.  И только  WR и RD самые короткие  внутри CS

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


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

Приветствую! 

5 minutes ago, Мур said:

Эх...   Где бы глянуть как эта магия творится? 

Эмм...  Эта магия творится в голове разработчика  :biggrin:  
О каких  констрейнах может идти речь если нет полного понимания типа интерфейса,  времянок на нем,  и реализации интерфейса в FPGA?
 

Успехов! Rob.

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


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

А нельзя ли ограничить частоту - не 250МГц, а 3-кратная к 75МГц? У Вас раньше всё работало на синхронной шине - т.е. было внутри и снаружи по 75 МГц + фазовый синхронизм клоков был обеспечен? - если я правильно понял из предыдущего материала.

Если засинхронизировать внешний и внутренние клоки - тогда , возможно, получится без выделения фронта (т.е. без необходимости иметь 3 такта внутр. частоты на длительность строба) корректно переправить данные в ПЛИС.

13 minutes ago, Мур said:

в каких констрейнах искать ответ

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

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


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

32 minutes ago, RobFPGA said:

Эмм...  Эта магия творится в голове разработчика  :biggrin:  
О каких  констрейнах может идти речь если нет полного понимания типа интерфейса,  времянок на нем,  и реализации интерфейса в FPGA?

Это понятно.  

Читал несколько раз книгу в стиле варшавского университета  и стал применять простые констрейны, без которых вообще *опа!

https://rusneb.ru/catalog/000199_000009_010366499/

А вот мелкие кружева не прочувствовал...

Был бы материал в стиле,- вот такая задача\проблема и её решаем вот так...   И так по основным приемам.  ...Вот было,- вот стало!

26 minutes ago, Yuri124 said:

А нельзя ли ограничить частоту - не 250МГц, а 3-кратная к 75МГц? У Вас раньше всё работало на синхронной шине - т.е. было внутри и снаружи по 75 МГц + фазовый синхронизм клоков был обеспечен? - если я правильно понял из предыдущего материала.

Был такой  план. Думал, что подстрою фазы двух PLL .  Только на практике  все смешалось в несколько тактирований. И частоты в итоге не кратны....

Поменяли MCU на 200МГц

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


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

18 minutes ago, Мур said:

Был такой  план. Думал, что подстрою фазы двух PLL .  Только на практике  все смешалось в несколько тактирований. И частоты в итоге не кратны....

Поменяли MCU на 200МГц

Ну, так и в ПЛИС сделайте 200 МГц

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


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

10 minutes ago, dimka76 said:

Ну, так и в ПЛИС сделайте 200 МГц

Ясный пень...

...Тут стоит не забывать дополнительный джиттер, потому как в прототипе тактированием ПЛИС занимался MCU.

Сейчас общий генератор в 25МГц и у каждого свой PLL.  А это более жесткие требования на питание PLL (говорил же схемотехникам,- аналоговый стабилизатор!  Поставили импульсный...:rtfm:)

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


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

У вам что-то очень критичное по времени по этому интерфейсу гонится? Растяните WE и RD на один или два такта.

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


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

4 minutes ago, andrew_b said:

У вам что-то очень критичное по времени по этому интерфейсу гонится? Растяните WE и RD на один или два такта.

Так это и делается!   Тут критично для DMA циклов

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


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

Приветствую!

1 hour ago, Мур said:

Так это и делается!   Тут критично для DMA циклов

Поэтому  еще раз  IMHO начинать надо с полного анализа  требование к интерфейсу, режимов работы, временных диаграмм. Затем оценка возможных реализаций в FPGA, с учетом физ. ограничений выбранной FPGA.  А уж потом реализация и  констрейны. 

 

Удачи! Rob.    

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


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

имхо брать асинхронную двухпортовку и портом А пытаться подключать её к ногам плис напрямую. в качестве тактовой надо смотреть какой из сигналов CE_b WR_b/RD брать в зависимости от конкретной реализации асинхронной шины в MCU

констрейнтами задавливать варианты, что тактирование может быть с "черезжопным" duty cycle. в случае успешного запуска прибивать RLOC-ами насмерть чтоб не шевелилось

чтение со стороны проца только по прерыванию, или когда оно там само захочет?

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


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

On 10/7/2021 at 12:58 PM, Мур said:

Предшественники писали так.  Я только поднял тактирование в 250МГц.  Раньше было 75МГц и был полный синхронизм с MCU


--======================================
-- пераллельная шина на запись
--======================================
process (CL250K)
begin
if (rising_edge(CL250K)) then
	if (cs = '0' and we = '0') then
		case (addr) is
			when "00000" => Control_r <= data_in;	--Управления модулем приемопередатчика
			when "00001" => BoudRate_r <= data_in; --Настройка скорости передачи и приема
			when "00011" => IER_r <= data_in;		--Разрешения прерываний
			when "00101" => IFCR_r <= data_in;		--Сброс флагов запроса прерываний
			when "00110" => 
						start_tx_bus <= data_in(0);--Управления передатчиком
			when "00111" => CntTx_r <= data_in;		
						res_fifo <= '1';				--Размер транзакции для передачи
			when "01000" => ControlRx_r <= data_in;   --Управление приемником
			when "01100" => TXBufControl_r <= data_in;--Выбора буфера передатчика
			when "01101" => T1_CMP_r <= data_in;--Компаратор времени окончания приема
			when "01110" => T2_CMP_r <= data_in;--Компаратор времени разрешения передачи
			when "01111" => wt_fifo_256 <= '1';
						data_fifo_tx<= data_in (7 downto 0);--Регистр FIFO записи в 256 байтный буфер передатчика 
			when "10001" => iwr_tx_fifo_4096 <= '1';		--Регистр FIFO записи в 4к байтный буфер передатчика
			when others => null;
		end case;
	else
		IFCR_r <= (others => '0');
		start_tx_bus <= '0';
		ControlRx_r(1) <= '0';
		wt_fifo_256 <= '0';
		iwr_tx_fifo_4096 <= '0';
		res_fifo <= '0';
		TXBufControl_r(1) <= iactive_sel;
		if (resControlR = '1') then
			TXBufControl_r(2) <= '0';
			TXBufControl_r(3) <= '0';
		end if;
	end if;
end if;
end process;

 

process (we, CS,iactive_sel, resControlR)

  begin

if ( CS = '1' ) then
		IFCR_r <= (others => '0');
		start_tx_bus <= '0';
		
		ControlRx_r(1) <= '0';
		wt_fifo_256 <= '0';
		iwr_tx_fifo_4096 <= '0';
		res_fifo <= '0';
		TXBufControl_r(1) <= iactive_sel;
		if (resControlR = '1') then
			TXBufControl_r(2) <= '0';
			TXBufControl_r(3) <= '0';
		end if;
elsif (rising_edge(we)) then
			case (addr) is
				when "00000" => Control_r <= data_in;	--Управления модулем приемопередатчика
				when "00001" => BoudRate_r <= data_in; --Настройка скорости передачи и приема
				when "00011" => IER_r <= data_in;		--Разрешения прерываний
				when "00101" => IFCR_r <= data_in;		--Сброс флагов запроса прерываний
				when "00110" => --ControlTx_r <= data_in;
							start_tx_bus <= data_in(0);--Управления передатчиком
				when "00111" => CntTx_r <= data_in;		
							res_fifo <= '1';				--Размер транзакции для передачи
				when "01000" => ControlRx_r <= data_in;   --Управление приемником
				when "01100" => TXBufControl_r <= data_in;--Выбора буфера передатчика
				when "01101" => T1_CMP_r <= data_in;--Компаратор времени окончания приема
				when "01110" => T2_CMP_r <= data_in;--Компаратор времени разрешения передачи
				when "01111" => wt_fifo_256 <= '1';
							data_fifo_tx<= data_in (7 downto 0);--Регистр FIFO записи в 256 байтный буфер передатчика 
				when "10001" => iwr_tx_fifo_4096 <= '1';		--Регистр FIFO записи в 4к байтный буфер передатчика
				
				when others => null;
			end case;
	end if;
end process;

Всех делов.....

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


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

Дааа.... Офигеть!

Произошла смена лидера и программист внешнего MCU ( 200 МГц ) оказался перфекционистом. Некий компромисс, который получился в итоге, (разгрузил на 60% параллельную шину дополнительным 100MHz SPI каналом от второго ядра MCU) абсолютно исключен!

Логика проста,- у нас на шине с FPGA висит не большая 16К* 16 RAM, которая работает в три раза быстрее (тайминги-задержки стробов WR RD это демонстрируют). ..."Должна работать, как внешняя RAM!"

Я, для полноты картины, внутрь своей ПЛИС добавил маленький RAM  512*16 . Фактически там только адресная защелка ( 200 МГц ). Выход памяти голый и на прямую выходит на сборку шины. Это только функция ИЛИ и тристабильный выход к MCU. Эксперимент показал, что тайминг дизайна держит 4 тика тактирования, а внутренняя RAM  только 3.  (Внешняя RAM ,- ноль!).  Получается слои логики на сборке шины от дизайна теряют дополнительный тик. Я предпринимал меры сокращения задержек на сборке по ИЛИ. Разница в один тик,- это не плохо, с учетом витиеватого дизайна....

Остается вопрос, почему внутренняя RAM такая медленная?  И как объяснить коллеге, что делать аналогию  ASIC RAM 16К*16   с FPGA не корректно?  Задержка неизбежна.

Что тут убедительного можно сказать от корифеев- плисоводов?

Спасибо!

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


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

ничего не понял, что именно надо сделать, на чем, какие интерфейсы, с чем столкнулись, что не получается и т.д.

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


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

проверьте мои экстрасенсорные способности 🙂

у автора ПЛИС эмулирует внешнюю асинхронную статическую память, соответственно сигнал WE (ну или CE) не успевает защелкнуться, и ПЛИС работает медленнее, чем чип внешней памяти. то есть вэйтцайклов программисту для обращения к ПЛИС (за дофига денег) приходится добавлять лишних, в сравнении с дешевой внешней памятью.

за что деньги плочены???

 

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


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

30 minutes ago, yes said:

у автора ПЛИС эмулирует внешнюю асинхронную статическую память, соответственно сигнал WE (ну или CE) не успевает защелкнуться, и ПЛИС работает медленнее, чем чип внешней памяти. то есть вэйтцайклов программисту для обращения к ПЛИС (за дофига денег) приходится добавлять лишних, в сравнении с дешевой внешней памятью.

если так. то это же очевидно, буфер туда, буфер обратно уже 10нс наберет, память на чтение 1 такт, ну и регистр по входу еще 1 такт.

Уменьшить можно попробовать за счет квазиасинхронного режима работы памяти, если чип позволяет по скорости)

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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