hallo miteinander, ich beschäftige mich rein autodidaktisch mit einem xc9536. Hab Null Vorkenntnisse aufzuweisen und gehe einen entsprechend steinigen Weg, hoffe daher auf Geduld. Meine Frage: Wie initialisiert man im cpld eigentlich Signale. Las, daß das vergeben von Startwerten nur für eine Simulation Wirkung hat. Die bisherige Literatur sagt immer: will man in realer Hardware eine Initialisierung haben, muss man dies anders erreichen. OK. Schön. Und konkreter? Die einzige Idee wäre, alles in einen reset prozess zu stecken und zu hoffen, daß der nach dem Einschalten zum richtigen Zeitpunkt durchlaufen wird. (der ganze Baustein läuft ja schnell los, aber falls mal fpgas ein Thema werden - die brauchen doch unkalkulierbar lange?) Alternative Vorstellung wäre für mich ein Internes Signal 'cpld' (oder fpga) läuft los, was man in die Sensitivitätsliste eines Initialisierungsprozesses schreiben könnte.... Irgendwie überzeugt mich alles nicht. Ach ja: Konkret möchte ich nur einen Vektor mit 'irgendeinem' definierten Wert laden können und den einfach mit einem Taster rundschieben. Das Problem ist aber ja denke ich immer da. Seien es Register, Zustände oder was auch immer. Daher die Frage: Wie mache ich das am besten. Mit meinem cpld und allgemein?
Wenn Du eine aktuelle ISE Software (Webpack oder Foundation) verwendest, wird das Initialisieren unterstützt. Das heißt, ein Signal das mit signal mySig : std_logic := '1'; definiert wird, startet mit High. Kein Grund, also sich Sorgen zu machen.
> Las, daß das vergeben von Startwerten nur für eine Simulation Wirkung hat. Die > bisherige Literatur sagt immer: will man in realer Hardware eine > Initialisierung haben, muss man dies anders erreichen. Theorie und Praxis. Es gibt Standards, die auf VHDL aufbauen und die festlegen, was mindestens synthetisierbar ist. Signalinitialisierungen sind das nicht. Das bedeutet aber erstmal nur, dass es wieder auf das konkrete Synthesetool ankommt, ob diese Initialisierungen nun synthetisiert werden oder nicht. Wie Klaus schon sagte ist das bei aktueller Xilinx-Software der Fall. Die Bücher zum Thema orientieren sich oft nur am Standard, selbst wenn der schon veraltet ist. Das ist leider etwas praxisfern, weil man 1. keinen Zugriff auf Features wie Signalinitialisierungen hat, die in der Praxis sehr nützlich sind, und 2. der Standard noch lange nicht garantiert, dass die Programme sich auch an ihn halten...
Danke so weit! Der Ernstfall ist allerdings jetzt schon eingetreten - ich hänge fest. An folgendem probiere ich rum:
1 | entity test1_code is |
2 | Port ( D : out STD_LOGIC_VECTOR (7 downto 0); |
3 | T : in STD_LOGIC); |
4 | end test1_code; |
5 | |
6 | architecture Behavioral of test1_code is |
7 | signal D_int : STD_LOGIC_VECTOR (7 downto 0):="11100010"; |
8 | begin
|
9 | |
10 | D<=D_int; |
11 | |
12 | shiften: process(T) |
13 | begin
|
14 | if rising_edge(T) then |
15 | D_int <= (D_int(6 downto 0) & D_int(7)); |
16 | end if; |
17 | end process shiften; |
18 | |
19 | |
20 | end Behavioral; |
Was ich möchte: 8 leds mit einem Muster vorinitialiisieren und per Taster einfach immer im Kreis schieben. Das vorinitialisieren funktioniert (obgleich mir daran nicht gefällt, daß ein internes Signal und nicht der Ausgabe Vektor initialisiert werden muss.) Was nicht funktioniert, ist die Funktion.... welch sprachliches Konstrukt. Warum die leds sich -irgendwie- ändern und das auch noch bei Tasten Druck und loslassen....da bräuchte ich Rat. Achja den Taster habe ich an gclk0 angeschlossen und mit einem rc Glied an einem Schmitt Trigger, hoffentlich, entprellt. Passiert auch nur beim niederdruck und leider loslassen entwas.
@ Hartmut F. (Gast) Der Code ist erstmal OK. >Taster einfach immer im Kreis schieben. Taster? Als Takt für einen sauschnellen CPLD? >gclk0 angeschlossen und mit einem rc Glied an einem Schmitt Trigger, >hoffentlich, entprellt. Klingt komisch deine Beschreibung. Poste mal einen Schaltplan unter Beachtung der Bildformate. Entprellung funktioniert wie im Artikel beschrieben. MFG Falk
Anbei der Schaltplan. Der Schalter ist bischen fragwürdig, ich habe aber in der Eile nichts besseres gefunden, hoffe wird euch klar. Code soweit ok ist doch was dann habe ich sicher einen Fehler in der Schaltung / Aufbau. Wenn das sehr unkonventionell ist, den Taster zum takten zu nehmen - wie würde ich es richtig, d.h. fehlerunanfälliger/narrensicher machen?
Könnte ich editieren, würde ich jetzt schreiben, daß ich die invertiereigenschaft nciht bedacht habe und daher auch die 'rising' edge irgendwie nicht passst. Ich werde die von die verlinkte Entprellung ausprobieren und bin recht zuversichtlich. vielen Dank erstmal!
@ Hartmut F. (Gast) >takten zu nehmen - wie würde ich es richtig, d.h. >fehlerunanfälliger/narrensicher machen? Indem du mal einen Schmitt-Trigger verwendest. Das was du dort hast ist KEIN Schmitt-Trigger! Das ist ein einfacher Inverter. Damit geht das nicht! Du brauchst einen 74HC_14_ ! Statt 74HC_04_ . Siehe Entprellung. Und machs auch mit den Widerständen wie im Artikel. Spart Nerven und sinnlose Nachfragen. MFG Falk
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.