• 练习八-利用有限状态机进行时序逻辑的设计


    1,任务目的:

    (1)掌握利用有限状态机实现一般时序逻辑分析的方法;
    (2)掌握用Verilog编写可综合的有限状态机的模板;
    (3)掌握用Verilog编写状态机模板的测试文件的一般方法。

    案例:重复检测序列,实现检测功能是:5进制“10010。考虑到序列重叠的可能,有限状态机共提供8个状态(包括初始状态IDLE)。”

    2,RTL代码,及原理框图

    module	seqdet(
    input				clk,
    input				x,
    input				rst,
    output				z,
    output	reg	[2:0]	state
    );
    //	独热码来做参数
    parameter		IDLE = 3'd0;
    parameter		A	 = 3'd1;
    parameter		B	 = 3'd2;
    parameter		C	 = 3'd3;
    
    parameter		D	 = 3'd4;
    parameter		E	 = 3'd5;
    parameter		F	 = 3'd6;
    parameter		G	 = 3'd7;
    
    //  `define			IDLE	0
    //  `define			A		1
    //  `define			B		2
    //  `define			C		3
    //  `define			D		4
    //  `define			E		5
    //  `define			F		6
    //  `define			G		7
    
    assign	z = ((state == E) && (x==0)) ? 1 : 0;
    //	当x序列 10010 最后一个 0刚到时刻,时钟沿立刻将状态变为E,此时z应该变为高
    
    always@(posedge clk)	
    	if(!rst)	
    		state	<= IDLE;
    	else 
    		casex(state)
    			IDLE: if(x == 1)	// 第一个码位对,记状态A
    					state	<= A;
    					
    			A:	if(x == 0)		// 记状态B
    					state	<= B;
    					
    			B:	if(x == 0)		//	C
    					state	<= C;
    				else
    					state	<= F;	// 前功尽弃,到 F
    					
    			C:	if(x == 1)
    					state	<= D;
    				else
    					state	<= G;	// 前功尽弃,到 G
    			D:	if(x == 0)
    					state	<= E;	// 全对,此时有输出
    				else
    					state	<= A;
    // 第五个码位不对时,前功尽弃,只有刚进入的1位有用,回到第一个码位对状态,记状态A
    
    			E:	if(x == 0)
    					state	<= C;
    				else
    					state	<= A;	// 前功尽弃,只有刚输入的1码位对,记状态A
    			F:	if(x == 1)
    					state	<= A;
    				else	
    					state	<= B;	//	又有一个码对,记状态B
    			G:	if(x == 1)
    					state	<= F;	// 只有刚输入的1码位对,记状态A
    					
    			default:
    					state	<= IDLE;	// 默认初始状态
    		endcase
    
    //  `undef			IDLE
    //  `undef			A
    //  `undef			B
    //  `undef			C
    //  `undef			D
    //  `undef			E
    //  `undef			F
    //  `undef			G
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    在这里插入图片描述

    3,测试代码,输出波形

    //	测试模块
    module	seqdet_top;
    reg		clk,	rst;
    reg		[23:0]	data;
    
    wire	[2:0]	state;
    
    wire	z, x;
    assign	x = data[23];
    always 	#10		clk = ~clk;
    
    always@(posedge clk)
    		data = {data[22:0], data[23]};	
    		// 形成数据向左移环形流,最高位与x连接
    
    initial	begin
    		clk = 0;	rst = 1;
    #2;		rst	= 0;	
    #30;	rst = 1;
    
    data	= 24'b0000_1100_1001_0000_1001_0100;
    #500;	$stop;
    end
    
    seqdet	u_seqdet(
    .clk		(clk	),
    .rst		(rst	),
    .x			(x		),
    .z			(z		),
    .state		(state	)
    );
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在这里插入图片描述

  • 相关阅读:
    算法学习笔记2023.1
    解锁汽车自动驾驶的密码:L0到L5六个等级全解析
    OpenCV14-图像平滑:线性滤波和非线性滤波
    对KMP算法的一点碎碎念——上篇
    jpg格式图片无法打开可以修复吗?有哪些方法?
    记一次因为C#官方扩展导致自动补全出错的情况 (C# & Godot)
    地平线旭日X3派小白上手
    jupyter notebook中使用不同的anaconda环境及常用conda命令
    为什么Video Speed Manager 和 Video Speed Controller 的chrome插件对有些B站视频不能调速
    深度学习(十四)——优化器
  • 原文地址:https://blog.csdn.net/qq_21952195/article/details/134531962