Domanda

Sto codificando un sommatore binario a 4 bit con accumulatore:

library ieee;
use ieee.std_logic_1164.all;

entity binadder is
    port(n,clk,sh:in bit;
        x,y:inout std_logic_vector(3 downto 0);
        co:inout bit;
        done:out bit);
end binadder;

architecture binadder of binadder is
    signal state: integer range 0 to 3;
    signal sum,cin:bit;
begin
    sum<= (x(0) xor y(0)) xor cin;
    co<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin);

    process
    begin
        wait until clk='0';
        case state is
            when 0=>
                if(n='1') then
                    state<=1;
                end if;
            when 1|2|3=>
                if(sh='1') then
                    x<= sum & x(3 downto 1);
                    y<= y(0) & y(3 downto 1);
                    cin<=co;
                end if;
                if(state=3) then
                    state<=0;
                end if;
        end case;
    end process;

    done<='1' when state=3 else '0';
end binadder;

L'output:

  

- Compilazione dell'architettura binadder di binadder

     

** Errore: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (15):

     

Nessuna voce possibile per l'operatore infix   & Quot; xor ".

     

** Errore: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (15):

     

Digitare l'errore nella risoluzione dell'espressione infix   & Quot; xor " come tipo std.standard.bit.

     

** Errore: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

     

Nessuna voce possibile per l'operatore infix   & Quot; e ".

     

** Errore: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

     

Espressione errata nell'operando di destra di   aggiungi espressione " o " ;.

     

** Errore: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

     

Nessuna voce possibile per l'operatore infix   & Quot; e ".

     

** Errore: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

     

Espressione errata nell'operando di sinistra di   aggiungi espressione " o " ;.

     

** Errore: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

     

Espressione errata nell'operando di destra di   aggiungi espressione " o " ;.

     

** Errore: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (16):

     

Digitare l'errore nella risoluzione dell'espressione infix   & Quot; o " come tipo std.standard.bit.

     

** Errore: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (28):

     

Nessuna voce possibile per l'operatore infix   & Quot; & amp; ".

     

** Errore: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (28):

     

Digitare l'errore nella risoluzione dell'espressione infix   & Quot; & amp; " come tipo   ieee.std_logic_1164.std_logic_vector.

     

** Errore: C: /Modeltech_pe_edu_6.5a/examples/binadder.vhdl (39):

     

Uscita compilatore VHDL

Credo di non gestire correttamente std_logic_vector. Per favore dimmi come? : (

È stato utile?

Soluzione

Una delle caratteristiche di VHDL è che la funzionalità di base stessa fornisce una funzionalità molto ridotta. La maggior parte viene fornita utilizzando i pacchetti. La seconda riga del tuo codice ne è un esempio (usa ieee.std_logic_1164.all). Questo significa che stai usando tutto il pacchetto std_logic_1164. Vedi qui per ciò che definisce questo pacchetto.

Quando scrivi il codice, generalmente vuoi memorizzare i tuoi segnali in std_logic o std_logic_vector. Ci sono due ragioni per questo. Il primo è che uno std_logic può anche rappresentare valori diversi da '0' o '1'. Può anche rappresentare 'Z' o 'X' per esempio. Il secondo è che i simulatori (come i modelli che stai usando) sono ottimizzati per funzionare più velocemente con std_logic.

Come convenzione generale, è buona norma rendere sempre gli input e gli output della propria entità uno std_logic o std_logic_vector.

Il problema specifico che stai riscontrando è che stai usando il bit di tipo (che è uno dei pochissimi tipi definiti nello standard VHDL) con xor.

La soluzione più semplice è cambiare il co-output nella tua entità in modo che sia di tipo std_logic e che la dichiarazione di sum e cin sia del tipo std_logic.

entity binadder is
    port(n,clk,sh:in bit;
         x,y:inout std_logic_vector(3 downto 0);
         co:inout std_logic;
         done:out bit);
end binadder;

    signal sum,cin:std_logic;

Un ulteriore commento è che in genere è una cattiva pratica rendere le porte in entrata a meno che non si abbia una buona ragione per farlo in quanto ciò rimuove alcuni dei rigidi controlli di tipo integrati nella lingua. La soluzione migliore è creare un segnale all'interno dell'entità stessa e assegnare il segnale direttamente all'uscita.

entity binadder is
    port(n,clk,sh:in bit;
         x,y:inout std_logic_vector(3 downto 0);
         co:out std_logic;
         done:out bit);
end binadder;

    signal co_int:std_logic;
 begin
    co_int<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin);
    co <= co_int;

Un ultimo commento è che una volta che il valore di state è 1, come diventerà mai 2 o 3?

Altri suggerimenti

Dai un'occhiata alle mappature della tua libreria logico-fisica.

Verifica che la libreria fisica abbia effettivamente scaricato i pacchetti.

Assicurati di non utilizzare una versione diversa dell'intestazione precompilata con una versione diversa del simulatore.

Se non funziona nulla, crea una copia locale di ieee, compila i pacchetti std_logic_1164, spostati nella libreria di lavoro e compila il tuo progetto. Questo deve funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top