Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы при загрузке прошивки в ПЛИС
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Andy111
Добрый день. Работаем с коллегами над небольшим проектом под spartan 6 low power. Проект представляет из себя несложный коммутатор с набором интерфейсов (spi, uart и т. д.). Проект уже готов однако при тестировании на железе возникает следующая проблема: время от времени (не всегда) при очередной загрузке проекта в ПЛИС, последний отказывается работать правильно (при этом прошивка заливается без ошибок). Мы выяснили что проблема в работе интерфейса SPI, а именно данные от ПЛИС по miso валятся со сдвигом; это наводит на мысль что регистр, используемый для выдачи данных инициализируется не нулевым значением. Возможно ли такое, что при загрузке прошивки в ПЛИС некоторые регистры каким-то образом могут инициализироваться не нулем (как написано в hdl-коде), а другим значением? Кто-нибудь сталкивался с подобным и как это исправить?
NahaL
Цитата(Andy111 @ Dec 21 2015, 13:36) *
Добрый день. Работаем с коллегами над небольшим проектом под spartan 6 low power. Проект представляет из себя несложный коммутатор с набором интерфейсов (spi, uart и т. д.). Проект уже готов однако при тестировании на железе возникает следующая проблема: время от времени (не всегда) при очередной загрузке проекта в ПЛИС, последний отказывается работать правильно (при этом прошивка заливается без ошибок). Мы выяснили что проблема в работе интерфейса SPI, а именно данные от ПЛИС по miso валятся со сдвигом; это наводит на мысль что регистр, используемый для выдачи данных инициализируется не нулевым значением. Возможно ли такое, что при загрузке прошивки в ПЛИС некоторые регистры каким-то образом могут инициализироваться не нулем (как написано в hdl-коде), а другим значением? Кто-нибудь сталкивался с подобным и как это исправить?

Более походит на не соблюдение временных диаграмм ( Timing Constrainst). У Вас они выставлены?
P.S. Ну и выставите регистр в ноль при начальном сбросе.
Andy111
Цитата(NahaL @ Dec 21 2015, 07:57) *
Более походит на не соблюдение временных диаграмм ( Timing Constrainst). У Вас они выставлены?
P.S. Ну и выставите регистр в ноль при начальном сбросе.

Частоты вроде небольшие, но все равно попробую применить констрейнты, может поможет. А что насчёт начального сброса?
Где можно взять подобный сигнал или как по-другому можно организовать систему сброса регистров при загрузке прошивки в ПЛИС?
iosifk
Цитата(NahaL @ Dec 21 2015, 10:57) *
Более походит на не соблюдение временных диаграмм ( Timing Constrainst). У Вас они выставлены?
P.S. Ну и выставите регистр в ноль при начальном сбросе.

Или скажем так. После завершения загрузки при отсутствии сброса, тактовая частью триггеров захватываетсяя, а к кому-то она еще не успевает...
А возможно, что проект асинхронный и это его гробит...
NahaL
Цитата(Andy111 @ Dec 21 2015, 14:25) *
Частоты вроде небольшие, но все равно попробую применить констрейнты, может поможет. А что насчёт начального сброса?
Где можно взять подобный сигнал или как по-другому можно организовать систему сброса регистров при загрузке прошивки в ПЛИС?

Для начального сброса нужна тактовая и проинициализированный счётчик.
Пример на VHDL
Код
signal StartReset        : std_logic;
signal Reset_count    : integer:=0;

Process (clk)
begin
   if (clk'event and clk= '1') then
      if (Reset_count >= 100000) then
         StartReset <= '0';
      else
         StartReset <= '1';
         Reset_count <= Reset_count + 1;
      end if;
   end if;
end process;


По сигналу StartReset сбрасываете что хотите...
Kolya
У нас была похожая ситуация и действительно получилось, что мы неправильно описали констрейны для внешних клоков. После исправления всё решилось само собой. А по поводу ресета при включении - это стандартная процедура для всех проектов. Глупо заливая прошивку надеятся, что со старта все модули будут изначально в нулевом состоянии и не будет словлено никакого дребезга от внешних устройств. Так что инициализируйте ресет при старте. И чем дольше - тем лучше)
Andy111
Цитата(NahaL @ Dec 21 2015, 08:44) *
Для начального сброса нужна тактовая и проинициализированный счётчик.
Пример на VHDL
Код
signal StartReset        : std_logic;
signal Reset_count    : integer:=0;

Process (clk)
begin
   if (clk'event and clk= '1') then
      if (Reset_count >= 100000) then
         StartReset <= '0';
      else
         StartReset <= '1';
         Reset_count <= Reset_count + 1;
      end if;
   end if;
end process;


По сигналу StartReset сбрасываете что хотите...

Спасибо за помощь. Попробую.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.