首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Verilog管道

Verilog管道
EN

Stack Overflow用户
提问于 2015-01-27 00:07:09
回答 1查看 1.2K关注 0票数 0

我试着用HD44780液晶显示器做一个简单的游戏。我的想法是使用一个繁忙的信号来阻止任何命令,直到执行之前的命令。我想使用计数器和大小写的命令序列,而另一个块是由繁忙的信号。

就像这样:

代码语言:javascript
复制
    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没有任何认真的经验,所以有人能告诉我该怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-27 00:55:59

虽然您的想法似乎不错,但最好使用有限状态机FSM。很大程度上,这意味着,与计数器不同,您将有一个变量,它包含一系列具有更多人类可读的名称的状态。使用它,您只需要有一个case语句来定义下一个状态和输出逻辑,这取决于当前的状态。

虽然这个FSM基本上是作为一个计数器来实现的,但是它更容易阅读。我不知道如何使用您的代码来实现它,但它可能如下所示:

代码语言:javascript
复制
// 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)
      ...

但你有希望得到这个想法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28161118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档