6

我正在尝试创建一个模块,该模块根据一个热输入将 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,我如何定义所有情况?

谢谢。

4

4 回答 4

12
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
end
于 2013-11-09T13:09:42.790 回答
11

如果您可以断言它onehot确实是 one-hot 或 0,那么您可以使用 generate

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
于 2013-11-09T15:38:20.713 回答
4

这是一个完全参数化的可合成多路复用器,使用 OR 树针对单热输入(即无优先级编码)进行了优化。请注意,如果未启用任何输入,则输出将被驱动为 0 而不是“z”:

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
于 2014-10-15T04:18:04.657 回答
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
于 2021-05-24T05:38:40.600 回答