Ich nutze den folgenden Konstrukt, um das Verschwinden der Signale
während der Synthese zu verhindern:
1 | architecture arch of adc_reader is
|
2 |
|
3 | signal ADC_D1 : std_logic_vector(13 downto 0) := (others => '1');
|
4 | signal ADC_D2 : std_logic_vector(13 downto 0) := (others => '1');
|
5 | signal ADC_D3 : std_logic_vector(13 downto 0) := (others => '1');
|
6 | signal ADC1_TM : std_logic_vector(27 downto 0) := (others => '1');
|
7 | signal ADC_OF : std_logic_vector(13 downto 0) := "000...1"; -- 923
|
8 | signal ADC_GN : std_logic_vector(13 downto 0) := "010...1"; -- 4123
|
9 |
|
10 |
|
11 | attribute keep : string;
|
12 | attribute keep of ADC_D1: signal is "true";
|
13 | attribute keep of ADC_D2: signal is "true";
|
14 | attribute keep of ADC_D3: signal is "true";
|
15 |
|
16 | begin
|
Trotzdem findet ChipsScope die Adresse 13 des ADC-Wertes nicht.
Woran kann das liegen?
Wird das "keep" nochmal irgendwo freigeschaltet oder gar anderweitig
überschrieben?
Es ist mir auch nicht ganz klar, warum das ADC3(13) überhaupt
verschwindet! Ich mache folgendes:
1 | ADC1_D1 <= ADC1_INPUT; -- read io
|
2 | ADC1_D2 <= ADC1_D1 - ADC1_OF; -- remove offset
|
3 | ADC1_TM <= ADC1_D2 * ADC1_GN; -- gain correction
|
4 | ADC1_D3 <= ADC1_TM(27 downto 14);
|
Bis zum Offset geht es korrekt - auch mit negativen Werten. Der
Gain-Wert ADC1_GN liegt bei ungefähr 4000-4200 (4096 ist eine "x 1.00").
Er ist statisch und immer positiv , daher fällt das Vorzeichen-bit wohl
weg, denke ich.
Ich habe den vollen Vektor genommen, um zu sehen, was rauskommt.
Eigentlich will ich aber etwas Anderes:
Wenn ich es z.B. so schreibe ...
1 | ADC1_D3 <= ADC1_TM(27) & ADC1_TM(24 downto 12);
|
... funktioniert es mit der Compilation, rechnet aber wider Erwarten
nicht korrekt. Der End-Wert ist manchmal falsch, obwohl eigentlich 2
Bits wegen der Vorzeichproblematik fehlen sollten. Ich habe es in Excel
durchprobiert und von der Lage der Bits ist das das richtige slice: 12
Bit weg entsprichtr "geteilt durch 4096".
Hat wer eine Idee?