Forum: FPGA, VHDL & Co. VHDL ALU ohne Libraries


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von David R. (legacydr)


Lesenswert?

Hi zusammen!

Ich muss im Studium aktuell eine ALU mit einer 2Bit AluControl in VHDL 
programmieren. Das ganze ist mit einfachen bit_vektoren (mit variabler 
Größe) zu realisieren, wobei auch keine Libraries, Integer Operationen 
und Bibliotheksfunktionen von den Vektoren verwendet werden dürfen.
Für die Funktionen add und sub sollen außerdem procedures verwendet 
werden.
Ich habe Addieren, AND und OR Operationen schon zum Laufen bekommen, 
allerdings hänge ich bei der Subtraktion ziemlich.

Mein Ansatz wäre gewesen, den Eingang B ins Zweierkompliment zu 
verwandeln und dann die add-procedure aufzurufen.

Mein aktueller Code:
1
library work;
2
use work.all;
3
4
entity ALU is
5
   port (
6
     iSrcA      : in  bit_vector;
7
   iSrcB      : in  bit_vector;
8
   iALUControl: in  bit_vector(1  downto 0);
9
   oALUResult : out bit_vector;
10
   oZero    : out bit);
11
end ALU;
12
13
architecture Behave of ALU is 
14
  signal Result : bit_vector(iSrcA'range);
15
  procedure addBV(signal A, B : in bit_vector(iSrcA'range);
16
          signal res : out bit_vector(iSrcA'range)) is
17
          variable Output : bit_vector(iSrcA'range);
18
          variable Carry : bit := '0';
19
  begin
20
    for i in iSrcA'range loop
21
      Output(i) := A(i) xor B(i) xor Carry;
22
      Carry := (A(i) and B(i)) or (Carry and (A(i) xor B(i)));
23
    end loop;
24
    res <= Output;
25
  end procedure;
26
  
27
  procedure subBV(signal A, B : in bit_vector(iSrcA'range);
28
          signal res : out bit_vector(iSrcA'range)) is
29
          signal BMinus : bit_vector(iSrcA'range);
30
          variable back : bit_vector(iSrcA'range);
31
  begin
32
    -- Umwandeln von Wert in B auf Zweierkomplement
33
    -- Dann damit addBV aufrufen
34
    back(BMinus'range) := (not(B(B'range)));
35
    BMinus <= back;
36
    addBV(A, BMinus, res);
37
  end procedure;
38
begin
39
  -- iALUControl: "00": Add, "01": Sub, "10": And, "11": Or
40
  process (iALUControl,iSrcA, iSrcB)
41
  begin
42
    case iALUControl is
43
      when "00" => -- A + B
44
        addBV(iSrcA, iSrcB, Result);
45
      when "01" => -- A - B bzw. (A + (-B))
46
        --subBV(iSrcA, iSrcB, Result);
47
      when "10" => -- A AND B
48
        Result <= iSrcA and iSrcB;
49
      when "11" => -- A OR B
50
        Result <= iSrcA or iSrcB;
51
      when others =>
52
        Result <= (others => '0');
53
    end case;
54
  end process;
55
  
56
  Output: process (Result)
57
  begin
58
    oALUResult <= Result after 15 ns;
59
  end process;
60
  
61
  ZFlag : process (Result)
62
  begin
63
    if Result = (Result'range => '0') then
64
      oZero <= '1' after 10 ns;
65
    else
66
      oZero <= '0' after 10 ns;
67
    end if;
68
  end process;
69
end architecture Behave;

von Duke Scarring (Gast)


Lesenswert?

Hast Du Dir die Subtraktion schonmal aufgemalt?
Wenn ja, kannst Du uns das hier zeigen?

Duke

von Jo U. (avrusb)


Lesenswert?

Hallo,

in Deiner subBV() Routine bildest Du bis jetzt nur das EINER-Komplement!
Also vor Aufruf von addBV() einen weiteren Aufruf von addBV(BMinus, 1, 
res) einfügen.

Des weiteren lassen sich Deine beiden Prozesse auch als conditional 
signal assignments schreiben, aber das ist wohl eine Stilfrage.

von (prx) A. K. (prx)


Lesenswert?

Jo U. schrieb:
> in Deiner subBV() Routine bildest Du bis jetzt nur das EINER-Komplement!

Subtraktion ist tatsächlich als Addition vom Einerkomplement 
implementierbar - aber mit am Anfang gesetzem Carry.

: Bearbeitet durch User
von my 50 Cents (Gast)


Lesenswert?

David R. schrieb:
> Für die Funktionen add und sub sollen außerdem procedures verwendet
> werden.

Soll das eine reines Simulationsmodell werden?
Dir ist bewusst, dass das keine wirkliche echte ALU ergeben wird, die 
man asl drop in bei einer Schaltung wird verwenden können?
...auch wegen der *wait*s und *after*s, oder?

Ich habe auch bedenken, die Carry Chain so platt aufzusetzen. Das wird 
recht langsam werden ,,,

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]
  • [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.

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