вот так делали и все работало при соотношении скорости передачи к частоте клока 1/4
entity receiver is generic ( FRAME_RATE : natural ;BIT_PER_FRAME : natural ;PACKET_COUNT : natural ); ... ... ...
signal RXs : std_logic; signal LatchBit : std_logic;
IN_RX: dff port map(clk,RX,Res,'0',RXs);
NET_SYNC: block -------------- subtype TNetClkDiv is integer range 0 to ceil(real(CLK_FREQ/FRAME_RATE/BIT_PER_FRAME))-1; signal NetClkDiv : TNetClkDiv; signal RXp : std_logic; signal NewBit: std_logic; -------------- begin IN_P: Front port map(RXs,clk,RXp,open,open); --************************************************** NET_CLOCK: process(clk) begin if clk='1' and clk'event then if Res = '1' then NetClkDiv <= TNetClkDiv'high; --| NewBit <= '0'; elsif RXp = '1' then NetClkDiv <= TNetClkDiv'high-1; NewBit <= '1'; elsif NetClkDiv = 0 then NetClkDiv <= TNetClkDiv'high-1; NewBit <= not NewBit; else NetClkDiv <= NetClkDiv - '1'; end if; end if; end process; LP1: Front port map(NewBit,clk,LatchBit,open,open); --************************************************** end block;
компонент Front вида
entity front is port (data,clk : in std_logic; pQ,mQ,dQ : out std_logic); end; architecture arc of Front is signal s : std_logic ; begin process(clk) begin if clk='1' and clk'event then s <= not data; end if ; end process ; pQ <= data and s ; mQ <= not(data or s); dQ <= not data xor s ; end;
смысл в том, что в отсутствии пакета на NewBit будет идти интересующий вас клок, но не синхронизированый с клоком передатчика. при поступлении стартового бита (у меня перепад 0 -> 1) генератор подстроится под входные данные, и будет подстраиватся на каждом таком перепаде.
полученный клок Вы, конечно не сможите использовать в качестве глобального, но LatchBit с успехом может подаваться на вход разрешения записи триггеров приемника.
а если хотите именно клок выделить - слушайте one_man_show, и скорее всего альтернативы не найдете
--------------------
однако..
|