Первый кодировщик ненулевых элементов в Verilog

Предположим, у меня есть массив A, содержащий двоичные числа, например. [0 0 1 0 1 1]. Теперь я хочу создать кодировщик, который может идентифицировать расположение первой «1» в массиве A. Например, логика должна выводить 3 для массива A, если мы присваиваем индекс 1 первому элементу в этом массиве. Есть ли какой-нибудь элегантный способ сделать это? Я предполагаю, что один из способов сделать это — использовать ПЗУ, но как записать это на Verilog? С помощью справочной таблицы?


person Nan    schedule 06.07.2016    source источник


Ответы (2)


Вы можете использовать generate для автоматизации построения комбинаторной логики для любой желаемой кодировки. В следующем примере возвращается индекс старшего установленного бита или -1, если установленный бит отсутствует.

Оператор generate используется для развертывания цикла. Каждый этап цикла может создать произвольную функцию индекса цикла и некоторых битов входного вектора. Поскольку выход первого этапа является входом для следующего, он формирует все более сложную комбинаторную логику. Инструмент «Синтез» предназначен для минимизации, упаковки и объединения многоэтапной комбинаторной логики наиболее эффективным способом.

Например, в Xilinx Vivado следующий пример сводится только к двум каскадам LUT с 6 входами для 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
person Anders    schedule 08.07.2016

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
person Rich Maes    schedule 08.07.2016