Forum: FPGA, VHDL & Co. Der Process soll sich selber ausschalten


von GS (chromosoma)


Lesenswert?

Manchmal fällt es wirklich schwer  einen passenden Betreff zu finden.:)

Es geht um folgendes:

Gegeben ist FPGA das  mit VHDL "programmiert" wird.

Es gibt insgesamt 3 Processe.

Ein Reciever, Transmitter und Main.

WIe der Name sagt,  Reciever empfäng die 12 Bit langen Befehl.
Sobald die Übertragung  fertig ist, setzt Reciever INSTRFLG auf 1. Das 
sagt den Main-Process, dass er jetzt diese 12 Bit in einen Befehl 
decodieren soll.
Falls Bit 11 =1, werden diese 12 Bit an  den Process "transmitter" 
übergeben.(SET_REF='1')
 Transmitter versendet insgesamt 16 bit seriell, und sobalt er fertig 
ist soll er die Kommunikation unterbrechen.
Die Idee ist, dass Transmitter den INSTRFLG wierder auf 0 setzt 
(RESET=0), und somit wird die  Befehlausführung in MAIN beendet.

Jetzt habe ich folgende  Meldung:

Error (12014): Net "INSTRFLG", which fans out to "SET_VREF", cannot be 
assigned more than one value
  Error (12015): Net is fed by "EXE:C1|FLG"
  Error (12015): Net is fed by "TRANSMITTER:C2|RESET"

Auf INSTRFLG greift somit  sowohl RECIEVER als auch TRANSMITTER, ich 
denke da liegt das Problem.
Mir ist irgendwie nicht ganz klar, wieso der INSTRFLG nicht durch 
Transmitter  geändert werden kann, oder wie ich meine Idee richtig 
realisieren kann.

Anbei  der Quellcode, stark verkürzt für den besseren Übersicht...

1
 library ieee;
2
USE ieee.std_logic_1164.all;
3
USE ieee.std_logic_unsigned.all;
4
USE ieee.numeric_std.all;
5
6
7
ENTITY FIRMWARE IS
8
PORT(
9
10
CLK_250: IN STD_LOGIC;
11
CLK_EN: OUT STD_LOGIC;
12
PD:OUT STD_LOGIC_VECTOR(2 downto 0);
13
DA_CLK:OUT STD_LOGIC;
14
SYNC_NOT:OUT STD_LOGIC_VECTOR(2 downto 0);
15
DA_IN: OUT STD_LOGIC_VECTOR(2 downto 0);
16
TX_EN,TX_DATA: IN STD_LOGIC
17
18
);
19
END FIRMWARE;
20
21
ARCHITECTURE MAIN OF FIRMWARE IS
22
SIGNAL INSTRUCTION: STD_LOGIC_VECTOR(11 downto 0):=(others=>'0');
23
SIGNAL INSTRFLG,ERROR: STD_LOGIC;
24
SIGNAL REC_ERROR:STD_LOGIC:='0';
25
SIGNAL WAITING: STD_LOGIC:='1';
26
SIGNAL PRSCL: INTEGER RANGE 0 to 8;
27
SIGNAL SET_VREF: STD_LOGIC;
28
   COMPONENT TRANSMITTER IS
29
  PORT(
30
       FLAG: IN STD_LOGIC;
31
       VOLTAGE:IN STD_LOGIC_VECTOR(7 downto 0);
32
       DA_SL: IN STD_LOGIC_VECTOR(2 downto 0);
33
       CLK: IN STD_LOGIC;
34
       SYNC: OUT STD_LOGIC_VECTOR(2 downto 0);
35
       DA_CLK: OUT STD_LOGIC;
36
       TX: OUT STD_LOGIC_VECTOR(2 downto 0);
37
       RESET:OUT STD_LOGIC
38
       );
39
   END COMPONENT TRANSMITTER;  
40
  
41
  
42
  COMPONENT EXE IS
43
  PORT(
44
    CLK:IN STD_LOGIC;
45
    REC_EN: IN STD_LOGIC;
46
    DATALINE: IN STD_LOGIC;
47
    COMMAND: OUT STD_LOGIC_VECTOR(11 downto 0);
48
          FLG,ERROR: OUT STD_LOGIC
49
    );
50
  END COMPONENT EXE;
51
BEGIN
52
C1: EXE PORT MAP(
53
      CLK_250,
54
    TX_EN,
55
      TX_DATA,
56
      INSTRUCTION,
57
      INSTRFLG,
58
      REC_ERROR
59
      );
60
C2: TRANSMITTER PORT MAP (
61
  SET_VREF,
62
  INSTRUCTION(7 downto 0),
63
  INSTRUCTION(10 downto 8),
64
  CLK,
65
  SYNC_NOT,
66
  DA_CLK,
67
          DA_IN,
68
          INSTRFLG
69
              );
70
PROCESS (CLK_250) 
71
BEGIN
72
IF(CLK_250'EVENT AND CLK_250='1')THEN
73
           
74
     CASE INSTRFLG IS---new command recieved
75
    WHEN '1'=>   
76
    CASE INSTRUCTION(11) IS
77
    WHEN '1'=> ---SEND DATA TO TRAMSITTER
78
      SET_VREF<='1'; ---START TRANSMISSION
79
    WHEN '0'=> 
80
       CASE  INSTRUCTION(10) IS
81
       WHEN '1' .......... blablabla
82
    END CASE;
83
          WHEN '0'=>
84
      SET_VREF<='0'; ----STOP TRANMISSION
85
      WAITING<='1';----wait for  new command
86
          WHEN OTHERS =>NULL;
87
    END CASE;
88
END IF;
89
---END OF MAIN PROCESS
90
END PROCESS;
91
END MAIN;


RECIEVER
1
library ieee;
2
USE ieee.std_logic_1164.all;
3
USE ieee.std_logic_unsigned.all;
4
USE ieee.numeric_std.all;
5
6
ENTITY EXE IS
7
PORT(
8
CLK:IN STD_LOGIC;
9
REC_EN: IN STD_LOGIC;
10
DATALINE: IN STD_LOGIC;
11
COMMAND: OUT STD_LOGIC_VECTOR(11 downto 0);
12
FLG,ERROR:OUT STD_LOGIC
13
);
14
END EXE;
15
16
 ARCHITECTURE  RECIEVER OF EXE IS
17
 
18
 SIGNAL COUNTER : INTEGER RANGE 0 to 26040:=0;--- BOUDRATE 9600 bit/sec
19
 SIGNAL DATA:STD_LOGIC_VECTOR(11 downto 0):=(others=>'0');
20
 BEGIN
21
 
22
 PROCESS(CLK)
23
 VARIABLE INDEX : INTEGER RANGE 0 to 12:=0;
24
 BEGIN
25
 IF(CLK'EVENT AND CLK='1')THEN
26
  
27
28
 IF(REC_EN='1') THEN ----START  recieving data
29
    IF (COUNTER<10)THEN
30
    COUNTER<=COUNTER+1;
31
    ELSE 
32
    COUNTER<=0;
33
   END IF; 
34
 
35
  IF(INDEX<12 AND COUNTER=9)THEN
36
  DATA(INDEX)<=DATALINE;
37
  INDEX:=INDEX+1;
38
  FLG<='0';
39
  END IF;
40
 END IF;
41
 IF(REC_EN='0')THEN ----STOP recieving data, send command.
42
   IF(INDEX=12)THEN---- VALID DATA
43
  COUNTER<=0;
44
  INDEX:=0;
45
  COMMAND<=DATA;
46
  FLG<='1';----SET INSTRFLG TO 1
47
  ELSE ---- Invalid DATA
48
  COUNTER<=0;
49
  ERROR<='1';
50
  INDEX:=0;
51
  END IF;  
52
END IF;
53
END IF;
54
END PROCESS;
55
END RECIEVER;

TRANSMITTER
1
library ieee;
2
USE ieee.std_logic_1164.all;
3
USE ieee.std_logic_unsigned.all;
4
USE ieee.numeric_std.all;
5
6
ENTITY TRANSMITTER IS
7
8
PORT(
9
FLAG: IN STD_LOGIC;
10
VOLTAGE:IN STD_LOGIC_VECTOR(7 downto 0);
11
DA_SL: IN STD_LOGIC_VECTOR(2 downto 0);
12
CLK: IN STD_LOGIC;
13
SYNC: OUT STD_LOGIC_VECTOR(2 downto 0);
14
DA_CLK: OUT STD_LOGIC;
15
TX: OUT STD_LOGIC_VECTOR(2 downto 0);
16
RESET: OUT STD_LOGIC
17
);
18
END TRANSMITTER;
19
20
ARCHITECTURE TX OF TRANSMITTER IS
21
SIGNAL DA_COUNTER: INTEGER RANGE 0 to 10:=0;
22
SIGNAL DATA: STD_LOGIC_VECTOR(15 downto 0);
23
SIGNAL ERROR: STD_LOGIC:='0';
24
 
25
BEGIN
26
DATA(5 downto 0)<="000000";---"DONT CARE" bits
27
DATA(15 downto 14)<="00";--- NORMAL MODE
28
PROCESS (FLAG,CLK,DA_SL)
29
VARIABLE INDEX : INTEGER  RANGE 0 TO 15:=15;
30
BEGIN
31
IF(CLK'EVENT AND CLK='1')THEN
32
33
   CASE FLAG IS----send data
34
     WHEN '1' =>
35
        DATA(13 downto 6)<=VOLTAGE;
36
         CASE DA_SL IS---SELECT  DAC_SYNC
37
       WHEN "001" =>
38
        SYNC <=NOT "001";
39
      WHEN "010" =>
40
        SYNC <=NOT "010";
41
      WHEN "011" =>
42
        SYNC <=NOT "100";
43
      WHEN "111"=>
44
        SYNC <=NOT "111";
45
      WHEN OTHERS =>
46
        ERROR <='1';
47
      END CASE;
48
        IF (DA_COUNTER<9) THEN  
49
      DA_COUNTER<=DA_COUNTER+1;
50
         ELSE 
51
         DA_COUNTER<=0;
52
       END IF;
53
      
54
     IF(DA_COUNTER<5) THEN---DA_CLK CONTROLL
55
       DA_CLK<='1';
56
      TX<=(OTHERS=>DATA(INDEX)); ---SET BIT
57
       ELSE 
58
      DA_CLK<='0';
59
     END IF;
60
     IF (INDEX=0) THEN ---TRANSMISSION COMPLETE; RESET INSTRFLG.
61
     RESET<='0';
62
     END IF;
63
     IF (DA_COUNTER=7 AND INDEX>0 )THEN
64
       INDEX:=INDEX-1; --- SAVES BIT ON FALLING EDGE, SET NEW INDEX
65
     END IF;  
66
     WHEN '0'=>   ---RESET INDEX, SYNC OFF
67
     INDEX:=15;
68
     SYNC<="111";
69
     DA_COUNTER<=0;
70
     WHEN OTHERS=> NULL;
71
      END CASE;
72
     
73
END IF;
74
  
75
END PROCESS;
76
END TX;
Ich weiss, das ist viel Code, aber ich hofe jemand hier wird mir doch 
Helfen:))

Vielend dank im Vorraus

von Hmm (Gast)


Lesenswert?

>Ich weiss, das ist viel Code, ...

Deswegen soll langer Code auch als Anhang gepostet werden.
Steht bei jedem Anfang eines neuen Postings:
"Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang"

Und dann: Das schreibt sich "Receiver" auch wenn es sich "Reßiwer" 
spricht.

von Moog (Gast)


Lesenswert?

Du kannst nicht ohne Weiteres von zwei Stellen aus ein Signal "ändern". 
Das würde ja realisiert als eine "Leitung" die von zwei Treibern 
angesteuert wird. Wenn ein Treiber ein High treibt, und der andere ein 
Low...

Es gibt beim std_logic dafür die "schwachen" Zustände 'H' und 'L' (im 
Gegensatz zu den starken '0' und '1') sowie den hochohmigen Zustand 'Z'. 
Damit könntest du das realisieren.

Aber bevor du dich verkünstelst: Nimm doch einfach zwei Signale! Ein 
'start' in die eine Richtung, ein 'done' in die andere.

von GS (chromosoma)


Lesenswert?

Na, den START Signal muss ich  ja trotzdem mit  DONE  auf Null setzen, 
damit ich später wieder starten kann.

zB
If(DONE='1') THEN
 START='0'
END IF;

 Ist das dann nich das Gleiche?

von mensch (Gast)


Lesenswert?

Hi, geht's vill mit ner Or-Verknüpfung der beiden Signale?

von Christian R. (supachris)


Lesenswert?

Böser Kommunist schrieb:
> Na, den START Signal muss ich  ja trotzdem mit  DONE  auf Null setzen,
> damit ich später wieder starten kann.
>
> zB
> If(DONE='1') THEN
>  START='0'
> END IF;
>
>  Ist das dann nich das Gleiche?

Nee, weil du das in dem gleichen Prozess machst wie das setzen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Christian R. schrieb:
> Nee, weil du das in dem gleichen Prozess machst wie das setzen.
Nennt sich dann Handshake. Und der zeitliche Ablauf der nötigen 4 
Schritte ist so:
1
              a            b c d
2
               _____   ______
3
 Start     ___|     ...      |_______
4
                            ___ 
5
 Done      _________...____|   |_____
a Start wird signalisiert, das Senden beginnt
b Senden fertig wird mit Done signalisiert
c Start wird deaktiviert, wenn Done aktiv ist
c Done wird deaktiviert, wenn erkannt wird, dass Start inaktiv ist

1
library ieee;
2
USE ieee.std_logic_1164.all;
3
USE ieee.std_logic_unsigned.all;
4
USE ieee.numeric_std.all;
Viel hilft viel, oder wie?
die std_logic_unsigned bringt nichts ohne die std_logic_arith. Und die 
beiden zusammen dürfen nie mit der numeric_std verwendet werden. Siehe 
dazu den Beitrag "Re: Ganze Zahl in Ziffern zerlegen" und den 
Beitrag "std_logic_vector auf integer umwandeln"
1
  PROCESS (FLAG,CLK,DA_SL)
2
  VARIABLE INDEX : INTEGER  RANGE 0 TO 15:=15;
3
  BEGIN
4
  IF(CLK'EVENT AND CLK='1')THEN
Ich sag' jetzt mal nichts weiter zur speichernden(!) Variable INDEX, das 
steht alles schon im Beitrag "Variable vs Signal". Aber 
das mit der Sensitivliste muss ich doch sagen: FLAG und DA_SL sind 
zuviel. Der Prozess ist nur auf CLK sensitiv...


Hier wäre ein Schieberegister evtl. die bessere Lösung gegenüber einem 
Multiplexer. Besonders in einem FPGA...
1
      TX<=(OTHERS=>DATA(INDEX)); ---SET BIT
Ein Tipp: sieh dir einfach an, wie das im Inneren eines Mikrocontrollers 
gemacht wird. Das Datenblatt gibt das meist schon ausreichend viel 
Informationen. Und uCs sind schon lang am Markt, da konnte die Evolution 
schon einige Fehldesigns ausbügeln....

von GS (chromosoma)


Lesenswert?

Danke für die Antworten. Handshake werde ich noch ausprobieren. Die 
Sensitivliste  ist noch veraltet,  ich habe vorher dort was anderes 
geschrieben.


Den Unterschied zwischen Variablen und Signale  ist mir noch nicht ganz 
klar, oder besser gesagt, wieso so viele gegen variablen sind. Ich 
verwende  die Variablen  einfach für bessere Übersichtlichkeit: alle 
processbezogene Sachen werden auch im Process deklariert.
Außerdem habe ich im Buch gelesen, dass Variablen sofort aktualisiert 
werden, während  Signale auf das Ende des Process warten müssen.
Im Buch stand übrigens  nichts gegen Variablen an sich.

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Böser Kommunist schrieb:
> ist mir noch nicht ganz klar, oder besser gesagt, wieso so viele
> gegen variablen sind.

Weil Variablen von Anfängern komplett falsch verwendet werden, weil sie 
den Sinn und Nutzen dahinter (im Bezug auf die Synthese) nicht verstehen 
und die fehlerhafte Nutzung zu massenhaften Problemen führt.

> Ich verwende  die Variablen  einfach für bessere Übersichtlichkeit:
Aus genau dem Grund verwende ich keine. 90% meiner VHDL-Codes kommen 
vollständig ohne Variablen aus. Selbst in Testbenches brauche ich oft 
keine.

> alle processbezogene Sachen werden auch im Process deklariert.
Was sind nach Deiner Vorstellung "prozessbezogene Sachen"?

> Außerdem habe ich im Buch gelesen, dass Variablen sofort aktualisiert
> werden, während  Signale auf das Ende des Process warten müssen.
Ohweh, Ich sehe sie schon vor dem geistigen Auge, die armen notleidenden 
Signale, die auf die Barikaden gehen, weil sie immer bis zum Ende des 
Prozesses dumm in der Ecke rumhängen und nicht aktualisiert werden, 
während die offenkundig bevorzugten Variablen schon munter weiterrechen 
dürfen. Wo bleibt die Gerechtigkeit beim VHDL?

Jetzt mal im Ernst: Du hast schon verstanden, dass das so sein muss, 
dass Signale erst im nächsten Takt ihren Wert kriegen dürfen und man 
innen drin immer die alten Werte hat? Erinnere Dich mal an die 
Datenverarbeitungsvorlesung, erstes Semester, wo es um die Zustände 
Z(t+1) = f(Z(t) ..) ging, das ist genau das. Variablen sind im 
synthetisierbaren Code nur ein Hilfsmittel zum vereinfachten formulieren 
von Zwischenergebnissen, sonst nix.

> Im Buch stand übrigens nichts gegen Variablen an sich.
Der Autor ist wahrscheinlich vom Förderverein zur Intensivierung der 
Variablennutzung in HDL-Codes geschmiert worden. Jedenfalls ist der 
Nachname des Autors schon mal nicht Miller. Das steht fest. :-)

Warte mal bis übernächstes Jahr: Dann kommt das vom EU-Ministerium für 
Gleichstellungsfragen geförderte VHDL 2015. In dem müssen dann auch die 
Signale sofort aktualisiert werden und dürfen nicht mehr benachteiligt 
werden. Das wird schick!

von GS (chromosoma)


Lesenswert?

> Was sind nach Deiner Vorstellung "prozessbezogene Sachen"?

z.B. interne Counter, Hilfsvariablen, etc. die nur für den Process 
wichtig sind.

> Errinnere Dich mal an die Datenverarbeitungsvorlesung
Habe so eine Vorlesung nicht gehabt:)


Das Buch, das ich für den Anfang  gelesen habe war "Circuit Design with 
VHDL" Volnei A. Pedroni.



>weil sie
den Sinn und Nutzen dahinter (im Bezug auf die Synthese) nicht verstehen

Kannst du bitte kurz beschreiben wofür die  Variablen gedacht sind, und 
zu welchen Problemen diese führen können. Evtl. mit einem simplem 
Beispiel?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Kannst du bitte kurz beschreiben wofür die Variablen gedacht sind,
Für Zwischenergebnisse. Aber nicht zum Speichern. Variablen werden also 
immer am Prozessanfang initialisiert.

> und zu welchen Problemen diese führen können.
> Evtl. mit einem simplem Beispiel?
Ich hatte vier Posts weiter oben einen Link zum Thread Variable vs. 
Signal eingefügt. Bitte jetzt Zutreffendes ankreuzen:
[ ] ich habe den Link zum Thread nicht gesehen
[ ] ich habe das, was im Thread beschrieben ist, nicht verstanden

von GS (chromosoma)


Lesenswert?

[V] ich habe das, was im Thread beschrieben ist, nicht verstanden

So wie ich es verstanden habe, die Signalzuweisung  ist sequenziel und 
die Variabelnzuweisung parralel, sprich sofort.Etwa so...
Was ich nicht ganz verstehe, in deinem Bsp:
1
>   process(din)
2
>   variable var: std_logic;
3
>   begin
4
>      res1 <= var;
5
>      var  := din;
6
>      res2 <= var;
7
>   end process;
8
>

Ist das nicht selbsverständlich, dass res1 den alten Wert erhält, weil 
die  "var" aktualisierung  erst danach erfolgt?
Obwohl, wenn Variablen parralel arbeiten, sollte das nicht passieren.

ehm...ich bin durcheinander.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Böser Kommunist schrieb:
> in deinem Bsp: ....
> Ist das nicht selbsverständlich, dass res1 den alten Wert erhält, weil
> die  "var" aktualisierung  erst danach erfolgt?
Ich beantworte dir diese Frage nicht, weil sie rein akademisch ist.
Du musst dir eines klar machen: die Simulation arbeitet ausschließlich 
mit der Sensitivliste, der Synthese ist die Sensitivliste schnurzegal. 
Letztendlich darf dich aber nur die Synthese interessieren, denn nur mit 
der Synthese kannst du ein Design in Hardware umsetzen. Du musst also 
deinen VHDL-Code so schreiben, dass er das Verhalten deiner Harware 
richtig simuliert. Mit diesem neuerworben Wissen siehst du dir diesen 
Prozess nocheinmal an.

Und du erkennst, dass die (Verhaltens-)Simulation falsch sein muss, 
weil der Simulator nur bei einer Änderung von din den Prozess neu 
berechnet, (und so res1 ein von din abhängiges, speicherndes Verhalten 
vorgaukelt), die Synthese aber erkennt, dass die Signale einfach 
geradeaus durchverdrahtet werden.
Und du wirst diesen Prozess nie richtig simulieren können (also so, wie 
sich die Hardware verhalten wird), weil die die Variable var nicht in 
die Sensitivliste (zur Neuberechnung des Prozesses) aufnehmen kannst.

Böser Kommunist schrieb:
> So wie ich es verstanden habe, die Signalzuweisung  ist sequenziel und
> die Variabelnzuweisung parralel, sprich sofort.Etwa so...
Keine Ahnung was auch immer da irgendwer mit sequentiell oder parallel 
meint. Ich glaube, diese Begriffe dienen nur der Verwirrung von 
Anfängern. In der Hardware ist letztlich alles parallel realisiert, also 
immer da...


Nochmal kurz zum Mitschreiben:
Variablen sind dort sinnvoll und geeignet, wo eine komplizierte 
Berechnung in kleine Schritte aufgeteilt werden soll/muss. Aber immer 
steht am Anfang des Prozesses eine Zuweisung an die Variable:
http://www.lothar-miller.de/s9y/archives/78-Bubblesort.html
http://www.lothar-miller.de/s9y/archives/84-Binaer-nach-BCD-mit-1-Takt-pro-Stelle.html
http://www.lothar-miller.de/s9y/archives/67-Vektor-nach-BCD-kombinatorisch.html
http://www.lothar-miller.de/s9y/archives/29-Division-in-VHDL.html
http://www.lothar-miller.de/s9y/archives/73-Wurzel-in-VHDL.html
http://www.lothar-miller.de/s9y/archives/68-Graycode-Umwandlung.html

Und so richtig austoben kann man sich mit Variablen, Schleifen und 
sostwas in Testbenches, denn die müssen ja nicht synthetisierbar sein:
http://www.lothar-miller.de/s9y/archives/75-PS2-Tastatur.html

von mike (Gast)


Lesenswert?

> in deinem Bsp: ....
> Ist das nicht selbsverständlich, dass res1 den alten Wert erhält, weil
> die  "var" aktualisierung  erst danach erfolgt?

Ganz klar NEIN, denn wie Du selber richtig geschrieben hast, bekommen 
Signale erst am Ende des Prozesses ihre Werte. Beide res stehen dann auf 
din.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

mike schrieb:
> Ganz klar NEIN, denn wie Du selber richtig geschrieben hast, bekommen
> Signale erst am Ende des Prozesses ihre Werte.
Aber jetzt kommts: sie bekommen den letzten Wert, der ihnen /bis 
dahin/ zugewiesen wurde. Probiers einfach mal aus...

> Beide res stehen dann auf din.
Das gilt nur für das Syntheseergebnis, aber nicht für die Simulation!
Zur Abkürzung ein Link auf die Lösung im 
Beitrag "Re: Variable vs Signal"

von mike (Gast)


Lesenswert?

Stimmt. Das ist natürlich klasse, wenn man zwischendrin geschickt mit 
den Signalen bastelt. Einfach genial.

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
>> So wie ich es verstanden habe, die Signalzuweisung  ist sequenziel und
>> die Variabelnzuweisung parralel, sprich sofort.Etwa so...
> Keine Ahnung was auch immer da irgendwer mit sequentiell oder parallel
> meint. Ich glaube, diese Begriffe dienen nur der Verwirrung von
> Anfängern. In der Hardware ist letztlich alles parallel realisiert, also
> immer da...

Ich würde mal stark annehmen, dass sich die Begriffe auf den zeitlichen 
Ablauf des Prozesses beziehen. Die Variablenzuweisung wäre dann aber 
sequenziell, weil die Zeitebene eine Rolle spielt, wärend die 
Signalzuweisung parallel ist, weil die Zeitabhängigkeit nicht exisitert: 
Alle Signale werden zur gleichen Zeit, nämlich beim Übergang in die 
nächste Zeitscheibe geändert, egal, wie sie sequeniell angeordnet sind. 
Dies ist quasi parallel, da es zwischen diesen Signalzuweisungen keine 
Zeit vergeht. Die Darstellung an sich macht schon Sinn. Allerdings gibt 
es anschaulichere Darstellungen des Sachverhaltes.

Das Beispiel oben zeigt aber wieder einmal dass genau hier der Hae im 
Pfeffer liegt. Man muss sich bei der Nuzung von Variablen über die 
Sequenz Gedanken machen, bei Signalen nicht - jedenfalls nicht innerhalb 
einer Zeitebene.

von GS (chromosoma)


Lesenswert?

Also Fazit ist: Nur Signale verwenden?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Böser Kommunist schrieb:
> Also Fazit ist: Nur Signale verwenden?
Soweit wie möglich.
Und wenn schon Variablen verwendet werden sollen, dann werden die vor 
der Verwendung initialisiert und nur zum Ablegen von Zwischenergebnissen 
verwendet. Ein paar sinnvolle Beispiele habe ich aufgezeigt und das hier 
ist auch ein Musterbeispiel für die Verwendung von Variablen:
http://www.lothar-miller.de/s9y/archives/86-Einsen-im-Vektor-zaehlen.html

Aber eine speichernde Variable ist für mich von vorn herein suspekt.

von Duke Scarring (Gast)


Lesenswert?

Böser Kommunist schrieb:
> WIe der Name sagt,  Reciever empfäng die 12 Bit langen Befehl.
> Sobald die Übertragung  fertig ist, setzt Reciever INSTRFLG auf 1. Das
> sagt den Main-Process, dass er jetzt diese 12 Bit in einen Befehl
> decodieren soll.
Statt der vorgeschlagenen Handshakesache könntest Du auch Dein INSTRFLG 
sofort wieder auf '0' setzten. Damit wird es zu einem 
Instruction_enable.
Dein Main-Process und andere müssen dann nur aktiv werden, wenn das Bit 
'1' ist. Damit das Konzept richtig funktioniert, dürfen die 
Instructionen nicht schneller kommen, als sie verarbeitet werden können.

Jürgen Schuhmacher schrieb:
> die armen notleidenden
> Signale, die auf die Barikaden gehen
Du solltest öfters einen Clown frühstücken (bzw. zum Abendbrot 
verspeisen) (+1 gefällt mir :-)

Duke

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.