【问题标题】:First non-zero element encoder in Verilog [duplicate]Verilog 中的第一个非零元素编码器
【发布时间】:2016-11-08 21:15:03
【问题描述】:

假设我有一个包含二进制数的数组 A,例如[0 0 1 0 1 1]。现在我想构建一个编码器,它可以识别数组 A 中第一个“1”的位置。例如,如果我们将索引 1 分配给该数组中的第一个元素,则逻辑应该为数组 A 输出 3。有什么优雅的方法吗?我想一种方法是使用 ROM,但你如何在 Verilog 中编写它?使用查找表?

【问题讨论】:

    标签: logic verilog encoder


    【解决方案1】:

    casex 可以解决您的问题。

    function [2:0] prienc6;
     input [5:0] select;
     reg   [2:0] out;
     begin
       casex(select)
         6'b000001: out = 3'b101;
         6'b00001x: out = 3'b100;
         6'b0001xx: out = 3'b011; 
         6'b001xxx: out = 3'b010; 
         6'b01xxxx: out = 3'b001; 
         6'b1xxxxx: out = 3'b000; 
       endcase
       prienc6 = out ;
     end
    endfunction
    

    【讨论】:

      【解决方案2】:

      您可以使用generate 为所需的任何编码自动构建组合逻辑。以下示例返回最高设置位的索引,如果没有设置位,则返回 -1。

      generate 语句用于展开循环。循环的每个阶段都可以创建循环索引和一些输入向量位的任意函数。由于第一阶段的输出是下一个阶段的输入,因此它逐渐形成更复杂的组合逻辑。综合工具以最有效的方式最小化、打包和组合多阶段组合逻辑。

      例如,在 Xilinx Vivado 中,以下示例将 16 位输入减少到只有两个 6 输入 LUT 级,而不是 16 个级联 2:1 多路复用器。

      module highbit #(
          parameter OUT_WIDTH = 4, // out uses one extra bit for not-found
          parameter IN_WIDTH = 1<<(OUT_WIDTH-1)
      ) (
          input [IN_WIDTH-1:0]in,
          output [OUT_WIDTH-1:0]out
      );
      
      wire [OUT_WIDTH-1:0]out_stage[0:IN_WIDTH];
      assign out_stage[0] = ~0; // desired default output if no bits set
      generate genvar i;
          for(i=0; i<IN_WIDTH; i=i+1)
              assign out_stage[i+1] = in[i] ? i : out_stage[i]; 
      endgenerate
      assign out = out_stage[IN_WIDTH];
      
      endmodule
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        • 2022-12-05
        相关资源
        最近更新 更多