Forum: FPGA, VHDL & Co. Instanzen überbrücken - Bypass Frage


von Philipp (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe gerade einen Knoten im Kopf und hoffe, dass ich ihn mit Eurer 
Hilfe lösen kann.

Im Bild kann man sehen, was ich in etwa vorhabe:
Ich habe 12 Eingangspins, die jeweils eine doppelte Funktion haben. Die 
Funktion kann mit einem mode-Bit (der 13. Pin) umgeschaltet werden. Ziel 
ist es, mit diesem Mode-Pin Teile zu überbrücken.
Ich gebe also entweder alle 12 bit an Instanz 0, oder eben zwei 6bit 
Werte an Instanz 1.
Nun stehe ich irgendwie auf dem Schlauch, wie ich das lösen kann O_o
1
entity XYZ is
2
port (
3
  CLK    : in  std_logic;
4
  NRES   : in  std_logic;
5
  INPUT  : in  std_logic_vector (11 downto 0;
6
  MODE   : in  std_logic;
7
  OUTPUT : out std_logic
8
  );
9
end entity XYZ;
10
11
...
12
13
i0 : instanz0
14
port map (
15
  INPUT  => input_i0,
16
  OUTPUT1 => output1_i0,
17
  OUTPUT2 => output2_i0
18
  );
19
20
i0 : instanz1
21
port map (
22
  INPUT1 => input1_i1,
23
  INPUT2 => input2_i1,
24
  OUTPUT => output_i1
25
  );
26
27
-- Signale umswitchen
28
bypass : process
29
begin
30
31
  if MODE = '1' then
32
    input_i0 <= INPUT;
33
    input1_i1 <= output1_i0;
34
    input2_i1 <= output2_i0;
35
  else
36
    input1_i1 <= INPUT(11 downto 6);
37
    input2_i1 <= INPUT( 5 downto 0);
38
  end if;
39
40
  OUTPUT <= output_i1;
41
end process;
42
43
...

Irgendwie habe ich das Gefühl, dass es bei dieser Methode noch ein 
Hacken gibt bzw. man die ganze Sache noch etwas einfacher/eleganter 
lösen kann.
Leider habe ich gerade kein ISE da zum Ausprobieren und Testen.

Ich wäre für Hinweise sehr dankbar!
Phil

von Robert K. (Firma: Medizintechnik) (robident)


Lesenswert?

du musst von hinten her denken und dir jedes Sigal greifen und es 
füttern.

was ist mit input0 im unteren mode zweig?

von Philipp (Gast)


Lesenswert?

Hallo,

R. K. schrieb:
> was ist mit input0 im unteren mode zweig?
input_i0 wird ja dann, wenn die Instanz überbrückt wird, nicht benötigt. 
Ich nehme an, so wie ich es geschrieben habe, ist der Eingang floating? 
Sollte aber auch keine Auswirkung haben, denn auch der Ausgang der 
Instanz 0 wird ja nicht mehr abgefragt.
Vielleicht lege ich ihn noch mit
1
input_i0 <= (others => '0');
auf Null und dann sollte das Thema gegessen sein?

Vielen Dank!
Phil

von Klaus (Gast)


Lesenswert?

Philipp schrieb:
> Leider habe ich gerade kein ISE da zum Ausprobieren und Testen.

Dann lad dir halt eins runter?!?

von Philipp (Gast)


Lesenswert?

Hallo,

Klaus schrieb:
> Dann lad dir halt eins runter?!?
Das liegt wemiger am ISE, als eher an den Rechner Kapazitäten. Bin 
gerade nur mit dem Netbook in der FH unterwegs. Da lohnt kein ISE drauf.
Ich teste es dann, wenn ich daheim bin!

Aber da keine harten Widerworte kommen, nehme ich mal an, dass diese 
Lösung durchaus praktikabel sein kann...

Vielen Dank!

von DuArte (Gast)


Lesenswert?

Wo ist die Sensitivitätsliste für den Prozess?

von Philipp (Gast)


Lesenswert?

Hallo,

DuArte schrieb:
> Wo ist die Sensitivitätsliste für den Prozess?
Die fehlt - ist ja nur ein schnell beispielhaft zusammengeschriebener 
Code.

An sich wollte es so aussehen:
1
-- Signale umswitchen
2
bypass : process (MODE, INPUT, output1_i0, output2_i0, output_i1)
3
begin
4
5
  if MODE = '1' then
6
    input_i0 <= INPUT;
7
    input1_i1 <= output1_i0;
8
    input2_i1 <= output2_i0;
9
  else
10
    input1_i1 <= INPUT(11 downto 6);
11
    input2_i1 <= INPUT( 5 downto 0);
12
  end if;
13
14
  OUTPUT <= output_i1;
15
end process;

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


Lesenswert?

Philipp schrieb:
> An sich wollte es so aussehen: ...
Ich würde das eher so machen:
1
input_i0  <= INPUT;
2
3
-- Signale am i1 umswitchen
4
bypass : process (MODE, INPUT, output1_i0, output2_i0)
5
begin
6
  if MODE = '1' then
7
    input1_i1 <= output1_i0;
8
    input2_i1 <= output2_i0;
9
  else
10
    input1_i1 <= INPUT(11 downto 6);
11
    input2_i1 <= INPUT( 5 downto 0);
12
  end if;
13
end process;
14
15
OUTPUT    <= output_i1;
Denn der Output hat offenbar nichts mit dem Input und dem Mode zu tun.

Und am input_i0 darf der Eingang immer angeschlossen bleiben. Das ist 
sogar besser so, denn welchen Pegel sollte input_i0 annehmen, wenn 
Mode='0' ist? Schwuppdibohne hast du ein Latch an der Backe...   :-o

von Philipp (Gast)


Lesenswert?

Hallo,

Dann lege ich den Input bei MODE='0' auf Masse. Dann sollte es wieder 
passen und ich finde es doch etwas übersichtlicher, wenn alle Signale in 
beiden Modi direkt untereinander geschrieben sind.
1
-- Signale umswitchen
2
bypass : process (MODE, INPUT, output1_i0, output2_i0, output_i1)
3
begin
4
5
  if MODE = '1' then
6
    input_i0  <= INPUT;
7
    input1_i1 <= output1_i0;
8
    input2_i1 <= output2_i0;
9
  else
10
    input_i0  <= (others => '0');    
11
    input1_i1 <= INPUT(11 downto 6);
12
    input2_i1 <= INPUT( 5 downto 0);
13
  end if;
14
end process;
15
  OUTPUT <= output_i1;

Oder hat das noch erhebliche Einflüsse auf das Syntheseergebnis?

Vielen Dank!
Phil

von P. K. (pek)


Lesenswert?

Philipp schrieb:
> Oder hat das noch erhebliche Einflüsse auf das Syntheseergebnis?

Es kommt noch ein MUX am Eingang dazu.

Wenn Deine erste Instanz (die welche nur in Mode = '1' benötigt wird) 
sehr umfangreich ist, kann es aus Powersave-Gründen sogar sinnvoll sein, 
die Inputs und damit den ganzen Block nicht mittoggeln zu lassen.

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.