Realisierung mit Shift-Funktion

Gast #1343841
Lesenswert?

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
Gast #1343874
Lesenswert?

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

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

> 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).

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