设计一个序列检测器,检测序列1101,检测到输出1,否则输出0.

用状态机来实现序列检测器是非常合适的,下面先给出状态转移图,之后用Moore状态机来实现这个序列检测器:

(注:此处所画为无重叠检测,有重叠检测只需要改变最后一个状态即可,例如本例里,有重叠检测,如果S4状态下输入为1,则需要转向S2状态,其他不变。)

图1:Moore状态机状态转移图

先给出行为仿真示意图,示例代码后面贴出:

可见,每经历一个1101,输出就会是一个高脉冲,持续一个周期,也即输出是一个1.

该状态机的Verilog HDL描述为:

`timescale 1ns / 1ps// Company:
// Engineer:
//
// Create Date: 2019/01/04 11:16:29
// Design Name:
// Module Name: seq_det_moore
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// module seq_det_moore(input clk,input reset,input din,output reg dout);//状态声明localparam [2:0]s0 = 3'b000,s1 = 3'b001,s2 = 3'b010,s3 = 3'b011,s4 = 3'b100;reg [2:0] current_state,next_state;always @(posedge clk, posedge reset)beginif(reset)current_state <= s0;elsecurrent_state <= next_state;endalways @ *begincase(current_state)s0:if(din == 1'b1) next_state = s1;else next_state = s0;s1:if(din == 1'b1) next_state = s2;else next_state = s0;s2:if(din == 1'b0) next_state = s3;else next_state = s2;s3:if(din == 1'b1) next_state = s4;else next_state = s0;s4:if(din == 1'b1) next_state = s1;else next_state = s0;default: next_state = s0;endcaseendalways @*beginif(current_state == s4) dout = 1;else dout = 0;endendmodule

RTL电路:

行为仿真代码:

`timescale 1ns / 1ps// Company:
// Engineer:
//
// Create Date: 2019/01/04 15:24:59
// Design Name:
// Module Name: seq_det_moore_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// module seq_det_moore_tb;reg clk,reset;reg din;wire dout;reg [20:0] din_mid;integer i;// Note: CLK must be defined as a reg when using this methodparameter PERIOD = 10;always beginclk = 1'b0;#(PERIOD/2) clk = 1'b1;#(PERIOD/2);end  initial beginreset = 1'b1;din_mid = 21'b110111010110100101101;#  20reset = 1'b0;din = 1'b0;for(i = 0;i < 21;i = i + 1)begin#PERIODdin = din_mid[i];endendseq_det_moore uu1(.clk(clk),.reset(reset),.din(din),.dout(dout));endmodule

编写这个简单的程序,并非毫无意义的,包括这个Testbench文件,自己动手编写往往能发现一些小的细节问题,你可能并不懂,例如,在测试文件(testbench)中,我使用到了for循环,出现了如下问题,首先我尝试使用了generate for循环语法,可是Vivado软件总是报错!!!

之后,我直接使用for循环,可是变量i的类型是什么呢?

reg,real都不对,最后使用了integer才成功,这说明了什么问题,当然是基础知识不牢固导致的,基础知识为什么不牢固,往往是因为练习的不多,语法书读的次数再多,往往很枯燥无味,问题还是需要在实践中去寻找,Verilog语言很类似C,这导致我们往往很不情愿去仔仔细细地去学,稍微关注些可综合的语法,之后拿来就用。至今我仍不愿意去细看所有的语法。解决的办法就是实践。

第二个问题就是在测试文件中,定义了参数parameter PERIOD,可是后面为什么不能对此参数进行运算呢?例如我想延时2 * PERIOD,Vivado仍然报错。让我郁闷!

上述这些问题都出现在我的初次表写测试文件的代码中,这里给出错误的初稿代码:(供大家发现问题)

`timescale 1ns / 1ps// Company:
// Engineer:
//
// Create Date: 2019/01/04 15:24:59
// Design Name:
// Module Name: seq_det_moore_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// module seq_det_moore_tb;reg clk,reset;reg din;wire dout;reg [20:0] din_mid;// Note: CLK must be defined as a reg when using this methodparameter PERIOD = 10;always beginclk = 1'b0;#(PERIOD/2) clk = 1'b1;#(PERIOD/2);end  initial beginreset = 1'b1;din_mid = 21'b110111010110100101101;#2*PERIODreset = 1'b0;generate genvar i;for(i = 0;i < 21;i ++)begin#PERIODdin = din_mid[i];endendgenerateendseq_det_moore uu1(.clk(clk),.reset(reset),.din(din),.dout(dout));endmodule

【 FPGA 】序列检测器的Moore状态机实现相关推荐

  1. 【 FPGA 】序列检测器的Mealy状态机实现

    上篇博文讲了使用Moore状态机来设计一个序列检测器:序列检测器的Moore状态机实现 原理一致,这里只不过采用了Mealy状态机实现,快速给出: 状态转移图如下:被检测序列为1101,也就是说,如果 ...

  2. 序列检测器(moore、mealy、独热码三种写法)

    序列检测器:检测110101 目的:检测一个序列中是不是有序列110101 Moore型状态机实现 Moore型状态机:输出只由当前状态决定,即次态=f(现状,输入),输出=f(现状): 状态转移图: ...

  3. Moore状态机和Mealy状态机的区别

    直接给出结论: 根据状态机的输出是否与输入条件相关来区分Moore状态机和Mealy状态机. Moore状态机:输出仅仅与当前状态有关: 如下实例,如三段式写法来写的一个序列检测的状态机([ FPGA ...

  4. IC/FPGA校招笔试题分析(四)再看Moore状态机实现序列检测器

    参加了几次笔试,发现序列检测器是常考的内容,而之前认为序列检测器真的很简单,但是这次X疆的笔试题做完之后,我怀疑自己了. 画状态转移图的时候,我开始犹豫了,我怕我会没考虑全,甚至有点晕. 人家又问: ...

  5. Verilog 实现111序列检测器——Moore和Mealy型状态机实现

    111序列检测器 有限状态机简介 电路结构 '111'序列检测器 Moore状态机 代码实现 Mealy状态机 代码实现 有关三段式和两段式的对比 有关可重叠和不可重叠序列的对比 有限状态机简介 电路 ...

  6. Verilog实现状态机与状态机经典示例——序列检测器、自动饮料售卖机

    原文链接:https://blog.csdn.net/qq_34070723/article/details/100737225 作者:King阿金 目录 1.状态机原理与三段式状态机 2.状态机示例 ...

  7. 实验十五 摩尔状态机序列检测器“1101”

    实验十五 摩尔状态机序列检测器 按键消抖模块debounce_button: 由于实际的拨码开关和按键开关都是机械式的设备,开关动作来回抖动多次后才能稳定下来,这个过程就会使得信号产生==抖动==.因 ...

  8. 重迭式三段式状态机序列检测器-检测10110110

    重迭式三段式状态机序列检测器-检测10110110 要求:序列检测器 clk input clock input rst_n input asynchronous reset, low active ...

  9. 序列检测器(三段式状态机)

    Verilog HDL 学习笔记三 基于状态机的序列检测器 检测序列11001,其状态转移图如下所示: 三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用 ...

最新文章

  1. 详细透彻的分析DM9000网卡驱动程序(4)
  2. python selenium爬虫爬京东评论_Python 不用selenium 带你高效爬取京东商品评论
  3. rpm包备份命令linux,RPM常用命令介绍 - Linux就该这么学的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. leetcode 86. 分隔链表(链表)
  5. 重磅!彭博社“机器学习基础”教程视频及讲义下载
  6. 异步任务利器Celery(一)介绍
  7. 【转载】我的MYSQL学习心得-系列
  8. 修改系统文件内容的经典错误总结
  9. 分销系统开发 三级分销技术开发
  10. 古代到现在一些小国家的形成和解体
  11. 【简单快捷教会你】如何正确使用animate.css,各种动态效果。
  12. 一段java代码_写了一段Java代码,希望大家多多指点
  13. 高盛vr/ar研究报告
  14. 陈潭:大数据战略实施的实践逻辑与行动框架
  15. 网际协议IP(计算机网络)
  16. 阿里云的学生机服务器
  17. 标准的自定义游标取数过程DECLARE CURSOR_NAME CURSOR FOR SQLSTATMENT
  18. 卡萨布兰卡/马拉喀什Photoblog
  19. 强势推荐8个超实用的软件,每一个都让人大开眼界
  20. 美智库为机器人时代战争支招

热门文章

  1. 一个自己设计的软件框架
  2. 如何成为Java程序员
  3. java交易系统_基于SSM框架的JAVA二手交易系统
  4. oracle右对齐,Oracle 学习笔记(基础)
  5. python编译成exe速度会变快吗_python如何编译成exe
  6. oracle sid环境变量,ORACLE_SID环境变量设置的问题
  7. 计算机系未来的理想工作,电智学院2019级计算机专业开展专业指导与职业规划报告会...
  8. 如何用html制作心,html – 如何创建CSS心脏? /为什么这个CSS创造一个心脏的形状?...
  9. python3.5.3安装完后什么样子_python3.5安装python3-tk详解
  10. 如何制作linux文件系统,linux文件系统制作(一)