Hallo zusammen,
ich bin relativ neu in der FPGA Programmierung (komme aus der C Welt)
und stehe vor folgendem Problem. Das Design soll mit Quartus auf einem
Cyclone10 synthetisiert werden, ich glaube das ist nebensächlich.
Ich habe ein Modul (nicht Toplevel) mit einem Tristate Signal:
1 | assign b = en ? a : 1'bZ;
|
b wurde dann auf einen externen Pin belegt, und alles war in Ordnung,
weil Tristate-Buffer an den Pins existieren. Jetzt möchte ich b auch
noch intern in einem anderen Modul verwenden, und die Probleme gehen
los.
1 | always (@posedge clk) begin
|
2 | [...]
|
3 | reg_b <= b;
|
4 | [...]
|
5 | end
|
Hier beschwert sich Quartus zu recht, dass es keine internen
Tristate-Buffer gibt. Es ist allerdings "nur" eine Warnung, der Tristate
sei durch ein OR-Gate ersetzt worden. Damit bin ich prinzipiell
zufrieden; gibt es eine Möglichkeit diesen "Cast" explizit zu machen,
damit die hässliche Warnung verschwindet?
Ich dachte außerdem ich könnte das Problem so beheben:
1 | reg b_clean;
|
2 | always begin
|
3 | case (b)
|
4 | 1'b0: b_clean <= 1'b0;
|
5 | default: b_clean <= 1'b1;
|
6 | caseend
|
7 | end
|
und dann
. Die Warnung bleibt jedoch bestehen, obwohl der Synthetisierer damit
theoretisch in der Lage sein sollte (glaube ich zumindest) das 'Z'
rauszuoptimieren. Gibt es hier einen besseren Trick?
Danke für eure Hilfe.