Hi Sina,
gleich vorweg ich bin kein Verilog- oder FPGA-Experte ;) Aber vielleicht
hilft das ja.
Was mir damals wirklich geholfen hat Blocking und Non-Blocking zu
verstehen sich klarzumachen wer treibt das Signal?
Ein Beispiel für ein And-Gatter mit Blocking und Non-Blocking:
Blocking:
1 | module top(
|
2 | output out,
|
3 | input a,
|
4 | input b
|
5 | );
|
6 | assign out = a&b;
|
7 | endmodule
|
In diesem Fall wird out durch kombinatorische Logik getrieben sprich a
and b wird out zugewiesen. Die Änderung von a oder b hat "sofort"
Auswirkung auf out. D.h. out ist ein Wire was den Wert von a oder b
annimmt.
Non-Blocking:
1 | module top(
|
2 | input clk,
|
3 | output reg out,
|
4 | input a,
|
5 | input b
|
6 | );
|
7 |
|
8 | always @( posedge clk )
|
9 | begin
|
10 | out <= a & b;
|
11 | end
|
12 | endmodule
|
Der Unterschied hier ist das out ein reg (Flipflop) ist. Ein Flipflop
treibt das Signal selbst. Damit ein Flipflop den neuen Wert übernimmt
braucht es eine Clock.
Und das ist genau der Punkt warum man für ein Non-Blocking einen
Always-Block braucht. Nur hier weiss die Synthesesoftware auf welche
Clock bezieht sich die Zuweisung.
Der Unterschied zum Non-Blocking ist zudem, dass out sich erst bei der
nächsten Clock ändert.
VG egon