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
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;
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!
Mit anderen Worten, wenn ich mein Eingangssignal(e) caste und zu einem unsign mache kann ich einfach rechnen???
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.
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?
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
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
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.
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.
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
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)?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.