我正在尝试多路复用过滤器模块的输入,但我的语法有困难。有人可以帮忙吗?我在想,
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
但是这不能编译。我该怎么做?
答案 0 :(得分:1)
我正在猜测你想要完成什么,但如果你只想抓住一部分矢量你可以使用索引部分选择
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
这也可以通过案例陈述来完成:
reg
请注意,我必须将输出设为always
,因为它是在wire [3:0][x-1:0] input_2d;
assign input_2d = MULTICHANNEL_INPUT;
assign channelDataIn = input_2d[channelNumberIn];
块内驱动的。但是,这并没有改变任何事情。这两个模块应该合成到相同的门。我更喜欢第一种解决方案,因为它不易出错:第二种解决方案中的拼写错误可能导致部分选择重叠。
另一种选择只是为了好玩。我不喜欢这个,因为不太清楚发生了什么,你冒着让尺寸倒退的风险(我不确定我是否真的在这里做过):
CASE
答案 1 :(得分:0)
获取未注册的多路复用器的一种简单方法是使用连续分配
to_char