Verilog中的第一个非零元素编码器

时间:2016-07-06 17:45:29

标签: logic verilog encoder

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

2 个答案:

答案 0 :(得分:2)

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

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

例如,在Xilinx Vivado中,以下示例将16位输入的16个输入LUT级简化为16个,而不是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

答案 1 :(得分: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