外同步信号检测---verilog---状态机
外同步信号检测---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---状态机的更多相关文章
- 视频外同步信号研究---fvh
视频外同步信号研究---fvh 一个时钟周期有两个edge,分别称为:(1)Leading edge=前一个边沿=第一个边沿,对于开始电压是1,那么就是1变成0的时候:对于开始电压是0,那么就是0变成 ...
- C# 同步 异步 回调 状态机 async await Demo
源码 https://gitee.com/s0611163/AsyncAwaitDemo 为什么会研究这个? 我们项目的客户端和服务端通信用的是WCF,我就想,能不能用异步的方式调用WCF服务呢?或者 ...
- Verilog状态机使用技巧
“没有什么难处是通过增加一个状态机不能够解决的,如果不行,那就俩..” 在实现某种功能时,若感觉该功能的各种可能状态间的切换太绕了,此时,增加一个状态机往往能使思路变得清晰,功能的实现也就简单明了了. ...
- Verilog状态机
以1011为例 代码如下: //1011(Meay型) module state1(clk,in,rst_n,out); input clk; input rst_n; input in; outpu ...
- (原创)Verilog三段式状态机
下面以上图一个简单的FSM说明三段式Verilog状态机范式: `timescale 1ns / 1ps module FSM( clk,rst_n, in1,in2, out1,out2, CS,N ...
- RSync实现文件备份同步详解
1.rsync简介 rsync是Unix下的一款应用软件,它能同步更新两处计算机的文件与目录,并适当利用差分编码以减少数据传输.rsync中一项与其他大部分类似程序或协议中所未见的重要特性是镜像对每个 ...
- linux高级技巧:rsync同步(一个)
1.rsync基本介绍 rsync这是Unix下的一款应用软件,它能同步更新两处计算机的文件与文件夹,并适当利用差分编码以降低数据传输.rsync中一项与其它大部分类似程序或协议中所未 ...
- 160407、java实现多线程同步
多线程就不说了,很好理解,同步就要说一下了.同步,指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系.所以同步的关键是多个线程对象竞争同一个共享资源. 同步分为外同步和内同步.外同步就是在外 ...
- [笔记][FPGA]有限状态机FSM学习笔记(三)
0. 简介 在数电FPGA中,FSM是一个重要的部分,藉此可以完成一些复杂算法的硬件实现等.其中有关于FSM的写法按照always块的个数来划分,又分为一段式.两段式.三段式状态机.顾名思义,一段式就 ...
随机推荐
- cxf动态调用外部web service 报告异常java.lang.NoSuchFieldErr
原因:cxf 依赖的xmlschema-core 与axis2-kernel依赖的xmlschema冲突. 解决方法:因为在项目中只用cxf即可,所以删除axis2的依赖.
- 微软Power BI 每月功能更新系列——12月Power BI 新功能学习
Power BI Desktop12月产品功能摘要 Power BI 作为实力宠粉达人每月更新不来点新花样,怎么对得起翘首期待的实力铁粉您嘞!一起来看看这一次的Power BI版本的更新又给我们带来了 ...
- Buildroot lmbench使用方法
/********************************************************************** * Buildroot lmbench使用方法 * 说明 ...
- Linux sort命令详解
linux之sort用法 sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式: sort [-bcfMnrtk][源文件][-o 输出文件] 补充说明:sort可针对文本文件的内容, ...
- scrapt中的数据提取,采用js2xml库
这个一个爬去美团的例子,应为数据都是在script中,小心封ip,尽量少运行. 先导入库几个库 import requests from bs4 import BeautifulSoup from l ...
- qt 内置图标使用
QToolButton *button = new QToolButton(this); button->resize(100,30); button->setToolButtonStyl ...
- jquery选择后代以及toggle,toggleClass用法
$("#id").find(".classname") 选择id为xx下的类名为xx的元素 toggle $(this).next(".c ...
- 能用padding,margin解决的不要使用伪元素,能用背景解决的也不要用伪元素
能用padding,margin解决的不要使用伪元素,能用背景解决的也不要用伪元素
- 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)
邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...
- review
一.123 第二部分:面向对象 . 谈谈你对面向对象的认识. . 约束 Java: - 接口,约子类中必须包含某个方法(约束). Interface IMessage: def func1(self) ...