Forum: FPGA, VHDL & Co. Verilog Signal-mux Problem


von Jan S. (spongebob)


Lesenswert?

Moin moin,
ich bin gerade wirklich am verzweifeln.
Ich versuche einen multiplexer zu bauen, der beliebige Eingänge auf eine 
feste Zahl an Ausgängen routen soll.

das ganze soll in Verilog und über einen generate-for block geschehen.
Meine Idee war nun einen "Selectvector" zu nutzen über den wählbar ist 
wie die Eingänge auf die Ausgänge geroutet werden. (Das soll am besten 
später auch in beide Richtungen funktionieren)

Für jeden Ausgang stehen 8 Bit zur Verfügung über die ein Eingang 
gewählt werden kann.
In der Simulation funktioniert das auch. Jedenfalls wenn ich wirklich 
nur Eingänge "links" und Ausgänge "rechts" am Block habe (hoffe ihr 
versteht was ich damit meine.

Wenn ich jetzt aber versuch das zu Synthetisieren steigt der immer aus 
weil angeblich mehrere Driver vorhanden sind.

Im folgenden mal ein Codeauszug:
1
...
2
3
input       [IF_channels:1]     if_sel0        ,
4
5
...
6
7
output reg  [IO_channels:1]     io_sel0        , 
8
9
...
10
11
reg [127:0] sel_vect;   //vector to select input-output pair
12
13
genvar i, j;
14
generate
15
    for(i=1; i<=IO_channels; i=i+1) begin : io_for
16
        for(j=1; j<=IF_channels; j=j+1) begin : if_for
17
            always @(*) begin
18
                if(sel_vect[(i*8)-1: ((i-1)*8)] == j) begin
19
                io_sel0[i]       <=  if_sel0[j];
20
                end
21
            end
22
        end
23
    end
24
endgenerate

Ich hoffe mir kann hier jemand weiter helfen.

Grüße

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


Lesenswert?

Jan S. schrieb:
> In der Simulation funktioniert das auch.
> Wenn ich jetzt aber versuch das zu Synthetisieren steigt der immer aus
Ich kann jetzt nur für VHDL sprechen: von den 100% Sprachumfang kannst 
du bestenfalls 5% für die Synthese verwenden. Und dann musst du noch 
"dem Synthesizer nach dem Maul" schreiben.

Aber irgendwie kann ich das Problem noch nicht ganz nachvollziehen. 
Beschreib es mal mit Zahlen, die im Kopf noch Platz haben: du hast 16 
Eingänge und 4 Ausgänge. Auf jeden dieser Ausgänge willst du irgendeinen 
der Eingänge schalten. Welcher das ist, das ist für alle Ausgänge 
zusammen in einem 16-Bit Vektor mit jeweils 4 Bits pro Ausgang 
beschrieben. Und das dann eben generisch und skalierbar. Trifft es das 
in etwa?

: Bearbeitet durch Moderator
von Lattice User (Gast)


Lesenswert?

Ein Signal kann nur von einem always block getrieben werden.
Dein generate contruct erzeugt aber viele.

Versuch es mal so (Ohne Gewähr)
1
genvar i, j;
2
always @(*) begin
3
    for(i=1; i<=IO_channels; i=i+1) begin : io_for
4
        for(j=1; j<=IF_channels; j=j+1) begin : if_for
5
                if(sel_vect[(i*8)-1: ((i-1)*8)] == j) begin
6
                io_sel0[i]       <=  if_sel0[j];
7
            end
8
        end
9
    end
10
end

von Jan S. (spongebob)


Lesenswert?

Also ich habe auf der "linken Seite" wenn man sich das mal als Block 
vorstellt beispielsweise einen weiteren Logikblock, der mehrere gleiche 
Sätze an Ein- und Ausgänge hat. über den block den ich schreiben will 
will ich diese Sätze an eine Schaltung geben die aus einem Array von 
gleichen Schaltungsteilen besteht und diese Sätze an (Ein- und 
Ausgangssignalen) verarbeitet. Durch den Block den ich schreiben will, 
will ich die möglichkeit geben jeden der Sätze an Eingangssignalen an 
jede Zelle der Schaltung zu leiten. Dabei kann die anzahl der 
Eingangssätze an signalen aber auch die Anzahl der Ausgangszellen 
übersteigen. Hoffe das Wurde klar. Sonst sagt noch mal bescheid, dann 
mach ich noch ne Zeichnung.

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.