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

Работа по двум фронтам

Подскажите как правильно реализовать нижеописанную схему. Отказывается работать нормально. Проблема в том что внутри процесса два условия:

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;

 

Заранее спасибо!!

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


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

Подскажите как правильно реализовать нижеописанную схему. Отказывается работать нормально. Проблема в том что внутри процесса два условия:
if( Clk='1' and Clk'event ) then

и

if ( x2_clk='0' and x2_clk'event ) then

. По сути двухфронтовая схема. Как такая схема будет вести себя ??? Моделироваться правильно отказывается.

Как говорил МасЛауд - должен остаться только один! Приведите всю схему к одному клоку... Есть описание стандартных процедур CDC.

 

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


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

Тут вроде не раз говорилось что аппаратно второй фронт не поддерживается, посему надо просто взять удвоенную частоту и работать с одним фронтом.

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


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

Тут вроде не раз говорилось что аппаратно второй фронт не поддерживается, посему надо просто взять удвоенную частоту и работать с одним фронтом.

Да, но многие участники форума не читают форум регулярно.

 

ТС примените синхронизацию между клоковыми доменами и можно сделать схему детекторов заднего/переднего фронта.

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


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

... надо просто взять удвоенную частоту и работать с одним фронтом.

Лучше все же не удвоенную, не менее чем в два раза выше (не знаю будет ли у ТС возможность отработать на учетверенной или удесятиренной тактовой частоте).

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


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

Похоже Вы пытаетесь реализовать приемник rs232 на базе частоты которая в 16 раз выше частоты бод. Если это так то делается все гораздо проще. В сети масса кода на VHDL по этому поводу. Причем полностью работоспособного. Что касается разных фронтов. Так делать нельза. Ставить в качестве условия спад второго сигнала if ( x2_clk='0' and x2_clk'event ) then при наличии в начале процесса if( Clk='1' and Clk'event ) then - это неверно и это еще мягко сказано. Обычно один процесс - один клок, пусть даже gated clock, но один.

Изменено пользователем Acvarif

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


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

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

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

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

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

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

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

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

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

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