Hallo,

Ik heb de volgende VHDL code geschreven om met behulp van een reeks flipflops een signaal te synchroniseren naar een ander klokdomein tegen metastabiliteit


library ieee ;
use ieee.std_logic_1164.all;

----------------------------------------------------

entity sync is

generic(number_of_sync: natural :=2); -- 2 Bit anti-metastability synchro.
port(   clk:            in std_logic;
        reset:          in std_logic;
        input:          in std_logic;
        output:         out std_logic
);
end sync;

----------------------------------------------------

architecture behv of sync is

    signal syncReg: std_logic_vector(number_of_sync-1 downto 0);

begin

    process(clk)
    begin
        if reset = '0' then
            syncReg(number_of_sync-1 downto 0) <= (others => '0');
        elsif (clk='1' and clk'event) then
                syncReg(0)<=input;
                syncReg(number_of_sync-1 downto 1)<=syncReg(number_of_sync-2 downto 0);
        end if;
    end process;

    output<=syncReg(number_of_sync-1);

end behv;

-----------------------------------------------------

De code zal op een CPLD worden gebruikt. Ik heb hier weinig ervaring mee, dus daarom vraag ik aan jullie of deze code goed is.

Je code is volgens mij niet onafhankelijk van je waarde van number_of_sync, wil je dat?

Verder, voor het reageren op een flank van de clock is toch een functie beschikbaar? rising_edge(clk) dacht ik.


reg sync[1:0];
reg out;

always @(posedge clk) begin
   reg <={reg[0];in};
   out <= (reg =="2'b11");
end

zettet zelf om. gewoon een shifter. eenmaal er '11' in staat gaat uit hoog.

als je symmetrisch wilt werken doe je dit


reg sync[1:0];
reg out;

always @(posedge clk) begin
   reg <={reg[0];in};
   if (reg =="2'b00") out <=1'b0;
   if (reg =="2'b11") out <=1'b1;
end

Ik denk niet dat dit helemaal ok is free. Jij assigned "out" met de inhoud van BEIDE ffs. Wat nu als de eerste metastabiel is? Ok, out is zelf ook een ff, dus in totaal heb je er toch 2 achter elkaar. Maar in dat geval is de 2e van je schuifregister niet nodig.

De implementatie van TS is goed.