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

Передача СТАТИЧЕСКИХ данных в другой тактовый домен

Разрабатываю устройство на Cyclone II.

Есть два домена(модуля): 60 и 100 МГц

Первый пишет ЗАРАНЕЕ в некий регистр regA, который читается ПОТОМ во втором домене.

Но значение regA не меняется во время работы второго домена.

ОБЯЗАТЕЛЬНО ли использовать два последовательных регистра для передачи данных регистра в данном случае?

TimeQuest ругается сейчас(без регистров), но можно запретить анализировать переход данныз из 60 в 100.

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


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

Только что, ianpo сказал:

ОБЯЗАТЕЛЬНО ли использовать два последовательных регистра для передачи данных регистра в данном случае?

Можно сделать только сигнал "готовность данных" и вот его пропустить через 2  триггера. И когда он придет на другую сторону, то тогда и данные из регистра можно считать...

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


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

10 minutes ago, ianpo said:

Есть два домена(модуля): 60 и 100 МГц

TimeQuest ругается сейчас(без регистров), но можно запретить анализировать переход данных из 60 в 100.

RTFM:

Quote

set_clock_groups -asynchronous -group {<clock1>...<clockn>} ... -group {<clocka>...<clockn>}

 

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


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

iosifk, cпасибо за ответ

Между записью в регистр и последующим чтением гарантированно проходит очень много тактов, тогда и один регистр, наверно, не нужен.

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

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


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

On 4/4/2019 at 1:25 PM, ianpo said:

Разрабатываю устройство на Cyclone II.

Есть два домена(модуля): 60 и 100 МГц

Первый пишет ЗАРАНЕЕ в некий регистр regA, который читается ПОТОМ во втором домене.

Но значение regA не меняется во время работы второго домена.

ОБЯЗАТЕЛЬНО ли использовать два последовательных регистра для передачи данных регистра в данном случае?

TimeQuest ругается сейчас(без регистров), но можно запретить анализировать переход данныз из 60 в 100.

module _synchronizer
#(
  parameter integer pLENGTH = 2,
  parameter [0:0]   INIT    = 0  
)(
//----------------------------------------------------------
     input            rstin,
     input            clkin,
     input            clkout,
     input            sin,
    output reg        sout
//----------------------------------------------------------
);
                            reg               main_reg =  INIT; // RS level triger for input pulses
(* ASYNC_REG = "TRUE" *)    reg [pLENGTH-1:0] in2out   = {pLENGTH{INIT}}; // clkin -> clkout syncronizer for level
(* ASYNC_REG = "TRUE" *)    reg [pLENGTH-1:0] out2in   = {pLENGTH{INIT}}; // clkout -> clk_in synronizer for level clear feedback

    wire sout_ack, main_en;

//----------------------------------------------------------------------------------------------
// Input converter edge/level clkin -> level clkin
//----------------------------------------------------------------------------------------------

always @(posedge clkin, posedge rstin)

         if (rstin)        main_reg <= INIT;
    else if (main_en)    main_reg <= sin;

assign    main_en = ~( sout_ack ^ main_reg );

//----------------------------------------------------------------------------------------------
// Forward syncronizer level clkin -> edge clkout
//----------------------------------------------------------------------------------------------

always @(posedge clkout, posedge rstin)

    if (rstin)    in2out <= {pLENGTH{INIT}};
    else        in2out <= {in2out[pLENGTH-2:0], main_reg};

assign    sout = in2out[pLENGTH-1];

//----------------------------------------------------------------------------------------------
// Feedback syncronizer level clkout -> level clkin
//----------------------------------------------------------------------------------------------

always @(posedge clkin, posedge rstin)

    if (rstin)    out2in <= {pLENGTH{INIT}};
    else        out2in <= {out2in[pLENGTH-2:0], sout};

assign    sout_ack = out2in[pLENGTH-1];

//----------------------------------------------------------------------------------------------
// end
//----------------------------------------------------------------------------------------------

endmodule

Применение всего этого выглядит так:

............

    parameter integer Wsync = 2;

...........

//=========== AZIMUTH domen2 > domen1 ==============================
_synchronizer           #(    // 2 -> 1
            .INIT       (    0              ),
            .pLENGTH    (    Wsync          ))
sync21_azimwr           (
            .rstin      (    ~d2i_SYS       ),  // <- domen2
            .clkin      (    d2_CLK         ),  // <- domen2
            .sin        (    d2i_AZIM_WR    ),  // <- domen2
            .clkout     (    d1_CLK         ),  // <- domen1
            .sout       (    d1o_AZIM_WR    )); // -> domen1
............

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


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

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

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

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

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

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

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

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

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

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