2017-05-10 16 views
0

두 개의 53 비트 숫자를 곱하기위한 코드가 있습니다 (아래에 쓰여 있습니다). 두 개의 다른 106 비트 레지스터를 사용하여 shift-add 전략을 사용하고 있습니다. 이 코드는 정상적으로 작동합니다. 이제 나는 또 다른 53 비트 고도로 최적화 된 hans carlson 덧셈기 모듈을 형식으로 작성했습니다 :Verilog 항상 블록 내부의 모듈 인스턴스화. 곱하기에 대한 덧셈기 사용

모듈 hans_carlson_adder (입력 [52 : 0] a, b, 입력 c_in, 출력 [52 : 0] 합, 출력 c_out);

이 덧셈기를 for 루프 (코드에서 언급)에서 합계 줄을 수행하려면 사용하고 싶습니다. 항상 블록 내부에서 덧셈기를 인스턴스화하는 데 문제가 있습니다. 게다가 나는이 가산기의 106 인스턴스 (for 루프 때문에)를 갖고 싶지 않습니다. 당신은

module mul1(
       output reg [105:0] c, 
       input [52:0] x, 
       input [52:0] y, 
      input clk, 
      input state 
      ); 

     reg [105:0] p; 
     reg [105:0]a; 
     integer i; 

     always @(posedge clk) begin 
     if (state==1) begin 

      a={53'b0,x[52:0]}; 
      p=106'b0; // needs to zeroed 
      for(i=0;i<106;i=i+1) begin 
      if(y[i]) begin 
       p=p+a; //THIS LINE NEEDS TO BE REPLACED WITH HANS CARLSONADDER 
      end 
      a=a<<1; 
      end 

     c<=p; 

     end else begin 
     c=0; 

     end 
     end 
     endmodule 
+1

두 가지 선택이 있습니다. 1) 한 사이클에서 곱셈을 수행하는 52 개의 덧셈기 2) 52 사이클에서 곱하기를 수행하는 하나의 덧셈기. 어느 쪽을하고 싶습니까. 참고 : 원래 코드는 y에 많은 비트가 없으므로 106 번 반복 할 필요가 없습니다. always 블록에서 모듈을 인스턴스화 할 수 없으므로 항상 외부에 인스턴스를 작성하거나 대신 함수 구현을 얻으십시오. –

+0

@Brad Budlong 나는 52 사이클에서 하나의 덧셈기 구현을 원한다. (피연산자는 106 비트가 될 것이므로 두 개를 사용해야 할 것입니다.) 내가 밖에서 모듈을 인스턴스화 할 수있는 방법을 이해하지 못하는 내가 루프에 대한 추가 작업을하고있는 것처럼 여전히 함수를 사용합니다. –

답변

0

첫째는 외부의 당신의 가산을 인스턴스화하기 위해 필요한이 코드를 도와 주실 수있는 항상 차단 및 신호에 연결 :

이제
wire [52:0] b; 
reg [5:0] count; 
assign b = c[count+7'd52:count]; 
wire [52:0] sum; 
wire c_out; 
// Add in x depending on the bits in y 
// b has the running result bits that still apply at this point 
hans_carlson_adder u0(x, b, 1'b0, sum, c_out); 

이 당신이가는 파이프 라인 가산기이기 때문에 곱셈을 시작할 수있는 무언가가 필요합니다. (그 번호는 input start입니다.) 그리고 그 결과를 사용할 수 있음을 나타내는 무언가가 필요합니다. (그 번호는 output reg done입니다.) 모듈 정의에 mul1 모듈을 추가하려고합니다. 필요에 따라 약간 다른 프로토콜을 선택할 수 있습니다. input state으로 구현하고있는 것으로 보입니다. 또한 각 계산 중에 start을 사용하여 별도의 재설정 신호가 필요하지 않도록 초기화 할 것입니다.

reg [52:0] shift; 
always @(posedge clk) begin 
    if (start) begin 
    done <= 0; 
    count <= 0; 
    c <= 106'b0; 
    shift <= y; 
    end else if (count < 53) begin 
    if (shift[0]) begin 
     c[count+7'd52:count] <= sum; 
     c[count+7'd53] <= c_out; 
    end 
    count <= count + 1; 
    shift = shift >> 1; 
    end else begin 
    done <= 1; 
    end 
end 

당신이 shift 신호가 결과에 추가 할 더 많은 비트가 없었다으로 done 신호가 높은 빨리 될 것이다이 경우 0으로 동일하면 끝낼 수 있었다 최적화를 확인하려면, 그래서 y의 작은 값을 곱하면 사이클이 줄어 듭니다.

+0

'c [count + 7'd52 : count]'가 완료되지 않습니다. 어쩌면 당신은'c [count + : 53]' – Greg