2016-05-03 13 views
0

Ich versuche, den Eingang für ein Filtermodul zu multiplexen, aber ich habe Schwierigkeiten mit der Syntax. Kann jemand helfen? Ich dachte zu tun,Verilog-Teil in einem Genvar-Kontext auswählen

reg [y:0] MULTICHANNEL_INPUT; 
wire [x:0] channelDataIn; 
wire [1:0] channelNumberIn; 

Filter XYZ (
... 
.chan_in(channelNumberIn), 
.din(channelDataIn),    //[x:0] data in 
... 
); 

always @ (*) 
case(channelNumberIn) 
    0: assign channelDataIn = MULTICHANNEL_INPUT[x:0] 
    1: assign channelDataIn = MULTICHANNEL_INPUT[2x:x+1] 
    ... 
endcase 

Dies kompiliert jedoch nicht. Wie soll ich das machen?

+0

Der Kompilierfehler ist: ChannelDataIn ist keine legale reg oder eine Variable Lvalue. - was ich verstehe, aber alles, was ich will, ist ein Multiplex mit ein paar Drähten: D nicht um es in ein reg zu konvertieren. – toomanychushki

+0

Was sind 'x' und' y'? Parameter? Genvars? Eingänge? – nguthrie

+0

Das Deklarieren einer Variablen als "reg" führt nicht zu Flip-Flops, wenn Sie sich darüber Sorgen machen. – nguthrie

Antwort

1

Ich nehme eine Vermutung an, was Sie versuchen zu erreichen, aber wenn Sie wollen einfach nur ein Teil eines Vektors greifen können Sie ein indiziertes Teil

module test 
#(
    parameter x = 4, 
    parameter y = 4*x 
) 
    (
    input [y-1:0] MULTICHANNEL_INPUT, 
    input [1:0] channelNumberIn, 
    output [x-1:0] channelDataIn 
) 

    assign channelDataIn = MULTICHANNEL_INPUT[x*channelNumberIn +: x]; 

endmodule 

Dies kann auch mit einem Fall erfolgen wählen verwenden Erklärung:

module test 
#(
    parameter x = 4, 
    parameter y = 4*x 
) 
    (
    input [y-1:0] MULTICHANNEL_INPUT, 
    input [1:0] channelNumberIn, 
    output reg [x-1:0] channelDataIn 
) 

    always_comb begin 
     case(channelNumberIn) 
     2'd0: channelDataIn = MULTICHANNEL_INPUT[1*x-1:0*x]; 
     2'd1: channelDataIn = MULTICHANNEL_INPUT[2*x-1:1*x]; 
     2'd2: channelDataIn = MULTICHANNEL_INPUT[3*x-1:2*x]; 
     2'd3: channelDataIn = MULTICHANNEL_INPUT[4*x-1:3*x]; 
     endcase 
    end 

endmodule 

Beachten sie, dass ich die Ausgabe eine reg machen musste, da es im Inneren eines always Block angetrieben wird. Das ändert jedoch nichts. Diese zwei Module sollten zu den gleichen Gates synthetisieren. Ich mag die erste Lösung besser, da sie weniger fehleranfällig ist: Ein Tippfehler in der zweiten könnte zu Überlappungen der Teile führen.

Eine weitere Option nur zum Spaß. Ich mache das nicht so viel wie, da es nicht ganz klar ist, was geschieht, und Sie laufen Gefahr, die Dimensionen nach hinten bekommen (ich bin nicht sicher, ich habe es tatsächlich hier):

wire [3:0][x-1:0] input_2d; 
assign input_2d = MULTICHANNEL_INPUT; 
assign channelDataIn = input_2d[channelNumberIn]; 
+0

Wie würde diese Multiplikation synthetisiert werden? Ich bezweifle, dass es schlau genug ist, um mir einen einfachen Multiplexer zu geben. – toomanychushki

+0

Ich denke, es ist schlau genug. Diese Parameter sind zur Kompilierzeit statisch. – nguthrie

0

eine einfache Ansatz, um einen nicht registrierten Mux zu erhalten, ist die kontinuierliche Zuweisung zu verwenden

assign <wire1> = <2-bit_select> ? <value0> : <2-bit_select> ? <value1> : ... <value1>; 
Verwandte Themen