Hallo, ich habe einen Zähler, dessen Wert ich auslesen will. Jer nach Ergebniss gibt es 3 verschiedene Möglichkeiten: 0<Zähler<=Wert1 -> Tue iwas Wert1 < Zähler <=Wert2 -> Tue iwas Wert2 < Zähler -> Tue iwas Ich habe es bisher so gemacht: if(Zähler<15)then Aktion1 elsif(Zähler < 500)then Aktion2 else Aktion3 end if; Das Problem ist aber dass er bei Werten kleiner 500 prinzipiell Aktion2 macht, Aktion1 wird nie ausgeführt, auch wenn der Wert kleiner als 15 ist. Aktion3 wird bei Werten über 500 ausgeführt, das funktionert. Was mache ich falsch? Danke schonmal, uLuxx
Bei mir gehts:
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity CompareRange is |
6 | Port ( value : in STD_LOGIC_VECTOR (9 downto 0); |
7 | lo : out std_logic; |
8 | mid : out std_logic; |
9 | hi : out std_logic); |
10 | end CompareRange; |
11 | |
12 | architecture Behavioral of CompareRange is |
13 | signal wert : integer range 0 to 1023; |
14 | begin
|
15 | wert <= to_integer(unsigned(value)); |
16 | process (wert) begin |
17 | lo <= '0'; |
18 | mid <= '0'; |
19 | hi <= '0'; |
20 | if (wert<15) then |
21 | lo <= '1'; |
22 | elsif (wert<500) then |
23 | mid <= '1'; |
24 | else
|
25 | hi <= '1'; |
26 | end if; |
27 | end process; |
28 | end Behavioral; |
Was machst du anders? EDIT Oder so:
1 | process (wert) begin |
2 | lo <= '0'; |
3 | mid <= '0'; |
4 | hi <= '0'; |
5 | if (wert<500) then |
6 | if (wert<15) then lo <= '1'; |
7 | else mid <= '1'; |
8 | end if; |
9 | else
|
10 | hi <= '1'; |
11 | end if; |
12 | end process; |
Die einfachste Methode wird sein, wenn du die Abfragen von hinten angehst, also die if-Anweisungen von großen zu kleinen Werten abfragen läßt, z.B. so: if(Zähler>500)then Aktion3 elsif(Zähler > 15)then Aktion2 else Aktion1 end if; Da der Code innerhalb des Prozesses für die if-Anweisung sequentiell abläuft, sollte die Umkehrung dann genau das tun, was du dir vorstellst. Gruß Thomas
Nein, das darf keinen Unterschied machen! Ich würde dennoch mal probieren, ob man nicht die Bedingung auf " >15 and < 500" erweitern sollte. Dann besser auch : lo <= '1'; mid <= '0'; hi <= '0'; lo <= '0'; mid <= '1'; hi <= '0'; Da dies nicht explicit dargestellt ist, steckt die erste Bedingung von in der zweiten drin und muss bez lo nicht unterschieden / realisiert werden.
Wuerde auch drauf tippen, dass die Bedingung nicht exakt genug ist.
@ uLuxx Ist der Zähler ein Signal oder eine Variable? Zeig doch mal den ganzen Code... > Das Problem ist dass er bei Werten kleiner 500 prinzipiell Aktion2 macht, > Aktion1 wird nie ausgeführt, auch wenn der Wert kleiner als 15 ist. In der Simulation oder in der Realität?
Also erst mal danke für die Hilfe! Der Code macht das in der Realität, Testbench ist was was ich bisher nicht hinbekomme :-) >Oder so: > > process (wert) begin > lo <= '0'; > mid <= '0'; > hi <= '0'; > if (wert<500) then > if (wert<15) then lo <= '1'; > else mid <= '1'; > end if; > else > hi <= '1'; > end if; > end process; Ja das habe ich auch schon versucht gleiches Ergebnis... Der Zähler ist ein Signal. Hier mein Code:
1 | elsif rising_edge(CLK)then |
2 | |
3 | if(Counter < 500)then |
4 | |
5 | if(0 < Counter < 150)then |
6 | Data <= Data(58 downto 0) & '0'; |
7 | Sek <= not(Sek); |
8 | Long <= '1'; |
9 | Short <= '0'; |
10 | NewM <= '1'; |
11 | else
|
12 | Data <= Data(58 downto 0) & '1'; |
13 | Sek <= not(Sek); |
14 | Long <= '0'; |
15 | Short <= '1'; |
16 | NewM <= '1'; |
17 | end if; |
18 | else
|
19 | Data <= "111111111111111111111111111111111111111111111111111111111111"; |
20 | Sek <= '0'; |
21 | |
22 | Long <= '1'; |
23 | Short <= '1'; |
24 | NewM <= '0'; |
25 | |
26 | end if; |
27 | |
28 | end if; |
29 | |
30 | |
31 | |
32 | end process; |
> if(0 < Counter < 150)then
Der ist aber neu hier...
Das das gehen soll hätte ich nicht erwartet...
Ich hätte das eher so geschrieben:
1 | if(0 < Counter and Counter < 150)then |
BTW:
1 | Data <= "111111111111111111111111111111111111111111111111111111111111"; |
Das geht kürzer so:
1 | Data <= (others=>'1'); |
> if(0 < Counter < 150)then
Der ist aber neu hier...
sorry, sollte heißen if(Counter < 150)
war aus einem test
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.