2017-12-05 7 views
-1

작게 응시하는 큰 프로그램의 일부를 쓰고 있습니다. Verilog에 익숙하지 않으므로 조언을 듣는 것이 좋습니다.Verilog는 case 문에서 옵션을 기본으로 설정하는 것으로 보입니다.

네 개의 버튼 중 하나를 누르면 네 개의 7 세그먼트 디스플레이 중 첫 번째에 숫자 (1-4)가 쓰여지는 사례 문장을 작성하려고합니다. 내 네 개의 버튼 중 하나는 항상 문을 실행 누를 때마다 내, 매우 제한된 이해에서

module final(CLK,button1,button2,button3,button4,a0,b0,c0,d0,e0,f0,g0,a1,b1,c1,d1,e1,f1,g1,a2,b2,c2,d2,e2,f2,g2,a3,b3,c3,d3,e3,f3,g3); 
    input CLK,button1,button2,button3,button4; 
    output a0,b0,c0,d0,e0,f0,g0,a1,b1,c1,d1,e1,f1,g1,a2,b2,c2,d2,e2,f2,g2,a3,b3,c3,d3,e3,f3,g3; //What a mess 

    integer i = 0; 

    reg [6:0] temp; 
    reg [6:0] sevenDisp0; 
    reg [6:0] sevenDisp1; 
    reg [6:0] sevenDisp2; 
    reg [6:0] sevenDisp3; 
    reg [2:0] place; 

    initial begin 
    temp = 7'b1110111; 
    sevenDisp0 = 7'b1110111; 
    sevenDisp1 = 7'b1110111; 
    sevenDisp2 = 7'b1110111; 
    sevenDisp3 = 7'b1110111; 
    i = 0; 

    end 
    always @(button1 or button2 or button3 or button4)// or sevenDisp0 or sevenDisp1 or sevenDisp2 or sevenDisp3)//bit1 or bit2) 
    begin 
     case({button1,button2,button3,button4}) 
      4'b0111: sevenDisp0 = 7'b1001111; //Have tried 4'b1111 to troubleshoot 
      4'b1011: sevenDisp0 = 7'b0010010; 
      4'b1101: sevenDisp0 = 7'b0000110; 
      4'b1110: sevenDisp0 = 7'b1001100; 
      //default: sevenDisp0 = 7'b1110111; 
     endcase 
    end 


    assign {a0,b0,c0,d0,e0,f0,g0} = sevenDisp0; 
    assign {a1,b1,c1,d1,e1,f1,g1} = sevenDisp1; 
    assign {a2,b2,c2,d2,e2,f2,g2} = sevenDisp2; 
    assign {a3,b3,c3,d3,e3,f3,g3} = sevenDisp3; 

endmodule 

. 어떤 버튼을 눌러도 sevenDisp0 레지스터에 기록됩니다.

한 가지주의 할 점은 버튼을 누르면 0이 표시되고 켜기면 7 개의 세그먼트가 0이라는 점입니다.

내가 보는 것은 처음 7 개 세그먼트의 번호입니다. 다른 버튼을 누르면 버튼이 눌러져있는 동안 해당 번호가 표시되고 숫자 1로 다시 전환됩니다.

나는 이것을 6 시간 동안 풀려고 노력해왔다. 어떤 도움이라도 좋을 것입니다.

+0

시뮬레이션을 실행 했습니까? 시뮬레이션의 결과가 귀하의 기대에 부합 했습니까? – toolic

+0

시뮬레이션이 없습니다. –

+1

미래에 누구든지이 문제를 해결할 것입니다. 레지스터가 실제로 올바르게 작동하려면 비 블로킹 표기법으로 전환해야했습니다. –

답변

0

sevenDisp0 (가능한 수준의 모든 경로에서 값이 할당되지 않으므로 레벨 감지) 래치가 예기치 않은 동작의 원인 일 수 있으므로 래치를 피하려고 시도해야합니다. 대부분의 FPGA는 래치를 제한적으로 지원하거나 지원하지 않습니다. 디자인에서 순수한 combiant 논리와 플롭 (clock edge triggered)을 사용해야합니다. 당신이 (사용 = 할당을 차단) 조합 논리 후, 그 값을 저장하는 사용 sevenDisp0을하지 않으려면

: 당신이 그 값을 저장하는 sevenDisp0을 원하지 않는 경우

always @* // auto-sensitivity 
    begin 
    case({button1,button2,button3,button4}) 
     4'b0111: sevenDisp0 = 7'b1001111; //Have tried 4'b1111 to troubleshoot 
     4'b1011: sevenDisp0 = 7'b0010010; 
     4'b1101: sevenDisp0 = 7'b0000110; 
     4'b1110: sevenDisp0 = 7'b1001100; 
     default: sevenDisp0 = 7'b1110111; //Needed or will be a latch 
    endcase 
    end 

을 다음 트리거하여 순차적으로 만들어 사용 FYI

always @(posedge CLK) 
    begin 
    case({button1,button2,button3,button4}) 
     4'b0111: sevenDisp0 <= 7'b1001111; //Have tried 4'b1111 to troubleshoot 
     4'b1011: sevenDisp0 <= 7'b0010010; 
     4'b1101: sevenDisp0 <= 7'b0000110; 
     4'b1110: sevenDisp0 <= 7'b1001100; 
     //default: //Retain previous value of sevenDisp0 
    endcase 
    end 

: 조합 용 (a 클록 에지 (<= 할당을 비 차단 사용) 의도적 래칭) 논리를 사용하려면 자동 민감도 @* 또는 동의어 @(*)을 사용해야합니다. 민감도 목록의 하드 코딩 신호는 Verilog-1995 표준을 준수해야하는 경우에만 필요합니다. Verilog-2001 @*은 RTL 시뮬레이션과 게이트/FPGA/등의 동작 불일치로 이어지는 신호 누락의 위험을 감수하지 않으므로 선호됩니다. 게다가 타이핑도 훨씬 적습니다.

또 다른 제안은 ANSI 스타일 헤더 (Verilog-2001에 추가 된 다른 기능)를 사용하는 것입니다. 이렇게하면 포트 방향을 선언하고 포트 목록 순서를 입력 할 수 있습니다. 또한 타이핑도 적습니다. 예 :

module final(
    input CLK, 
    input button1,button2,button3,button4, 
    output a0,b0,c0,d0,e0,f0,g0, // much 
    output a1,b1,c1,d1,e1,f1,g1, // easier 
    output a2,b2,c2,d2,e2,f2,g2, // to 
    output a3,b3,c3,d3,e3,f3,g3); // read 

reg [6:0] sevenDisp0; 
// ...