Асинхронный дизайн FIFO

Я нашел следующий фрагмент кода в Интернете, когда искал хороший дизайн FIFO. По ссылке SVN Code FIFO — Автор Клиффорд Э. Каммингс . Я провел некоторое исследование, я не смог понять, почему в дизайне три указателя? Я могу читать код, но что мне не хватает?

 module sync_r2w #(parameter ADDRSIZE = 4)
 (output reg [ADDRSIZE:0] wq2_rptr,
 input [ADDRSIZE:0] rptr,
 input wclk, wrst_n);
 reg [ADDRSIZE:0] wq1_rptr;
 always @(posedge wclk or negedge wrst_n)
 if (!wrst_n) {wq2_rptr,wq1_rptr} <= 0;
 else {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
endmodule


module sync_w2r #(parameter ADDRSIZE = 4)
 (output reg [ADDRSIZE:0] rq2_wptr,
 input [ADDRSIZE:0] wptr,
 input rclk, rrst_n);
 reg [ADDRSIZE:0] rq1_wptr;
 always @(posedge rclk or negedge rrst_n)
 if (!rrst_n) {rq2_wptr,rq1_wptr} <= 0;
 else {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};
endmodule

person chitranna    schedule 12.04.2013    source источник


Ответы (2)


То, что вы видите здесь, называется синхронизатором двойного ранга. Как вы упомянули, это асинхронный FIFO. Это означает, что стороны чтения и записи FIFO не находятся в одном и том же часовом домене.

Как вы знаете, триггеры должны соответствовать требованиям по времени установки и удержания, чтобы функционировать должным образом. При подаче сигнала из одного тактового домена в другой в общем случае невозможно гарантировать соблюдение требований.

Когда вы нарушаете эти требования, FF переходят в так называемое «метастабильное» состояние, в котором на короткое время существуют неопределенности, а затем (более или менее) случайным образом переходят в 1 или 0. Однако они делают это (и это важно) менее чем за один такт.

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

Этого самого по себе недостаточно для передачи многобитового значения (адресного указателя) через домены часов. Если одновременно изменяется более одного бита, вы не можете быть уверены, что переход будет чистым на другой стороне. Итак, в таких ситуациях вы часто будете видеть, что указатели FIFO будут закодированы серым цветом. Это означает, что каждое приращение счетчика изменяется не более чем на один бит за раз.

например Вместо 00 -> 01 -> 10 -> 11 -> 00... будет 00 -> 01 -> 11 -> 10 -> 00...

Пересечение часовых доменов — глубокая и тонкая тема. Даже опытные дизайнеры очень часто путают их, не задумываясь.

Кстати, обычные симуляции Verilog ничего не покажут о том, что я только что описал в симуляции с нулевой задержкой. Вам необходимо выполнить аннотированное моделирование SDF с реальными временными моделями.

person Brian Magnuson    schedule 12.04.2013

В этом примере адрес передается через сдвиговый регистр, чтобы он был задержан на единицу. тактовый цикл. «Указателей» могло быть и больше, чтобы еще больше задержать вывод.

Как правило, легче понять, что происходит и почему, если вы моделируете схему и смотрите на форму сигнала.

Кроме того, вот несколько хороших реализаций FIFO, на которые вы можете посмотреть:

  1. IP-ядро Xilinx FIFO Generator
  2. система Altera FIFO с одним/двумя часами
  3. Универсальные FIFO OpenCores

Надеюсь, поможет. Удачи!

person Community    schedule 12.04.2013