|
|
|
Anfang
zurück
weiter
Ende
|
Autor |
Beitrag |
Saibot521
Registrierter Benutzer
Beiträge: 3
|
Erstellt: 18.12.09, 16:31 Betreff: elsif ungleich case ?
drucken
Thema drucken weiterempfehlen
|
|
|
Warum kommen da zwei unterschiedliche Sachen bei raus. Auf den ersten Blick würde man doch sagen das der Code das selbe macht.
[editiert: 18.12.09, 21:03 von Saibot521]
|
|
nach oben |
|
|
BerndR
Stammgast
Beiträge: 29
|
Erstellt: 21.12.09, 10:12 Betreff: Re: elsif ungleich case ?
drucken
weiterempfehlen
|
|
|
Hallo Tobias,
das liegt daran, dass du dem Synthesetool nicht vorschreibst, wie sich IO(1) und IO(2) in den nicht beschriebenen Fällen verhalten sollen. Es sieht so aus, als ob bei if Latches generiert werden und beim case nicht (Das ist auch von Synthese-tool zu Synthese-tool unterschiedlich). Dadurch werden im ersten Fall die IO-Daten gehalten bis die Anweisung für das Rücksetzen kommt und im zweiten Fall nicht. Um das gewünschte Verhalten für beide Beschreibungsarten zu erhalten, solltest du in die else bzw. when others -Bedingung den Halteterm eintragen IO(1) <= IO(1); IO(2) <= IO(2); Wenn die IOs als output definiert sind, wird es hier eine Fehlermeldung geben. Deshalb ist es ratsam hierfür interne Signale zu erzeugen, die am Schluss den Outputs zugewiesen werden. Signal io1 : std_logic; Signal io2 : std_logic;
Im Prozess werden dann die internen Signale io1 und io2 benutzt. Ausserhalb des Prozesses kommt dann noch die Zuweisung: IO(1) <= io1; und IO(2) <= io2;
Damit sollte es dann funktionieren.
Gruß
Bernd
|
|
nach oben |
|
|
Gast
|
Erstellt: 22.12.09, 12:22 Betreff: Re: elsif ungleich case ?
drucken
weiterempfehlen
|
|
|
Hm, abgesehen davon SIND die beiden Beispiele unterschiedlich. Im ersten wird der Takt abgefragt, im zweiten nicht :-)
Laut VHDL ist ein Case oder ne Sequenz von IFs nämlich äquivalent ineinander überführbar, wenn man das in beiden Fällen korrekt und gleich beschreibt. Und sinnvollerweise "vollständig" um die Latche zu vermeiden - aber Latche würden in beiden Fällen eingefügt, wenn die Anweisungen "unvollständig" sind.
BTW, die Synthesetools sagen das einem auch, d.h. man bekommt ne entsprechende Warning.
|
|
nach oben |
|
|
Gast
|
Erstellt: 22.12.09, 12:28 Betreff: Re: elsif ungleich case ?
drucken
weiterempfehlen
|
|
|
Achso ja, noch ein paar Comments:
Das IO1 <= IO1 im ELSE oder OTHERS reicht hier leider nicht aus, um das vollständig zu beschreiben, da in manchen Zweigen nur IO1 und in anderen nur IO2 gesetzt wird. Gibt trotzdem Latche.
Und auch wenns überall drin stehen würde gäbs im 2. Fall Latche, weil m.W. genau das "Halten" in einem nicht getakteten Prozess ein latch einbaut!
Aber man kann den Vorschlag von berndR vor dem Case oder If schreiben, als Default-Zuweisung. Sollte dann aber keine Haltefunktion haben.
Noch was, im ersten Prozess goibt#äs nen Takt, d.h. dort werden FFs eingebaut, keine Latche. und die FFs sind m.E. auch beabsichtigt.
In so nem Fall hilft auch immer, zu simulieren, und sich die Warnings der Tools anzuschauen.
|
|
nach oben |
|
|
Saibot521
Registrierter Benutzer
Beiträge: 3
|
Erstellt: 22.12.09, 13:30 Betreff: Re: elsif ungleich case ?
drucken
weiterempfehlen
|
|
|
Beabsichtigt war von mir eine case-anweisung mit einem speichernden verhalten. Das Ganze soll ein Testmustergenerator werden. Bei der Simulation funktioniert es so wie es soll, halt eben nur nicht in der Hardware.
Das IO stellt einen Ausgangsvektor dar, ist also keine Variable und auch kein Signal
@BerndR - das mit dem Signal dazwischen hab ich auch schon versucht. Es brachte aber nicht den gewünschten erfolg.
[editiert: 22.12.09, 15:15 von Saibot521]
|
|
nach oben |
|
|
Gast
|
Erstellt: 24.12.09, 15:12 Betreff: Re: elsif ungleich case ?
drucken
weiterempfehlen
|
|
|
Nachdem ich feststellen mußte das ISE auch noch Problem mit vielen elsif Anweisungen hintereinander hat ... mußte ich mir was neues einfallen lassen. Das hier ist bei rausgekommen:
process (clk) begin if falling_edge(clk) then -------------- Alle Eingänge auf 0 setzen if (Data_counter_16_Bit_TMG_1 = "0000000000000001") then IO(1) <= '0'; IO(2) <= '0'; IO(3) <= '0'; IO(4) <= '0'; end if; -------------- Testmuster 1 if (Data_counter_16_Bit = "0000000000000011") then IO(1) <= '1'; end if; if (Data_counter_16_Bit = "0000000000001111") then IO(1) <= '0'; end if; if (Data_counter_16_Bit = "0000000000011001") then IO(2) <= '1'; end if; if (Data_counter_16_Bit = "0000000000100101") then IO(2) <= '0'; end if; if (Data_counter_16_Bi = "0000000000101111") then IO(3) <= '1'; end if; if (Data_counter_16_Bit = "0000000000111011") then IO(3) <= '0'; end if; if (Data_counter_16_Bit = "0000000001000101") then IO(4) <= '1'; end if; if (Data_counter_16_Bit = "0000000001010001") then IO(4) <= '0'; end if; ... end if; end process;
|
|
nach oben |
|
|
Gast
|
Erstellt: 25.12.09, 00:03 Betreff: Re: elsif ungleich case ?
drucken
weiterempfehlen
|
|
|
Zitat: Saibot521
Beabsichtigt war von mir eine case-anweisung mit einem speichernden verhalten. Das Ganze soll ein Testmustergenerator werden. Bei der Simulation funktioniert es so wie es soll, halt eben nur nicht in der Hardware.
Das IO stellt einen Ausgangsvektor dar, ist also keine Variable und auch kein Signal
@BerndR - das mit dem Signal dazwischen hab ich auch schon versucht. Es brachte aber nicht den gewünschten erfolg. |
Kleiner Tipp: Ich würd immer auf die Simulation vertrauen. Allerdings misst Du den Code dann auch entsprechend schreiben, dass HW und Simulation dasselbe implementiert. Bsp. Sensitivity Listen .... werden in der Simulation korrekt ausgewertet, in der HW aber ignoriert. Ist z.B. eines der Punkte in Deinem 2 prozess, dort steht der Clk drin, d,h, die Simuklation aktualisiert die Daten immer nur,wenn Clk sich ändert. Bei allen anderen Signalen nicht. Die HW ändert den Wert bei einer Änderung auf allen Signalen, die in dem Prozess verwendet werden.
Du solltest Dir überlegen, das ganze sauber üner einen getakteten Prozess zu schreiben - da das ja ohnehin den Wert speichern soll.
|
|
nach oben |
|
|
Gast
|
Erstellt: 25.12.09, 00:13 Betreff: Re: elsif ungleich case ?
drucken
weiterempfehlen
|
|
|
Zitat: Gast
Nachdem ich feststellen mußte das ISE auch noch Problem mit vielen elsif Anweisungen hintereinander hat ... mußte ich mir was neues einfallen lassen. Das hier ist bei rausgekommen:
process (clk) begin if falling_edge(clk) then -------------- Alle Eingänge auf 0 setzen if (Data_counter_16_Bit_TMG_1 = "0000000000000001") then IO(1) <= '0'; IO(2) <= '0'; IO(3) <= '0'; IO(4) <= '0'; end if; -------------- Testmuster 1 if (Data_counter_16_Bit = "0000000000000011") then IO(1) <= '1'; end if; if (Data_counter_16_Bit = "0000000000001111") then IO(1) <= '0'; end if; if (Data_counter_16_Bit = "0000000000011001") then IO(2) <= '1'; end if; if (Data_counter_16_Bit = "0000000000100101") then IO(2) <= '0'; end if; if (Data_counter_16_Bi = "0000000000101111") then IO(3) <= '1'; end if; if (Data_counter_16_Bit = "0000000000111011") then IO(3) <= '0'; end if; if (Data_counter_16_Bit = "0000000001000101") then IO(4) <= '1'; end if; if (Data_counter_16_Bit = "0000000001010001") then IO(4) <= '0'; end if; ... end if; end process; |
Hm, was willst Du denn letztendlich beschreiben?
Hier mal ein beispiel für nen getakteten prozess:
p_Decoder: process (Clock, Reset) if Reset then IO <= (others = '0'); elsif clock'event and clock = '1' then -- hier würd ich jetzt entweder mir ein Case überlegen, -- in dem ich immer alle 4 IOs setze, oder mir 4 einzelne -- cases für jedes IO(i) machen. -- case Data_bit_counter_16 is -- when xxx => IO <= "0010"; -- when xxx => IO <= "0001"; -- usw. -- when others => IO <= "0000"; --oder welche Werte auch immer Sinn machen. -- end case; -- Das ganze wird bei einem entscheidungsvektor von 16 bit aber ziemlich schnell unübersichtlich. -- ggf. besser wäre hier: case Data_bit_counter_16 is when "wert1" | "wert2 | "wert3" => IO(0) <= '0' when "wert1" | "wert2 | "wert3" => IO(0) <= '1' when others => IO(0) <= IO(0); end case: -- dito fpr IO 1, 2 und 3. -- oder dasselbe ggf. als it then elsif .... end if; end process;
|
|
nach oben |
|
|
xiaoou
Vielschreiber
Beiträge: 53
|
|
nach oben |
|
|
thomaslist
Gast
|
|
nach oben |
|
|
xiaozheng
Gast
|
|
nach oben |
|
|
|
powered by carookee.com - eigenes profi-forum kostenlos
Design © trevorj
|