Guten Abend,
eines vorweg: ich bin Einsteiger und deshalb noch ein wenig grün hinter
den Ohren.
Folgende Problem: ich möchte in einem getakteten Prozess augrund einer
eher kryptischen logischen Ausdrucks in folgendem Stil einen Ausgang
setzen.
1 | if(A = B - 1 or (A = 20 and B = 0)) then inc <= '1';
|
2 | else inc <= '0';
|
3 | end if;
|
Zusätzlich würde ich gerne (an andere Stelle im Prozess) etwas machen,
das zusätzlich noch von einem Eingang abhängt im Stil:
1 | if(A = B - 1 or (A = 20 and B = 0) and read = '1') then dec <= '1';
|
2 | elsif(blabla) --usw.
|
3 | end if;
|
Da die Signale A, B so gewählt sind, dass man sich darunter etwas
vorstellen kann und die Bedingung etwas komplizierter ist, werden die
Bedingungen sehr unleserlich und lange. Ich könnte mir Schreibarbeit
sparen, indem ich die zweite Bedingung in die erste reinverschachtle,
das wird aber auch kryptisch.
Meine Idee war Folgende: da die Bedinung
1 | A = B - 1 or (A = 20 and B = 0)
|
sehr gut mit "speicher_voll" o.ä. beschrieben werden kann, ein Signal
damit zu machen, doch weil es ein getakteter Prozess ist und ich einen
Takt Verzögerung nicht will, stehe ich schon wieder am Berg.
Die zweite Idee war die Verwendung von einer Variablen. Doch da
scheitert es an der Zuweisung des Logischen Ausdrucks:
1 | begin
|
2 | process(clk)
|
3 | variable speicher_voll : STD_LOGIC;
|
4 | begin
|
5 | if(rising_edge(clk)) then
|
6 | speicher_voll := (A = B - 1 or (A = 20 and B = 0))
|
7 | --usw.
|
Bin ich total auf dem Holzweg oder wie kann ich der Variable dieses
Kombinatorik zuweisen? Der Fehler der auftaucht:
Type of speicher_voll is incompatible with type of or.
Vielen Dank für alle Tipps... & einen schönen Abend!