Jupyther věci pro VHDL

  1. [[Generátor děličky frekvence]]

Poznámky související s VHDL

  • [[GHDL + Yosys]]

Tipy pro VHDL

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