2015-01-27 68 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

尽管您的想法看起来不错,但使用有限状态机[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) 
     ... 

但你的想法有希望。