Jump to content

    
Sign in to follow this  
SergeyVas

модуль spi slave verilog

Recommended Posts

Здравствуйте. Недавно начал вникать в тему 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 ещё нет?

 

Спасибо.

 

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

post-88193-1471956799.jpg

post-88193-1471956807.jpg

Edited by glb

Share this post


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

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

Share this post


Link to post
Share on other sites

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

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

Edited by Jenya7

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this