Hallo zusammen,
ich habe gerade eine Denkblockade und hoffe sie mit Eurer Hilfe lösen zu
können.
Ich bekomme Daten auf 16bit in einem bestimmten Adressraum gesendet.
Dazu habe ich einen WR_VALID Puls.
Diesen Daten haben immer auf der Startadresse ein Statuspaket, auf den
folgenden 0 bis 63 Adressen Datenpakete und dann noch ein weiteres
Statuspaket.
Im ersten Statuspaket ist eine Information enthalten, wieviele
Datenwörter gesendet werden, also auch auf welcher Adresse das letzte
Statuspaket liegt.
Die Daten kommen in der korrekten Reihenfolge, also Status1 - Daten-
Stauts2.
Nun muss ich eine Art "received vector" füllen, also welche Adresse bzw.
welche Daten ich schon erhalten habe.
Der Vektor hat also 1+64+1 Bit, damit auch die maximal mögliche Anzahl
an Datenpaketen erfasst werden kann.
Leider habe ich noch keine Möglichkeit gefunden, und genau da liegt
meine Denkblockade, diese Vektorbits abhängig von einem Signal zu
setzen. Signale dürfen nicht als Index eines anderen Vektors verwendet
werden. Es sind nur konstante integer als RANGE zugelassen.
Sonst hätte ich wohl sowas gemacht (Syntax vielleicht nicht 100%
korrekt, geht ja eh nicht!):
1 | IF WR_VALID = '1' AND WR_ADDR = Startadresse THEN
|
2 | s_received(0) <= '1';
|
3 | s_status1_rec <= '1';
|
4 | s_data_length <= WR_DATA(5 DOWNTO 0);
|
5 | END IF;
|
6 |
|
7 | IF s_status1_rec = '1' AND WR_VALID = '1' AND WR_ADDR > startadresse AND WR_ADDR < startadresse + to_integer(unsigned(s_data_length + 1)) THEN
|
8 | s_received(WR_ADDR-startadresse) <= '1'; -- HIER liegt das Problem!
|
9 | END IF;
|
Wenn die s_data_length immer konstant wäre, könnte ich eine case
Anweisung mit 66 Zeilen schreiben und wäre fertig, nur leider ist es
nicht konstant.
Hat jemand eine Idee, wie ich das Problem lösen könnte?
Vielen Dank!
Ralf :)