2016-09-20 2 views
0

나는 Verilog에서 스톱워치 및 반응 타이머를 작업 중입니다. 내 스톱 워치가 작동하지만 반응 타이머의 한 부분에 문제가 있습니다. 목표는 버튼을 누르는 것입니다. 나중에 LED가 켜지고 타이머가 시작되고, LED가 켜진 후 타이머를 멈추는 데 걸리는 시간을 직접 측정합니다. 어쨌든 반응 타이머 시작 버튼을 눌렀을 때 (Cen == 2'b10 일 때) 타이머가 카운팅을 시작합니다. 나는 버튼 누름과 타이머 시작 사이에 어떻게 지연을 추가 할 수 있는지 궁금하다. Cen == 2'b10 일 때 레지스터 "count"를 사용하여 지연시키려는 시도가 있지만 작동하지 않는 것 같습니다. 나는 지금 막 고정 지연을하려고하는데, 나중에 랜더 마이저를 구현 하겠지만, "카운트"방법을 사용하는 지연은 작동하지 않는다. 어떤 아이디어? 설명이 필요하면 알려주세요. 감사!Verilog에 지연 추가

module Counter4dig(
    input [1:0] Cen, 
    //input incIn, 
    input clk, rst, inc, 
    output reg[3:0] Dig0, 
    output reg[3:0] Dig1, 
    output reg[3:0] Dig2, 
    output reg[3:0] Dig3 
); 

reg ReactionCounter; 
reg RandomValue; 
reg [30:0] count = 1'b0; 

always @ (posedge(clk), posedge(rst)) 
begin 

if (rst == 1'b1)begin 
     Dig0 <= 4'b0000; 
     Dig1 <= 4'b0000; 
     Dig2 <= 4'b0000; 
     Dig3 <= 4'b0000; 
    end 

//increment if inc 
else if(inc == 1'b1) 
begin 
    Dig0 <= Dig0 + 1'b1; 

    if(Dig0 == 4'b1001) 
    begin 
     Dig0 <= 4'b0000; 

     //add 1 to second digit (when first resets) up till 9 
     Dig1 <= Dig1 + 1'b1; 
    end 
    //reset if == 10 
    if(Dig1 == 4'b1001 && Dig0 == 4'b1001) 
    begin 
     Dig1 <= 4'b0000; 

     //add 1 to third digit (when second reset) up till 9 
     Dig2 <= Dig2 + 1'b1; 
    end 
    //reset if == 10 
    if(Dig2 == 4'b1001 && Dig1 == 4'b1001 && Dig0 == 4'b1001) 
    begin 
     Dig2 <= 4'b0000; 

     //add 1 to fourth digit (when third reset) up till 9 
     Dig3 <= Dig3 + 1'b1; 
    end 

    //reset if == 10 
    if(Dig3 > 4'b1001) 
    begin 
     Dig3 <= 4'b0000; 
    end    

end 

else if (Cen == 2'b10) 
begin 
    if (count != 50000) 
    count <= count + 1; 

    else 
    begin 
    Dig0 <= Dig0 + 1'b1; 

     if(Dig0 == 4'b1001) 
     begin 
      Dig0 <= 4'b0000; 

      //add 1 to second digit (when first resets) up till 9 
      Dig1 <= Dig1 + 1'b1; 
     end 
     //reset if == 10 
     if(Dig1 == 4'b1001 && Dig0 == 4'b1001) 
     begin 
      Dig1 <= 4'b0000; 

      //add 1 to third digit (when second reset) up till 9 
      Dig2 <= Dig2 + 1'b1; 
     end 
     //reset if == 10 
     if(Dig2 == 4'b1001 && Dig1 == 4'b1001 && Dig0 == 4'b1001) 
     begin 
      Dig2 <= 4'b0000; 

      //add 1 to fourth digit (when third reset) up till 9 
      Dig3 <= Dig3 + 1'b1; 
     end 

     //reset if == 10 
     if(Dig3 > 4'b1001) 
     begin 
      Dig3 <= 4'b0000; 
     end  
end 
end 

//only continue if Cen is 01 & not inc 
else if(Cen == 2'b01) 
begin 

    //add 1 to first digit up till 9 
    Dig0 <= Dig0 + 1'b1; 

    //reset if == 10  
     if(Dig0 == 4'b1001) 
     begin 
      Dig0 <= 4'b0000; 

      //add 1 to second digit (when first resets) up till 9 
      Dig1 <= Dig1 + 1'b1; 
     end 
      //reset if == 10 
      if(Dig1 == 4'b1010) 
      begin 
       Dig1 <= 4'b0000; 

       //add 1 to third digit (when second reset) up till 9 
       Dig2 <= Dig2 + 1'b1; 
      end 
       //reset if == 10 
       if(Dig2 == 4'b1010) 
       begin 
        Dig2 <= 4'b0000; 

        //add 1 to fourth digit (when third reset) up till 9 
        Dig3 <= Dig3 + 1'b1; 
       end 

        //reset if == 10 
       if(Dig3 > 4'b1001) 
       begin 
        Dig3 <= 4'b0000; 
       end   
    end 
//end 

단부

사용자가 등록 [30 : 0]이 할당

+0

마치 C 코드를 작성하는 것처럼 Verilog 코드를 작성한 것처럼 보입니다. 하드웨어의 잠재력을 생각하고 다른 신호 할당 (예 : Dig1 등)에 대해 항상 다른 블록을 사용하십시오. 그렇게하면 코드가 나에게 명확 해지며 다른 사람들에게도 명확 해집니다. –

답변

0

endmodule = 1'b0 계산하는 단계; 우선 31 비트 대신 1 비트만 지정합니다. 31'b0을 사용하십시오. 다음으로, 블록 지정이있는 always 문 외부의 count를 지정하고 논 블로킹 지정 문을 사용합니다. 나는 이것이 합성 가능하다는 것을 확신하지 못한다.

단추 누르기가 발생하면 카운터를 제로로 재설정하고 계산을 시작해야한다고 말하는 것이 합리적입니까? 버튼이 눌려져있는 동안 카운트를 계속한다고 가정하면 이것을 시도 할 수 있습니다.

reg[1:0] Cen_d; // Used to capture the Cen for use in a making a pulse 
reg  Cen_pulse; 
generator 

always @ (posedge clk) 
begin 
    Cen_d <= Cen; // capture the old Cen value 
    Cen_pulse <= Cen == 2'b10 & (Cen != Cen_d); // Look for Cen == 2'b01 and 
               // the old Cen (in Cen_d) is 
               // is not current Cen. If so 
               // pulse once. 
end 

always @ (posedge clk or posedge reset) 
begin 
    if (reset) 
     count <= 31'h0000_0000; 
    else 
     begin 
     count = Cen_pulse  ? 31'h0000_0000 : // Return to zero on pulse 
       count >= 50000 ? 31'd500000 : // Stop counting at 50000 
       count = count + 1;    // Otherwise increment 
     end 
end