Logic Verilog中的第一个非零元素编码器
假设我有一个包含二进制数的数组,例如[0 1 0 1]。现在我想构建一个编码器,它可以识别数组A中第一个“1”的位置。例如,如果我们给数组A中的第一个元素指定索引1,那么逻辑应该为数组A输出3。有什么优雅的方法吗?我想其中一种方法是使用ROM,但如何在Verilog中编写它呢?使用查找表?casex可以解决您的问题Logic Verilog中的第一个非零元素编码器,logic,verilog,encoder,Logic,Verilog,Encoder,假设我有一个包含二进制数的数组,例如[0 1 0 1]。现在我想构建一个编码器,它可以识别数组A中第一个“1”的位置。例如,如果我们给数组A中的第一个元素指定索引1,那么逻辑应该为数组A输出3。有什么优雅的方法吗?我想其中一种方法是使用ROM,但如何在Verilog中编写它呢?使用查找表?casex可以解决您的问题 function [2:0] prienc6; input [5:0] select; reg [2:0] out; begin casex(select)
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
您可以使用
generate
为所需的任何编码自动构建组合逻辑。下面的示例返回最高设置位的索引,如果没有设置位,则返回-1
generate语句用于展开循环。循环的每个阶段都可以创建循环索引和一些输入向量位的任意函数。由于第一阶段的输出是下一阶段的输入,它逐渐形成更复杂的组合逻辑。综合工具用于以最有效的方式最小化、打包和组合多阶段组合逻辑
例如,在Xilinx Vivado中,以下示例将16位输入而不是16个级联2:1多路复用器简化为仅两个6输入LUT级
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
模块高位#(
参数OUT_WIDTH=4,//OUT对“未找到”使用一个额外的位
_WIDTH中的参数=1