Skip to content
Snippets Groups Projects
Commit c26ce4f1 authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Some useful notes on how to do vhdl.

parent 8442252b
No related branches found
No related tags found
1 merge request!100Removed text for XSub that is now written in Confluence Subband correlator...
VHDL explained
1) rising_edge()
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.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment