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];
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
Was sind 'x' und' y'? Parameter? Genvars? Eingänge? – nguthrie
Das Deklarieren einer Variablen als "reg" führt nicht zu Flip-Flops, wenn Sie sich darüber Sorgen machen. – nguthrie