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.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
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
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
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.