Verilog 实现111序列检测器——Moore和Mealy型状态机实现

有限状态机简介

电路结构

由组合逻辑电路和存储电路组成。组合逻辑可以分为C1和C2部分。
电路结构
经典状态机结构示意图
结构示意图

'111’序列检测器

设计一个“111”序列检测器,当输入三个或三个以上的“1”时,电路输出为1,否则为0。

Moore状态机

Moore状态机的输出仅依赖于当前状态而与输入无关。

有限状态机的结构
Moore
状态转移图
Moore

代码实现

功能模块:
三段式

// seqdata_moore
module seqdata_moore (
  output  reg   dout,
  input   wire  clk,
  input   wire  rst,
  input   wire  din
);
  reg [1:0] curr_state;
  reg [1:0] next_state;
  
  parameter IDLE  = 2'b 00;
  parameter S1    = 2'b 01;
  parameter S2    = 2'b 10;
  parameter S3    = 2'b 11;
  
  always @ (posedge clk or negedge rst) begin
    if (!rst)
      curr_state  <=  IDLE;
    else
      curr_state  <=  next_state;
  end
  
  always @ (*) begin
    case (curr_state)
      IDLE: 
        if (din == 1)  next_state <=  S1;
        else           next_state  <=  IDLE;
      S1:
        if (din == 1)  next_state <=  S2;
        else           next_state  <=  IDLE;
      S2:
        if (din == 1)  next_state <=  S3;
        else           next_state  <=  IDLE;
      S3: 
        if (din == 1)  next_state <=  S3;
        else           next_state  <=  IDLE;
      default:
      		next_state	<=	IDLE;
    endcase
  end
  
  // 体现了Moore机的特点:输出由当前状态决定
  always @ (*) begin
    if (curr_state == S3) dout <=  1;
    else                  dout <=  0;
  end
  
endmodule

两段式

// seqdata_moore
module seqdata_moore (
  output  reg   dout,
  input   wire  clk,
  input   wire  rst,
  input   wire  din
);
  reg [1:0] curr_state;
  reg [1:0] next_state;
  
  parameter IDLE  = 2'b 00;
  parameter S1    = 2'b 01;
  parameter S2    = 2'b 10;
  parameter S3    = 2'b 11;
  
  always @ (posedge clk or negedge rst) begin
    if (!rst)
      curr_state  <=  IDLE;
    else
      curr_state  <=  next_state;
  end
  
  // 将组合逻辑合成一段
  always @ (*) begin
    case (curr_state)
      IDLE: 
        if (din == 1)  begin  next_state <=  S1;    dout <= 0;  end
        else           begin  next_state <=  IDLE;  dout <= 0;  end
      S1:
        if (din == 1)  begin  next_state <=  S2;    dout <= 0;  end
        else           begin  next_state <=  IDLE;  dout <= 0;  end
      S2:
        if (din == 1)  begin  next_state <=  S3;    dout <= 0;  end
        else           begin  next_state <=  IDLE;  dout <= 0;  end
      S3: 
        if (din == 1)  begin  next_state <=  S3;    dout <= 1;  end
        else           begin  next_state <=  IDLE;  dout <= 1;  end
      default:  begin  next_state <=  IDLE;  dout  <= 0;  end
    endcase
  end
  
endmodule

测试模块:

// testbench of 'seqdata_moore'
module seqdata_tb ();
  wire  dout;
  reg   clk;
  reg  rst;
  reg   din;
  
  seqdata_moore seqdata_moore0 (.dout(dout), .clk(clk), .rst(rst), .din(din));
  
  always #10 clk = ~clk;
  initial begin
    clk = 0;
    rst = 0;
    din = 0;
    
    #50 rst = 1;
    #20 din = 1;
    #20 din = 0;
    #20 din = 1;
    #40 din = 0;
    #20 din = 1;
    #60 din = 0;
    #20 din = 1;
  end
  
endmodule

仿真波形:
Moore_波形

Mealy状态机

Mealy状态机的输出与当前状态和输入有关。

有限状态机的结构
Mealy

状态转移图
在这里插入图片描述

代码实现

功能代码:

module seqdata_mealy (
  output  reg   dout,
  input   wire  clk,
  input   wire  rst,
  input   wire  din
);
  reg [1:0] curr_state;
  reg [1:0] next_state;
  
  parameter IDLE  = 2'b 00;
  parameter S1    = 2'b 01;
  parameter S2    = 2'b 11;

  always @ (posedge clk or negedge rst) begin
    if (!rst)
      curr_state  <=  IDLE;
    else
      curr_state  <=  next_state;
  end
  
  always @ (*) begin
    case (curr_state)
      IDLE:
          if (din == 1) begin next_state <= S1;   dout <= 0;  end  
          else          begin next_state <= IDLE; dout <= 0;  end
      S1:
          if (din == 1) begin next_state <= S2;   dout <= 0;  end  
          else          begin next_state <= IDLE; dout <= 0;  end
      S2:
          if (din == 1) begin next_state <= S2;   dout <= 1;  end  
          else          begin next_state <= IDLE; dout <= 0;  end 
      default:  begin next_state <= IDLE; dout <= 0;  end
    endcase       
  end         
endmodule

测试代码同Moore

有关三段式和两段式的对比

  • 三段式:状态转移由一个always块实现,根据当前状态来确定输出有另一个always块实现
  • 两段式:状态转移和输出在一个always块中实现
  • 三段式并不是一定要写三个always块。如果状态机更为复杂,always块也会相应增加
    (例如交通灯状态机:交通灯状态机

有关可重叠和不可重叠序列的对比

  • 该处"111"序列检测的摩尔机和米利机都是可重叠序列检测
    (有关不可重叠和可重叠的举例:链接: 101序列检测器.)
  • 25
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
课程设计任务书 学生姓名 胡俊 学生专业班级 计 算 0801 指导教师 王莹 学 院 名 称 计算科学与技术学院 一、题目:“1 1 1”序列检测器。 原始条件:使用D触发器( 74 LS 74 )、“与”门 ( 74 LS 08 )、“或”门( 74 LS 32 )、非门 ( 74 LS 04 ),设计“1 1 1”序列检测器。 二、要求完成设计的主要任务如下: 1.能够运用数字逻辑的理论和方法,把时序逻辑电路设计和组合逻辑电路设计相结合,设计一个有实际应用的数字逻辑电路。 2.使用同步时序逻辑电路的设计方法,设计“1 1 1”序列检测器。写出设计中的5个过程。画出课程设计图。 3.根据74 LS 74、74 LS 08、74 LS 32、74 LS 04集成电路引脚号,在设计好的“1 1 1”序列检测器电路图中标上引脚号。 4.在试验设备上,使用74 LS 74、74 LS 08、74 LS 32、74 LS 04集成电路连接、调试和测试“1 1 1”序列检测器电路。 三、实验设计过程: 第1步,画出原始状态图和状态表。 根据任务书要求,设计的序列检测器有一个外部输入x和一个外部输出Z。输入和输出的逻辑关系为:当外部输入x第一个为“1”,外部输出Z为“0”;当外部输入x第二个为“1”,外部输出Z为“0”;当外部输入x第三个为“1”,外部输出Z才为“1”。假定有一个外部输入x序列以及外部输出Z为: 输入x: 0 1 0 1 1 1 0 1 1 1 1 0 1 输出Z: 0 0 0 0 0 1 0 0 0 1 1 0 0 要判别序列检测器是否连续接收了“111”,电路必须用不同的状态记载外部输入x的值。假设电路的初始状态为A,x输入第一个“1”,检测器状态由A装换到B,用状态B记载检测器接受了111序列的第一个“1”,这时外部输出Z=0;x输入第二个“1”,检测器状态由B装换到C,用状态C记载检测器接受了111序列的第二个“1”,外部输出Z=0;x输入第三个“1”,检测器状态由C装换到D,外部输出Z=1。然后再根据外部输入及其他情况时的状态转移,写出相应的输出。以上分析了序列检测器工作,由此可画出图7-1所示的原始状态图。根据原始状态图可列出原始状态表,如表7-2所示。
一、实验目的: 1、深入了解与掌握同步时序逻辑电路的设计过程; 2、了解74LS74、74LS08、74LS32及74LS04芯片的功能; 3、能够根据电路图连接好实物图,并实现其功能。学会设计过程中的检验与完善。 二、实验内容描述: 题目:“1 1 1”序列检测器。 原始条件:使用D触发器( 74 LS 74 )、“与”门 ( 74 LS 08 )、“或”门( 74 LS 32 )、非门 ( 74 LS 04 ),设计“1 1 1”序列检测器。 集成电路引脚图: D触发器( 74 LS 74 ) “与”门 ( 74 LS 08 ) “或........ 三、实验设计过程: 第1步,画出原始状态图和状态表。 根据任务书要求,设计的序列检测器有一个外部输入x和一个外部输出Z。输入和输出的逻辑关系为:当外部输入x第一个为“1”,外部输出Z为“0”;当外部输入x第二个为“1”,外部输出Z为“0”;当外部输入x第三个为“1”,外部输出Z才为“1”。假定有一个外部输入x序列以及外部输出Z为: 输入x: 0 1 0 1 1 1 0 1 1 1 1 0 1 输出Z: 0 0 0 0 0 1 0 0 0 1 1 0 0 要判别序列检测器是否连续接收了“111”,电路必须用不同的状态记载外部输入x的值。假设电路的初始状态为A,x输入第一个“1”,检测器状态由A装换到B,用状态B记载检测器接受了111序列的第一个“1”,这时外部输出Z=0;x输入第二个“1”,检测器状态由B装换到C,用状态C记载检测器接受了111序列的第二个“1”,外部输出Z=0;x输入第三个“1”,检测器状态由C装换到D,外部输出Z=1。然后再根据外部输入及其他情况时的状态转移,写出相应的输出。以上分析了序列检测器工作,由此可画出图7-1所示的原始状态图。根据原始状态图可列出原始状态表,如表7-2所示。 现态 次态/输出 x = 0 x = 1 A A / 0 B / 0 B A / 0 C / 0 C A / 0 D / 1 D A / 0 D / 1 (表 7-2 原始状态表) (图
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值