|
Странности со STate Machine, Летает, блин!.. |
|
|
|
Nov 16 2011, 13:03
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 26-11-07
Из: Москва, Зеленоград
Пользователь №: 32 692

|
Имеем проект для Cyclone III. Один из фрагментов содержит State Machine переменную. Так вот, этот самый state machine через некоторое время улетает в неопределенное состояние, из которого возвращается только сбросом. Как такое может быть и чем лечится? Вот, код на VHDL. Вывод TST был добавлен для поиска состояния, в котором исполнение виснет. Так вот - TST так и не стал '1' после зависания  Код library ieee; use ieee.std_logic_1164.all; use IEEE.numeric_std.all;
entity IO_SPLITTER_LOW is port ( HOLD_in1, HOLD_in2 : in bit := '0'; DI_in1, DI_in2 : in bit_vector (31 downto 0); DI_out : out bit_vector (31 downto 0); DO_out1, DO_out2 : out bit_vector (31 downto 0); DO_in : in bit_vector (31 downto 0); START_in1, START_in2, WnR_in1, WnR_in2 : in bit; DONE_1, DONE_2 : out bit; START_out, WnR_out, TST : out bit; DONE : in bit; RESET, CLK : in bit ); end IO_SPLITTER_LOW;
architecture pll_type of IO_SPLITTER_LOW is type State_Machine is (S0, S1, S2, S3, S4, S5); signal mode : State_Machine; signal dir, connected, lstart, eof_flag : bit; begin DI_out <= DI_in1 when dir = '0' else DI_in2; WnR_out <= WnR_in1 when dir = '0' else WnR_in2; DO_out1 <= DO_in; DO_out2 <= DO_in; DONE_1 <= DONE when connected = '1' and dir = '0' else '0'; DONE_2 <= DONE when connected = '1' and dir = '1' else '0'; lstart <= START_in1 when dir = '0' else START_in2; START_out <= lstart when connected = '1' else '0'; TST <= '1' when mode = S2 or mode = S3 else '0'; process (connected, DONE) begin if DONE = '0' and DONE'event then eof_flag <= '1'; end if; if connected = '0' then eof_flag <= '0'; end if; end process; process (CLK, RESET) begin if CLK = '1' and CLK'event then case mode is when S0 => if START_in1 = '1' and HOLD_in2 = '0' then mode <= S2; else mode <= S1; end if; when S1 => if START_in2 = '1' and HOLD_in1 = '0' then mode <= S3; else mode <= S0; end if; when S2 => dir <= '0'; mode <= S4; when S3 => dir <= '1'; mode <= S4; when S4 => connected <= '1'; if eof_flag = '1' then mode <= S5; else mode <= S4; end if; when others => connected <= '0'; mode <= S0; end case; end if; if RESET = '1' then mode <= S0; dir <= '0'; connected <= '0'; end if; end process; end pll_type;
|
|
|
|
|
 |
Ответов
|
Nov 24 2011, 10:20
|
Профессионал
    
Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082

|
2/3 Вы задали TA исходную частоту, он в итоге по времянке выдает максимально возможную для худшего случая (по умолчанию - высокая загруженность кристалла, критичная температура +%). Она получается в общем случае исходя из максимального времени прохождения сигнала от триггера до триггера (есть и другие), Вы можете посмотреть эту максимальную цепочку (до 1000 наихудших по времени для каждой частоты/совместных частот), короче говоря получилось что у Вас самая длинная цепочка по времени (1/75МГц) секунд. В предыдущем посте писал как посмотреть. 1. По поводу сброса люди статьи пишут  . Ваш сброс мне не нравится - он получается с помощью комбинаторики, и по идее идет по обычной линии сигналов, а не глобальной шине (могу ошибаться), возможны гонки сигналов. Но для него все равно можно анализ закрыть, fiiter скорее всего переименовал nRST_LOC во что-то еще, посмотрите не в RTL, а в технолоджи мап вьювере. PS// Посмотрел еще раз описание SM, в vhdl плохо разбираюсь, но меня смущает приоритет описания регистровой логики - обычно сначала по if описывается именно сброс, а уже все остальное по else. Советую убедиться, что Ваш сброс в триггере поступает именно на предназначенный для него вход.
|
|
|
|
|
Nov 24 2011, 10:28
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 26-11-07
Из: Москва, Зеленоград
Пользователь №: 32 692

|
Цитата(bogaev_roman @ Nov 24 2011, 13:20)  PS// Посмотрел еще раз описание SM, в vhdl плохо разбираюсь, но меня смущает приоритет описания регистровой логики - обычно сначала по if описывается именно сброс, а уже все остальное по else. Советую убедиться, что Ваш сброс в триггере поступает именно на предназначенный для него вход. Я смотрел, как формируется сброс и клок в моем случае - сброс на "R" вход, как и положено. Без доп комбинаторики. Структуру if-else квартус трактует именно как или-или. Т.е. в случае if-else наличие сброса еще будет и перекрывать другие сигналы. По сути - это лишнее. R и S входы чисто схематически имеют приоритет над клоком.
|
|
|
|
|
Nov 24 2011, 11:46
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 26-11-07
Из: Москва, Зеленоград
Пользователь №: 32 692

|
Цитата(bogaev_roman @ Nov 24 2011, 13:54)  В общем случае сброс и должен иметь наивысший приоритет и перебивать другие сигналы. Структура if-else приоритетна и else срабатывает только при отсутствии if. Не знаю что там на циклон3 за архитектура, но на стратикс4 синхронный сброс подается на вентиль AND вместе с данными, после чего на вход D триггера. Асинхронный - заведен специально отдельным входом aclr. Реальную структуру смотреть лучше все-таки на chipplanner, а не на RTL. Я как правило пользуюсь именно асинхронным сбросом (aclr). Но в случае синхронного сброса - вы абсолютно правы. И тогда имеет смысл использовать if-else
|
|
|
|
Сообщений в этой теме
Вовка_Бызов Странности со STate Machine Nov 16 2011, 13:03 bogaev_roman Цитата(Вовка_Бызов @ Nov 16 2011, 17:03) ... Nov 16 2011, 13:27 slash_spb Цитата(Вовка_Бызов @ Nov 16 2011, 16:03) ... Nov 16 2011, 14:00 Вовка_Бызов Цитата(slash_spb @ Nov 16 2011, 17:00) Ещ... Nov 17 2011, 05:01  Вовка_Бызов Ну - в общем, вылечить-то вылечил - но не до конца... Nov 21 2011, 08:17   bogaev_roman Цитата(Вовка_Бызов @ Nov 21 2011, 12:17) ... Nov 21 2011, 08:33    Вовка_Бызов Цитата(bogaev_roman @ Nov 21 2011, 11:33)... Nov 21 2011, 10:18     bogaev_roman Цитата(Вовка_Бызов @ Nov 21 2011, 14:18) ... Nov 21 2011, 10:30      Вовка_Бызов Спасибо! Полез читать блог. Надеюсь, после это... Nov 21 2011, 10:37       bogaev_roman Цитата(Вовка_Бызов @ Nov 21 2011, 14:37) ... Nov 21 2011, 10:53        Вовка_Бызов Цитата(bogaev_roman @ Nov 21 2011, 13:53)... Nov 21 2011, 11:10         bogaev_roman Цитата(Вовка_Бызов @ Nov 21 2011, 15:10) ... Nov 21 2011, 11:38          Вовка_Бызов Цитата(bogaev_roman @ Nov 21 2011, 14:38)... Nov 24 2011, 09:44 Мур Выведите шину(надо организовать) состояний на джит... Nov 16 2011, 14:19    bogaev_roman Цитата(Вовка_Бызов @ Nov 24 2011, 15:46) ... Nov 24 2011, 12:17
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|