“101101”序列检测器Verilog设计实例与VCS仿真(mealy型和moore型)

        本文设计了一个“101101”序列检测器,分别采用mealy型状态机和moore型状态机进行了设计。

Moore型状态机:输出只由当前状态决定,即次态=f(现状,输入),输出=f(现状);
Mealy型状态机:输出不但与当前状态有关,还与当前输入值有关,即次态=f(现状,输入),输出=f(现状,输入);

本文引用自:https://blog.csdn.net/llxxyy507/article/details/83751999

Mealy型状态机设计

        “101101”序列检测器的状态输出表如下:

                              

       左边的表为mealy型的状态输出表,但含有冗余状态,从右边的表的灰色部分可以看出,这几个状态可以合并为一个状态,从而完成状态化简。

       

        化简后的状态输出表如上表所示,对6个状态分别进行命名。然后根据状态输出表可以写出“101101”序列检测器的的HDL代码(verilog)。也可以再画出状态图然后在写HDL代码。

module seq_detector_mealy #(parameter IDLE   =  6'b00_0001,
		                              S1     =  6'b00_0010,
                                      S10    =  6'b00_0100,
                                      S101   =  6'b00_1000,
                                      S1011  =  6'b01_0000,
                                      S10110 =  6'b10_0000)
      (
       input   clk,
       input   rst_n,
       input   seq,
       output reg out
       );

reg [5:0] state;


always @(posedge clk ,negedge rst_n)
   if ( !rst_n ) begin
         state <= IDLE;
         out     <= 0;
         end

   else 
   case (state)
   IDLE : if (seq == 0) begin
               state  <= IDLE;
               out      <= 0;
               end
         else begin
               state <= S1;
               out     <= 0;
               end

   S1   : if (seq == 0) begin
               state  <= S10;
               out      <= 0;
               end
         else begin
               state <= S1;
               out     <= 0;
               end

   S10  : if (seq == 0) begin
               state  <= IDLE;
               out      <= 0;
               end
         else begin
               state <= S101;
               out     <= 0;
               end

   S101  : if (seq == 0) begin
               state  <= S10;
               out      <= 0;
               end
         else begin
               state <= S1011;
               out     <= 0;
               end

   S1011 : if (seq == 0) begin
               state  <= S10110;
               out      <= 0;
               end
         else begin
               state <= S1;
               out     <= 0;
               end

   S10110 : if (seq == 0) begin
               state  <= IDLE;
               out      <= 0;
               end
         else begin
               state <= IDLE;
               out     <= 1;
               end
   default : begin
               state <= IDLE;
               out     <= 0;
             end
  endcase
endmodule

timescale.v与testbench.v如下:

`timescale  1ns/1ns
`define  halfperiod  20

module t;

reg  clk;
reg  rst_n;
reg  [31:0] data;
reg  seq;

wire out;

initial  begin
  clk     = 0;
  rst_n   = 1;
  data = 32'b1010_1100_1011_0101_1010_1001_1011_0011;
  #5 rst_n = 0;
  #16 rst_n = 1;
  #(`halfperiod * 100) $finish;
 end

always  #(`halfperiod)  clk = ~clk;

always @(posedge clk)
   #2  data <= {data[30:0],data[31]};

assign  seq = data[31];

seq_detector_mealy  U(.clk(clk), .rst_n(rst_n), .seq(seq), .out(out) );

initial  begin
 $vcdpluson;
end

endmodule

采用VCS进行仿真,结果如下:

由上图的结果可以看出,mealy型状态机当检测到“101101”序列时,立马输出一个“1”。

Moore型状态机设计

        状态输出表如下:

                               

      左边表为初始状态输出表,右边灰色区域表示可以合并的冗余状态。状态合并并进行状态命名后的表如下:

         

    根据状态输出表写出的HDL(verilog)代码如下,也可以画出状态输出图再写verilog代码。

module seq_detector_moore #(parameter IDLE    = 7'b000_0001,
                                      S1      = 7'b000_0010,
                                      S10     = 7'b000_0100,
                                      S101    = 7'b000_1000,
                                      S1011   = 7'b001_0000,
                                      S10110  = 7'b010_0000,
                                      S101101 = 7'b100_0000)
         (input   clk,
          input   rst_n,
          input   seq,
          output reg out
          );

reg [6:0] state;

always @(posedge clk, negedge rst_n)
      if (!rst_n) begin
           state <= IDLE;
           out   <= 0;
         end 
      else
       case (state)
       IDLE     : begin
                     if(seq == 0)  
                       state <= IDLE;  
                     else 
                       state <= S1;
                   out <= 0;
                  end
                      
       S1     : begin
                     if(seq == 0)  
                       state <= S10;  
                     else 
                       state <= S1;
                   out <= 0;
                  end
                      
       S10     : begin
                     if(seq == 0)  
                       state <= IDLE;  
                     else 
                       state <= S101;
                   out <= 0;
                  end
                      
       S101     : begin
                     if(seq == 0)  
                       state <= S10;  
                     else 
                       state <= S1011;
                   out <= 0;
                  end
                      
       S1011     : begin
                     if(seq == 0)  
                       state <= S10110;  
                     else 
                       state <= S1;
                   out <= 0;
                  end
                      
       S10110     : begin
                     if(seq == 0)  
                       state <= IDLE;  
                     else 
                       state <= S101101;
                   out <= 0;
                  end
                      
       S101101     : begin
                     if(seq == 0)  
                       state <= IDLE;  
                     else 
                       state <= S1;
                   out <= 1;
                  end
                      
       default     : begin
                       state <= IDLE;  
                       out <= 0;
                     end
      endcase
endmodule 

timescale.v与testbench.v如下:

`timescale 1ns/1ns
`define  halfperiod  20

module t;

reg  clk;
reg  rst_n;
reg  [31:0] data;
reg  seq;

wire out;

initial  begin
  clk     = 0;
  rst_n   = 1;
  data = 32'b1010_1100_1011_0101_1010_1001_1011_0011;
  #5 rst_n = 0;
  #16 rst_n = 1;
  #(`halfperiod * 100) $finish;
 end

always  #(`halfperiod)  clk = ~clk;

always @(posedge clk)
   #2  data <= {data[30:0],data[31]};

assign  seq = data[31];

seq_detector_moore  U(.clk(clk), .rst_n(rst_n), .seq(seq), .out(out) );

initial  begin
 $vcdpluson;
end

endmodule

采用VCS进行仿真,结果如下:

由仿真结果可以看出,当检测到“101101”序列后,moore型状态机没有立刻输出“1”,而是在下一个周期输出“1”。

  • 13
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是一个简单的1011序列检测器Verilog代码和仿真: ``` module sequence_detector(input wire clk, reset, input wire data, output reg detected); reg [3:0] shift_reg; always @(posedge clk) begin if (reset) begin shift_reg <= 4'h0; detected <= 0; end else begin shift_reg <= {shift_reg[2:0], data}; if (shift_reg == 4'hB) begin detected <= 1; end else begin detected <= 0; end end end endmodule ``` 这个模块有四个输入:时钟信号clk,复位信号reset,数据信号data和一个输出信号detected。它还包括一个4位移位寄存器shift_reg,它用于存储输入数据的前三位。 在always块中,我们使用always @(posedge clk)来表示这个块在时钟上升沿时执行。如果reset为1,我们将shift_reg重置为0,并将detected设置为0。否则,我们将输入数据移动到shift_reg中,并将shift_reg与4'hB进行比较。如果它们相等,我们将detected设置为1,否则我们将detected设置为0。 以下是一个简单的测试程序,用于对序列检测器进行仿真: ``` module sequence_detector_tb; reg clk, reset, data; wire detected; sequence_detector detector(.clk(clk), .reset(reset), .data(data), .detected(detected)); initial begin clk = 0; reset = 1; data = 0; #10 reset = 0; #10 data = 1; #10 data = 0; #10 data = 1; #10 data = 1; #10 data = 0; #10 $finish; end always #5 clk = ~clk; endmodule ``` 这个测试程序引入了一个时钟信号clk,一个复位信号reset,一个数据信号data和一个检测信号detected。它还创建了一个sequence_detector实例,并将输入和输出连接到适当的信号。 在initial块中,我们初始化信号,并在一定的时间后将reset信号设置为0,然后输入一个1011序列。最后,我们使用$finish指令来结束仿真。在always块中,我们使用#5来表示时钟周期的长度,并且每次循环时都会翻转时钟信号的值。 运行仿真程序后,可以看到在输入1011序列时,检测信号detected变为1。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值