Forum: FPGA, VHDL & Co. Addition mit std_logic


von Andreas Ehret (Gast)


Angehängte Dateien:

Lesenswert?

Moin!

Wie ihr seht, versuche ich in angehängtem Code einer indizierten
Variable aus einem Vektor dessen Wert addiert mit einem anderen
indizierten Wert zuzuweisen...

Leider bekomme ich bei der Synthese immer den Fehler: + can not have
such operands in this context

Ich möchte damit die Parität eines DCF77-Codes überprüfen. In den
jeweiligen Schleifen soll jeweils die Werte der Bitfolgen für die
Minute, Stunde und Kalendertag aufaddiert werden, sodass ich sie mit
den DCF77-Paritybits vergleichen kann.
Das soll am Ende des Codes durchgeführt werden, entsprechend error=0
oder 1^.

Danke für eure Hilfe im voraus

Gruß
   Andy

von john-eric (Gast)


Angehängte Dateien:

Lesenswert?

hi ich hab auch ne uhr programmiert.
hab den fehler über die bits mit xor gliedern gemacht.
und die nicht möglichen mit rein genommen.
ich häng mal den code mit an.
vielleicht hilft er dir ja.
bei der simulation lief zumindest alles ganz gut.
jetzt wart ich nur noch auf nen chip zum überprüfen.
bei mir ist das eher so das er mir aus zaehlern addiere macht.
naja vielleicht hilft es dir.
mfg

von Andreas Ehret (Gast)


Lesenswert?

Hi john-eric,

danke mal für den Code, werd´s mal checken. Aber mal so als kleinen
Tipp: Damit Du Dir nicht die tausend xor-Verknüpfungen einzeln
verknüpfen musst .... pack das doch alles in eine for..loop-Schleife,
wie in meinem Code. Meiner geht zwar nicht, aber das liegt an nem
Syntaxproblem (was weiss ich warum mein Synthese-Tool das net rafft)
... aber damit könntest Du Dir einige Zeilen sparen.

Wenn Du Interesse hast, würde ich Dir mal den vollständigen Code der
Uhr posten. Mich würde Deine Code selbstverständlich auch mal
interessieren :-)
Meine Uhr ist im Prinzip fast fertig, leider hatte ich noch keine Zeit,
alle Module gleichzeitig zu simulieren. Dauert ja ne Weile ... ;-) Aber
die einzelnen Module laufen!

Gruß
   Andy

von Jochen Pernsteiner (Gast)


Lesenswert?

>Meiner geht zwar nicht, aber das liegt an nem
>Syntaxproblem (was weiss ich warum mein Synthese-Tool das net rafft)

Ich schon. Weil der "+"-Operator nicht für zwei std_logic definiert
ist. Du brauchst stattdessen nur xor benutzen.

Allerdings ist Dein Code trotzdem falsch.
Durch die for-Schleife wird nämlich nichts aufaddiert.
Eine for-Schleife in VHDL entspricht nicht einer for-Schleife in C.

parity(0) hat immer den Wert von dcf77_decoded(21),
parity(1) hat immer den Wert von dcf77_decoded(29),
parity(2) hat immer den Wert von dcf77_decoded(36).

Ich weiß nicht ob Du Dir das so gedacht hast.

von john-eric (Gast)


Angehängte Dateien:

Lesenswert?

naja mag sein.
aber anscheinend hauts bei dir ja nicht so hin.
so den code hab ich mit angehähngt.
der ist in mehrer prozesse unterteil.
zähler, dcfbit und fehler.
beim symulieren klappt alles wunderbar.
die uhr stellt sich über dcf.
läst sich aber noch nicht manuel einstellen.
kommt wenn der chip und die hardware fertig sind.
vielleicht hast du ja hardware und könntest das mal für mich testen.
den weiß ich schon mal das es geht.
zu guter letzt, kommt vielleicht noch ne weckfunktion mit rein und ein
sprachmodul soll auch noch aufs board.
wäre nett wenn dus mal probierst.
mfg

von john-eric (Gast)


Lesenswert?

in der testbench müsstest du das signal fehler entfernen, da ich den
nicht mehr herraus geführt habe.
was ich noch nicht erwähnt habe.
die uhr speichert auch das datum ab und gibt es in den sekunden 20-29
aus.
in der restlichen zeit ist die uhrzeit.
mfg

von john-eric (Gast)


Angehängte Dateien:

Lesenswert?

der geht

von Andreas Ehret (Gast)


Lesenswert?

@Jochen P.

Danke für den Tipp! Du hast recht, damit habe ich nicht gerechnet.
Heisst das, dass ich in VHDL keine Möglichkeit habe, mit Indizierungen
dieser Form zu arbeiten?

@john-eric

danke für den Code, schicke Dir meinen heute abend zu, bin leider nicht
an meinem Arbeitsplatz.

Eines verstehe ich allerdings nicht: Du fragst in einer IF-Schleife die
Signale dcf_2 und dcf_1 ab nach unterschiedlichen Zuständen. 2 Zeilen
darüber weisst Du aber doch dcf_2 den Wert von dcf_1 zu, d.h. dieser
Zustand in der IF-Schleife würde doch nie eintreten, oder?

Vielleicht ist das jetzt auch wieder ein Denkfehler von mir ... bin
halt andere Programmiersprachen gewohnt. ;-)

------

elsif rising_edge(clk_int) then
  dcf_1 <= dcf;
  dcf_2 <= dcf_1;
  if dcf_2 ='0' and dcf_1 = '1' then
    zaehler_dcf  <= 0;
  else
    if zaehler_dcf = 1990 then
      zaehler_dcf  <= zaehler_dcf;
    else
      zaehler_dcf  <= zaehler_dcf + 1;
    end if;

------

Und john, ich werde den Code nächste Woche mal testen. Hab hier nen
Spartan3 x3s200.

Gruß
   Andy

von Andreas Ehret (Gast)


Lesenswert?

@john-eric

Gehe ich richtig in der Annahme, dass Dein Systemtakt 1 kHz ist?

Gruß
   Andy

von Michael Noll (Gast)


Lesenswert?

std_logic_arith ist dein freund ...

von john-eric (Gast)


Lesenswert?

ha ist 1kh.
über dcf 1 und 2 kann mann die tacktflanke synchron zum systemtackt
abfragen.
hab ich von einem hier aus dem forum.
dadurch wurde mein code gleich einfacher.

@ michael.
keine ahnung ise web pack macht den automatisch mit rein.
also hab ich den gelassen.
warum.
ist der schlecht oder wie??
war über wochende weg deswegen konnte ich nicht schreiben.
mfg

von john-eric (Gast)


Lesenswert?

noch mal dazu.
------

elsif rising_edge(clk_int) then
  dcf_1 <= dcf;
  dcf_2 <= dcf_1;
  if dcf_2 ='0' and dcf_1 = '1' then
    zaehler_dcf  <= 0;
  else
    if zaehler_dcf = 1990 then
      zaehler_dcf  <= zaehler_dcf;
    else
      zaehler_dcf  <= zaehler_dcf + 1;
    end if;

------
ich hab als erstes auch so dedacht.
aber ich hab mir das erklären lassen von einem hier aus dem forum und
das ist die standart methode um ein signal mit dem systemtackt zu
syncronisieren und von dem die flanke abzufragen. zum zeitpunkt der
flanke fragt der dcf_1 das neue signal von dcf ab und dcf2 das alte
signal von dcf 1. wenn es nun zu einer änderung kommt, den sind die
beiden bei einer flanke 0&1 oder 1&0.
hoffe du hast es verstanden.
beim simulieren hats geklappt.
mit der flanke wird der zähler_dcf zurück gesetzt wie man sieht.
der ist für die erkennung der minutenmarke.
danke das du den code mal testen willst.
sag den mal bitte bescheid obs geklappt hat.

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.