| 网站首页 | 新闻 | SOPC | FPGA | DSP | ARM | 嵌入式操作系统 | 下载 | 所有产品 | 留言 | 论坛 | 网络协议 | 驱动设计 | 购买指南 | 
您现在的位置: 嵌入式控制研究室 >> FPGA >> 其它 >> 文章正文 用户登录 新用户注册
状态机举例           ★★★ 【字体:
状态机举例
作者:佚名    文章来源:21control    点击数:    更新时间:2005-12-14
 你可以指定状态寄存器和状态机的状态。以下是一个有四种状态的普通状态机。

// These are the symbolic names for states
// 定义状态的符号名称
parameter  [1:0]
  S0 = 2'h0,
  S1 = 2'h1,
  S2 = 2'h2,
  S3 = 2'h3;

// These are the current state and next state variables
// 定义当前状态和下一状态变量
reg [1:0] state;
reg [1:0] next_state;


// state_vector state
// 状态向量的转移关系
always @ (state or y or x)
begin
  next_state = state;
  case (state)                
    S0: begin
      if (x) begin
        next_state = S1;
      end
      else begin
        next_state = S2;
      end
    end
    S1: begin
      if (y) begin
        next_state = S2;
      end
      else begin
        next_state = S0;
      end
    end
    S2: begin
      if (x & y) begin
        next_state = S3;
      end
      else begin
        next_state = S0;
      end
    end
    S3: begin
      next_state = S0;
    end
  endcase
end


always @ (posedge clk or posedge reset)
begin
  if (reset) begin
    state <= S0;
  end
  else begin
    state <= next_state;
  end
end


  同样的状态机也可以用下面的代码以“One hot”编码方式实现。
// These are the symbolic names for states
// 定义状态的符号名称
parameter  [1:0]
  S0 = 2'h0,
  S1 = 2'h1,
  S2 = 2'h2,
  S3 = 2'h3;
 
parameter  [3:0] 
  s0 = 4'h1,
  s1 = 4'h2,
  s2 = 4'h4,
  s3 = 4'h8;
  
// These are the current state and next state variables
// 定义当前状态和下一状态变量
reg [3:0] state;
reg [3:0] next_state;
 
 
// state_vector state
// 状态向量的转移关系
always @ (state or y or x)
begin 
  next_state = state;
  case (1)                 
    state[S0]: begin 
      if (x) begin 
        next_state = 1 << S1;
      end
      else begin 
        next_state = 1 << S2;
      end
    end
    state[S1]: begin 
      if (y) begin 
        next_state = 1 << S2;
      end
      else begin 
        next_state = 1 << S0;
      end
    end
    state[S2]: begin 
      if (x & y) begin 
        next_state = 1 << S3;
      end
      else begin 
        next_state = 1 << S0;
      end
    end
    state[S3]: begin 
      next_state = 1 << S0;
    end
  endcase
end


always @ (posedge clk or posedge reset)
begin 
  if (reset) begin 
    state <= 1 << S0;
  end
  else begin 
    state <= next_state;
  end
end
文章录入:fengfeiyi    责任编辑:fengfeiyi 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 基于Verilog的顺序状态逻辑F…
  • 使用Verilog实现基于FPGA的S…
  • 可综合风格的计数器设计
  • Verilog HDL参考文献、书目:…
  • 中文版Verilog HDL简明教程:…
  • 中文版Verilog HDL简明教程:…
  • 中文版Verilog HDL简明教程:…
  • 中文版Verilog HDL简明教程:…
  • 中文版Verilog HDL简明教程:…
  • 中文版Verilog HDL简明教程
  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)