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


von VHDL-Neuling (Gast)


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;


von Falk (Gast)


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

von VHDL-Neuling (Gast)


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.

von Falk (Gast)


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

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.