Xilinx keep-constraint versagt

Gast #1816518
Lesenswert?

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?
Moderator (Firma: Titel) Persönliche Seite #1816899
Lesenswert?

> signal ADC_D1 : std_logic_vector(13 downto 0) := (others => '1');
Man rechnet nicht mit Vektoren. Nimm die numeric_std Lib und die darin 
befindlichen Datentypen signed und unsigned.

> Wird das "keep" nochmal irgendwo freigeschaltet oder gar anderweitig
> überschrieben?
Probier doch mal mit einem nicht angekreuzten: Syntheseoptionen --> 
Xilinx Specific Options --> Equivalent Register Removal

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren