2012-05-15 3 views
1

현재 "Tug of War"게임을 만들기 위해 Verilog 코드를 작성 중입니다. 아래 모듈은 경기장을 나타내는 15 개의 LED의 중앙 LED를 나타냅니다. 중앙 조명은 게임이 시작될 때까지 켜져 있어야합니다 (예 : 그것은 일종의 입력을받을 때 (입력은 L과 R에 의해 주어지며, 여기서 L은 왼쪽으로 한 운동이고 R은 오른쪽으로 한 운동이다).Verilog 항상 시간 = 0에 블록

그러나 이상한 버그가 있습니다. 비록 내가 enabled의 값을 1로하고 L과 R을 0으로 만들었지 만 코드를 실행할 때 enabled은 즉시 0으로 바뀐다.

내 질문은 왜 그런가? 그리고 입력 값을 볼 때까지 변수를 1로 유지하는 방법은 무엇입니까?

module centerLight(Clock, reset, L, R, NL, NR, lightOn); 
    input Clock, reset, L, R, NL, NR; 
    output reg lightOn; 

    reg gameStart = 0; 
    reg enabled = 1; 

    [email protected](L or R) 
    if (L | R) begin 
     gameStart = 1; 
     enabled = 0; 
    end 
    else if (enabled) 
     gameStart = 0; 
    wire PS; 
    reg NS; 

    [email protected](PS or L or R or NL or NR) 
    if((NL && R) || (NR && L)) NS = ~PS; 
    else    NS = PS; 

    [email protected](PS or gameStart) 
    case(PS || !gameStart) 
     0: lightOn = 0; 
     1: lightOn = 1; 
    endcase 

    D_FF cl (PS, NS, reset, Clock); 

endmodule 

module D_FF (q, d, reset, clk); 
    input d, reset, clk; 
    output reg q; 

    [email protected](posedge clk or posedge reset) 
    if (reset) 
     q = 0; 
    else 
     q = d; 

endmodule 
+0

당신이 시뮬레이터를 통해 활성화의 상태를 결정하는 희망? 이유를 말할 수 있어야 상태 변경 사항 : 아마도 L 또는 R이 글리치 처리 또는 주장하는 것일 수도 있습니다. – Tim

+0

예, L과 R이 그 중 하나를 수행하는 것처럼 보입니다. (차이점을 알려줄 방법을 모르겠지만 죄송합니다. Verilog가이 작업을 수행하는 것을 막을 수 있습니까? 도움이된다면 FPGA 보드에서이 코드를 실행합니다. L과 R에는 두 개의 키가 반전 된 입력이 할당되어 있습니다. – cjspook

+0

회로 자체를 보지 않고는 말하기가 불가능합니다. 명확하지 않다 ** 시뮬레이션 **에서 이런 일이 일어나는가? 아니면 물리적으로 파워 업 할 때 일어나는가? 첫 번째 경우에는 파형을 덤프 할 수 있거나 후자의 경우 L 및 R을 할당하는 래퍼 모듈을 표시 할 수 있습니다. – Tim

답변

1

enable은 래치입니다. 가장 짧은 시간 동안 L 또는 R이 높으면 (또는 부동 일 수 있음) enable 스위치가 켜집니다.

전체 디자인을 순차적으로 만든 다음 리셋을 사용하여 gameStart이 낮게 설정하는 것이 좋습니다.

내가 그것을 할 거라고 방법은 다음과 같습니다

module centerLight(Clock, reset, L, R, NL, NR, lightOn); 
    input Clock, reset, L, R, NL, NR; 
    output reg lightOn; 

    reg lightOn_d; 
    reg gameStart, gameStart_d; 
    reg PN, NS; 

    always @ (posedge Clock or posedge reset) 
     if(reset) 
      begin 
       gameStart <= 1'b0; 
       PS  <= 1'b0; 
       lightOn <= 1'b0; 
      end 
     else 
      begin 
       gameStart <= gameStart_d; 
       PS  <= NS; 
       lightOn <= lightOn_d; 
      end 

    always @ * 
     begin 
      if(L || R) 
       gameStart_d = 1'b1; 
      else 
       gameStart_d = gameStart; 

      if((NL && R) || (NR && L)) 
       NS = ~PS; 
      else 
       NS = PS; 

      if(PS || !gameStart) 
       lightOn_d = 1'b1; 
      else 
       lightOn_d = 1'b0; 
     end 

endmodule 

나는이 도움이되기를 바랍니다.

0

L | R = 1 일 때 코드의 사용 가능 값은 0으로 지정됩니다. 테스트 벤치의 L과 R의 초기 값 또는 FPGS의이 핀 값이 처음에 1이면 enable이 0으로 전환됩니다. 매달린 L 및 R 핀은 1로 평가 될 수도 있습니다.

Modelsim과 같은 시뮬레이터를 사용하면 "enabled = 0;"일 때 줄에 중단 점을 설정할 수 있습니다.

1

컴파일러 스위치 때문일 수 있습니다.

초기 설정은 합성 가능하지 않기 때문에 초기 설정은 사실상 초기 블록입니다 (물론 알테라의 Quartus는 파워 업 조건을 설정하기 위해 이들을 읽도록 지시 할 수 있지만 Doulos에 따르면 이들은 합성을 지원하지 않습니다) FPGA 로직의 결과에 영향을 주어서는 안됩니다.

RTL로 시뮬레이션해야합니다. 그러나 "Powerup do not care"스위치가 on으로 설정되어 있지 않으면, 예를 들어 모든 로직 파워가 0으로 시작하는 알테라 디바이스를 알고 있습니다.이 경우 로직을 살펴보고 레지스터를 로직을 최소화하는 값으로 설정합니다 .

이 경우 가장 작은 로직을 생성하므로 필요하지 않습니다. (기술적으로 무시해야하는 초기 구문을 제외하고는 코드가 1로 설정되지 않기 때문에 그 스위치로 초기 구성을 읽었을 수 있습니다).

나는 항상

(래치로 유지) 항상을 추가하고이 활성화 된 모든 할당을 넣어 활성화에 리셋을 추가하려고 @ (재설정) 않았다 경우 (재설정) 는 < = 1을 활성화 'b1; else if (L | R) 사용 < = 1'b0;

이렇게하면 활성화 된 기능이 로직에 보존 된 것을 볼 수 있습니다.

다른 메모에서는 동기식 등록 방식 대신 래치를 사용하는 것이 좋습니다.

또한 Verilog에서 코드 전체에서 대소 문자를 사용하는 것이 좋습니다. 결국 고전적인 오류는 모듈을 연결하고 컴파일러가 'default_nettype none'을 사용하지 않으면 전선을 유추합니다. 클리포드 근채의 대상이 기술에서, 또는 둘로스 영감)과 같은 코드에서 D 봐.

나는이 도움이!