www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Addition von Zahlen in VHDL


Autor: VHDL-Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich benütze in meinem VHDL-Code zwei Zahlen, die ich addieren möchte.
die beiden Zahlen sind binär und jeweils 16-Bit breit.

Zahl1 : in std_logic_vector(15 downto 0);
Zahl2 : in std_logic_vector(15 downto 0);
...
GesamtZahl <= Zahl1 + Zahl2;
...
Prozess für Datenausgabe
...

Die resultierende GesamtZahl dient später dazu einen Prozess zu steuern. 
Im Prozess wird ein Zähler gestartet, der zu einem CLK2-Event 
inkrementiert wird, bis es die GesamtAnzahl-Zahl erreicht.
Vor jedem Inkrementieren wird eine Datenausgabe über RS232 vorgenommen. 
Ich müsste also immer so viele Daten über RS232 rausbekommen, wie die 
Anzahl der Gesamtzahl selbst.

Nun bekomme ich aber jeweils verschiedene Ergebnisse für Gesamtzahl raus

Bei z.B Zahl1=50 und Zahl2=100 (dezimal) erhalte ich 151 Werte =OK
Bei Zahl1=10 und Zahl2=50 erhalte ich 61 Werte = auch OK

ABER: Wenn ich Beispielsweise nun Zahl1=200 und Zahl2=300 einstelle 
erhalte ich einen Wert, der viel kleiner als 500 ist! Normalerweise 
erwarte ich hier 501 Werte.

Also, bei gewissen Zahlen scheint irgend etwas Probleme zu machen

Woran könnte dies den liegen?


Unten ist der Prozess für die Ausgabensteuerung (Steuerung eines SRAM)

    AUSGABE:process (reset,clk)
    begin
        if reset='1' then
            ram_addr_reg<=(others=>'0');
            data_in_reg<=(others=>'0');
            ram_data_reg<=(others=>'0');
            end_write_addr<=(others=>'0');
            after_tl_addr<=(others=>'0');

        elsif clk'event and clk='1' then
            if read_write_stop='0' and read_en='1' then
                if addr_inc='1' then
                    ram_addr_reg<=ram_addr_reg+1;
                end if;
                if reg_mem_read_en='1' then
                    ram_data_reg<=ram_data;
                end if;
            end if;

            if count_res='1' then
                end_write_addr<=Zahl1+Zahl2;
                ram_addr_reg<=(others=>'0');
                after_tl_addr<=(others=>'0');

            elsif CLK2='1' then
                if trig_level_en='1' then
                    if read_write_stop ='0' then
                        data_in_reg<=data_in;
                        ram_addr_reg<=ram_addr_reg+1;
                    else
                        after_tl_addr<=after_tl_addr+1;
                        data_in_reg<=data_in;
                    end if;
                elsif write_en='1' then
                    if read_write_stop ='0' then
                        data_in_reg<=data_in;
                        ram_addr_reg<=ram_addr_reg+1;
                    else
                        ram_addr_reg<=(others=>'0');
                    end if;
                end if;
            end if;
        end if;
    end process AUSGABE;


Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@VHDL-Neuling

>ich benütze in meinem VHDL-Code zwei Zahlen, die ich addieren möchte.
>die beiden Zahlen sind binär und jeweils 16-Bit breit.

>Zahl1 : in std_logic_vector(15 downto 0);
>Zahl2 : in std_logic_vector(15 downto 0);
...
>GesamtZahl <= Zahl1 + Zahl2;

Ich hoffe, dass deine Gesamtzahl breit genug ist (min. 17 Bit), sonst 
fängst du dir nen schönen Überlauf ein.

>Unten ist der Prozess für die Ausgabensteuerung (Steuerung eines SRAM)

Was hat der VHDL-Quellcode mit dem Problem zu tun?

MFG
Falk

Autor: VHDL-Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk

die Gesamtzahl ist immer kleiner als 17 Bit. Beide Zahlen zusammen 
addiert ergeben weniger als 16 Bit.

In diesem VHDL-Code habe ich diese Addition verwendet.
...
if count_res='1' then
end_write_addr<=Zahl1+Zahl2;
...
wobei Gesamtzahl = end_write_addr

mit diesem Code wird ein Zähler gestartet, der den Schreib und 
Lese-Prozedur eines SRAM steuert. Es sollen immer nur 
end_write_addr<=Zahl1+Zahl2 -Anzahl Daten in das SRAM gespeichert und 
ausgelesen werden.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ VHDL-Neuling

>In diesem VHDL-Code habe ich diese Addition verwendet.

Solche Schnipsel bringen nichts. Zeig mir deinen vollstädigen Quelltext 
und ich kann dir vielleicht sagen was du falsch machst. Deine bisherigen 
Ausschnitte waren vollkommennichtssagend.

MFG
Falk

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.