2013-08-22 4 views
0

Verilog HDL을 처음 접했고 첫 번째 프로젝트는 일련의 레지스터를 사용하여 간단한 스톱워치 카운터를 구현하는 것입니다. 나는 Altera Quartus를 사용하고있다.Quartus에서 Verilog 코드 컴파일하기

아래 코드를 컴파일 할 때 레지스터마다 각각의 오류가 계속 발생합니다. 오류 메시지 중 하나는 다음과 같습니다

오류 (10028) : test_interface.v에서 (127)

누구든지 도움이 될 수 있습니다 순 "[3] SEC0"에 대한 여러 일정 드라이버를 해결할 수 있습니까? 이 코드는 Modelsim에서 잘 시뮬레이트합니다. 여러 always 블록

your code in Dropbox을 바탕으로
always @ (posedge clk) 

    if (qsoutput == 1) 
     sec0 = sec0 + 1; 
    else if (sec0 == 4'b1010) begin 
     sec1 = sec1 + 1; 
     sec0 = 4'b0000; 
    end else if (sec1 == 4'b0110) begin 
     min0 = min0 + 1; 
     sec1 = 4'b0000; 
    end else if (min0 == 4'b1010) begin 
     min1 = min1 + 1; 
     min0 = 4'b0000;  
    end else if (min1 == 4'b0110) begin 
     sec0 = 4'b0000; 
     sec1 = 4'b0000; 
     min0 = 4'b0000; 
     min1 = 4'b0000; 
    end 
+0

코드 세그먼트만으로는 잘못된 것이 없습니다. 'test_interface.v'전체를 게시 할 수 있습니까? 전체 컴파일 오류 목록을 게시 할 수 있습니까? – Tim

+0

실제로 코드 127 줄뿐만 아니라 각 줄마다 여러 개의 오류가 나타납니다. 오류 (10028) : test_interface.v에서 net "sec0 [3]"에 대한 여러 상수 드라이버를 해결할 수 없습니다 - 오류 (10028) : test_interface.v 등에서 net "sec1 [3]"에 대한 복수 상수 드라이버를 확인할 수 없습니다. – user2707696

+0

이해하지만 더 많은 정보가 필요합니다. 내가 바라는 두 가지를 게시 해주세요.게시물 하단에 '수정'을 선택하여 추가 할 수 있습니다. – Tim

답변

2

, 당신이 지정하는 레지스터 :

여기에 문제를 일으키는 코드의 조각입니다. 이는 합성에는 적합하지 않으며 Altera Quartus 오류 메시지에 대한 공동 연구자는 언급하고 있습니다. reg 유형은 하나의 always 블록에만 할당해야합니다.

예를 들어, sec0always @(posedge reset_reg)과 코드에서 제공됩니다. code in Dropbox은 카운터 논리를 sec0을 지정하는 4 개의 분리 된 항상 블록으로 분할했기 때문에 더욱 심각합니다.

always(@posedge clk or posedge reset_reg) 
begin 
    if(reset_reg) 
    begin 
    // ... asynchronous reset code ... 
    end 
    else 
    begin 
    // ... synchronous counter code ... 
    end 
end 

이 논문은 합성에 좋은를 Verilog 코딩 관행에 대한 내용이수록 : http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf


나는 당신이 항상 비동기로 차단 모든 sec*min* 거부자에게 하나의 클럭 동기를 넣어 제안

기타 문제 :

  • 레지스터 할당시 비 차단 (<=)을 사용하십시오. 이는 앞서 언급 한 Cliff's paper에서 논의됩니다.
  • 초기 블록 제거. 일부 FPGA 신디사이저가 그것을 허용하고 일부는 그것을 무시 이해합니다. 모든 것을 알리고 예측 가능한 값으로 설정하는 것은 비동기식을 사용하는 것이 좋습니다.
  • always @ (clk or start_reg or lap_reg or reset_reg)으로 시작하는 블록은 기괴한 감도 목록을 가지고있어 문제를 일으킬 수 있습니다. 콤비네이션 로직을 원하면 @(*)을, 동기 플롭을 위해서는 @(posedge clk or posedge reset_reg)을 원한다.
  • 매우 드물게 듀얼 에지 플롭이 사용됩니다. always @ (posedge clk or negedge clk) 줄은 동기식의 경우 always @ (posedge clk)이거나 조합 논리의 경우 always @(*)이어야합니다.
+0

이 모든 귀중한 정보에 감사드립니다! – user2707696

+0

@ user2707696이 답변으로 귀하의 질문이 충족되면이 대답을 수락하십시오. 다른 사람들이 더 많은 해결책을 찾고 있지 않다는 것을 알게 될 것입니다. 대답의 일부가 불완전하거나 명확하지 않은 경우 의견을 추가하십시오. – Greg