2016-11-11 1 views
0

약간 문제가 있습니다. 고정 소수점으로 두 숫자를 나누는 프로그램을 만들고 싶습니다. 내 출력은 괜찮아 보이지만 내가 로컬 테스트 사이트에서 프로그램을 테스트 할 때 나는 이상한 결과를 얻는다. 누군가 나를 도울 수 있습니까? 고마워요.고정 소수점 이하 자릿수

module divider(
     input[7:0] a,b, 
     output reg [15:0] q, 
     output reg [7:0] r,frac 
     ); 

     reg[7:0] c2, r2; 
     integer c; 
    always @(*) 
     begin 

     c = 8'b00000000; 
     r = a; 
      frac = 8'b00000000; 

     repeat (30) 
      begin 
       if (r >= b) 
        begin 
        c = c + 1; 
        r = r - b; 
        end 
      end 

      q[15:8] = c; 



     repeat (8) 
     begin 
      if(r != 0) 
       begin 
       r = r*10; 
       c2 = 8'b00000000; 

       repeat(30) 
        begin 

        if (r>=b) 
         begin 
         c2 = c2 + 1; 
         r = r-b; 
         end 
        end 
       frac = frac*10 + c2; 
       end 
      end 

      q[7:0] = frac; 








end 

endmodule 

출력 로컬 사이트 :

error: a = 1, b = 2, q = 0.019531, expected q = 0.500000 
error: a = 1, b = 4, q = 0.097656, expected q = 0.250000 
error: a = 1, b = 5, q = 0.007813, expected q = 0.199219 
error: a = 1, b = 7, q = 0.570313, expected q = 0.140625 
error: a = 1, b = 8, q = 0.488281, expected q = 0.125000 
error: a = 1, b = 9, q = 0.777344, expected q = 0.109375 
error: a = 1, b = 10, q = 0.003906, expected q = 0.097656 
error: a = 1, b = 11, q = 0.363281, expected q = 0.089844 
error: a = 1, b = 14, q = 0.785156, expected q = 0.070313 
error: a = 1, b = 15, q = 0.664063, expected q = 0.066406 
error: a = 1, b = 16, q = 0.441406, expected q = 0.062500 
error: a = 1, b = 17, q = 0.937500, expected q = 0.058594 
error: a = 1, b = 18, q = 0.386719, expected q = 0.054688 
error: a = 1, b = 19, q = 0.207031, expected q = 0.050781 
error: a = 1, b = 20, q = 0.019531, expected q = 0.046875 
error: a = 1, b = 21, q = 0.187500, expected q = 0.046875 
error: a = 1, b = 22, q = 0.679688, expected q = 0.042969 
error: a = 1, b = 23, q = 0.695313, expected q = 0.042969 
error: a = 1, b = 25, q = 0.015625, expected q = 0.039063 
error: a = 1, b = 27, q = 0.589844, expected q = 0.035156 
error: a = 1, b = 28, q = 0.890625, expected q = 0.035156 
error: a = 1, b = 29, q = 0.824219, expected q = 0.031250 
error: a = 1, b = 30, q = 0.832031, expected q = 0.031250 
error: a = 1, b = 31, q = 0.804688, expected q = 0.031250 
error: a = 1, b = 32, q = 0.207031, expected q = 0.031250 
error: a = 1, b = 33, q = 0.121094, expected q = 0.027344 
error: a = 1, b = 34, q = 0.437500, expected q = 0.027344 
error: a = 1, b = 35, q = 0.570313, expected q = 0.027344 
error: a = 1, b = 36, q = 0.914063, expected q = 0.027344 
error: a = 1, b = 37, q = 0.000000, expected q = 0.023438 
error: a = 1, b = 38, q = 0.339844, expected q = 0.023438 
error: a = 1, b = 40, q = 0.097656, expected q = 0.023438 
+0

이 알고리즘이 어떻게 지원되는지는 100 % 확신 할 수 없습니다. 첫 번째 예제를 실행하면 생성 된 'q'가 현재 수행중인 작업에서 의미가 있음을 알 수 있습니다. 이 디자인은 당신의 의도 일 수도 아닐 수도있는 완벽한 조합 논리를 설명합니다. 'a = 8'd100','b = 8'd2'와 같이'repeat (30)'을 어디에서 얻었는지 모르겠지만,'c ='는 첫 번째 루프의 끝에서 30이 될 것입니다. 충분히 잇달아 뺄셈을하지 못했습니다. 또한 고정 소수점은 일반적으로 여기에있는대로 10을 기준으로하지 않고 기본 2입니다 ('사실 = 사실 * 10 + c2'). – Unn

답변

0

당신은 반드시 FPGA에 분할을위한 기수 (10)가 필요하지 않습니다. Radix2 division (예 : shift and subtract)은 구현이 훨씬 빠르고 쉽습니다. radix2 division에 대한 예제는 this입니다.

관련 문제