2017-05-16 10 views
0
 tempReg:=B; 
     shiftReg:= "0000000000000000" & A;   

     for i in 0 to 16 loop 
      if shiftReg(2*n+1) = '1' then 
       shiftReg(2*n+1 downto 0) := (shiftReg(2*n+1 downto n+1) + tempReg(n downto 0)) & shiftReg(n downto 0); 
      elsif shiftReg(2*n+1) = '0' then 
       shiftReg(2*n+1 downto 0) := (shiftReg(2*n+1 downto n+1) - tempReg(n downto 0)) & shiftReg(n downto 0); 
      end if; 

      if shiftReg(2*n+1) = '1' then 
       shiftReg(2*n+1 downto 0):= shiftReg(2*n downto 0) & '0'; 
      elsif shiftReg(2*n+1) = '0' then 
       shiftReg(2*n+1 downto 0):= shiftReg(2*n downto 0) & '1'; 
      end if; 
     end loop; 

     C <= shiftReg(n downto 0); 
     D <= shiftReg(2*n+1 downto n+1); 

이것은 ALU 코드의 일부입니다. (A와 B는 16 비트 입력이고, C는 답이고, D는 미리 알림입니다.) 이 부분 코드는이 부분에서 책임을집니다. VHDL 언어를 사용하여이 분배기 "https://www.youtube.com/watch?v=z0RIEvzX65I"을 다시 만들고 싶습니다. 문제는 올바른 대답 (C)을 받았지만 잘못된 미리 알림 (D)입니다.VHDL 분배기, 수정

내가 진심이 "나쁜/바보 코드"또는

+1

하시기 바랍니다가, [mcve] 제공 :

는 여기에 기본 코드입니다. 특히 전체 엔터티 및 테스트 벤치를 제공하십시오. 나는 당신이 그것을 단지 시뮬레이션하고 있다고 가정한다. 이 코드를 합성하려는 하드웨어는 언급하지 않았기 때문에. – Staszek

답변

0

기본적으로, 부문 그냥 반복 뺄셈 "이 질문을 게시 할 잘못된 장소"인 경우 사과하고 싶다.

count := (15 downto 0 => '0'); 
rem := dividend; 
while (rem >= divisor) loop 
    rem := (rem - divisor); 
    count := count + 1; 
end loop; 
quotient <= count; 
remainder <= rem; 
+1

이것은 합성 할 수 없습니다. 게다가, 나누기 알고리즘이 훨씬 효율적입니다. 반복마다 1 비트 몫을 해결합니다. 당신의 코드는 1000/1 반복을 요구할 것입니다. 더미 비 복원 분할은 16 사이클을 취할 것입니다 (16 비트 지수의 경우). –