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

Здравствуйте. Недавно начал вникать в тему FPGA и поэтому возник вопрос..

В коде присутствуют регистры для устранения метастабильности rx_done.

 

   reg                     rx_done;
   reg                     rx_done_flip1;
   reg                     rx_done_flip2;
   reg                     rx_done_flip3;

 

По фронту тактирующего сигнала CLK_I происходит запись в эти регистры

 

   always @(posedge CLK_I or posedge RST_I)
     if (RST_I) begin
       rx_done_flip1                <= #UDLY 1'b0;
       rx_done_flip2                <= #UDLY 1'b0;
       rx_done_flip3                <= #UDLY 1'b0;
     end
     else begin
       rx_done_flip1                <= #UDLY rx_done;
       rx_done_flip2                <= #UDLY rx_done_flip1;
       rx_done_flip3                <= #UDLY rx_done_flip2;
     end

 

Меня интересует почему во время записи reg_rxdata <= rx_shift_data;

используется проверка if (rx_done_flip1 && !rx_done_flip2)

 

   always @(posedge CLK_I or posedge RST_I)
     if(RST_I)
       reg_rxdata            <= #UDLY 'h0;
     else if (rx_done_flip1 && !rx_done_flip2)
       reg_rxdata            <= #UDLY rx_shift_data;

 

А при установке регистра reg_rrdy

используется проверка else if (rx_done_flip2 && !rx_done_flip3)

 

   always @(posedge CLK_I or posedge RST_I)
     if (RST_I) 
       reg_rrdy                     <= #UDLY 1'b0;
     else if (rx_done_flip2 && !rx_done_flip3)
       reg_rrdy                     <= #UDLY 1'b1;
     else if (WR_RD && !CSn)
       reg_rrdy                     <= #UDLY 1'b0;

 

 

И почему, например в (rx_done_flip2 && !rx_done_flip3), регистр rx_done_flip3 берётся с инверсией?

Чтобы значение reg_rrdy было зафиксировано только когда rx_done_flip2 установлен, а rx_done_flip3 ещё нет?

 

Спасибо.

 

 

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


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

Путем таких нехитрых условий требуемое действие происходит только на фронте сигнала. Если текущее значение ноль, а предыдущее было единичка, то это задний фронт; если текущее единичка, а предыдущее было ноль - передний фронт. Т.о., если какой-то сигнал держится в единичке или в нуле больше одного такта, можно относительно просто совершить однократное действие, связанное с его значением.

 

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


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

Доброго дня! Использовал приведенный пример SPI, при приеме пакета по SPI сигнал RX_RDY "сдвигается" и срабатывает до окончания приема, с чем это может быть связано?

post-88193-1471956799.jpg

post-88193-1471956807.jpg

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

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


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

Доброго дня! Использовал приведенный пример SPI, при приеме пакета по SPI сигнал RX_RDY "сдвигается" и срабатывает до окончания приема, с чем это может быть связано?

может быть дребезг на фронтах клока.

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


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

решил поднять тему. посмотрел описание SPI Slave на VHDL. вроде логика понятна. непонятно как написать надстройку над модулем, пользовательскую логику управляющую слейвом.

если я правильно понял из тестбенч - никакого разрешающего тригера нет. передача инициализируется при CSn<='0';

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

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


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

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

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

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

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

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

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

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

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

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