Hi,
ich möchte mehrere Instanzen eines Blocks (Peripherie) haben können, die
je nach Adresse selektiert werden. In der Architecture habe ich dazu
folgenden Code (gekürzt):
1 | GEN_channel_src :
|
2 | for I in 0 to NUM_CHANNEL_SRC-1 generate
|
3 | chsrc : channel_src
|
4 | port map (
|
5 | clk => clk,
|
6 | sreq => chsrc_sreq(I), -- request
|
7 | saddr => saddr(5 downto 0), -- address
|
8 | swdata => swdata,
|
9 | srdata => chsrc_srdata(I),
|
10 | sready => chsrc_sready(I),
|
11 | );
|
12 | chsrc_sreq(I) <= sreq when
|
13 | saddr(19 downto 10) = "1000000001" and
|
14 | saddr(9 downto 6) = std_logic_vector(to_unsigned(natural(I), 4))
|
15 | else "00";
|
16 | end generate;
|
Die vorwärts gerichteten Signale (in den Block hinein) kriege ich so
verarbeitet, aber ich habe ein Problem mit den rückwärts gerichteten
Signalen. Bisher hatte ich da ein concurrent assignment:
1 | srdata <= ctrl_srdata or chsrc_srdata(0) or chsrc_srdata(1) or chsrc_srdata(2) or chsrc_srdata(3);
|
2 | sready <= ctrl_sready and chsrc_sready(0) and chsrc_sready(1) and chsrc_sready(2) and chsrc_sready(3);
|
Was ich natürlich immer anpassen muss, wenn sich die Anzahl der
Instanzen ändert. Im Prinzip will ich ein wired-or bzw. wired-and haben,
aber Tristate gibt's im FPGA nicht (muss synthetisierbar sein).
Mit Variablen in einem process sollte das gehen, aber dann ist die
Verdrahtung optisch getrennt von den Generates. Gibt es da eine bessere
Lösung?
Schöne Grüße