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

관련 문제