Hallo zusammen - habe folgenden Ausdruck: pix2(15 downto (15-DPIXrange)) := pix1(DPIXrange downto 0); DPIXrange ist ein input. Synopsys will das nicht synthetisieren. Ich würde da gerne die shift Funktion verwenden. Habe die aber noch nie verwendet - wie sieht das denn dann mit der shift Funktion aus? Würde mich über Hilfe freuen, Simon
> pix2(15 downto (15-DPIXrange)) := pix1(DPIXrange downto 0); Das geht ja wohl nur, wenn DPIXrange genau 7 ist. Sonst passt die Verktorbreite nicht. > wie sieht das denn dann mit der shift Funktion aus? Ja, was denn überhaupt?
> pix2(15 downto (15-DPIXrange)) := pix1(DPIXrange downto 0);
Das geht ja wohl nur, wenn DPIXrange genau 7 ist. Sonst passt die
Verktorbreite nicht.
Nö -das kanns nicht sein:
(15 downto (15-DPIXrange)) =
(15+DPIXrange downto 15) =
(DPIXrange downto 0)
wie gewünscht
evtl. der ":"
-> is pix2 eine variable oder ein signal !
> Nö -das kanns nicht sein: ... Richtig, leichter Anfall von Dyskalkulie :-/ >> Synopsys will das nicht synthetisieren. > evtl. der ":" Zitat: Nö -das kanns nicht sein: ... Sonst würde nicht die Synthese meckern, sondern schon der Syntax-Check...
Simon schrieb: > DPIXrange ist ein input. > Synopsys will das nicht synthetisieren. Lothar Miller > Sonst würde nicht die Synthese meckern, sondern schon der Naja... 'Synopsys will das nicht synthetisieren' kann auch bedueten das er schon beim Syntax Check abbricht ;)
> Ich würde da gerne die shift Funktion verwenden. Aufpassen: Das ist kein Shift, den du da beschreibst, sondern ein Monster-Mux. > Naja... 'Synopsys will das nicht synthetisieren' kann auch bedueten das > er schon beim Syntax Check abbricht ;) Ok, wenn man seine Tools nicht kennt... Wenn DPIXrange ein Input ist, dann ist es vermutlich auch ein std_logic_vector. Und die müssen für eine range-Angabe natürlich erst mal in einen integer gewandelt werden. So gehts:
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity VarMux is |
6 | Port ( iv : in STD_LOGIC_VECTOR (15 downto 0); |
7 | ov : out STD_LOGIC_VECTOR (15 downto 0); |
8 | rng : in STD_LOGIC_VECTOR (3 downto 0)); |
9 | end VarMux; |
10 | |
11 | architecture Behavioral of VarMux is |
12 | begin
|
13 | -- Original, so gehts nicht:
|
14 | ov(15 downto rng) <= iv(rng downto 0); |
15 | |
16 | -- So gehts:
|
17 | ov(15 downto (15-to_integer(unsigned(rng)))) <= iv(to_integer(unsigned(rng)) downto 0); |
18 | end Behavioral; |
> := Diese Variablenrechnerei gibt mir zu Denken....... :-/ > pix2(15 downto (15-DPIXrange)) := ... Durch die unvollständige Beschreibung des Ausgangsvektors handelst du dir 16 Latches ein. Ist dir das bewusst? Willst du das?
Naja, es gibt auch Leute die integers in ihren Port-Listen übergeben ... und wenn das Ding nicht constrained ist ... Aber das ist alles Kaffeesudleserei, der OP sollte mehr verraten, wie das genau bei ihm aussieht.
> Naja, es gibt auch Leute die integers in ihren Port-Listen übergeben ...
Naja, dann hätte es ja auch gleich geklappt...
Sogar mit einem unconstrained Integer.
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity VarMux is |
6 | Port ( iv : in STD_LOGIC_VECTOR (15 downto 0); |
7 | ov : out STD_LOGIC_VECTOR (15 downto 0); |
8 | rng : in integer); |
9 | end VarMux; |
10 | |
11 | architecture Behavioral of VarMux is |
12 | begin
|
13 | ov(15 downto 15-rng) <= iv(rng downto 0); |
14 | end Behavioral; |
Zwar mit verheerendem Ressourcenverbrauch (wegen des nicht eingeschränkten Integers), aber immerhin. Auch interessant: dieses kombinatorische Design verwendet bei Xilinx S3 immerhin drei Taktnetze (wegen der 15 Latches).
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.