jenya7 0 16 февраля, 2017 Опубликовано 16 февраля, 2017 · Жалоба В С я часто делаю так. If (flag) { flag = 0; //do something } По аналогии пишу в VHDL. if (CLK'event and CLK='1') then If (packet_ready = '1') then --DO SOMETHING packet_ready <= '0'; end if; end if; И это даже компилируется. Но уменя есть сомнения что на том же клоке сигнал примет новое значение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 16 февраля, 2017 Опубликовано 16 февраля, 2017 (изменено) · Жалоба В С я часто делаю так. If (flag) { flag = 0; //do something } По аналогии пишу в VHDL. if (CLK'event and CLK='1') then If (packet_ready = '1') then --DO SOMETHING packet_ready <= '0'; end if; end if; И это даже компилируется. Но уменя есть сомнения что на том же клоке сигнал примет новое значение. Если это происходит в процессе, то код более, чем синтезируем. Но смысл будет иметь только, если у вас этот флаг при прогрузке инициализируется единицей и то, что вы делаете, делается один раз. Скорее всего проблема в том, что вы этот флаг пытаетесь в '1' устанавливать из другого процесса. VHDL не позволяет так делать. По поводу момента, когда регистр изменит свое значение - да, это будет позже фронта клока на время распространения сигнала через регистр, которое зависит от конкретной платы. Но на следующем клоке вы гарантированно получите ноль. Если нужно "мнгновенное" изменение какого-то флага, то используйте переменную в процессе. Изменено 16 февраля, 2017 пользователем Tausinov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 16 февраля, 2017 Опубликовано 16 февраля, 2017 · Жалоба Если это происходит в процессе, то код более, чем синтезируем. Но смысл будет иметь только, если у вас этот флаг при прогрузке инициализируется единицей и то, что вы делаете, делается один раз. Скорее всего проблема в том, что вы этот флаг пытаетесь в '1' устанавливать из другого процесса. VHDL не позволяет так делать. По поводу момента, когда регистр изменит свое значение - да, это будет позже фронта клока на время распространения сигнала через регистр, которое зависит от конкретной платы. Но на следующем клоке вы гарантированно получите ноль. Если нужно "мнгновенное" изменение какого-то флага, то используйте переменную в процессе. Я понял. Я таки делаю это в процессе. process (CLK, State) begin if (CLK'event and CLK='1') then case State is when ST_WAIT_DONE => if (spi_can_wr_done_reg = '1') then spi_can_wr_done_reg <= '0'; end if; end case; end process; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Александр77 1 16 февраля, 2017 Опубликовано 16 февраля, 2017 · Жалоба if (CLK'event and CLK='1') then If (packet_ready = '1') then --DO SOMETHING packet_ready <= '0'; end if; end if; И это даже компилируется. Но уменя есть сомнения что на том же клоке сигнал примет новое значение. Присвоение значения в VHDL производится либо flag <= x; если это сигнал либо flag:=x; если флаг переменная. Что у Вас (сигнал или переменная) - неясно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 16 февраля, 2017 Опубликовано 16 февраля, 2017 · Жалоба Присвоение значения в VHDL производится либо flag <= x; если это сигнал либо flag:=x; если флаг переменная. Что у Вас (сигнал или переменная) - неясно. у меня сигнал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 16 февраля, 2017 Опубликовано 16 февраля, 2017 · Жалоба Наличие процесса не избавляет от необходимости где-то этот флаг устанавливать. Из другого процесса у вас это сделать не получится все равно. State в списке чувствительность лишний, возможны различия между симуляцией и реализацией. Если нужно что-то сделать один раз, то можно выделить фронт сигнала, по которому нужно действовать. В таком случае сигнал спокойно меняется снаружи, а внутри действие будет однократно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 16 февраля, 2017 Опубликовано 16 февраля, 2017 · Жалоба Наличие процесса не избавляет от необходимости где-то этот флаг устанавливать. Из другого процесса у вас это сделать не получится все равно. State в списке чувствительность лишний, возможны различия между симуляцией и реализацией. Если нужно что-то сделать один раз, то можно выделить фронт сигнала, по которому нужно действовать. В таком случае сигнал спокойно меняется снаружи, а внутри действие будет однократно. сигнал устанавливается в том же процесе в другом стэйте. насчет списка чувствительности - каждый раз думаю что в него засовывать а что нет. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 16 февраля, 2017 Опубликовано 16 февраля, 2017 · Жалоба сигнал устанавливается в том же процесе в другом стэйте. насчет списка чувствительности - каждый раз думаю что в него засовывать а что нет. :) С этим все просто. Если процесс асинхронный, то все сигналы, а в VHDL2008 можно писать process(all). Если синхронный, т.е. все происходит под клоком, то только сам клок. Тогда осталось вам с логикой разобраться. Если важно, чтобы в этот же такт какие-то условия уже видели опущенный флаг, то используйте переменную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 16 февраля, 2017 Опубликовано 16 февраля, 2017 (изменено) · Жалоба С этим все просто. Если процесс асинхронный, то все сигналы, а в VHDL2008 можно писать process(all). Если синхронный, т.е. все происходит под клоком, то только сам клок. Тогда осталось вам с логикой разобраться. Если важно, чтобы в этот же такт какие-то условия уже видели опущенный флаг, то используйте переменную. понял. спасибо. Если важно, чтобы в этот же такт какие-то условия уже видели опущенный флаг, то используйте переменную. переменную в смысле variable rx_byte_idx : integer; не сигнал? кстати я читал что лучше использовать синхронные процессы. Изменено 16 февраля, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 16 февраля, 2017 Опубликовано 16 февраля, 2017 · Жалоба кстати я читал что лучше использовать синхронные процессы.Категория лучше/хуже здесь неприменима. Процесс -- это просто часть схемы, срабатывающая при изменении одного или нескольких сигналов. Описание асинхронной логики процессом нормальное явление. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 16 февраля, 2017 Опубликовано 16 февраля, 2017 · Жалоба понял. спасибо. переменную в смысле variable rx_byte_idx : integer; не сигнал? кстати я читал что лучше использовать синхронные процессы. process(clk) variable flag_var : std_logic; begin if (rising_edge(clk)) then if (flag_sig = '1') then flag_var := '0'; else flag_var := '1'; end if; логика установки flag_sig; дальше условия уже от (flag_var) ..... end process; Типа такого что-то. Можно даже в отдельный процесс вынести для наглядности. Синхронные процессы используются для последовательной логики. Если задан клок некой частоты, то при совпадении таймингов гарантируется, что к следующему фронту клока все сигналы примут нужные значения. Использую синхронную логику можно организовать конвеерную обработку, позволяющую максимизировать пропускную способность и т.д. Асинхронный процесс - комбинаторная логика со всеми вытекающими отсюда последствиями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 16 февраля, 2017 Опубликовано 16 февраля, 2017 · Жалоба Асинхронный процесс - комбинаторная логика со всеми вытекающими отсюда последствиями.Ну и какие же последствия будут, если я вместо y <= x1 when (s = '1') else x2; напишу process (x1, x2, s) begin if (s = '1') then y <= x1; else y <= x2; end if; end process; ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 16 февраля, 2017 Опубликовано 16 февраля, 2017 · Жалоба Ну и какие же последствия будут? Нечетко написал, я имел в виду последствия не использования процесса вместо отдельного выражения, а последствия использовании асинхронной логики вместо синхронной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться