《FPGA全程进阶---实战演练》第九章 计数器要注意
2016-01-12 11:11
375 查看
本小节我们来做一个好玩的事情,就是计数器,还记得在做LED自加实验时我们就曾经提到过关于计数器的相关议题,那么这节我们就来讨论讨论。
探讨一下如下的问题:请用verilog记八个数的写法,分析这个可以更好的理解触发器的工作原理。
对应的仿真结果为:
1.计数为9个。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/31/f7e2c5d6801ac8241ec12dcc864ad80c.jpg)
2.计数为8个
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/31/7da25ce190d7009d7d69701b29d11afd.jpg)
3.计数为8个
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/31/fb518de0bcdbf61722d315af68076762.jpg)
4.计数为7个
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/31/7f8dbcdbd6d10da769cf202d5c25c157.jpg)
在else if语句中的判断条件为 cnt < 4’d7或者cnt <4’d8,以cnt < 4’d7为例,当cnt =4’d7显然是不满足条件的,所以利用跳出自加程序,执行else语句,但是cnt = 4’d7也会被打印输出,这是由于时序电路在时钟的节奏下一拍一拍的输出,当时钟上升沿来临时,这时cnt = 4’d7,然后等待下一个时钟沿到来把cnt = 4’d7打入到锁存器里面去,然后再在下一个时钟沿来临将cnt = 4’d0打入。以此类推。
针对上述的四种情况,大家在写一些利用计数器进行分频的程序时,若是精确控时,请注意cnt小于的常数是多少,这一点务必搞清楚。
探讨一下如下的问题:请用verilog记八个数的写法,分析这个可以更好的理解触发器的工作原理。
1. reg [3:0]cnt; always@(posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 4'd0; else if (cnt < 4'd8) cnt <= cnt + 1'b1; else cnt <= 4'd0; end 2. reg [3:0]cnt; always@(posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 4'd0; else if (cnt < 4'd8 - 1) cnt <= cnt + 1'b1; else cnt <= 4'd0; end 3. reg [3:0]cnt; always@(posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 4'd1; else if (cnt < 4'd8 ) cnt <= cnt + 1'b1; else cnt <= 4'd1; end 4. reg [3:0]cnt; always@(posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 4'd1; else if (cnt < 4'd7 ) cnt <= cnt + 1'b1; else cnt <= 4'd1; end
对应的仿真结果为:
1.计数为9个。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/31/f7e2c5d6801ac8241ec12dcc864ad80c.jpg)
2.计数为8个
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/31/7da25ce190d7009d7d69701b29d11afd.jpg)
3.计数为8个
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/31/fb518de0bcdbf61722d315af68076762.jpg)
4.计数为7个
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/31/7f8dbcdbd6d10da769cf202d5c25c157.jpg)
在else if语句中的判断条件为 cnt < 4’d7或者cnt <4’d8,以cnt < 4’d7为例,当cnt =4’d7显然是不满足条件的,所以利用跳出自加程序,执行else语句,但是cnt = 4’d7也会被打印输出,这是由于时序电路在时钟的节奏下一拍一拍的输出,当时钟上升沿来临时,这时cnt = 4’d7,然后等待下一个时钟沿到来把cnt = 4’d7打入到锁存器里面去,然后再在下一个时钟沿来临将cnt = 4’d0打入。以此类推。
针对上述的四种情况,大家在写一些利用计数器进行分频的程序时,若是精确控时,请注意cnt小于的常数是多少,这一点务必搞清楚。
相关文章推荐
- iOS 百思不得姐 项目
- gizp网站压缩
- 读数据库所有表和表结构的sql语句了(mssql)
- 基于jq 滚动条到底加载更多的方法
- git查看本地和创建分支、上传分支、提交代码到分支、删除分支等,git分支
- mysql 索引
- [LeetCode] Combination Sum II, Solution
- [LeetCode] Combinations, Solution
- [LeetCode] Construct Binary Tree from Preorder and Inorder Traversal, Solution
- [LeetCode] Container With Most Water, Solution
- [LeetCode] Convert Sorted List to Binary Search Tree, Solution
- [LeetCode] Count and Say, Solution
- [LeetCode] Decode Ways, Solution
- [FaceBook] Hanoi Moves, Solution
- [Facebook] Products of all elements
- [Google] Inorder Successor in Binary Search Tree, Solution
- [Google] URL query with wild card
- [Yahoo] Cloest palindrome number, Solution
- [LeetCode] Valid Palindrome, Solution
- [LeetCode] Word Ladder II, Solution