Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

VHDL Conversione da enumerated a std_logic_vector

Strumenti informatici per la matematica applicata, le simulazioni, il disegno: Mathcad, Matlab, Scilab, Microcap, PSpice, AutoCad ...

Moderatori: Foto Utenteg.schgor, Foto Utentedimaios

0
voti

[1] VHDL Conversione da enumerated a std_logic_vector

Messaggioda Foto Utentemichper1 » 13 apr 2013, 8:50

Ciao a tutti!
Ho un problema che mi assilla e non riesco a risolvere. Ho descritto una macchina a stati in questo modo:

Codice: Seleziona tutto
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

ENTITY sequence_2proc_fsm IS
PORT(    w : IN std_logic;
      clk, rstn : IN std_logic;
      state :OUT std_logic_vector(8 downto 0);
      z : OUT std_logic);
END sequence_2proc_fsm;

ARCHITECTURE behavioural OF sequence_2proc_fsm IS
TYPE state_type IS (A,B,C,D,E,F,G,H,I);
SIGNAL ps, ns : state_type; -- ps: present state, ns= next state
BEGIN

state_process: PROCESS(w, ps)
BEGIN
   CASE ps IS
      WHEN A =>    IF w = '0' THEN ns <= B;
               ELSE ns <= F;
               END IF;
      WHEN B =>    IF w = '0' THEN ns <= C;
               ELSE ns <= F;
               END IF;
      WHEN C =>    IF w = '0' THEN ns <= D;
               ELSE ns <= F;
               END IF;
      WHEN D =>    IF w = '0' THEN ns <= E;
               ELSE ns <= F;
               END IF;
      WHEN E =>    IF w = '0' THEN ns <= E;
               ELSE ns <= F;
               END IF;
      WHEN F =>    IF w = '0' THEN ns <= B;
               ELSE ns <= G;
               END IF;
      WHEN G =>    IF w = '0' THEN ns <= B;
               ELSE ns <= H;
               END IF;
      WHEN H =>    IF w = '0' THEN ns <= B;
               ELSE ns <= I;
               END IF;
      WHEN I =>    IF w = '0' THEN ns <= B;
               ELSE ns <= I;
               END IF;
      WHEN OTHERS => ns <= A;
   END CASE;
END PROCESS;

state_update: PROCESS(clk)
BEGIN
   IF clk'EVENT AND clk = '1' THEN
      IF rstn = '0' THEN
      ps <= A;
      ELSE
      ps <= ns;
      END IF;
   END IF;
END PROCESS;

z <= '1' WHEN ps = E OR ps = I ELSE '0';
state <= ps; -- conversione??? state è di tipo std_logic_vector

END behavioural;


Avrei bisogno di portare in uscita il present state codificato su std_logic_vector. Esiste una funzione di conversione che lo faccia? Altrimenti è possibile estrarre in qualche modo dalla macchina a stati il signal in ingresso ai vari flip flop che la compongono?
Grazie, buon weekend a tutti
Avatar utente
Foto Utentemichper1
190 1 2 4
Frequentatore
Frequentatore
 
Messaggi: 114
Iscritto il: 19 mar 2013, 22:12
Località: Türin

0
voti

[2] Re: VHDL Conversione da enumerated a std_logic_vector

Messaggioda Foto Utenterini » 13 apr 2013, 13:23

Codice: Seleziona tutto
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

ENTITY sequence_2proc_fsm IS
PORT(    w : IN std_logic;
      clk, rstn : IN std_logic;
      state :OUT std_logic_vector(8 downto 0);
      z : OUT std_logic);
END sequence_2proc_fsm;

ARCHITECTURE behavioural OF sequence_2proc_fsm IS
TYPE state_type IS (A,B,C,D,E,F,G,H,I);
SIGNAL ps, ns : state_type; -- ps: present state, ns= next state
SIGNAL outx : std_logic_vector(8 downto 0);
BEGIN

state_process: PROCESS(w, ps)
BEGIN
   CASE ps IS
      WHEN A =>    IF w = '0' THEN ns <= B;
               ELSE ns <= F;
...............................
      WHEN I =>    IF w = '0' THEN ns <= B;
               ELSE ns <= I;
               END IF;
      WHEN OTHERS => ns <= A;
   END CASE;
END PROCESS;

state_update: PROCESS(clk)
BEGIN
   IF clk'EVENT AND clk = '1' THEN
      IF rstn = '0' THEN
      ps <= A;
      outx <= "00000";
      ELSE
      ps <= ns;
      END IF;
    
      CASE ns IS
        WHEN A => outx <= "00000000";
        WHEN B => outx <= "00000001";
        WHEN C => outx <= "00000010";
        WHEN D => outx <= "00000011";
        WHEN E => outx <= "00000100";
        WHEN F => outx <= "00000101";
        WHEN G => outx <= "00000110";
        WHEN H => outx <= "00000111";
        WHEN I => outx <= "00001000";
        WHEN OTHERS => ns <= "00000000";
      END CASE;
      
   END IF;
END PROCESS;

z <= '1' WHEN ps = E OR ps = I ELSE '0';
state <= outx; -- conversione??? state è di tipo std_logic_vector

END behavioural;


io avevo pensato a qualcosa del genere, dato che le funzioni di conversioni che dici tu io non ne conosco. provalo e vedi se soddisfa le tue aspettative
rini - \existslectroYou
Avatar utente
Foto Utenterini
1.345 2 5 13
Master EY
Master EY
 
Messaggi: 460
Iscritto il: 17 dic 2007, 1:04
Località: Bologna \ Salento

0
voti

[3] Re: VHDL Conversione da enumerated a std_logic_vector

Messaggioda Foto Utentemichper1 » 13 apr 2013, 19:38

Ciao, grazie per la risposta.
Il problema è che io dovrei visualizzare i present state su un array di led sulla board DE2 dell'Altera al variare della codifica che impongo al sintetizzatore. Mi spiego meglio. Il sintetizzatore deve ottimizzare la codifica degli stati in con tre varianti. La prima è minimal bits, la seconda one hot e la terza automatica.
In questi tre casi la codifica che il sintetizzatore usa per il medesimo stato varia. E io vorrei visualizzarla, utilizzando i led, sulla board.
Con il codice che mi hai scritto invece impongo io la codifica di ogni stato.
Ciao, buona serata
Avatar utente
Foto Utentemichper1
190 1 2 4
Frequentatore
Frequentatore
 
Messaggi: 114
Iscritto il: 19 mar 2013, 22:12
Località: Türin


Torna a Programmi applicativi: simulatori, CAD ed altro

Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti