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
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
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
>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.
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
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
@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
@john-eric Gehe ich richtig in der Annahme, dass Dein Systemtakt 1 kHz ist? Gruß Andy
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.