计数器,FPGA设计中最常用的设计,然而有些地方需要多加注意。

一、勿要多计

  打算计10下,所以我计数器就写计到10:cnt==10,程序如下所示。

1、设计文件

 module jsq
//========================< 端口 >==========================================
(
input wire clk ,
input wire rst_n ,
input wire en ,
output reg [ :] cnt
);
//========================< 信号 >==========================================
reg en_flag ;
wire add_cnt ;
wire end_cnt ; //========================< 程序 >==========================================
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
en_flag <= ;
end
else if(en) begin
en_flag <= ;
end
else if(end_cnt) begin
en_flag <= ;
end
end always @(posedge clk or negedge rst_n) begin
if(!rst_n)
cnt <= ;
else if(add_cnt) begin
if(end_cnt)
cnt <= ;
else
cnt <= cnt + ;
end
end assign add_cnt = en_flag;
assign end_cnt = add_cnt && cnt== ; //我想计10下 endmodule

2、仿真文件

 `timescale 1ns/1ps  //时间精度
`define Clock //时钟周期 module jsq_tb; //========================< 端口 >==========================================
reg clk ; //时钟,50Mhz
reg rst_n ; //复位,低电平有效
reg en ;
wire [ :] cnt ; //==========================================================================
//== 模块例化
//==========================================================================
jsq u_jsq
(
.clk (clk ),
.rst_n (rst_n ),
.en (en ),
.cnt (cnt )
); //==========================================================================
//== 时钟信号和复位信号
//==========================================================================
initial begin
clk = ;
forever
#(`Clock/) clk = ~clk;
end initial begin
rst_n = ; #(`Clock*+);
rst_n = ;
end //==========================================================================
//== 设计输入信号
//==========================================================================
initial begin
en = ;
#(`Clock*+); //初始化完成
en = ;
#(`Clock*);
en = ;
#(`Clock*);
$stop;
end endmodule

3、Modelsim仿真图像

  观察图像可以看到,计数器 cnt 计到了 cnt==10 这里,可是当我仔细数数时却发现,计数是从 0 开始计的,从 0 到 10,所以实际计了 11 下!和我之前写代码时脑中所想不一致!所以,如果只想计10下,那实际写代码应该写 9 才对。

  总结:计数器想计 n 下,那写代码只能写 cnt==n-1。

二、勿要少记

  数据 data 和数据使能 data_en 同时来,我想数一下到底来了多少个数据。

1、代码设计

 module jsq
(
input wire clk ,
input wire rst_n ,
input wire [ :] data ,
input wire data_en ,
output reg [ :] cnt
); always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt <= ;
end
else if(data_en) begin
cnt <= cnt + ;
end
else begin
cnt <= ;
end
end endmodule

2、仿真设计

 `timescale 1ns/1ps  //时间精度
`define Clock //时钟周期 module jsq_tb; //========================< 端口 >==========================================
reg clk ; //时钟,50Mhz
reg rst_n ; //复位,低电平有效
reg [ :] data ;
reg data_en ;
wire [ :] cnt ; //==========================================================================
//== 模块例化
//==========================================================================
jsq u_jsq
(
.clk (clk ),
.rst_n (rst_n ),
.data (data ),
.data_en (data_en ),
.cnt (cnt )
); //==========================================================================
//== 时钟信号和复位信号
//==========================================================================
initial begin
clk = ;
forever
#(`Clock/) clk = ~clk;
end initial begin
rst_n = ; #(`Clock*+);
rst_n = ;
end //==========================================================================
//== 设计输入信号
//==========================================================================
initial begin
data_en = ;
data = ;
#(`Clock*+); //初始化完成 data_en = ;
data = ;
#(`Clock);
data = ;
#(`Clock);
data = ;
#(`Clock);
data = ;
#(`Clock);
data = ;
#(`Clock);
data = ;
#(`Clock);
data = ;
#(`Clock);
data = ;
#(`Clock);
data = ;
#(`Clock);
data = ;
#(`Clock);
data = ;
data_en = ; #(`Clock*);
$stop;
end endmodule

3、Modelsim仿真图像

  观察图像可以看到,计数器 cnt 计到了 cnt==10 这里,而我的 data_en 确实是维持了 10 个周期的。这种情况下,cnt 计到多少就是多少,第0下是不作数的。如果按照上面的情况,以为真实计数是 10-1=9下,反而是错的了。当然如果其他信号需要用到 cnt来搞事情,那还是需要写 cnt==n-1的,这就又回到上面第一种情况了。

  此外 cnt 较 data_en 延后了一个周期,当 data_en 都拉低了,而后 cnt 才计到 cnt==10,这是时序逻辑的特点,并非出错。

  总结:计数器计算一段波形的持续时间,最终即到 cnt==n,那波形时间就是n,不需要 -1。

Windows状态栏图标显示异常的更多相关文章

  1. Win32项目生成的程序exe图标显示异常的问题

    问题 如图: 用VS2013生成exe执行文件时发现的问题,起初以为是没添加ico图像的最小尺寸,后来查看ico并不是这个问题. Baidu.Google了半天找到原因:文件资源管理器的图标缓存bug ...

  2. PC上图标显示异常 白色框框处理方案

    步骤如下: 1.打开360安全卫士,点击图标显示异常的立即修复 2.修复完,图标就正常了 3.分析原因: 可能是我用了魔方优化大师(TweakerCube)优化了桌面快捷方式(去掉箭头)引起的,而且是 ...

  3. thinkphp使后台的字体图标显示异常

    thinkphp使后台的字体图标显示异常 相似问题 1.thinkPHP的这些图标都不显示了-CSDN论坛https://bbs.csdn.net/topics/391823415 解答: 发现在别的 ...

  4. WIN10图标显示异常

    1.打开控制面板,右上边查看方式选择边小图标显示 2.打开显示里面的自定义缩放级别 3.设置级别为125%  然后点击 应用 4.注销或者重启,然后将异常的快捷方式点击打开,就会恢复正常,至少我的是回 ...

  5. win7记事本txt图标显示异常解决方法

    链接:https://zhidao.baidu.com/question/2076205353435701108.html                                       ...

  6. WIN7下重建图标缓存(解决MFC.exe桌面图标显示异常问题)

    WIN7下重建图标缓存 使用WIN7时,MFC工程生成的应用程序图标,如果更改为自定义的ICON图标之后可能在桌面上显示的依旧是上一次的图标,改个名或换个路径都能恢复正常,说明在WIN7系统下图标的缓 ...

  7. office word excel等图标显示异常

    1.查看注册表:查看参数对应的路径被删除,计算机搜索新的文件路径更改路径即可.以此类推~ 计算机\HKEY_CLASSES_ROOT\Excel.Sheet.12\DefaultIcon 正常exce ...

  8. Windows右下角图标显示不正常

    我的win7系统,右下角图标透明,分不清哪个是哪个.点击也没有任何反应. 解决办法: 点击运行输入cmd,在命令提示符下输入下列命令即可恢复. taskkill /im explorer.exe /f ...

  9. Windows 托盘区域显示图标

    NOTIFYICONDATA structure 这个结构体包含了向通知区域(底部任务栏右下角区域,下面都称为托盘)显示的信息.需要使用函数Shell_NotifyIcon. 结构体成员 typede ...

随机推荐

  1. Git 管理篇(详细)

    新建repository 本地目录下,在命令行里新建一个代码仓库(repository) 里面只有一个README.md 命令如下: touch README.md git init 初始化repos ...

  2. 小胖的奇偶(Viojs1112)题解

    原题: 题目描述 huyichen和xuzhenyi在玩一个游戏:他写一个由0和1组成的序列. huyichen选其中的一段(比如第3位到第5位),问他这段里面有奇数个1 还是偶数个1.xuzheny ...

  3. TypeScript in 5 minutes

    https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html Let’s get started by build ...

  4. python skimage图像处理(二)

    python skimage图像处理(二) This blog is from: https://www.jianshu.com/p/66e6261f0279  图像简单滤波 对图像进行滤波,可以有两 ...

  5. spring-boot 知识集锦

    1.spring-boot项目在外部tomcat环境下部署 https://blog.csdn.net/james_wade63/article/details/51009423 https://bl ...

  6. HTML5的服务器EventSource(server-sent event)发送事件

    参考资料: HTML5的服务器(server-sent event)发送事件有什么应用场景? W3school HTML 5 服务器发送事件 『后台消息推送功能』,前端除了轮询.scoket.第三方服 ...

  7. 使用Faker来随机生成接近真实数据的数据

    在很多场景我们需要造一些假数据或者mock数据,如果我们写死类似[XXXX]类似的无意义的其实不是很优雅,Faker能提供常用的一些名词的随机数据. 1.引入POM: <dependency&g ...

  8. Swift5升级遇到的AVCapturexxxDelegate的坑,写法换了

    升级到swift5之后,遇到关于AVCapture的两个代理都失效了, 找了一圈,发现原因是代理方法写法变了,如果不替换,代理事件就收不到了 解决方法: 替换新写法就可以了 我这边只举例我遇到的两个例 ...

  9. kotlin基础 尾递归

    尾调用的重要性在于它可以不在调用栈上面添加一个新的堆栈帧——而是更新它,如同迭代一般. 尾递归因而具有两个特征: 调用自身函数(Self-called): 计算仅占用常量栈空间(Stack Space ...

  10. sqlserver存储过程创建和java调用

    创建存储过程 CREATE procedure [dbo].[getdata_monitor_city_hour_hb] ), ) OUT as begin SET @test = '失败'; if ...