外同步信号检测---verilog---状态机

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: chensimin
//
// Create Date: 2018/02/08 11:39:20
// Design Name:
// Module Name: signal_detect
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////// module signal_detect #
(
parameter TOTAL_TIME_CNT = ,
parameter THRESHOLD_VALUE = ,
parameter WIDTH =
)
(
input wire clk,
input wire rst,
input wire signal,
output wire signal_existence
); //--------------------------------------------------------------
外部信号边沿检测
reg signal_delay_1;
reg signal_delay_2;
wire signal_rise;
always @(posedge clk or posedge rst)
begin
if( rst )
begin
signal_delay_1 <= 'b0;
signal_delay_2 <= 'b0;
end
else
begin
signal_delay_1 <= signal;
signal_delay_2 <= signal_delay_1;
end
end assign signal_rise = !signal_delay_2 && signal_delay_1; //----------------------------------------------------------------
计数器1 用来在第一个状态计数
reg [ WIDTH- : ] time_cnt_1;
always @(posedge clk or posedge rst)
begin
if( rst )
time_cnt_1 <= ;
else if( time_cnt_1 < TOTAL_TIME_CNT - && current_state == 'b01)
time_cnt_1 <= time_cnt_1 + 'b1;
else
time_cnt_1 <= ;
end //----------------------------------------------------------------
计数器2 用来在第二个状态计数
reg [ WIDTH- : ] time_cnt_2;
always @(posedge clk or posedge rst)
begin
if( rst )
time_cnt_2 <= ;
else if( time_cnt_2 < TOTAL_TIME_CNT - && current_state == 'b10)
time_cnt_2 <= time_cnt_2 + 'b1;
else
time_cnt_2 <= ;
end //----------------------------------------------------------------
计算第一个状态下 signal_rise 的脉冲个数
reg [ WIDTH- : ] i;
always @(posedge clk or posedge rst)
begin
if( rst )
i <= ;
else if ( time_cnt_1 == )
i <= ;
else if( signal_rise && current_state == 'b01)
i <= i + 'b1;
end //----------------------------------------------------------------
计算第二个状态下 signal_rise 的脉冲个数
reg [ WIDTH- : ] j;
always @(posedge clk or posedge rst)
begin
if( rst )
j <= ;
else if ( time_cnt_2 == )
j <= ;
else if( signal_rise && current_state == 'b10)
j <= j + 'b1;
end //---------------------------------------------------------------- localparam NO_SIGNAL = 'b01;
localparam HAVE_SIGNAL = 'b10; reg [:]current_state;
reg [:]next_state;
always @ (posedge clk or posedge rst)
begin
if( rst )
current_state <= NO_SIGNAL;
else
current_state <= next_state;
end //--------------------------------------------------------------
状态机跳变条件:
1.在NO_SIGNAL状态下,先是在一定时间段内,数脉冲的个数,当脉冲的个数大于了某个阈值时,立刻判断为,外同步信号存在。
2.在HAVE_SIGNAL状态下,同样也是数脉冲的个数,当一段时间内,脉冲总数量小于某个阈值时,则判断为外同步信号丢失,状态跳转到NO_SIGNAL状态
always @(*)
begin
next_state = NO_SIGNAL;
case( current_state ) NO_SIGNAL:
begin
if( i >= THRESHOLD_VALUE )
next_state = HAVE_SIGNAL;
else
next_state = NO_SIGNAL;
end HAVE_SIGNAL:
begin
if( (time_cnt_2 == TOTAL_TIME_CNT - ) && j < THRESHOLD_VALUE )
next_state = NO_SIGNAL;
else
next_state = HAVE_SIGNAL;
end endcase
end //-------------------------------------------------------------
  状态机输出信号驱动
reg signal_existence_r;
always @(posedge clk or posedge rst)
begin
if (rst)
begin
signal_existence_r <= 'b0;
end
else
begin case( current_state ) NO_SIGNAL:
begin
signal_existence_r <= 'b0;
end HAVE_SIGNAL:
begin
signal_existence_r <= 'b1;
end endcase end
end assign signal_existence = signal_existence_r; endmodule /* add_force {/signal_detect/clk} -radix hex {1 0ns} {0 50000ps} -repeat_every 100000ps
add_force {/signal_detect/rst} -radix hex {1 0ns} {0 150ns}
add_force {/signal_detect/signal} -radix hex {0 0ns} {1 300ns} {0 400ns} -repeat_every 500ns */

仿真波形:

1.

2.

3.

外同步信号检测---verilog---状态机的更多相关文章

  1. 视频外同步信号研究---fvh

    视频外同步信号研究---fvh 一个时钟周期有两个edge,分别称为:(1)Leading edge=前一个边沿=第一个边沿,对于开始电压是1,那么就是1变成0的时候:对于开始电压是0,那么就是0变成 ...

  2. C# 同步 异步 回调 状态机 async await Demo

    源码 https://gitee.com/s0611163/AsyncAwaitDemo 为什么会研究这个? 我们项目的客户端和服务端通信用的是WCF,我就想,能不能用异步的方式调用WCF服务呢?或者 ...

  3. Verilog状态机使用技巧

    “没有什么难处是通过增加一个状态机不能够解决的,如果不行,那就俩..” 在实现某种功能时,若感觉该功能的各种可能状态间的切换太绕了,此时,增加一个状态机往往能使思路变得清晰,功能的实现也就简单明了了. ...

  4. Verilog状态机

    以1011为例 代码如下: //1011(Meay型) module state1(clk,in,rst_n,out); input clk; input rst_n; input in; outpu ...

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

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

  6. RSync实现文件备份同步详解

    1.rsync简介 rsync是Unix下的一款应用软件,它能同步更新两处计算机的文件与目录,并适当利用差分编码以减少数据传输.rsync中一项与其他大部分类似程序或协议中所未见的重要特性是镜像对每个 ...

  7. linux高级技巧:rsync同步(一个)

    1.rsync基本介绍         rsync这是Unix下的一款应用软件,它能同步更新两处计算机的文件与文件夹,并适当利用差分编码以降低数据传输.rsync中一项与其它大部分类似程序或协议中所未 ...

  8. 160407、java实现多线程同步

    多线程就不说了,很好理解,同步就要说一下了.同步,指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系.所以同步的关键是多个线程对象竞争同一个共享资源. 同步分为外同步和内同步.外同步就是在外 ...

  9. [笔记][FPGA]有限状态机FSM学习笔记(三)

    0. 简介 在数电FPGA中,FSM是一个重要的部分,藉此可以完成一些复杂算法的硬件实现等.其中有关于FSM的写法按照always块的个数来划分,又分为一段式.两段式.三段式状态机.顾名思义,一段式就 ...

随机推荐

  1. 大数据-10-Spark入门之支持向量机SVM分类器

    简介 支持向量机SVM是一种二分类模型.它的基本模型是定义在特征空间上的间隔最大的线性分类器.支持向量机学习方法包含3种模型:线性可分支持向量机.线性支持向量机及非线性支持向量机.当训练数据线性可分时 ...

  2. 数据库和redis的一致性

    之前的讲解,主要是在讲解redis如何支撑海量数据.高并发读写.高可用服务的架构 从这一讲开始,正式开始做业务系统的开发 商品详情页,缓存架构,90%是大量的业务(没有什么级数含量),10%最有级数含 ...

  3. stack-protector-strong

    Improve protection against stack buffer overflows Much like its predecessor, stack-protector, stack- ...

  4. ORA-16019搭建DG设置归档线程参数报错

    #操作描述:搭建DG,主库修改参数log_archive_dest_1线程路径报错 ORA-16019: cannot use LOG_ARCHIVE_DEST_1 with LOG_ARCHIVE_ ...

  5. Buildroot stress-ng Linux系统压力测试

    /********************************************************************** * Buildroot stress-ng Linux系 ...

  6. 【转&改进】Linux MPI 单机配置

    MPI的全称是Message Passing Interface即标准消息传递界面,可以用于并行计算.MPI有多种实现版本,如MPICH, CHIMP以及OPENMPI.这里我们采用MPICH版本. ...

  7. 将Myeclipse非maven项目,导入到IDEA

    # 将Myeclipse非maven项目,导入到IDEA 1. 打开原项目,复制“.classpath”文件路径,在IDEA中打开项目时,选此文件路径 2. 进入项目转换界面,默认一步步完成 3. 导 ...

  8. zzuli2226:神奇的薯条

    题目描述 小明拿了n元钱去买薯条,薯条小份3元,大份7元.现在小明想知道如果只买薯条,自己的钱是否可以刚好花完,请你设计一个程序帮他计算一下. 输入 第一行输入一个整数T,表示实例数量.(1<= ...

  9. java-Integer类

    1.为什么会有基本类型包装类 * 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据. 2.常用操作 * 常用的操作之一:用于基本数据类型与字符串之间的转换. * Intege ...

  10. url参数和字典的相互转化

    目标url:https://www.baidu.com/s?&wd=python&ie=utf-8 将字典转成url参数 使用urllib.parse的urlencode方法,将字典对 ...