1、序列检测器的逻辑功能描述:序列检测指的就是将一个指定的序列从数字码流中识别出来。本例中,我们将设计一个"10010”序列的检测器。设x_in为数字码流输入,z_out为检出标记输出,高电平表示“发现指定序列”,低电平表示“没有发现指定序列”。

2、本次试验的data stream是 18'b11_0010_0100_0010_0101,通过循环来给x_in进行赋值。其中还要考虑到重叠现象。

3、重点是状态图的描绘,仅有当状态机跳到E状态时,z_out才置1,说明发现了指定序列。其实这个试验关键是怎么来描绘该状态机。第一次看到夏宇闻书上该例子时,脑子里马上想到头一个问题,就是他是如何画出该状态机的,这个过程没有讲,很纳闷,那会是刚看Verilog,很多不懂,于是就放下这个问题,只阅读了代码。然而此次去看该例子时,我只看了题目和他的状态机,代码就不用看了,觉得书上画的状态机有点啰嗦,就没仔细看,干脆自己画一个 ,画该状态机其实也很简单,先把所有状态全都列出来,先单向的把IDLE->A->B->C->D->E跳变条件写上,比如IDLE到A,是当输入x_in为1时才会调到A,这个很好确认的吧,然后在仔细针对每个状态为其它条件时该如何跳,比如B是在x_in为1时是到C的,那么就得好好考虑x_in为0时,状态该跳到哪儿,就这样一步一步的仔细推敲,完整的状态机很快就完成。

4、代码实现:

sequence_detect.v

 module sequence_detect(
//input
clk,
rst_n,
x_in, //ouput
z_out
);
/****************************************/
input clk;
input rst_n;
input x_in;
output z_out;
/****************************************/
parameter IDLE = 'd0;
parameter A = 'd1;
parameter B = 'd2;
parameter C = 'd3;
parameter D = 'd4;
parameter E = 'd5;
/****************************************/
reg [:] crt_state,nxt_state;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
crt_state <= IDLE;
else
crt_state <= nxt_state;
end
/****************************************/
always @(*)
begin
case(crt_state)
IDLE: if(x_in) nxt_state = A;
else nxt_state = IDLE; A : if(!x_in) nxt_state = B;
else nxt_state = A; B : if(!x_in) nxt_state = C;
else nxt_state = A; C : if(x_in) nxt_state = D;
else nxt_state = IDLE; D : if(!x_in) nxt_state = E;
else nxt_state = A; E : if(!x_in) nxt_state = C;
else nxt_state = A; default: nxt_state = IDLE;
endcase
end
/****************************************/
reg z_out_temp;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
z_out_temp <= 'b0;
else case(nxt_state)
IDLE : z_out_temp <= 'b0;
A : z_out_temp <= 'b0;
B : z_out_temp <= 'b0;
C : z_out_temp <= 'b0;
D : z_out_temp <= 'b0;
E : z_out_temp <= 'b1;
default: z_out_temp <= 'b0;
endcase
end
/****************************************/
assign z_out = z_out_temp;
/****************************************/
endmodule

sequence_detect_top.v

 `timescale 1ns / 10ps
module sequence_detect_top;
reg clk;
reg rst_n;
reg [:] data;
wire x_in;
wire z_out;
/***********************************************************/
initial
begin
clk = 'b0;
rst_n = 'b0;
#;
rst_n = 'b1;
end
/***********************************************************/
always # clk = ~clk;
/***********************************************************/
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
data <= 'b11_0010_0100_0010_0101;
else
data <= {data[:],data[]};
end
/***********************************************************/
assign x_in = data[];
/***********************************************************/
sequence_detect sequence_detect_inst(
//input
.clk(clk),
.rst_n(rst_n),
.x_in(x_in), //ouput
.z_out(z_out)
);
/***********************************************************/
endmodule

5、仿真波形:

仅当crt_state在E状态(5)时,z_out置1。通过波形可以看到,输出是正确的。

简单三段式状态机实验3-Sequence Detect(序列检测)的更多相关文章

  1. 简单三段式状态机实验2-LCD12864

    此实验是在“基于I2C EPPRPM(AT24C02B) + LCD12864实验”基础上,把LCD模块里的一段式状态机改成三段式,I2C EPPROM模块暂时未改出来,一步一步来吧,改完后代码下载到 ...

  2. 简单三段式状态机实验1-SOS

    一直想从一段式状态机切换到三段式状态机,从书上和网上不断搜寻三段式案例及方法,感觉很简单,就想拿之前做过的实验把一段式改成三段式,可是写起来并非那么简单,很棘手,改完后也没有成功,尤其状态机里面的计数 ...

  3. Verilog笔记.三段式状态机

    之前都是用的一段式状态机,逻辑与输出混在一起,复杂点的就比较吃力了. 所以就开始着手三段式状态机. 组合逻辑与时序逻辑分开,这样就能简单许多了. 但是两者在思考方式上也有着很大的区别. 三段式,分作: ...

  4. FPGA三段式状态机的思维陷阱

    用三段式描述状态机的好处,国内外各位大牛都已经说的很多了,大致可归为以下三点: 1.将组合逻辑和时序逻辑分开,利于综合器分析优化和程序维护; 2.更符合设计的思维习惯; 3.代码少,比一段式状态机更简 ...

  5. 10010序列检测器的三段式状态机实现(verilog)

    序列检测器是时序数字电路设计中经典的教学范例,夏宇闻的<verilog数字系统设计教程>一书中有这个例子,用verilog设计一个“10010”序列的检测器.看完后我觉得F和G两个状态多余 ...

  6. 基于FPGA的三段式状态机

    状态机分类: 通常, 状态机的状态数量有限, 称为有限状态机(FSM) .由于状态机所有触发器的时钟由同一脉冲边沿触发, 故也称之为同步状态机. 根据状态机的输出信号是否与电路的输入有关分为 Meal ...

  7. (原创)Verilog三段式状态机

    下面以上图一个简单的FSM说明三段式Verilog状态机范式: `timescale 1ns / 1ps module FSM( clk,rst_n, in1,in2, out1,out2, CS,N ...

  8. Verilog三段式状态机描述

    时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息. 状态机采用VerilogHDL语言编码,建议分为三个always段完成. 三段式建模 ...

  9. verilog 三段式状态机的技巧

    三段式代码多,但是有时钟同步,延时少,组合逻辑跟时序逻辑分开并行出错少. (1)同步状态转移 (2)当前状态判断接下来的状态 (3)动作输出 如果程序复杂可以不止三个always   .always ...

随机推荐

  1. IoC容器Autofac正篇之类型关联(服务暴露)(八)

    类型关联  类型关联就是将类挂载到接口(一个或多个)上去,以方便外部以统一的方式进行调用(看下例). 一.As关联 我们在进行手动关联时,基本都是使用As进行关联的. 1 2 3 4 5 6 7 8 ...

  2. differences between null pointer and void pointer.

    These are two different concepts, you cannot compare them. What the difference between the skunk and ...

  3. 聊一聊PV和并发、以及计算web服务器的数量的方法【转】

    聊一聊PV和并发.以及计算web服务器的数量的方法 站长之家 2016-08-17 09:40 最近和几个朋友,聊到并发和服务器的压力问题.很多朋友,不知道该怎么去计算并发?部署多少台服务器才合适? ...

  4. MPEG1的码流层次与各层次的作用

    1. 序列层(Sequence layer) 序列层主要用于为随机播放提供全局参数支持,这些参数包括图像宽高.像素高宽比.帧率.码率.VBV大小.帧内量化矩阵.帧间量化矩阵. 2. 图像组层(Grou ...

  5. Linq序列间的操作

    一.Union并集操作相同的数据只显示一次 二.Concact连接 相同的数据也会重复显示 三.except差集 我有的你没有的显示 四.intersect交集相同的显示 五.zip序列的合并 六.d ...

  6. linux centos下安装g++

    1.查看是否安装 g++ -v 2.命令直接安装 yum install gcc-c++ 3.提示你找不到g++安装包,执行下面命令 yum install gcc-c++ libstdc++-dev ...

  7. uIP学习笔记

    uIP学习笔记 从零开始使用uIP freemodbus modbus TCP 学习笔记

  8. 浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

  9. dede修改templets模板文件夹后,出现“无法在这个位置找到: ”错误的解决办法

    修改templets模板文件夹的方法: 首先找到系统配置文件common.inc.php,此文件存放在Include目录下,打开common.inc.php来修改默认模板目录templets, 查找: ...

  10. iOS多线程中performSelector

    下面两段代码都在主线程中运行,我们在看别人代码时会发现有时会直接调用,有时会利用performSelector调用,今天看到有人在问这个问题,我便做一下总结, [delegate imageDownl ...