基于vivado的序列检测

目录

目的与要求:

过程及分析(包括电路原理图):

Moore机代码

testbench代码

Mleay机代码

behavioral波形图

资源利用率:

Moore机和Mealy区别:


目的与要求:

基本要求:

  1. 利用状态机等知识,设计一个可以识别“01101”的序列检测电路;
  2. 使用vivado软件中verilog HDL输入方式实现所设计的序列检测器;
  3. 自行编写测试文件testbench.v 文件进行仿真,验证检测器功能;

高级要求(可选):

              用Moore和Mealy机两种状态机实现序列检测,并分析比较其波形、资源利用率、性能的差异。

过程及分析(包括电路原理图):

1、状态机设计思想

状态机的本质是对具有逻辑顺序或时序规律事件的一种描述方法。这个论断的最重要的两个词就是“逻辑顺序”和“时序逻辑”,这两点就是状态机所要描述的核心和强项,换言之,所有具有逻辑顺序和时序规律的事情都适合用状态机描述。

2、状态机分类

(1)mealy型和moore型

状态机有两大类:Mealy型和Moore型。Moore型状态机的输出只与当前状态有关,而Mealy型状态机的输出不仅取决于当前状态,还受到输入的直接控制,并且可能与状态无关,其状态机结构如下图:

681a451301904d419aab05d30a799819.png

图1 Mealy型状态机结构图

0bc38caccbbd4c9486b2fe7ba973db7d.png

图2 Moore型状态机结构图

(2)按照状态编码来分类

1、Gray(格雷码)码状态机

2、one-hot码(独热码)状态机

3、二进制码状态机

有限状态机编码时常采用的是格雷码和独热码。格雷码,即相邻之间只变1bit,编码密度高。独热码,即任何状态只有1bit为1,其余皆为0,编码密度低。

比如说,表示四个状态,那么状态机寄存器采用格雷码编码只需要2bit,即00(S0),01(S1),11(S2),10(S3),采用独热码则需要4bit:0001(S0), 0010(S1), 0100(S2),1000(S3)。所以很明显采用格雷码可以省2bit寄存器。

(3)在Verilog中描述有限状态机,可以有三种形式,可分为一段式、二段式和三段式。这三种描述主要根据其输入、输出和状态来分类。

一段式状态机:

一段式状态机只选择一个状态标志位,这个状态标志位会在输入的决定下选择跳转到下一个状态还是维持原有状态,在每一个状态下检测状态标志位及输入来决定其状态的跳转及输出。其输出和状态的切换在一个always循环块中执行。

二段式状态机:

二段式状态机将状态分为当前状态和此状态,其系统会自动将次状态更新到当前状态,其输入更新在次状态上,其决定系统的状态切换和输出。其输出和状态的切换在两个个always循环块中执行,第一个always块决定系统状态标志的自动跳转,第二个always块决定系统根据不同状态下的输入进行状态的跳转及输出。

三段式状态机:

三段式状态机将状态分为当前状态和此状态,其系统会自动将次状态更新到当前状态,系统的输入更新在次状态上,其决定系统的状态切换,系统会根据其当前状态决定输出的值。其输出和状态更新和状态切换在三个always块中,第一个always块决定系统状态标志的自动跳转,第二个always块决定系统根据不同状态下的输入进行状态的切换,第三个always块根据系统的当前状态决定输出的值。

31915898a0bc4f4fb139c2794711743c.jpeg

图3 检测序列为01101的状态跳转图(Moore)

b422eb41d98b440ba9064a51f45536f2.jpeg

图4 检测序列为01101的状态跳转图(Mealy)

Moore机代码

module Sequence_detection(input x,clk,rst_n,
output flag,
output reg [2:0] state
    );

	
 parameter IDLE = 'd0,
			  A = 'd1, B = 'd2,
			  C = 'd3, D = 'd4,
			  E = 'd5;
assign flag =(state==E)?1:0;
always@(negedge rst_n or posedge clk)
begin 
if (!rst_n)
	begin
	state <= IDLE;
	end
else 
casex(state)
IDLE:if(x==0)    //第一个码位对,记状态A
	begin 
	state<=A;
	end
       else state<=IDLE;

A:if(x==1)       //第二个码位对,记状态B
	state<=B;
     else
	state<=A;
B:if(x==1)       //第三个码位对,记状态C
        state<=C;
        else
        state<=A;    
C:if(x==0)       //第四个码位对,记状态D
        state<=D;
        else
        state<=IDLE;
D:if(x==1)        //第五个码位对,记状态E
        state<=E;
        else
        state<=A;
E:if(x==1)
        state<=C;
        else
        state<=A;
    default:state<=IDLE;  //默认初始状态
    endcase 
    end
endmodule 

testbench代码

module sequance_detection_tb();
reg rst_n,clk;
wire x,flag;
wire [2:0] state;
reg [23:0] data;
assign x=data[23];
Sequence_detection u(.x(x),.clk(clk),.rst_n(rst_n),.flag(flag),.state(state));
initial begin
		rst_n = 1;
		clk = 0;
		#2 rst_n=0;
		#30 rst_n=1;
		data = 'b1001_1101_1011_0101_0011_0011;
		#500 $stop;
	end
	
always #10 clk=~clk;
always @ (posedge clk)
		data={data[22:0],data[23]};

  endmodule

Mleay机代码

module Sequence_detection1(x,flag,rst_n,clk,state);
input x,rst_n,clk;
output flag;
output [2:0]state;
wire flag;
reg [2:0]state = 0;	
parameter IDLE = 'd0,
			  A = 'd1, B = 'd2,
			  C = 'd3, D = 'd4;
assign flag=(state==D && x==1)?1:0; 
always@(negedge rst_n or posedge clk)
begin 
if (!rst_n)
	begin
	state <= IDLE;
	end
else 
casex(state)
IDLE:if(x==0)    //第一个码位对,记状态A
	begin 
	state<=A;
	end
       else state<=IDLE;

A:if(x==1)       //第二个码位对,记状态B
	state<=B;
     else
	state<=A;
B:if(x==1)       //第三个码位对,记状态C
        state<=C;
        else
        state<=A;    
C:if(x==0)       //第四个码位对,记状态D
        state<=D;
        else
        state<=IDLE;
D:if(x==1)        //第五个码位对,记状态E
        state<=B;
        else
        state<=A;
    default:state<=IDLE;  //默认初始状态
    endcase 
    end
endmodule 

testbench代码

module Sequence_detection1_tb();
reg rst_n,clk;
wire x,flag;
wire [2:0] state;
reg [23:0] data;
assign x=data[23];
Sequence_detection1 u(.x(x),.clk(clk),.rst_n(rst_n),.flag(flag),.state(state));
initial begin
		rst_n = 1;
		clk = 0;
		#2 rst_n=0;
		#30 rst_n=1;
		data = 'b1001_1101_1011_0101_0011_0011;
		#500 $stop;
	end
	
always #10 clk=~clk;
always @ (posedge clk)
		data={data[22:0],data[23]};

endmodule

behavioral波形图

d2fe6981b7604d24b5e7daca9ad16580.png

                                                        Moore

53c5613324e6413994c39d94a7719447.png

                                                           Mealy

资源利用率:

ac9339f5a7504fb0ac835abae2070314.png

                                                                       Moore机

f0c2526f0fb8468297f2119c121a2869.png

                                                                        Mealy机

Moore机和Mealy区别:

在实现相同功能时,Moore型状态机需要比Mealy型状态机多一个状态,且Moore型状态机的输出比Mealy型延后一个时钟周期。这样的话Moore机要比Mealy机的反应要慢。Mealy机能更早的得到输出。但是由于Moore机多了一个状态确认,相比Mealy没那么容易出错,可靠性更强。Mealy机输入改变后,输出立刻就会改变,故在不小心的情况下会使电路出大问题。

一、实验目的: 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 原始状态表) (图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值