1

Я пытаюсь написать некоторый код Verilog, который я хотел бы использовать повторно для приложения, которое имеет много дополнений с различным количеством входов. Скажем, у меня есть модуль:Verilog: Есть ли способ сделать обобщенный сумматор (переменная ширина/количество входов)?

module parameterizable_adder #( 
    parameter WIDTH = 16, 
    parameter NUM_INPUTS = 16)( 
    input [NUM_INPUTS*WIDTH-1:0] in_data, output [NUM_INPUTS+WIDTH-1:0] out_data 
); 

    //treat this block as psuedo code 
    integer i; 
    for (i = 0; i < NUM_INPUTS; i = i + 1) begin 
    out_data = out_data + in_data[i*WIDTH+WIDTH-1:i*WIDTH]; 
    end 

endmodule 

Это более или менее то, что я хочу сделать. Есть ли способ в verilog сделать это и сделать его синтезируемым? В идеале цикл for будет откручен и оптимизирован, поэтому он не будет пытаться выполнить добавление в этапах NUM_INPUTS-1. Это лучше подходит для выражения generate?

Благодаря

ответ

2

Вам не нужно генерировать блок для этого

integer i; 
reg [NUM_INPUTS+WIDTH:0] temp_data; 
always @* begin 
    temp_data = 0; 
    for (i = 0; i < NUM_INPUTS; i = i + 1) 
     temp_data = temp_data + in_data[i*WIDTH +: WIDTH]; 
    out_data = temp_data; 
    end 
+0

Спасибо Дейву, что бы код выполнить в один такт? будет ли temp_data обновляться в течение одного тактового цикла или тактового цикла для каждой операции добавления? – marlow

+0

Пробовал редактировать, но я не могу. Я заметил, что нет часов (в моем коде тоже), его «*» для всегда блока. Кажется, я понял. Благодаря! – marlow

 Смежные вопросы

  • Нет связанных вопросов^_^