Hallo
ich habe eine state maschiene, die Impulse bestimmter dauer generieren
soll. Dazu wird auf dem Eingang "lang" ein 8 bit breiter wert (den
bekomme ich über eine serielle Schnittstelle) eigegeben. Damit keine
Leitungen "in der Luft hängen" begrenze ich die range auf 256 Werte. Der
Impuls wird generiert sobald "time20" = '1'. Für den Beispiel ist alles
vereinfacht bis zum geht nicht mehr.
Hier ist meine state maschiene:
1 | entity PWM_machine is
|
2 | Port
|
3 | (
|
4 | clk : in STD_LOGIC;
|
5 | rst : in STD_LOGIC;
|
6 | time20 : in STD_LOGIC;
|
7 | lang : in integer range 0 to 255;
|
8 | pulse : out STD_LOGIC
|
9 | );
|
10 | end PWM_machine;
|
11 |
|
12 | -- 10000 cycles = 1 ms
|
13 |
|
14 | architecture Behavioral of PWM_machine is
|
15 | type signal_machine is ( init, start_pulse, end_pulse );
|
16 | signal cur_state: signal_machine := init;
|
17 | begin
|
18 | pulse20ms: process(clk, rst)
|
19 | variable i: natural range 0 to 10001 := 0;
|
20 | variable timer: natural := 0;
|
21 | begin
|
22 | if( clk = '1' and clk'event ) then
|
23 | case cur_state is
|
24 | when init =>
|
25 | pulse <= '0';
|
26 | i := t1;
|
27 | cur_state <= start_pulse;
|
28 | when start_pulse =>
|
29 | if ( time20 = '1' ) then
|
30 | timer := ((lang * 10000 / 256) + 10000);
|
31 | cur_state <= end_pulse;
|
32 | pulse <= '1';
|
33 | i := 10000;
|
34 | end if;
|
35 | when end_pulse =>
|
36 | if ( i = 0 ) then
|
37 | cur_state <= start_pulse;
|
38 | pulse <= '0';
|
39 | else
|
40 | i := i - 1;
|
41 | end if;
|
42 | end case;
|
43 | end if;
|
44 | end process pulse20ms;
|
45 |
|
46 | end Behavioral;
|
jetzt mein der compiler, dass "lang" Eingang nie benutz wird, obwohl der
ja eindeutig für die berechnung "timer := ((lang * 10000 / 256) +
10000);" gebraucht wird. Deswegen schließt er den gar nicht erst an.
Dieses Problem kann behoben werden, wenn ich am Eingang integer nicht
begrenze, dann passt es an einer anderen Stelle (nämlich ist dann das
Ergebnis länger als 31 bit) nicht mehr und zusätzlich muss noch eine
Fehlerbehandlung eingebaut werden, für den Fall, dass der wert nicht
zwischen 0 und 255 liegt.
dann gibt es noch 2 weitere fehlermeldungen, mit denen ich gar nichts
anfangen kann:
WARNING:Xst:647 - Input <lang> is never used. This port will be
preserved and left unconnected if it belongs to a top-level block or it
belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:1426 - The value init of the FF/Latch FFd2 hinder the
constant cleaning in the block FSM.
You should achieve better results by setting this init to 1.
WARNING:Xst:1426 - The value init of the FF/Latch FSM_FFd2 hinder the
constant cleaning in the block FSM_0-parent.
You should achieve better results by setting this init to 1.
Was passiert da?