2017-12-06 5 views
0

난 당신이 볼 수 있듯이, 내가 라운드 로빈 카운터를 만들기 위해 노력하고있어결정 카운터, ModelSim을

module rr_arbiter (
clk, // positive edge trigger 
reset, // negative edge trigger 
req0, req1, req2, req3, 
grant0, grant1, grant2, grant3, 
priority, priority_req); 

input clk, reset; 
input req0, req1, req2, req3; 
input priority; 
input [1:0] priority_req; 

output grant0, grant1, grant2, grant3; 

reg x 

always(posedge clk or negedge reset) begin 
pirority_req = priority; 

if (reset) begin 
    grant0 <= 1'b0; 
    grant1 <= 1'b0; 
    grant2 <= 1'b0; 
    grant3 <= 1'b0; 
    end 
else 
begin 
    if(priority == 1) 
     if (priority req == 2b'00) 
      begin 
      x=1; 
      grant0 <= (grant0*(~x))+(grant1*x);  
      x=0; 
      grant0 <= (grant0*(~x))+(grant1*x); 
      grant1 <= grant2; 
      grant2 <= grant3; 
      grant3 <= grant1; 
      // counter 0
      end 
     else if (priority req == 2b'01) 
      begin 
      grant0 <= grant1; 
      x=1; 
      grant1 <= (grant1*(~x))+(grant2*x); 
      x=0; 
      grant1 <= (grant1*(~x))+(grant2*x); 
      grant2 <= grant3; 
      grant3 <= grant1; 
      // counter 0112301123 
      end 
     else if (priority req == 2b'10) 
      begin 
      grant0 <= grant1; 
      grant1 <= grant2; 
      x=1; 
      grant2 <= (grant2*(~x))+(grant3*x); 
      x=0; 
      grant2 <= (grant2*(~x))+(grant3*x); 
      grant3 <= grant1; 
      // counter 0122301223 
      end 
     else if (priority req == 2b'11) 
      begin 
      grant0 <= grant1; 
      grant1 <= grant2; 
      grant2 <= grant3; 
      x=1; 
      grant3 <= (grant3*(~x))+(grant1*x); 
      x=0; 
      grant3 <= (grant3*(~x))+(grant1*x); 
      // counter
      end 
    end 

    else 
    begin 
     grant0 <= ~grant2 * grant3; 
     grant1 <= grant0; 
     grant2 <= grant1; 
     grant3 <= grant2; 
     //counter
    end 
end 
end 

end 

endmodule 

을의 Verilog에서 라운드 로빈 카운터를 만들기 위해 노력하고있어. 각 경우 그것은 (부여) 01,230,123 .. .. 0, 0112301123 .. .. 0122301223,...

** Error: (vlog-13069) C:/Modeltech_pe_edu_10.4a/examples/rr_arbiter.v(17): near "always": syntax error, unexpected always, expecting ';' or ','.

** Error: (vlog-13069) C:/Modeltech_pe_edu_10.4a/examples/rr_arbiter.v(22): near "<=": syntax error, unexpected <=.

** Error: C:/Modeltech_pe_edu_10.4a/examples/rr_arbiter.v(22): (vlog-13205) Syntax error found in the scope following 'grant0'. Is there a missing '::'?

답변

3

라인 (17)에 대한 오류 메시지가 자명하다 같다. 그것은 ';'을 기대하고 있습니다. 당신은 ';'

오류 메시지가 나타나지 않는 경우 항상 눈을 화면 위로 가져 가서 문제가 이전 줄인지 확인하십시오.

+0

Thx. 나는 그것을 발견하고 고쳤다. 그러나 내가 정말로 만들고 싶어하는 것은 RR 카운터 다. 그리고 그것은 전혀 일하지 않는다. 나 좀 도와 줄래? –

+0

그것은 이런 같아야 때 리셋 == 1 모두 부여 = 0 우선 == 0 카운터 : 0 1 2 3 0 1 2 3 ... 우선 == 1 priority_req == 0 카운터 : 0 1 2 3 0 0 0 1 2 3 ... 우선 == 1 priority_req == 1 카운터 : 0 1 2 3 1 0 1 2 3 ... 우선 순위 = 1 priority_req == 2 카운터 0 1 2 2 3 0 1 2 2 3 ... 우선 순위 = 1 및 우선 순위 = 3 카운터 : 0 1 2 3 3 0 1 2 3 3 ... 어떻게 할 수 있습니까? 나는 그 카운터 시스템을 만든다 ..! –

+0

문제를 해결하고 필요한 블록을 생각해야합니다. 이중 계산을 추적하는 두 가지 상태의 FSM; 카운터는 0-3을 카운트하지만 FSM과 상호 작용하여 이중 계산을 수행합니다. req0-req3을 2 비트 2 진수로 변환하여 카운터 출력과 비교하는 4-2 인코더 (하나 이상의 req가 1 인 경우 어떻게해야하는지 생각해야 함); 카운터 출력을 grant0-grant3으로 변환하는 2-4 디코더. 이런 식으로 문제를 해결한다면, 거대한 '항상'블록에서 코드를 작성하는 것보다 머리를 감싸는 것이 더 쉬울 수도 있습니다. –