Forum: FPGA, VHDL & Co. Xilinx keep-constraint versagt


von Samuel (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Frank (Gast)


Lesenswert?

Mit "keep" habe ich keine Erfahrung, aber der slice, den Du verwendest, 
müsste stimmmen. Sehe ich auch so.

von Samuel (Gast)


Lesenswert?

Wie teile ich denn dann - ohne mit Vektoren zu rechnen - das Ergebnis 
herunter? Ich will ja nicht den voll Multiplier-output haben.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Samuel schrieb:
> Wie teile ich denn dann - ohne mit Vektoren zu rechnen - das Ergebnis
> herunter?
Du kannst jeden Wert ohne weiteres durch irgendwelche Zweierpotenzen 
teilen. Das ist ja nichts anderes als deine "versetzte" Zuweisung:

ADC1_D3 <= ADC1_TM(27 downto 14);
entspricht:
ADC1_D3 <= ADC1_TM/16384;

von Haro (Gast)


Lesenswert?

Wenn keep nicht reicht, dann die checkbox "TRIM UNCONNECTED SIGNALS" aus 
der Synthese / Implementierung "unchecken".

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
Noch kein Account? Hier anmelden.