2013-02-23 2 views
0

이것은 다소 어리석은 질문 일지 모르지만 소프트웨어에서 HDL 로의 전환은 때로는 다소 좌절감을 나타냅니다!Verilog For Loop for Array Multiplication

내 문제 : Verilog에서 수행하려고하는 배열 곱셈이 있습니다. 이것은 길이 200의 두 배열 (한 포인트 씩)의 곱셈입니다. 다음 코드는 테스트 벤치에서 정상적으로 작동했습니다.

for (k=0; k<200; k=k+1) 
    result <= result + A[k] * B[k]; 

그러나 Verilog 모듈에서 작동하지는 않습니다. 그 이유는 많은 클럭 사이클 동안 작업이 이루어져야했기 때문이라고 생각했습니다. 내가 손으로 그것을하면 200의 곱셈과 199의 덧셈을 쓰는 것을 포함하기 때문에 (!) for 루프를 만드는 데 트릭이 있었는지 궁금해하고 있었다.

감사합니다,

파이잘.

답변

4

for 루프를 사용하지 않으려면 클록 논리 블록을 사용하고 싶습니다. for 루프는 자신에 대한 피드백이없는 병렬 구조를 설명하기위한 용도로만 사용되며, 유용하지 않으며 소프트웨어 프로그램에서 사용하는 것과 동일한 종류의 것들에는 유용하지 않습니다. 당신이 달성하려고하는 일을하려면

, 당신과 같이 블록이 있어야합니다

이 재설정에 대한 결과를 제로로
always @(posedge clk or posedge reset) 
    if (reset) begin 
     result <= 0; 
     k <= 0; 
     result_done <= 0; 
    end else begin 
     result  <= result_done ? result : (result + A[k] * B[k]); 
     k   <= result_done ?  k : k + 1; 
     result_done <= result_done ?  1 : (k == 200); 
    end 
end 

는, A [K]를 추가 * B 합 [K]에 대한 200 클럭, 그리고 k == 200 일 때 카운팅을 멈추고 'done'신호를 어서 트한다.

+0

정말 고마워요 ... 완벽하게 작동합니다! :) –

+0

지금은 제대로 Verilog에 대한 루프를 작성하는 방법을 알고, 감사합니다. – Jason