De VHDL functie rising_edge() definieert een clock. Deze functie moet je dus alleen voor clock signalen gebruiken, om daarmee registers (flipflops) geheugen elementen te definieren. Nooit rising_edge() toepassen op andere signalen.
2) Geen latches
Zorg dat output signalen in een process altijd een waarde toegekend krijgen, anders creeer je een geheugen element dat bij synthesis een latch wordt. Latches mogen niet in FPGA want dat geeft probemen op HW. Bijv:
IF x = 3 THEN
y <= x;
END IF;
Maakt dat y een latch wordt. Je moet een ELSE y <= 0 END IF; toevoegen, of beginnen met een default assignment y <= 0; en dan de IF - END IF;
3) Complete sensitivity list
De VHDL regel is: Alle inputs van een combinatorisch process moeten in de sensitivity list, anders kun je verschil krijgen tussen sim en synth.
Synth negeert de sensitivity list en doet alsof alle input signals er in staan. Sim kijkt wel naar de sensitivity list, en update de process output alleen als er iets wijzigt aan een signal in die sensitivity list.
Maar meestal is het mogelijk om alleen de register waarden als process input te gebruiken, in dit geval dus delay_cnt in plaats van nxt_delay_cnt. Oppassen dat de nxt_x waarde niet door de nxt_x waarde bepaald wordt, want dan krijg je een combinatorische loop (dus zonder rergister in de loop).
4) Combinatorische process (p_comb) + clock process (p_clk)
Houdt steeds deze twee processen visueel als block schema in gedachten. De input van p_comb komt van buiten of van p_clk. De p_comb bepaalde de nxt_* waarden voor p_clk en p_clk maakt daar de register waarden van.
Houdt in gedachten, of op papier, ook een timing diagram met clk en signals bij, net als het Wave window, om te weten welke waarden de signals hebben en wanneer ze veranderen.
5) Wanneer IF of WHEN
Pieter Donker:ooststellingwerf: 1:56 PM
prev_in_val <= in_val WHEN rising_edge(clk); geeft Illegal sequential statement.
Eric Kooistra 1:57 PM
Ja, deze regel moet buiten het process, want het is een concurrent statement, dus een process op zich.
Equivalent alternatief is om prev_in_val <= in_val; toe te voegen in p_clk.
Binnen een process gebruik je IF, buiten een process in een concurrent statement gebruik je WHEN.