2012-08-28 3 views
2

현재 C를 VHDL로 변환하는 프레임 워크를 작성 중이며 긴 long division의 구현에 매달리고 있습니다. 사실, 내 프레임 워크는 32 비트 변수에서만 작동하므로 C long long 변수를 구문 분석하면 VHDL 변수가 두 개가됩니다. 하나는 가장 중요한 부분을 포함하고 다른 하나는 중요도가 가장 낮은 부분을 포함합니다. 그래서에서, 요약하기 :32 비트 메모리를 사용하는 long long division

long long a = 1LL; 

무언가 같이 될 것입니다 생성 될 VHDL :

var30 <= 00000000000000000000000000000000; 
var31 <= 00000000000000000000000000000001; 

이제 내 문제입니다 : 내가 (VHDL에서) 2 개 오래 오래 매개 변수를 나눌 수있는 방법 , 그들은 2 개의 변수로 나뉘어져 있기 때문에? 덧셈/뺄셈에 아무런 문제가 없었습니다. 왜냐하면 저는 가장 중요한 부분을 독립적으로 (단지 캐리를 전달하기 위해) 작업 할 수 있기 때문입니다. 그러나 이걸로 나눗셈을 수행 할 수있는 방법을 실제로 볼 수는 없습니다. 작업의 종류, 최소한의 가장 중요한 부분은 정말 사람이 아이디어가있는 경우가 많이 주시면 감사하겠습니다 ... 함께

PS를 바인딩 : 나는 곱셈

편집을 위해 같은 문제가 : 나는 둘 다 부호있는/부호없는 변수에서 작동하며 결과는 64 비트 변수 여야합니다.

+0

입력 사항이 서명되었거나 서명되지 않았습니까? –

+0

부호가 있거나 부호가 없습니다. –

+0

64 비트 결과 만 원하거나 전체 128 비트 결과를 원하십니까? –

답변

0

곱셈과 나눗셈 문제 모두에 대해 다음과 같이 문제를 해결할 수 있습니다. 각 64 비트 값 xc 는 k*x.hi+x.lo으로 표현되며, 여기서 x.hi는 상위 32 비트이고, x.lo는 하위 32 비트이며, k는 2^32입니다. 그래서 곱셈 : 그냥 64 비트 결과를 원하는 경우

a*b = (a.hi*k+a.lo)*(b.hi*k+b.lo) 
    = a.hi*b.hi*k*k + (a.hi*b.lo + a.lo*b.hi)*k + a.lo*b.lo 

는 첫 번째 항은 사라지고 당신이 얻을 :

a*b = (a.hi*b.lo + a.lo*b.hi)*k + a.lo*b.lo 

일반적인 곱셈의 비트의 수를 두 배로 기억, 각각의 32 비트 위의 표현식에서 x 32 비트가 곱하면 64 비트 항이 생성됩니다. 어떤 경우에는 낮은 32 비트 (위의 표현에서 처음 두 용어) 만 필요하지만 마지막 용어는 낮은 32 비트와 높은 32 비트가 모두 필요합니다.

+0

예제에서 k는 무엇입니까? –

+1

첫 번째 참조 para :'k = 2^32' –

+0

분단의 문제는 당신이 얻는 표현을 단순화 할 수 없다는 것입니다. 그래서 곱셈에 도움이되는 방법을 보았을 때, 저는 분단을 위해하지 않습니다. .. –