D-Luxe 0 31 октября, 2015 Опубликовано 31 октября, 2015 · Жалоба Подскажите как правильно реализовать нижеописанную схему. Отказывается работать нормально. Проблема в том что внутри процесса два условия: if( Clk='1' and Clk'event ) then и if ( x2_clk='0' and x2_clk'event ) then . По сути двухфронтовая схема. Как такая схема будет вести себя ??? Моделироваться правильно отказывается. process( Clk ) begin if( Clk='1' and Clk'event ) then case ReceiveSReg is when WaitStartBit => if( x16_clk='1' ) then if( RX='0' and StartBitCntEnable='0' and StartBitFound='0' ) then StartBitCntEnable <= '1'; StartBitCnt <= StartBitCnt + '1'; end if; if( RX='1' and StartBitCntEnable='1' ) then StartBitCntEnable <= '0'; StartBitCnt <= ( others => '0' ); end if; if( RX='0' and (StartBitCntEnable='1' or StartBitFound='1') ) then StartBitCnt <= StartBitCnt + '1'; -- Считаем такты x16 end if; if( RX='0' and StartBitCntEnable='1' and StartBitCnt > "1000" ) then -- Нашли 8 бит нулевых StartBitCntEnable <= '0'; StartBitFound <= '1'; end if; if( StartBitCnt = "1111" ) then StartBitFound <= '0'; ReceiveSReg <= DataReceive; end if; end if; when DataReceive => if ( x2_clk='0' and x2_clk'event ) then -- По спадающему фронту Counter <= Counter + '1'; end if; if( x2_clk='1' and x2_clk'event ) then -- По нарастающему защелкиваем данные RX_DataIn(CONV_INTEGER( Counter )) <= RX; end if; if( Counter="111" and x2_clk='0' and x2_clk'event ) then -- 8 бит сосчитано ReceiveSReg <= ParityBitReceive; end if; when ParityBitReceive => if ( x2_clk='0' and x2_clk'event ) then ReceiveSReg <= StopBitReceive; end if; when StopBitReceive => if ( x2_clk='0' and x2_clk'event ) then ReceiveSReg <= WaitStartBit; end if; when others => ReceiveSReg <= WaitStartBit; end case; end if; end process; Заранее спасибо!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 31 октября, 2015 Опубликовано 31 октября, 2015 · Жалоба Подскажите как правильно реализовать нижеописанную схему. Отказывается работать нормально. Проблема в том что внутри процесса два условия: if( Clk='1' and Clk'event ) then и if ( x2_clk='0' and x2_clk'event ) then . По сути двухфронтовая схема. Как такая схема будет вести себя ??? Моделироваться правильно отказывается. Как говорил МасЛауд - должен остаться только один! Приведите всю схему к одному клоку... Есть описание стандартных процедур CDC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
agregat 0 31 октября, 2015 Опубликовано 31 октября, 2015 · Жалоба Тут вроде не раз говорилось что аппаратно второй фронт не поддерживается, посему надо просто взять удвоенную частоту и работать с одним фронтом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 31 октября, 2015 Опубликовано 31 октября, 2015 · Жалоба Тут вроде не раз говорилось что аппаратно второй фронт не поддерживается, посему надо просто взять удвоенную частоту и работать с одним фронтом. Да, но многие участники форума не читают форум регулярно. ТС примените синхронизацию между клоковыми доменами и можно сделать схему детекторов заднего/переднего фронта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Александр77 1 1 ноября, 2015 Опубликовано 1 ноября, 2015 · Жалоба ... надо просто взять удвоенную частоту и работать с одним фронтом. Лучше все же не удвоенную, не менее чем в два раза выше (не знаю будет ли у ТС возможность отработать на учетверенной или удесятиренной тактовой частоте). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 3 ноября, 2015 Опубликовано 3 ноября, 2015 (изменено) · Жалоба Похоже Вы пытаетесь реализовать приемник rs232 на базе частоты которая в 16 раз выше частоты бод. Если это так то делается все гораздо проще. В сети масса кода на VHDL по этому поводу. Причем полностью работоспособного. Что касается разных фронтов. Так делать нельза. Ставить в качестве условия спад второго сигнала if ( x2_clk='0' and x2_clk'event ) then при наличии в начале процесса if( Clk='1' and Clk'event ) then - это неверно и это еще мягко сказано. Обычно один процесс - один клок, пусть даже gated clock, но один. Изменено 3 ноября, 2015 пользователем Acvarif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться