www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Addition und Subtraktion


Autor: keinenPlan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sollte aber gehen. Zeig mal Code

Autor: keinenPlan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
  doutm    <= (others => '0');
  din_alt  <= (others => '0');
  dIn_temp <= dIn - dOutm & '0';
  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!

Autor: keinenPlan (Gast)
Datum:

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

Autor: Nobbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
use ieee.numeric_std.all;
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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wäre mal der erste Schritt.

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

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

Autor: keinenPlan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: keinenPlan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir das jetzt mal nicht genauer angesehen, weil es mir da schon 
das Auge ausgerenkt hat:
   if clk ='1' and clk'event then
      Q <= din_neu after 40 ps;  -- !!! Zeiten lassen sich nicht synthetisieren !!
      din_alt <= Q;
   else 
      Q <= "00000000000";
   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.

Autor: Florian Z. (floz)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Florian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)?

Autor: Nobbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Florian Z. (floz)
Datum:

Bewertung
0 lesenswert
nicht 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

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.