关于FPGA(verilog)电平检测模块的易错点分析

复制代码
 1 reg F1,F2; // F2 Previous State,   F1 Current  State
 2     always@(posedge CLK or negedge RSTn)
 3         if(!RSTn)
 4             begin
 5                 F1<=1'b0;//(注意复位时F1;F2都是等于0的!)
 6                 F2<=1'b0;
 7             end
 8             else
 9               begin
10                 F1<= A;
11                 F2<= F1;
12               end
13         
14     wire  Aup = F1 & !F2; 
15     wire  Adown = F2 & !F1;    
复制代码

     这个模块可以用来检测A输入口的“上跳变”以及“下跳变”
现在,开始分析:
1、假设:A的默认值,也就是初始值为0;
     第一个时钟来临时,F1=0;F2=0;所以Aup = 0 & 1 = 0;Adown = 0 & 1 =0;的这完全没有问题。

2、假设:A的默认值,也就是初始值为1;
     第一个时钟来临时,F1=1;F2=0;所以Aup = 1 & 1 = 1;Adown = 0 & 0 =0;
这个时候就有问题了,本来在第一个时钟A是没有发生变化的,但是Aup却等于1,被认为有一个上跳变。
这就是,检测模块要注意的问题。这种问题会导致,你发现计数时问什么会“无缘无故”多一个。问题就在这里。

   

    这个问题如何预防呢?首先我们必须搞清楚,我们所检测的这个引脚是默认0还是1.如果是1的话我们应该这么写。

复制代码
 1 reg F1,F2; // F2 Previous State,   F1 Current  State
 2     always@(posedge CLK or negedge RSTn)
 3         if(!RSTn)
 4             begin
 5                 F1<=1'b1;(注意复位时F1;F2都是等于1的!)
 6                 F2<=1'b1;
 7             end
 8             else
 9               begin
10                 F1<= A;
11                 F2<= F1;
12               end
13         
14     wire  Aup = F1 & !F2; 
15     wire  Adown = F2 & !F1;
复制代码

    第一个时钟来临时,F1=1;F2=1;所以Aup = 1 & 0 = 0;Adown = 1 & 0 =0;的这样就没有问题了。

         

      总结:这个检测模块容易出问题的地方就是在第一个时钟的时候,但是如果搞清楚检测引脚的初始状态,我们根据这个状态来选择这个模块的写法就不会出问题。
      当然如果这个检测引脚既不是高电平也不是低电平,也就是高组态。那么两种写法都可以
咯。因此,我们反方思维一下,如果我们写测试文件(产生激励信号)时,不清楚应该个输入赋什么值的时候,
这样写就是一个不错的选择——A <= 1'bz;(将输入设为不确定状态)。

 

 

 

posted @   宋桓公  阅读(2081)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示