摩尔FSM序列检测器的完整Verilog代码

这个 Verilog项目 将使用以下命令显示序列检测器的完整Verilog代码 摩尔FSM。还提供了用于Moore FSM 序列检测器的Verilog Testbench,用于仿真。 

摩尔FSM不断从数字量输入和输出中检测二进制序列。 FSM 仅在检测到“ 1011”序列时才变为高电平。下图显示了用于序列检测器的Moore FSM 的状态图。
摩尔FSM序列检测器的完整Verilog代码

注意,摩尔FSM输出仅取决于FSM的当前状态。序列检测器的Moor FSM 的状态图如下:

摩尔FSM序列检测器的完整Verilog代码

摩尔FSM序列检测器的Verilog代码是基于Moore FSM 的状态图和框图设计的:

// hzgifts.cn: FPGA projects, Verilog项目s, VHDL projects
// Verilog项目: Verilog code for Sequence Detector using 摩尔FSM
// The sequence being detected is "1011" or One Zero One One 
module Sequence_Detector_MOORE_Verilog(sequence_in,clock,reset,detector_out
    );
input clock; // clock signal
input reset; // reset input
input sequence_in; // binary input
output reg detector_out; // output of the sequence detector
parameter  Zero=3'b000, // "Zero" State
  One=3'b001, // "One" State
  OneZero=3'b011, // "OneZero" State
  OneZeroOne=3'b010, // "OnceZeroOne" State
  OneZeroOneOne=3'b110;// "OneZeroOneOne" State
reg [2:0] current_state, next_state; // current state and next state
// sequential memory of the 摩尔FSM
always @(posedge clock, posedge reset)
begin
 if(reset==1) 
 current_state <= Zero;// when reset=1, reset the state of the FSM  to "Zero" State
 else
 current_state <= next_state; // otherwise, next state
end 
// combinational logic of the 摩尔FSM
// to determine next state 
always @(current_state,sequence_in)
begin
 case(current_state) 
 Zero:begin
  if(sequence_in==1)
   next_state = One;
  else
   next_state = Zero;
 end
 One:begin
  if(sequence_in==0)
   next_state = OneZero;
  else
   next_state = One;
 end
 OneZero:begin
  if(sequence_in==0)
   next_state = Zero;
  else
   next_state = OneZeroOne;
 end 
 OneZeroOne:begin
  if(sequence_in==0)
   next_state = OneZero;
  else
   next_state = OneZeroOneOne;
 end
 OneZeroOneOne:begin
  if(sequence_in==0)
   next_state = OneZero;
  else
   next_state = One;
 end
 default:next_state = Zero;
 endcase
end
// combinational logic to determine the output
// of the 摩尔FSM, output only depends on current state
always @(current_state)
begin 
 case(current_state) 
 Zero:   detector_out = 0;
 One:   detector_out = 0;
 OneZero:  detector_out = 0;
 OneZeroOne:  detector_out = 0;
 OneZeroOneOne:  detector_out = 1;
 default:  detector_out = 0;
 endcase
end 
endmodule

摩尔FSM序列检测器的Verilog Testbench:

`timescale 1ns / 1ps
// hzgifts.cn: FPGA projects, Verilog项目s, VHDL projects
// Verilog项目: Verilog code for Sequence Detector using 摩尔FSM
// Verilog Testbench for Sequence Detector using 摩尔FSM 
module tb_Sequence_Detector_Moore_FSM_Verilog;

 // Inputs
 reg sequence_in;
 reg clock;
 reg reset;

 // Outputs
 wire detector_out;

 // Instantiate the Sequence Detector using 摩尔FSM
 Sequence_Detector_MOORE_Verilog uut (
  .sequence_in(sequence_in), 
  .clock(clock), 
  .reset(reset), 
  .detector_out(detector_out)
 );
 initial begin
 clock = 0;
 forever #5 clock = ~clock;
 end 
 initial begin
  // Initialize Inputs
  sequence_in = 0;
  reset = 1;
  // Wait 100 ns for global reset to finish
  #30;
      reset = 0;
  #40;
  sequence_in = 1;
  #10;
  sequence_in = 0;
  #10;
  sequence_in = 1; 
  #20;
  sequence_in = 0; 
  #20;
  sequence_in = 1; 
  #20;
  sequence_in = 0;  
  // Add stimulus here

 end
      
endmodule

Verilog中使用Moore FSM 的序列检测器的仿真波形:

摩尔FSM序列检测器的完整Verilog代码
序列检测器的仿真波形准确显示了 摩尔FSM工作。 摩尔FSM的下一个状态取决于序列输入和当前状态。 摩尔FSM的输出仅取决于当前状态。仅当检测到“ 1011”序列时,序列检测器的输出才变为高电平。
推荐的 Verilog projects:
2. FIFO存储器的Verilog代码
3. 用于16位单周期MIPS处理器的Verilog代码
4. Verilog HDL中的可编程数字延迟计时器
5. 用于数字电路中基本逻辑组件的Verilog代码
6. 用于32位无符号除法器的Verilog代码
7. 用于定点矩阵乘法的Verilog代码
8. Verilog HDL中的车牌许可证识别
9. 提前进位乘法器的Verilog代码
10。 微处理器的Verilog代码
11。 4x4乘法器的Verilog代码
12 停车场系统的Verilog代码
13 使用Verilog HDL在FPGA上进行图像处理
14。 如何使用Verilog HDL将文本文件加载到FPGA中
15 交通信号灯控制器的Verilog代码
16。 FPGA上的闹钟的Verilog代码
17。 比较器设计的Verilog代码
18岁 D触发器的Verilog代码
19 Full Adder的Verilog代码
20 带testbench的计数器的Verilog代码
21 16位RISC处理器的Verilog代码
22 用于在FPGA上反跳按钮的Verilog代码
23。 双向/输入端口的Verilog Testbench
30岁  Verilog中的N位加法器设计
31。 Verilog和VHDL:通过示例解释
32。 FPGA上时钟分频器的Verilog代码
33。 如何在Verilog中生成时钟使能信号
34。 用于PWM发生器的Verilog代码
35岁 Verilog编码与软件编程
36。 摩尔FSM序列检测器的Verilog代码
37。 Basys 3 FPGA上的7段显示控制器的Verilog代码
FPGA Verilog VHDL课程

2条评论:

  1. 您能解释一下为什么状态寄存器的声明语句(当前状态<=下一个状态,当前状态<= zero) is <= and not simply =.

    回复删除
    回覆
    1. 对于顺序逻辑(寄存器),建议使用非阻塞分配。对于组合逻辑,建议使用块分配。您可以阅读有关它们的更多信息。

      删除

热门FPGA项目