Forum: FPGA, VHDL & Co. Wie designe ich dieses case am besten?


von Christian P. (kron)


Lesenswert?

Hallo,

ich habe eine verzweigte if-case-Anweisung in dieser Form:
1
if RW = '0' then
2
  case DP_M is
3
   when "0000" => blabla
4
   when "0001" => blabla, etc
5
  end case;
6
else
7
  case DP_M is
8
   when "0000" => blabla
9
   when "0001" => blabla, etc
10
  end case;

Ich habe also in beiden Fällen (also wenn RW 1 oder 0 ist),
Abfragen für DP_M. Bei den meisten Fällin sehen
die Anweisungen für die einzelnen cases von DP_M auch
anders aus für RW = 1 bzw. 0.
Aber bei manchen sind sie auch gleich.
Und da frage ich mich (bzw. euch ;) ) natürlich gleich,
ob es da eine resourcensparendere Methode gibt, als
in beiden case-Anweisungen die identischen Zeilen zu schreiben.
Weiß da jemand was pfiffiges?

von Christian P. (kron)


Lesenswert?

Eine erste Verbesserung ergibt sich,
wenn außen die Case-Anweisung steht,
und dann in den einzelnen Fällen RW gecheckt wird,
bzw. bei den Fällen, die gleich sind, wird es halt weggelassen.

von Klaus F. (kfalser)


Lesenswert?

Ob es wirklich einen Unterschied macht ob das iF oder das Case außen 
steht ist sehr fraglich, da letztentlich in der Hardware die Signale in 
der gleichen Art verknüpft werden müssen.
Das RW wird in Hardware nicht vorher, sondern gleichzeitig mit DP_M 
geprüft.

Eine Einsparung ergibt sich nur, wenn Du dem Compiler mitteilen kannst, 
daß bestimmte Kombinationen nicht relevant sind, z.B.

case Adr is
   when "00" =>
      Data <= "0000";
   when "01" =>
      Data <= "0100";
   when others =>
      Data <= "----";   -- don't care
end case;

Grüße
Klaus

von Christian P. (kron)


Lesenswert?

Es gibt einen großen Unterschied!
Hier die Werte nach der Synthese für If außen,
in Klammern dahinter sind die Werte bei Case außen:

Number of Slices:                     306  out of    768    39%  (251)
Number of Slice Flip Flops:           398  out of   1536    25%  (354)
Number of 4 input LUTs:               391  out of   1536    25%  (299)
Number of bonded IOBs:                 71  out of    124    57%  (66)
IOB Flip Flops: 30
Number of GCLKs:                        4  out of      8    50%


Timing Summary:
---------------
Speed Grade: -4

Minimum period: 14.544ns (Maximum Frequency: 68.757MHz) (88.921MHz)
Minimum input arrival time before clock: 10.171ns (9.158ns)
Maximum output required time after clock: 9.322ns (9.322ns)
Maximum combinational path delay: 12.518ns (14.106ns)

von Sebastian (Gast)


Lesenswert?

Sehr interessant. Das macht als doch schon eine Menge aus. Welchen 
Compiler hast Du denn benutzt?

Grüsse

Sebastian

von na (Gast)


Lesenswert?

Was passiert denn bei der Zuweisung? Wenn es nicht zu viel ist kann man 
da manchmal durch geschickte Verknüpfung was erreichen.

von Frank (Gast)


Lesenswert?

Du musst ein fehler in deinem Quellcode haben.
Die anzahl der IOB sollet bei beiden Lösungen gleich sein, das ist 
jedoch nicht der fall. Mir scheint, dass bei der version "case außen" 
etwas wegsynthesiert wird. Vielleicht simulierst Du beides mal, ob sie 
tatsächlich das gleiche verhalten aufweisen?
frank

von na (Gast)


Lesenswert?

Oder du fragst case(RW & DP_M(0)) ab, kommt ein einfacher 4-MUX raus.

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.