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


von Thorsten H. (tube_radio)


Angehängte Dateien:

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:
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
USE IEEE.STD_LOGIC_ARITH.ALL;
4
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
ENTITY alu IS
7
  PORT ( Daten : IN STD_LOGIC_VECTOR(1 downto 0);
8
         Funktion : IN STD_LOGIC_VECTOR(2 downto 0);
9
         Ausgang : OUT STD_LOGIC_VECTOR(1 downto 0));
10
END alu;                                
11
12
ARCHITECTURE comb OF alu IS
13
BEGIN
14
  WITH Funktion SELECT
15
          Ausgang(0) <= '0' WHEN "000",
16
          '1' WHEN "001",
17
          (Daten(0) * Daten(1)) WHEN "010",
18
          (Daten(0) NAND Daten(1)) WHEN "011",
19
          (Daten(0) == Daten(1)) WHEN "100",   
20
          not(Daten(0)) WHEN "101",
21
          Daten(0) WHEN "110",
22
          ( (Daten(0) and not(Daten(1))) or (not(Daten(0)) and Daten(1)) )    WHEN "111",  --Summe eines Halbaddierers, da nur A und B
23
  
24
          '0' WHEN OTHERS;
25
26
27
28
  Ausgang(1) <= '0' WHEN "000",
29
          '1' WHEN "001",
30
          (Daten(0) + Daten(1)) WHEN "010",
31
          (Daten(0) NOR Daten(1)) WHEN "011",
32
          (Daten(0) == not(Daten(1))) WHEN "100",   
33
          not(Daten(1)) WHEN "101",
34
          Daten(1) WHEN "110",
35
          (Daten(0) AND Daten(1)) WHEN "111",  --Übertrag(Carry) eines Halbaddierers, da nur A und B
36
  
37
          '0' WHEN OTHERS;
38
      
39
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

von Knut (Gast)


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",

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ich bekomme mit deinem Code schon beim Syntax-Check sowas:
1
INFO:HDLCompiler:1061 - Parsing VHDL file "F:/Projekte/FPGA/OneBitALU/obalu.vhd" into library work
2
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 19: Syntax error near "=".
3
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 28: Syntax error near ",".
4
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 29: Syntax error near ",".
5
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 30: Syntax error near ",".
6
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 31: Syntax error near ",".
7
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 32: Syntax error near "=".
8
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 33: Syntax error near ",".
9
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 34: Syntax error near ",".
10
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 35: Syntax error near ",".
11
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 37: Syntax error near "OTHERS".
12
ERROR:ProjectMgmt:496 - 10 error(s) found while parsing design hierarchy.
Die Zeile 19:
1
           (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:
1
USE IEEE.STD_LOGIC_ARITH.ALL;
2
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
Dann sind diese Operationen durchaus definiert...

von Thorsten H. (tube_radio)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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:
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
USE IEEE.STD_LOGIC_ARITH.ALL;
4
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
ENTITY alu IS
7
  PORT ( Daten : IN STD_LOGIC_VECTOR(1 downto 0);
8
         Funktion : IN STD_LOGIC_VECTOR(2 downto 0);
9
         Ausgang : OUT STD_LOGIC_VECTOR(1 downto 0));
10
END alu;                                
11
12
ARCHITECTURE comb OF alu IS
13
signal m : std_logic_vector(1 downto 0);
14
signal a : std_logic_vector(1 downto 0);
15
BEGIN
16
  a <= Daten(0 downto 0) + Daten(1 downto 1);
17
  m <= Daten(0 downto 0) * Daten(1 downto 1);
18
  WITH Funktion SELECT
19
          Ausgang(0) <= '0' WHEN "000",
20
          '1' WHEN "001",
21
          m(0) WHEN "010",
22
          (Daten(0) NAND Daten(1)) WHEN "011",
23
--          (Daten(0) == Daten(1)) WHEN "100",   
24
          not(Daten(0)) WHEN "101",
25
          Daten(0) WHEN "110",
26
          ( (Daten(0) and not(Daten(1))) or (not(Daten(0)) and Daten(1)) )    WHEN "111",  --Summe eines Halbaddierers, da nur A und B
27
  
28
          '0' WHEN OTHERS;
29
30
31
32
  WITH Funktion SELECT
33
          Ausgang(1) <= '0' WHEN "000",
34
          '1' WHEN "001",
35
          a(0) WHEN "010",
36
          (Daten(0) NOR Daten(1)) WHEN "011",
37
--          (Daten(0) == not(Daten(1))) WHEN "100",   
38
          not(Daten(1)) WHEN "101",
39
          Daten(1) WHEN "110",
40
          (Daten(0) AND Daten(1)) WHEN "111",  --Übertrag(Carry) eines Halbaddierers, da nur A und B
41
  
42
          '0' WHEN OTHERS;
43
      
44
END comb;

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

von Mathi (Gast)


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

von Thorsten H. (tube_radio)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.