Forum: FPGA, VHDL & Co. Addition und Subtraktion


von keinenPlan (Gast)


Lesenswert?

Hallo Leute,

eine kurze Frage, ich will/muss eine Differenz Bilden, als Eingangswerte 
liegen jeweils ein 10Bit breites Std_logic_vector vor dass Ergebnis wird 
in einem weiteren Schritt dann mit einem Wert Addiert, gleicher Typ und 
Länge.
Wie schreibe ich das in VHDL? Ich habe einfach mal naiv die Signale mit 
nem '+'bzw '-' addiert / subtrahiert und das Ergebnis auf nen neuen 
Vektor geschrieben, aber das geht nicht.
Was mach ich falsch

Danke für die Hilfe

von ich (Gast)


Lesenswert?

Das sollte aber gehen. Zeig mal Code

von keinenPlan (Gast)


Lesenswert?

So hier mal ein Auszug aus meinem Code...ich versteh es echt nicht. 
Nicht wundern der Text ist in mehr eingebettet:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;

entity SDModulator is

                          -- Ports Anlegen--

  port (   dIn: in std_logic_Vector (9 downto 0);
      clk: in std_logic;
      dOut: out std_logic );

end SDModulator;


architecture Modulator of SDModulator is

                          -- Hilfssignale anlegen--

signal dIn_temp:       std_logic_Vector  (10 downto 0);
signal dIn_neu:       std_logic_Vector  (10 downto 0);
signal dIn_alt:        std_logic_Vector  (10 downto 0);
signal dOutm:         std_logic_Vector  (9 downto 0);
signal Q:        std_logic_Vector  (10 downto 0);
signal dOut_read:      std_logic;
signal dIn_un:        std_logic_Vector  (9 downto 0);

begin
                      -- Signale mit '0' initalisieren --

  doutm <= (others => '0');
  din_alt <= (others => '0');

  Differenz: process (dIn, dOutm)          -- Differenzbildung am 1. 
Knoten --
  begin

    dIn_temp <= dIn - dOutm & '0';


  end process Differenz;


  Addiere: process (dIn_temp, dIn_alt)            -- Addition am 2. 
Knoten --
  begin

    dIn_neu <= dIn_temp + dIn_alt;


  end process Addiere;

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?


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


Lesenswert?

keinenPlan schrieb:
> use ieee.numeric_std.all;
> use ieee.std_logic_arith.all;
Niemals nicht beide!!
Sonst sind einige Funktionen/Casts doppelt delkariert...
Siehe auch den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

Wozu die beiden Prozesse? Du kannst die Operationen auch ganz ohne 
Sensitivliste einfach so concurrent hinschreiben.
1
  doutm    <= (others => '0');
2
  din_alt  <= (others => '0');
3
  dIn_temp <= dIn - dOutm & '0';
4
  dIn_neu  <= dIn_temp + dIn_alt;
Das ist genau funktionsgleich, nur ein wenig kompakter.

> das Ergebnis auf nen neuen Vektor geschrieben, aber das geht nicht.
Was geht da nicht?

Übrigens: mit Vektoren rechnet man nicht.
Stattdessen gibt es die Datentypen signed, unsigned und integer!

von keinenPlan (Gast)


Lesenswert?

Mit anderen Worten, wenn ich mein Eingangssignal(e) caste und zu einem 
unsign mache kann ich einfach rechnen???

von Nobbi (Gast)


Lesenswert?

1
use ieee.numeric_std.all;
2
use ieee.std_logic_arith.all;
Also wenn dann nur eines von beiden einbinden. Bevorzugt numeric_std, 
weil std_logic_arith schon etwas veraltet ist.
Wenn du deine Rechnungen durchführen willst solltest du drauf achten, 
dass deine Vektoren signed oder unsigned sind und nicht 
std_logic_vector. Entweder du änderst das an der 
Eingangs-/Signaldeklaration direkt oder du verwendest dann den typecast.
http://www.lothar-miller.de/s9y/categories/16-Numeric_Std
Gruß Nobbi.

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


Lesenswert?

Das wäre mal der erste Schritt.

Aber prinzipiell solltest du mit der alten Synopsys-Lib durchaus mit 
Vektoren rechnen können...

Übrigens:
1
  doutm    <= (others => '0');
2
  din_alt  <= (others => '0');
3
  dIn_temp <= dIn - dOutm & '0';
4
  dIn_neu  <= dIn_temp + dIn_alt;
Die obige Beschreibung und die nachfolgende sind exakt funktionsgleich:
1
  dIn_neu  <= dIn_temp + dIn_alt;
2
  dIn_temp <= dIn - dOutm & '0';
3
  din_alt  <= (others => '0');
4
  doutm    <= (others => '0');
Ist dir das klar?

von keinenPlan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo erstmal ein großes DANKE für die Schnelle Hilfe,

ich habe jetzt mal alle Werte zu unsigned gemacht, dass klappt dann 
auch, jetzt eröffnet sich nur ein neues Problem.

Im Anhang meine Datei, vielleicht erkennt der eine oder andere was ich 
da tue...ich sag nur Sigma-Delta-Wandlung

von keinenPlan (Gast)


Lesenswert?

Hallo,

also das Problem liegt an dem Cast bei meinem Komperator, aber das 
bekomme ich nicht so ganz hin...Code habt ihr ja

thx schonmal

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


Lesenswert?

Ich habe mir das jetzt mal nicht genauer angesehen, weil es mir da schon 
das Auge ausgerenkt hat:
1
   if clk ='1' and clk'event then
2
      Q <= din_neu after 40 ps;  -- !!! Zeiten lassen sich nicht synthetisieren !!
3
      din_alt <= Q;
4
   else 
5
      Q <= "00000000000";
6
   end if;
Was soll denn hier passieren?
Bei einer steigenden Flanke sollen irgendwelche Daten an Q übergeben 
werden. Und wenn keine Flanke kommt, dann soll Q auf 0 gesetzt werden. 
Blöd nur, dass eine Flanke per Definiton eine Zeitdauer von 0 hat. Du 
bist also eigentlich immer im else-Pfad.

Ich empfehle dir unbedingt das Buch "VHDL-Synthese" zur Bildung einer 
halbwegs fundierten VHDL-Basis...

EDIT: Meine VHDL-Dateien enden mit .vhd oder .vhdl
Dann funktioniert das hier im Forum auch mit dem Syntax-Highlighten.

von Florian Z. (floz)


Lesenswert?

Lothar Miller schrieb:
> if clk ='1' and clk'event then


dass ist nach mir die Abfrage einer Steigenden Flanke, also immer wenn 
eine steigende Flanke kommt soll es etwas tun, nämlich Q durchreichen

Ja ich gebe zu ich bin noch ein ziemlicher Anfänger in Sachen VHDL aber 
ich übe ganz fleißig.

von Florian (Gast)


Angehängte Dateien:

Lesenswert?

So manchmal sagen bilder mehr als tausend worte daher meine Vorstellung 
als schema,
ich hoffe mit eurer hilfe bekomme ich sie in vhdl umgesetzt.

danke schon mal

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


Lesenswert?

Da ist ein Komparator (kein Komp-e-rator) drin, der aber irgendwie gar 
nichts vergleicht. Komparator heißt aber "Vergleicher"...

Und was macht das Modul "Auffüllen"?

Wie sind die Wortbreiten (bzw. Zahlenbereiche)?

von Nobbi (Gast)


Lesenswert?

Florian Z. schrieb:
> dass ist nach mir die Abfrage einer Steigenden Flanke, also immer wenn
> eine steigende Flanke kommt soll es etwas tun, nämlich Q durchreichen

prinzipiell richtig, aber immer wenn die Anweisung für die steigende 
Flanke nicht erfüllt ist, ist dann der else Zweig aktiv. Wie bereits 
erwähnt wurde hat allerdings die steigende Flanke ein Dauer von 0, was 
dazu führt, dass der else Zweig ständig aktiv ist.
Ich denke, dass dann die Anweisung nicht synthetisiert, sondern Q 
einfach nur mit Ground verbunden wird. Bitte korrigiert mich wenn ich 
falsch liege.
Gruß Nobbi.

von Florian Z. (floz)


Lesenswert?

Doch also der Komperator, schaut das MSB an und wenn das '1' ist wird 
durch "auffüllen" ein Signal mit lauter Einzen erzeugt und wenn der 
Komperator eine '0' vorfindet erzeugt "auffüllen" ein Null Signal die 
Signallängen sind imm 9 downto 0 ...
Hoffe es kann mir jemand stellenweiße Code oder ein paar Tips geben

danke

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.