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!
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.
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
Ich habe mir das jetzt mal nicht genauer angesehen, weil es mir da schon
das Auge ausgerenkt hat:
1
ifclk='1'andclk'eventthen
2
Q<=din_neuafter40ps;-- !!! Zeiten lassen sich nicht synthetisieren !!
3
din_alt<=Q;
4
else
5
Q<="00000000000";
6
endif;
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