Jupyther věci pro VHDL
- [[Generátor děličky frekvence]]
Poznámky související s VHDL
- [[GHDL + Yosys]]
Tipy pro VHDL
- Assertions -> [[ASICentrum přesnáška na SIS]]
- Web na trénování VHDL Web
- Web na tcl, bash a VHDL Zde
- VHDL, UVM, SV atd příklady
- Verilog online IDE se vším všudy
Obecné tipy
Mám bus a chci zapsat na určitou pozici
v_arg_data(29) := '1';
Rozdíl mezi signalem a variable
SIGNAL sig : std_logic_vector(3 downto 0);
VARIABLE var : std_logic_vector(3 downto 0);
sig <= "1000"; -- do signálu s <=
var := "1000"; -- do variable s :=
-- variables můžou být použity pouze uvnitř processů (přemýšlet o tom jako o SW proměnné)
-- signal může být použit všude
Reset
U resetu je nutné aby byl hladinově a ne na náběžnou hranu!!!
-- takhle ne!
IF rising_edge(rst_n) THEN
hodnota <= '0';
END IF;
-- takhle správné
IF rst_n = '0' THEN
hodnota <= '1';
END IF;
Je také mnohem lepší používat negovaný reset a to protože ta nulová hodnota je silnější než jedničková. → mnohem odolnější proti náhodnému šumu na sběrnici.
Asynchronní vs synchronní reset
Asynchronní reset se vykoná okamžitě, synchronní pouze s clockem
Obecně je nutné mít reset skoro všude kde to jde, ale málo kdy to jde jen tak. Syntetizátor totiž nemá rád, pokud zapisujeme v jednom clocku do jedné proměnné víckrát.
TODO udělat příklad
Multiplexer
Naprosto nejlíp se dělá s with select
with SW select -- nejlepší způsob jak delat MUX
Y <= A when "00",
B when "01",
C when "10",
D when "11",
A when others;
Modulo 2 je prostě bitový posuv -> dělení 2 je prostě bitový posuv -> dělení
null; je věc co ti přímo specifikuje že se nic neděje, například v case. Jinak si stěžuje syntetizátor
Printování hodnoty do textu
report "Hodnota je: " & real'image(current_val);
Procedury
Return
- Pokud někam do procedury dám return tak to přeruší proceduru a vyskočí to ven
procedure RS ( signal S, R: in BIT; signal Q, NQ: inout BIT) is begin if (S = '1' and R = '1') then report "forbidden state: S and R are equal to '1'"; return; else Q <= S and NQ after 5 ns; NQ <= R and Q after 5 ns; end if; end procedure RS;
![[2024-03-14 Valeo daily#VHDL external name]]
— todo VHDL aliasy