botondkirei / Suport_HDL

Suport curs PSHDL
0 stars 2 forks source link

Tema de proiect - verificarea codoarelor de prioritate #4

Open botondkirei opened 4 years ago

botondkirei commented 4 years ago

Codorul de prioritate se foloseste pentru a selecta unul dintre mai multe evenimente. De exemplu sistemele de calcul stabilesc prioritatea intreruperilor hardware cu ajutorul unui codor de prioritate.

Sa consideram un codor de prioritate cu 8 intrari. Acest decodor va avea o magistrala de iesire de latimea de 5 biti. Daca nici-un semnal de intrare nu este 1 atunci iesirea este 0. Daca primul semnal este activ, atunci indiferent de restul intrarilor, iesirea va fi 1. Daca primul semnal este inactiv si al doilea este activ, atunci iesirea codorului va fi 2, indiferent de restul semnalelor. Si asa mai departe.

In urma #3 se astepata ca se obtin implementari la nivel de porti a codoarelor de la 8 pana la 32 de biti intr-o tehnologie tinta . Se cere verificarea implementarilor prin simulare VHDL. Se sugereaza:

  1. Conceperea unui testbench in care sunt instantiate la rand codoare de 8 pana la 32 de biti
  2. comparatia implementarilor cu urmatoarea descriere comportamentala:
    
    entity pe_Nbits is
          Generic ( N: natural := 4
                   );
            Port (
                    bi : in STD_LOGIC_VECTOR (N-1 downto 0); 
                    bo : out STD_LOGIC_VECTOR (log2(N)-1 downto 0);
                    );
    end pe_Nbits;

architecture Behavioral of pe_Nbits is

signal highest_bit : natural := N-1;

function log2 (n : natural) return integer is

  variable m, p : integer;
  begin
   m := 0;
   p := 1;
   for i in 0 to n loop
      if p < n then
        m := m + 1;
        p := p * 2;
      end if;
   end loop;
  return m;

end log2;

begin

shifting : PROCESS(bi) variable i: natural; begin for i in 0 to N-1 loop if bi(i) = '1' then highest_bit <= i; end if; end loop; end process;

bo <= std_logic_vector(to_unsigned(highest_bit, log2(N)));

end Behavioral;