我正在尝试创建一个模块,根据一个热输入将x输入数据包切换到单个输出数据包。
如果x是固定值4,我只想创建一个case语句
case (onehot)
4'b0001 : o_data = i_data[0];
4'b0010 : o_data = i_data[1];
4'b0100 : o_data = i_data[2];
4'b1000 : o_data = i_data[3];
default : o_data = 'z;
endcase
但是对于变量x,我该如何定义所有情况呢?
感谢。
答案 0 :(得分:11)
parameter X = 4;
input [X-1:0] onehot;
input i_data [X];
output reg o_data;
always_comb begin
o_data = 'z;
for(int i = 0; i < X; i++) begin
if(onehot == (1 << i))
o_data = i_data[i];
end
答案 1 :(得分:9)
如果您可以断言onehot
真的是一热或0,那么您可以使用生成
package mytypes;
typedef logic [7:0] packet_t;
endpackage
module mux #(int X) (
input logic [X-1:0] onehot,
input mytypes::packet_t i_data[X],
output wire mytypes::packet_t o_data
);
for(genvar i=0;i<X;i++) begin
assign o_data = onehot[i] ? i_data[i] : 'z;
end
endmodule
答案 2 :(得分:2)
这是一个完全参数化的可合成多路复用器,使用OR树优化了单热输入(即无优先级编码)。请注意,输出被驱动为0而不是&#39; z&#39;如果没有启用输入:
module mux
#( parameter int unsigned inputs = 4,
parameter int unsigned width = 8 )
( output logic [width-1:0] out,
input logic sel[inputs],
input logic [width-1:0] in[inputs] );
always_comb
begin
out = {width{1'b0}};
for (int unsigned index = 0; index < inputs; index++)
begin
out |= {width{sel[index]}} & in[index];
end
end
endmodule
答案 3 :(得分:0)
我认为 'wor' 数据类型是这里真正的救星。 请找到示例代码:
module cnt64_shared
#(
parameter INSTANCES = 6 // Number of shared istances
)
(
input [INSTANCES-1:0][31:0] in_L_f , // i - input
input [INSTANCES-1:0] in_sel_1hot , // i - input selection
// clk and reset - add new signals before
input clk , // i - clock
input rst_n // i - reset
);
wor [31:0] in_L_mux;
genvar i;
generate
for (i=0;i<INSTANCES;i=i+1) begin
assign in_L_mux = in_sel_1hot[i] ? in_L_f[i] : 32'h0 ;
end
endgenerate
endmodule