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

Проблемы при загрузке прошивки в ПЛИС

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

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


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

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

Более походит на не соблюдение временных диаграмм ( Timing Constrainst). У Вас они выставлены?

P.S. Ну и выставите регистр в ноль при начальном сбросе.

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


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

Более походит на не соблюдение временных диаграмм ( Timing Constrainst). У Вас они выставлены?

P.S. Ну и выставите регистр в ноль при начальном сбросе.

Частоты вроде небольшие, но все равно попробую применить констрейнты, может поможет. А что насчёт начального сброса?

Где можно взять подобный сигнал или как по-другому можно организовать систему сброса регистров при загрузке прошивки в ПЛИС?

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


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

Более походит на не соблюдение временных диаграмм ( Timing Constrainst). У Вас они выставлены?

P.S. Ну и выставите регистр в ноль при начальном сбросе.

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

А возможно, что проект асинхронный и это его гробит...

 

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


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

Частоты вроде небольшие, но все равно попробую применить констрейнты, может поможет. А что насчёт начального сброса?

Где можно взять подобный сигнал или как по-другому можно организовать систему сброса регистров при загрузке прошивки в ПЛИС?

Для начального сброса нужна тактовая и проинициализированный счётчик.

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

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


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

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

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


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

Для начального сброса нужна тактовая и проинициализированный счётчик.

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

Спасибо за помощь. Попробую.

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


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

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

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

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

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

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

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

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

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

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