www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Addition mit std_logic


Autor: Andreas Ehret (Gast)
Datum:
Angehängte Dateien:

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

Autor: john-eric (Gast)
Datum:
Angehängte Dateien:

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

Autor: Andreas Ehret (Gast)
Datum:

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

Autor: Jochen Pernsteiner (Gast)
Datum:

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

Autor: john-eric (Gast)
Datum:
Angehängte Dateien:

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

Autor: john-eric (Gast)
Datum:

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

Autor: john-eric (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
der geht

Autor: Andreas Ehret (Gast)
Datum:

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

Autor: Andreas Ehret (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@john-eric

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

Gruß
   Andy

Autor: Michael Noll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
std_logic_arith ist dein freund ...

Autor: john-eric (Gast)
Datum:

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

Autor: john-eric (Gast)
Datum:

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

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.