2015-01-27 4 views
0

HD44780 LCD를 사용하여 쉬운 게임을 만들려고합니다. 제 생각은 이전 명령이 실행될 때까지 BUSY 신호를 사용하여 모든 명령을 보류하는 것입니다. 다른 블록이 BUSY 신호에 의해 유지되는 동안 커맨드의 시퀀스에 카운터와 케이스를 사용하고 싶습니다. 이 같은Verilog 파이프 라인

뭔가 :

case (counter) 
    0: CMD_REG = CLEAR_LCD; 
    1: CMD_REG = WRITE_PLR; 
    2: ME_BUSY = 0; 
    endcase 

    if(DRIVER_BUSY == 0 && counter < 2) begin 
     ENABLE_DRIVER <= 1; 
     counter <= counter + 1; 
    end 
    if (counter > 2) begin 
     counter <= 4'd0; 
    end 

그러나 "잘못"느낀다. Verilog에 대한 심각한 경험이 없으므로 누군가 어떻게해야하는지 알려줄 수 있습니까?

답변

2

생각이 괜찮지 만 Finite State Machine [FSM] (http://en.wikipedia.org/wiki/Finite-state_machine)을 사용하는 것이 좋습니다. 거의 이것은 단지 카운터 대신에 사람이 읽을 수있는 이름을 가진 일련의 상태를 유지하는 변수를 갖게된다는 것을 의미합니다. 이 방법을 사용하면 현재 상태에 따라 다음 상태와 출력 논리를 정의하는 case 문만 있으면됩니다.

이 FSM은 기본적으로 카운터로 구현되지만 읽기가 훨씬 쉽습니다. 나는 정확히 어떻게 코드에서와 만드는 방법 알려 질수 있지만, 다음과 같이 보일 수 있습니다

// State register 
always @(posedge clk) begin 
    state <= next_state; 
end 

// Next state and output logic 
always @(*) begin 
    // Default values 
    CMD_REG = CLEAR_LCD; 
    ME_BUSY = 1'b0; 
    ENABLE_DRIVER = 1'b0; 

    next_state = WAIT; // Im using enum style, but if you cant use enums, you can always use macros (`WAIT) 

    case (state) 
    WAIT: begin // counter == 0 
     if (DRIVER_BUSY == 0) begin 
     next_state = WAIT_MORE; 
     end 
    WAIT_MORE: begin // counter == 1 
     ENABLE_DRIVER = 1'b1; 
     CMD_REG = WRITE_PLR; 

     if (DRIVER_BUSY == 0) begin 
     next_state = NOT_BUSY_HOLD; 
     end 
    NOT_BUSY_HOLD: begin // counter == 2, here it looks like you get stuck due to your conditionals (at counter == 2, it doesnt increment nor reset) 
     ... 

하지만 희망 아이디어를 얻을.