나는 위에서 언급 한 아키텍처를 기반으로 부호있는 숫자에 대한 곱셈기 누산기를 설계하고 있습니다. 필자는 부분 제품을 생성하고 캐리 세이빙 축전지에 대해 부스 인코더 용 모듈을 작성했으며 두 가지 모두 올바르게 작동하고 있습니다. 이제, 이러한 하위 부품을 통합하기 위해 작성된 마지막 모듈에서 첫 번째 클럭 사이클에서 두 개의 입력을 받아들이고 부분 곱을 생성 한 다음 이전 승수의 결과를 누적하는 carry 저장 가중치로 전달하려고합니다. 현재의 것. 결과는 다음 클럭 사이클에서 저장되고 두 번째 레지스터에 표시됩니다. 처음에 모든 레지스터는 0으로 재설정됩니다. 캐리 세이프 누적 기는 http://infolab.stanford.edu/pub/cstr/reports/csl/tr/94/617/CSL-TR-94-617.appendix.pdf 링크의 그림 A.6을 기반으로합니다. 최종 레벨은 carry look ahead adder로 구성되어 누적 된 결과를 출력합니다. 코드의 관련 부분은 다음과 같습니다 리셋 = 1, 및 즉시 리셋 = 0으로, 그들이 생각하는가 '1'과 '의 값을 취할 때radix-4 기반 병렬 곱셈 누적 기 수정 된 부스 알고리즘
CSA_hope csahope (znew, zcnew, pv[0][8:0], pv[1][8:0], pv[2][8:0], pv[3][8:0],
sasa, product, xy[19:16], dealsign);//pv=partial products, znew=output of csa,
product=final accumulated result, xy=input values
always @ (posedge clk)
begin
if (reset)
begin
xy <= 20'b0;
product <= 16'b0;
sasa <= 2'b0;
dealsign <= 5'b0;
end
else
begin
dealsign[0] = ~(multiplicand[7]^pv[0][8]);
dealsign[1] = ~(multiplicand[7]^pv[1][8]);
dealsign[2] = ~(multiplicand[7]^pv[2][8]);
dealsign[3] = ~(multiplicand[7]^pv[3][8]);
dealsign[4] = (multiplicand[7]^pv[0][8]);
xy <= {N, multiplicand, multiplier};
sasa <= 2'b11;
product <= znew;
end
end
레지스터의 사사와 dealsign는 처음에 0을 포함 E '를 캐리 세이브 누적 계산기에 각각 입력합니다 (그림 A.6 참조). 그러나, 이러한 일은 발생하지 않으며, 1과 E로 값을 변경하기 위해 여분의 클록 사이클을 소비하므로 잘못된 결과가 생성됩니다. 여기에이 코드를 작성한 테스트 벤치입니다 :
always
#5 clk = !clk;
initial
begin
$monitor ($time," clk=%b reset=%b x=%d y=%d xy=%b p0=%b p1=%b p2=%b p3=%b znew=%b product=%b(%d)
dealsign=%b sasa=%b\n",clk, reset,
multiplicand, multiplier, fmac.xy,fmac.pv[0][8:0],fmac.pv[1][8:0],fmac.pv[2] [8:0],fmac.pv[3][8:0], fmac.znew,product,product,fmac.dealsign,fmac.sasa);
#0 clk = 0; multiplicand = 10; multiplier = 19; reset = 1;
#10 reset = 0; N = 4'b0001;
#30 multiplicand = 11; multiplier = 13; N = 4'b0010;
#50 $finish;
end
그래서, dealsign의 필수 값이 아니라 t에서보다, t = 25에서오고는 = 15 따라서, t의 제품은 = 25에 나온다 0000000010111110 (190) 대신 0000001010111110 (702)이되어야합니다. 누군가이 코드를 디버깅하거나 다른 방법을 제안 할 수 있습니까?
'collabign [0] ='과 (과) 비슷한 줄은''dealign [0] <='으로 변경해야합니다. – Morgan
RTL 시뮬레이션에서 디지털 논리가 0이 아닌 다른 것을 취한다면 't'는 무엇입니까? 'CSA_hope' 모듈에 타이밍 정보가 포함되어있는 경우, 실행 가능한 최대 주파수를 나타냅니다. – Morgan