Page 1 of 1

Contatatore 5 bit con MSF

PostPosted: 09 May 2015, 11:31
by edob95
Salve a tutti, in università mi è stata assegnata un esercitazione costituita da 3 esercizio uno dei quali è la realizzazione di un contatore a 5 bit tramite MSF utilizzand il linguaggio VHDL.
Il mio contatore presenta in input:un segnale RESET che avvia il conteggio o lo riporta a 0, uno STOP che ferma momentaneamente il conteggio, un RESTART che riabilita il conteggio, un segnale UP_DOWN per scegliere il verso del conteggio tutti della durata di un ciclo di clock.
In output ho invece un segnale END_C che indica la fine del conteggio, uno START_C che indica l'avvio dello stesso e un segnale bus Q a 5 bit che mi porta in uscita il valore del conteggio.
Per non utilizzare un numero esagerato di stati sono riuscito a realizzare una MSF con 4 stati utilizzando una variabile temporanea che mi permetta il conteggio. Questo è il codice VHDL:
Code: Select all
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity esercizio3 is
port(CK, stop, restart, reset, up_down: in std_logic;
       end_c, start_c: out std_logic;
      Q: out std_logic_vector(4 downto 0));
end esercizio3;

architecture arc of esercizio3 is
    type stato is(ST0, ST1, ST2, ST3);
    signal ps, ns: stato;
    signal temp: std_logic_vector(4 downto 0);
    begin
      seq_proc: process(CK, RESET)
       begin
        if(RESET='0')then
        ps<=ST0;
        elsif(rising_edge(CK)) then
        ps<=ns;
        end if;
      end process seq_proc;

      comb_proc:process(RESTART, STOP, UP_DOWN, PS)
      begin
      end_c<='0';
      start_c<='0';
       case ps is
       when ST0=>
         temp<="00000";
         if(stop='0')then
         ns<=ST0;
         elsif(up_down='0')then
         ns<=ST1;
         else
         ns<=ST2;
         end if;

      when ST1=>
        temp<=temp-"00001";
        if(stop='0')then
        ns<=ST3;
        elsif(up_down='0')then
        ns<=ST1;
        else
        ns<=ST2;
        end if;

     when ST2=>
        temp<=temp+"00001";
        if(stop='0')then
        ns<=ST3;
        elsif(up_down<='0')then
        ns<=ST1;
        else
        ns<=ST2;
        end if;

     when ST3=>
        if(Restart='1')then
        ns<=ST3;
        elsif(up_down='0')then
        ns<=ST1;
        else
        ns<=ST2;
        end if;
        when others=>
        ns<=ST0;
     end case;
     Q<=temp;
     if(temp="00000")then
     start_c<='1';
     elsif(temp="11111")then
     end_c<='1';
     end if;
   end process comb_proc;
end arc;


La compilazione avviene senza problemi solo che all'avvio della simulazione con Model Sim ricevo il seguente errore:

#**Error: (vsim-3601) Iteration limit reached at time 15ns.

Suppongo che questo sia dovuto ad un loop ma non riesco a risolvere il problema riuscite ad aiutarmi?
Grazie in anticipo, saluti Edoardo.

Re: Contatatore 5 bit con MSF

PostPosted: 10 May 2015, 10:47
by Leonardo
Ciao Edoardo,

Ti consiglio di esaminare sempre scrupolosamente i warning restituiti da Quartus, ti riporto qualche messaggio:

Warning (10492): VHDL Process Statement warning at esercizio3.vhd(41): signal "temp" is read inside the Process Statement but isn't in the Process Statement's sensitivity list

Warning (10631): VHDL Process Statement warning at esercizio3.vhd(25): inferring latch(es) for signal or variable "temp", which holds its previous value in one or more paths through the process

Warning (335093): TimeQuest Timing Analyzer is analyzing 5 combinational loops as latches.


Il primo warning ti dice che devi aggiungere qualcosa alla lista di sensitività di un processo

Il secondo che hai dei latch che sono quasi sempre un problema sulle logiche programmabili, in sostanza hai un elemento di memoria che però non è campionato solamente durante il fronte di salita di un clock e che quindi può cambiare al minimo glitch, etc.. TIPS: i segnali di stato devono essere aggiornati tra la logica combinatoria o sequenziale?

L'ultimo warning conferma il tuo dubbio, hai dei loop combinatoriali che puoi risolvere correggendo il warning precedente

Prego,
Leonardo