www.mikrocontroller.net

Forum: FPGA, VHDL & Co. ALU (1Bit-Prozessor)


Autor: Thorsten H. (tube_radio)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Mikrocontroller-Community,

Habe dieses Forum erst vor kurzem entdeckt, und bin erstaunt welche 
Vielfältigen Themen es umfasst.

Nun, wie Ihr aus meinem Betreff schon erahnen könnt, habe ich ein 
Problem eine ALU im VHDL-Code zu schreiben.
Ich sollte das bauen (Bild im Anhang).

Mein Code:


LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY alu IS
  PORT ( Daten : IN STD_LOGIC_VECTOR(1 downto 0);
         Funktion : IN STD_LOGIC_VECTOR(2 downto 0);
         Ausgang : OUT STD_LOGIC_VECTOR(1 downto 0));
END alu;                                

ARCHITECTURE comb OF alu IS
BEGIN
  WITH Funktion SELECT
          Ausgang(0) <= '0' WHEN "000",
          '1' WHEN "001",
          (Daten(0) * Daten(1)) WHEN "010",
          (Daten(0) NAND Daten(1)) WHEN "011",
          (Daten(0) == Daten(1)) WHEN "100",   
          not(Daten(0)) WHEN "101",
          Daten(0) WHEN "110",
          ( (Daten(0) and not(Daten(1))) or (not(Daten(0)) and Daten(1)) )    WHEN "111",  --Summe eines Halbaddierers, da nur A und B
  
          '0' WHEN OTHERS;



  Ausgang(1) <= '0' WHEN "000",
          '1' WHEN "001",
          (Daten(0) + Daten(1)) WHEN "010",
          (Daten(0) NOR Daten(1)) WHEN "011",
          (Daten(0) == not(Daten(1))) WHEN "100",   
          not(Daten(1)) WHEN "101",
          Daten(1) WHEN "110",
          (Daten(0) AND Daten(1)) WHEN "111",  --Übertrag(Carry) eines Halbaddierers, da nur A und B
  
          '0' WHEN OTHERS;
      
END comb;




Habe jeweils Daten, Funktionen und die Ausgänge(F,G) zu einem Vektor 
zusammengefasst.
Grundsätzlich nicht schwer, doch ich erhalte beim Compilieren immer 
einen Fehler das er die Befehle wo ich addiere und multipliziere nicht 
interpretieren kann in Englisch: can't interpret subprogram call.

Das müsste doch funktionieren, habe auch weiter Bibliotheken verwendet.
Weiteres verstehe ich nicht wie ich den Befehl A!=B in VHDL-Code 
schreiben soll.

Hoffe Ihr könnt mir helfen
Um Antworten wäre ich euch sehr dankbar!

mfg

Autor: Knut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für STD_LOGIC_VECTOR sind die Operationen wie + und * nicht definiert. 
Du must quasi einen Typecast auf einen Numerischen Typ machen, den VHDL 
versteht:

Oben:
use ieee.numeric_std.all;

Und dann:
(unsigned(Daten(0)) + unsigned(Daten(1))) WHEN "010",

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bekomme mit deinem Code schon beim Syntax-Check sowas:
INFO:HDLCompiler:1061 - Parsing VHDL file "F:/Projekte/FPGA/OneBitALU/obalu.vhd" into library work
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 19: Syntax error near "=".
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 28: Syntax error near ",".
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 29: Syntax error near ",".
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 30: Syntax error near ",".
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 31: Syntax error near ",".
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 32: Syntax error near "=".
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 33: Syntax error near ",".
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 34: Syntax error near ",".
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 35: Syntax error near ",".
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 37: Syntax error near "OTHERS".
ERROR:ProjectMgmt:496 - 10 error(s) found while parsing design hierarchy.
Die Zeile 19:
           (Daten(0) == Daten(1)) WHEN "100",  
== gibt es in VHDL nicht...  :-/
Es sein denn, du hast deinen eigenen Operator definiert...

> Weiteres verstehe ich nicht wie ich den Befehl A!=B in VHDL-Code
> schreiben soll.
/= evtl...?

Sowas steht aber in jedem VHDL-Buch ziemlich am Anfang...


Knut schrieb:
> Für STD_LOGIC_VECTOR sind die Operationen wie + und * nicht definiert.
Wenn das da steht:
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
Dann sind diese Operationen durchaus definiert...

Autor: Thorsten H. (tube_radio)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
Danke für eure SCHNELLEN Antworten...
Eben, ich habe die Operatoren wie folgt definiert:

USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

und trotzdem gibt er mir eine Fehlermeldung aus das er die Befehle nicht 
interpretieren kann, komisch..
Auch habe ich die Bibliothek die Knut vorgeschlagen hat verwendet, nur 
schreibt er dann als Fehlermeldung das "numeric_std" in der Bibliothek 
nicht existiert.
Abgesehen von der Zeile 19 und 32 mit dem "=" sollte das Programm ja 
funktionieren, oder?....
Wie gesagt als Fehlermeldung bekomme ich nur das er die Befehle nicht 
versteht, würdet Ihr das Programm anders schreiben?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thorsten H. schrieb:
> Abgesehen von der Zeile 19 und 32 mit dem "=" sollte das Programm ja
> funktionieren, oder?....
Das ist kein Programm, das auf irgendeinem FPGA "läuft".

> Abgesehen von der Zeile 19 und 32 mit dem "=" sollte das Programm ja
> funktionieren, oder?....
Nein.
Denn selbst wenn der Vergleich funktionieren würde, liefert er einen 
boolean Wert zurück. Du mußt aber einen std_logic Wert an den Vektor 
zuweisen.

Dein Problem mit dem Multiplizieren und Addieren ist, dass diese 
Operationen nur für Vektoren definiert sind, nicht für einzelne Bits. 
Als Workaround könntest du so schreiben:
(Daten(0 downto 0) * Daten(1 downto 1))
Blöd nur, dass dann aber das Ergebnis immer noch ein Vektor ist, den du 
nicht auf ein einzelnes Bit zuweisen kannst...

So ginge das prinzipiell:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY alu IS
  PORT ( Daten : IN STD_LOGIC_VECTOR(1 downto 0);
         Funktion : IN STD_LOGIC_VECTOR(2 downto 0);
         Ausgang : OUT STD_LOGIC_VECTOR(1 downto 0));
END alu;                                

ARCHITECTURE comb OF alu IS
signal m : std_logic_vector(1 downto 0);
signal a : std_logic_vector(1 downto 0);
BEGIN
  a <= Daten(0 downto 0) + Daten(1 downto 1);
  m <= Daten(0 downto 0) * Daten(1 downto 1);
  WITH Funktion SELECT
          Ausgang(0) <= '0' WHEN "000",
          '1' WHEN "001",
          m(0) WHEN "010",
          (Daten(0) NAND Daten(1)) WHEN "011",
--          (Daten(0) == Daten(1)) WHEN "100",   
          not(Daten(0)) WHEN "101",
          Daten(0) WHEN "110",
          ( (Daten(0) and not(Daten(1))) or (not(Daten(0)) and Daten(1)) )    WHEN "111",  --Summe eines Halbaddierers, da nur A und B
  
          '0' WHEN OTHERS;



  WITH Funktion SELECT
          Ausgang(1) <= '0' WHEN "000",
          '1' WHEN "001",
          a(0) WHEN "010",
          (Daten(0) NOR Daten(1)) WHEN "011",
--          (Daten(0) == not(Daten(1))) WHEN "100",   
          not(Daten(1)) WHEN "101",
          Daten(1) WHEN "110",
          (Daten(0) AND Daten(1)) WHEN "111",  --Übertrag(Carry) eines Halbaddierers, da nur A und B
  
          '0' WHEN OTHERS;
      
END comb;

BTW:
(Daten(0) and not(Daten(1))) or (not(Daten(0)) and Daten(1))
Das ist ein
Daten(0) XOR Daten(1)

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thorsten H. schrieb:
> Eben, ich habe die Operatoren wie folgt definiert:
>
> USE IEEE.STD_LOGIC_ARITH.ALL;
> USE IEEE.STD_LOGIC_UNSIGNED.ALL;

Gewöhn Dir schnellstmöglich an die beiden Bibliotheken NICHT zu 
verwenden!
Die waren nur eine Übergangslösung.
Benutze die numeric_std

Autor: Thorsten H. (tube_radio)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Antworten, Lothar --> danke für den Code.
Habs jetzt so ziemlich verstanden, was die Fehler betrifft.
Nochmals danke und schönen Abend noch...
mfg

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.