Andy111 0 21 декабря, 2015 Опубликовано 21 декабря, 2015 · Жалоба Добрый день. Работаем с коллегами над небольшим проектом под spartan 6 low power. Проект представляет из себя несложный коммутатор с набором интерфейсов (spi, uart и т. д.). Проект уже готов однако при тестировании на железе возникает следующая проблема: время от времени (не всегда) при очередной загрузке проекта в ПЛИС, последний отказывается работать правильно (при этом прошивка заливается без ошибок). Мы выяснили что проблема в работе интерфейса SPI, а именно данные от ПЛИС по miso валятся со сдвигом; это наводит на мысль что регистр, используемый для выдачи данных инициализируется не нулевым значением. Возможно ли такое, что при загрузке прошивки в ПЛИС некоторые регистры каким-то образом могут инициализироваться не нулем (как написано в hdl-коде), а другим значением? Кто-нибудь сталкивался с подобным и как это исправить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smail522 0 21 декабря, 2015 Опубликовано 21 декабря, 2015 · Жалоба Добрый день. Работаем с коллегами над небольшим проектом под spartan 6 low power. Проект представляет из себя несложный коммутатор с набором интерфейсов (spi, uart и т. д.). Проект уже готов однако при тестировании на железе возникает следующая проблема: время от времени (не всегда) при очередной загрузке проекта в ПЛИС, последний отказывается работать правильно (при этом прошивка заливается без ошибок). Мы выяснили что проблема в работе интерфейса SPI, а именно данные от ПЛИС по miso валятся со сдвигом; это наводит на мысль что регистр, используемый для выдачи данных инициализируется не нулевым значением. Возможно ли такое, что при загрузке прошивки в ПЛИС некоторые регистры каким-то образом могут инициализироваться не нулем (как написано в hdl-коде), а другим значением? Кто-нибудь сталкивался с подобным и как это исправить? Более походит на не соблюдение временных диаграмм ( Timing Constrainst). У Вас они выставлены? P.S. Ну и выставите регистр в ноль при начальном сбросе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy111 0 21 декабря, 2015 Опубликовано 21 декабря, 2015 · Жалоба Более походит на не соблюдение временных диаграмм ( Timing Constrainst). У Вас они выставлены? P.S. Ну и выставите регистр в ноль при начальном сбросе. Частоты вроде небольшие, но все равно попробую применить констрейнты, может поможет. А что насчёт начального сброса? Где можно взять подобный сигнал или как по-другому можно организовать систему сброса регистров при загрузке прошивки в ПЛИС? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 21 декабря, 2015 Опубликовано 21 декабря, 2015 · Жалоба Более походит на не соблюдение временных диаграмм ( Timing Constrainst). У Вас они выставлены? P.S. Ну и выставите регистр в ноль при начальном сбросе. Или скажем так. После завершения загрузки при отсутствии сброса, тактовая частью триггеров захватываетсяя, а к кому-то она еще не успевает... А возможно, что проект асинхронный и это его гробит... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smail522 0 21 декабря, 2015 Опубликовано 21 декабря, 2015 · Жалоба Частоты вроде небольшие, но все равно попробую применить констрейнты, может поможет. А что насчёт начального сброса? Где можно взять подобный сигнал или как по-другому можно организовать систему сброса регистров при загрузке прошивки в ПЛИС? Для начального сброса нужна тактовая и проинициализированный счётчик. Пример на 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 сбрасываете что хотите... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 21 декабря, 2015 Опубликовано 21 декабря, 2015 · Жалоба У нас была похожая ситуация и действительно получилось, что мы неправильно описали констрейны для внешних клоков. После исправления всё решилось само собой. А по поводу ресета при включении - это стандартная процедура для всех проектов. Глупо заливая прошивку надеятся, что со старта все модули будут изначально в нулевом состоянии и не будет словлено никакого дребезга от внешних устройств. Так что инициализируйте ресет при старте. И чем дольше - тем лучше) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy111 0 21 декабря, 2015 Опубликовано 21 декабря, 2015 · Жалоба Для начального сброса нужна тактовая и проинициализированный счётчик. Пример на 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 сбрасываете что хотите... Спасибо за помощь. Попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться