2014-04-05 4 views
0

Altera DE0 보드에 3 개의 버튼을 사용하고 있습니다.Verilog Muliple이 예상대로 작동하지 않는 경우

는 내가 세 가지 버튼의 값을 기준으로 중첩 된 경우 - 다른 문이

input [2:0] Button; 
    reg [2:0] y; 
    parameter [2:0] S0 = 3'b000, S1 = 3'b001, S2 = 3'b010, S3 = 3'b011, S4 = 3'b100, S5 = 3'b101; 

로 선언

[email protected](negedge (&Button)) 
//if(&Button == 0) 
begin 
if(Button == 3'b011) // Button 2 is pressed 
begin 
if(y == S0) 
    begin 
    y = S1; 
    end 
end 
else if(Button == 3'b101) // Button 1 is pressed 
begin 
if (y == S1) 
    begin 
    y = S2; 
    end 
else if (y == S2) 
    begin 
    y = S3; 
    end 
end 
else if(Button == 3'b110) //This is the check on button 0, but this conditional statement does not work. 
begin 
if(y == S2) 
    begin 
    y = S3; 
    end 
end 
end 

assign z = (y == S0);  // z,z1,z2,z3 are LED's on the board 
assign z1 = (y == S1); 
assign z2 = (y == S2); 
assign z3 = (y == S3); 

나는 처음 두 버튼을 사용하면 IF-다른 DE0 보드에서 BUTTON2 및 BUTTON1로 레이블 된 명령문 (버튼 == 3'b011 및 버튼 == 3'b101)이 작동하면 코드가 작동하고 예상대로 y가 적절한 값으로 변경됩니다.

하지만 if-else에서 세 번째 버튼을 시도 할 때 DE0에서 BUTTON0으로 레이블 된 Button == 3'b011, 아무 것도 발생하지 않고 y가 예상 값을 얻지 못합니다. 나는 2 개의 다른 DE0 보드를 사용했고 같은 문제가 발생합니다.

나는이 세 번째 버튼을 눌러 바로 감지되지 않는 점에서

[email protected](negedge (&button)) 

함께 할 수있는 뭔가가 생각합니다. 하지만 같은 코드를 사용할 때

[email protected](negedge button[0] or negedge button[1] or negedge button[2]) 

다른 문제가 발생하여 해결할 수 없었습니다.

답변

2

모델을 만들려는 하드웨어에 대해 생각해 봐야합니다. always @(negedge 또는 일반적으로 에지 트리거 된 항상 블록은 일반적으로 클럭 및 리셋에 의해 구동되는 플립 플롭을 암시하는 데 사용됩니다.

Frequency Divider에서와 같이 데이터 신호를 시계로 사용할 수 있습니다. 그러나 결합 축소 연산자를 단 하나의 &으로 사용하면 실제 하드웨어에서 글리치가 발생합니다. 하드웨어에는 해당이 없습니다

[email protected](negedge button[0] or negedge button[1] or negedge button[2]) 

:

난 당신이 구조를 가지고 있기 때문에 당신이 암시하는 어떤 하드웨어에 대해 생각 언급했다.

Altera FSM example이 도움이 될 수 있습니다. 당신은 implement edge detection from this question에 무엇을 할 것이므로 버튼 누름마다 한 번 상태를 바꿀 것입니다.

관련 문제