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