序列检测“1101”

编程入门 行业动态 更新时间:2024-10-26 15:25:11

<a href=https://www.elefans.com/category/jswz/34/1769864.html style=序列检测“1101”"/>

序列检测“1101”

目录

1.题意描述

2.利用摩尔型状态机求解

 3.利用米利型状态机求解

4.摩尔型状态机与米利型状态机的区别


1.题意描述

用状态机检测“1101”序列,当检测到后将o_valid标志信号拉高。考虑序列叠加情况,即“1101101101”将会识别出3个“1101”

2.利用摩尔型状态机求解

摩尔型状态机:输出只与当前状态有关,与当前输入无关

摩尔型状态机状态定义:IDLE, S_1,S_11,S_110,S_1101

摩尔型状态机状态转移图:

摩尔型状态机RTL代码:

module sequence_test_more(i_clk   ,i_rst_n ,i_data  ,o_valid
);input           i_clk   ;
input           i_rst_n ;
input           i_data  ;
output          o_valid ;reg             o_valid ;parameter       IDLE    =       3'b000;
parameter       S_1     =       3'b001;
parameter       S_11    =       3'b010;
parameter       S_110   =       3'b011;
parameter       S_1101  =       3'b100;reg     [2:0]   current_state   ;
reg     [2:0]   next_state      ;always@(posedge i_clk or negedge i_rst_n)
beginif(!i_rst_n)current_state <= #1 IDLE        ;elsecurrent_state <= #1 next_state  ;
endalways@(*)
begincase(current_state)IDLE    :if(i_data==1'b1)next_state = S_1 ;elsenext_state = IDLE ;S_1     :if(i_data==1'b1)next_state = S_11 ;elsenext_state = IDLE ;S_11    :if(i_data==1'b0)next_state = S_110 ;elsenext_state = S_11 ;S_110   :if(i_data==1'b1)next_state = S_1101 ;elsenext_state = IDLE ;S_1101  :if(i_data==1'b1)next_state = S_11 ;elsenext_state = IDLE ;default :next_state = IDLE ;endcaseendalways@(posedge i_clk or negedge i_rst_n)
beginif(!i_rst_n)o_valid <= #1 1'b0      ;else if(next_state==S_1101)o_valid <= #1 1'b1      ;elseo_valid <= #1 1'b0      ;
end
endmodule

仿真文件:输入序列11101101011010

`timescale 1ns/1ns
module test;//************i_clk and i_rst_n*************
reg i_rst_n     ;
reg i_clk       ;initial
begini_rst_n = 1'b0  ;i_clk   = 1'b0  ;#20;i_rst_n = 1'b1  ;
end
always #5 i_clk<=~i_clk;
//************define******************
reg             i_data  ;
wire            o_valid ;//************instance****************
sequence_test_more      U1(.i_clk          (i_clk  ),.i_rst_n        (i_rst_n),.i_data         (i_data ),.o_valid        (o_valid)
);
//************main source*************
parameter       TEST_DATA = 14'b1110_1101_0110_10;
initial
begini_data = 1'b0;#50;@(posedge i_clk)i_data <=#1 TEST_DATA[13];@(posedge i_clk)i_data <=#1 TEST_DATA[12];@(posedge i_clk)i_data <=#1 TEST_DATA[11];@(posedge i_clk)i_data <=#1 TEST_DATA[10];@(posedge i_clk)i_data <=#1 TEST_DATA[9];@(posedge i_clk)i_data <=#1 TEST_DATA[8];@(posedge i_clk)i_data <=#1 TEST_DATA[7];@(posedge i_clk)i_data <=#1 TEST_DATA[6];@(posedge i_clk)i_data <=#1 TEST_DATA[5];@(posedge i_clk)i_data <=#1 TEST_DATA[4];@(posedge i_clk)i_data <=#1 TEST_DATA[3];@(posedge i_clk)i_data <=#1 TEST_DATA[2];@(posedge i_clk)i_data <=#1 TEST_DATA[1];@(posedge i_clk)i_data <=#1 TEST_DATA[0];#50;$finish;
end//***************fsdb****************
initial
begin$fsdbDumpfile("test.fsdb");$fsdbDumpvars(0,test);
endendmodule

仿真波形:

 3.利用米利型状态机求解

米利型状态机:输出不仅当前状态有关,还与当前输入有关

米利型状态机状态定义:IDLE, S_1,S_11,S_110

米利型状态机状态转移图:

米利型状态机RTL代码:


module sequence_test_mely(i_clk   ,i_rst_n ,i_data  ,o_valid
);input           i_clk   ;
input           i_rst_n ;
input           i_data  ;
output          o_valid ;reg             o_valid ;parameter       IDLE    =       3'b000;
parameter       S_1     =       3'b001;
parameter       S_11    =       3'b010;
parameter       S_110   =       3'b011;
//parameter     S_1101  =       3'b100;reg     [2:0]   current_state   ;
reg     [2:0]   next_state      ;always@(posedge i_clk or negedge i_rst_n)
beginif(!i_rst_n)current_state <= #1 IDLE        ;elsecurrent_state <= #1 next_state  ;
endalways@(*)
begincase(current_state)IDLE    :if(i_data==1'b1)next_state = S_1 ;elsenext_state = IDLE ;S_1     :if(i_data==1'b1)next_state = S_11 ;elsenext_state = IDLE ;S_11    :if(i_data==1'b0)next_state = S_110 ;elsenext_state = S_11 ;S_110   :if(i_data==1'b1)next_state = S_1 ;elsenext_state = IDLE ;default :next_state = IDLE ;endcaseendalways@(posedge i_clk or negedge i_rst_n)
beginif(!i_rst_n)o_valid <= #1 1'b0;else if((current_state==S_110) && (i_data == 1'b1))o_valid <= #1 1'b1      ;elseo_valid <= #1 1'b0      ;
end
endmodule

仿真文件:输入序列11101101011010(与摩尔型仿真激励相同)

仿真波形:

4.摩尔型状态机与米利型状态机的区别

在状态定义上米利型状态机比摩尔型状态机少一个状态。

更多推荐

序列检测“1101”

本文发布于:2024-03-08 00:57:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1719417.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:序列

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!