外同步信号检测---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块的个数来划分,又分为一段式.两段式.三段式状态机.顾名思义,一段式就 ...
随机推荐
- python day04 作业答案
1. 1) li=['alex','WuSir','ritian','barry','wenzhou'] print(len(li)) 2) li=['alex','WuSir','ritian',' ...
- phpcms 新建模块安装
1.安装配置---小问题: 估计就我这么傻 T-T ,改成自己的目录名. 2.模块的目录: 模块存放在modules文件夹里,打开这个文件夹,里面的一个文件夹代表一个模块. 3.建立模块以及其基本目 ...
- Spring Boot 揭秘与实战 源码分析 - 工作原理剖析
文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...
- Ubuntu16.04安装OpenCV3.2以及PCL1.8
最近在学习slam14讲,需要配置一些环境<视觉slam十四讲> 这本书中已经给出如何配置相关环境的比较详细的说明,但是有些环境并无卵用,比如OpenCV以及PCL 这里给出自己屡试不爽的 ...
- gurnt js css 压缩合并
package.json 文件 { "name":"my-project-name", "version":"0.0.1" ...
- python 加密 hashlib与hmac模块
https://www.jb51.net/article/128911.htm hashlib模块简介: hashlib模块为不同的安全哈希/安全散列(Secure Hash Algorithm)和 ...
- inner join 与一般笛卡尔积的区别
inner join 与一般笛卡尔积的区别:inner join是笛卡尔积的特殊形式.如果有表a和表b,表a有m条记录,表b有n条记录,则一般笛卡尔积后得到的记录条数是m*n条,记录之间的组合是随意的 ...
- 同一个页面引用不同版本jquery库
(如有打扰,请忽略)阿里云ECS大羊群,2U4G低至1.4折,限实名新用户,需要的点吧https://promotion.aliyun.com/ntms/act/vm/aliyun-group/tea ...
- PostgreSQL的配置文件
PostgreSQL的配置文件主要有如下3个(postgresql.conf,pg_hba.conf,pg_ident.conf)可以通过如下方式查找:postgres=# select name, ...
- js中将一个字一个字的打印出来
第一种方式: setTimeout(function(){ var cc=document.createTextNode(ss[i]) content.appendChild(cc) },3000)