реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблемы при загрузке прошивки в ПЛИС
Andy111
сообщение Dec 21 2015, 07:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 3-03-15
Пользователь №: 85 466



Добрый день. Работаем с коллегами над небольшим проектом под spartan 6 low power. Проект представляет из себя несложный коммутатор с набором интерфейсов (spi, uart и т. д.). Проект уже готов однако при тестировании на железе возникает следующая проблема: время от времени (не всегда) при очередной загрузке проекта в ПЛИС, последний отказывается работать правильно (при этом прошивка заливается без ошибок). Мы выяснили что проблема в работе интерфейса SPI, а именно данные от ПЛИС по miso валятся со сдвигом; это наводит на мысль что регистр, используемый для выдачи данных инициализируется не нулевым значением. Возможно ли такое, что при загрузке прошивки в ПЛИС некоторые регистры каким-то образом могут инициализироваться не нулем (как написано в hdl-коде), а другим значением? Кто-нибудь сталкивался с подобным и как это исправить?
Go to the top of the page
 
+Quote Post
NahaL
сообщение Dec 21 2015, 07:57
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 85
Регистрация: 5-07-06
Из: Барнаул
Пользователь №: 18 592



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

Более походит на не соблюдение временных диаграмм ( Timing Constrainst). У Вас они выставлены?
P.S. Ну и выставите регистр в ноль при начальном сбросе.
Go to the top of the page
 
+Quote Post
Andy111
сообщение Dec 21 2015, 08:25
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 3-03-15
Пользователь №: 85 466



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

Частоты вроде небольшие, но все равно попробую применить констрейнты, может поможет. А что насчёт начального сброса?
Где можно взять подобный сигнал или как по-другому можно организовать систему сброса регистров при загрузке прошивки в ПЛИС?
Go to the top of the page
 
+Quote Post
iosifk
сообщение Dec 21 2015, 08:42
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



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

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


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
NahaL
сообщение Dec 21 2015, 08:44
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 85
Регистрация: 5-07-06
Из: Барнаул
Пользователь №: 18 592



Цитата(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 сбрасываете что хотите...
Go to the top of the page
 
+Quote Post
Kolya
сообщение Dec 21 2015, 08:52
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 85
Регистрация: 21-03-11
Из: Киев
Пользователь №: 63 755



У нас была похожая ситуация и действительно получилось, что мы неправильно описали констрейны для внешних клоков. После исправления всё решилось само собой. А по поводу ресета при включении - это стандартная процедура для всех проектов. Глупо заливая прошивку надеятся, что со старта все модули будут изначально в нулевом состоянии и не будет словлено никакого дребезга от внешних устройств. Так что инициализируйте ресет при старте. И чем дольше - тем лучше)
Go to the top of the page
 
+Quote Post
Andy111
сообщение Dec 21 2015, 08:56
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 3-03-15
Пользователь №: 85 466



Цитата(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 сбрасываете что хотите...

Спасибо за помощь. Попробую.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th June 2025 - 14:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016