关于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;(将输入设为不确定状态)。
作者:宋桓公
出处:http://www.cnblogs.com/douzi2/
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现