Forum: FPGA, VHDL & Co. Vorinitialisieren von Signalen im cpld


von Hartmut F. (Gast)


Lesenswert?

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?

von Klaus F. (kfalser)


Lesenswert?

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.

von Morin (Gast)


Lesenswert?

> 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...

von Hartmut F. (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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

von Hartmut F. (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Hartmut F. (Gast)


Lesenswert?

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!

von Falk B. (falk)


Lesenswert?

@ 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
Noch kein Account? Hier anmelden.