読み取りポインターと書き込みポインターは、あるクロック ドメインから別のクロック ドメインに転送されるときにグレイ エンコーディングを使用する必要があります。ご存知のように、グレー カウンターの 1 ビットだけが 2 つの連続する値の間で異なります。したがって、メタスタビリティは変化する 1 つのビットのみに影響を与える可能性があります。再同期後、転送されたポインタは、更新されたポインタまたは以前の値のいずれかになります。
どちらの場合も、これは問題ではなく、FIFO の悲観的なフラグ/カウントにつながるだけです。
読み取り/書き込みポインターに通常のカウンターを使用し、次の関数を使用してそれらをグレイコードに変換します。これらは VHDL で記述されていますが、次のように理解する必要があります。
function bin_to_gray(a: unsigned) return unsigned is
begin
return a xor ('0' & a(a'left downto 1));
end function bin_to_gray;
function gray_to_bin(a: unsigned) return unsigned is
variable ret : unsigned(a'range);
begin
ret(a'left) := a(a'left);
for i in a'left-1 downto 0 loop
ret(i) := ret(i+1) xor a(i);
end loop;
return ret;
end function gray_to_bin;