计数器的原理,设计及verilog实现
若计数器由n个触发器组成,则计数器的位数为n,所能计数的最大模数为2的n次幂。以下为同步二进制加法计数器电路;

驱动方程:
状态图
状态方程(此时的Q0,Q1为上一次状态值):

下例是同步4位2进制计数器的设计:该计数器具有异步清零,同步置数的功能,具有时钟端:clk;置数端:s;清零端:r;使能端:en;置数端: d[3:0];输出端:q [3:0];进位端:co。

module counter(clk,co,q,r,s,en,d);
input clk,r,s,en; // 时钟,清零端,置数端,使能端
input[3:0] d; // 置数输入端
output co; // 进位端
output[3:0] q; // 计数输出端
reg[3:0] q; //4 位的计数寄存器
reg co; //1 位进位寄存器
always@(posedge clk) // 时钟上升沿触发
if(r) // 判断清零端是否为 1
begin q=0;end // 是的话把计数寄存器清 0
else
begin
if(s) // 判断置数端是否为 1
begin q=d;end// 是的话把置数输入端的值赋予计数寄存器
else
if(en) // 判断使能端是否为 1
begin
q=q+4'b1; // 是的话 q 自加 1
if(q==4'b1111) // 判断 q 是否计满
begin co=1;end // 是的话进位端置 1
else
begin co=0;end // 否的话进位端置 0
end
else
begin q=q;end // q 保持原值
end
endmodule
时序仿真图:

在编程时关于阻塞赋值和非阻塞赋值注意点:
1.阻塞赋值操作用“=”,阻塞是指在在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是后面的语句必须等到当前的赋值语句执行完毕才能执行。赋值时实时的,计算完后面的马上赋值给左边的,然后再执行下一句,操作是串行的,且在一个always内完成。从理论上讲,它与后面的赋值语句只有概念上的先后,而无实质上的延迟。
always@(posedge clk)
begin
x=next_x;
y=x;
end
当执行”x=next_x“,x会立即到next_x,而下一句y=x之后执行,由于两条语句没有延迟(为导线),导致”y=next_x”。
2.非阻塞赋值用<=表示,非阻塞是指在进程语句中,当前的赋值不会阻断其后的语句,在进入进城后,所有的非阻塞语句同时赋值。

当执行“x<=next_x”时,并不会阻断“y<=x”的执行。因此语句”y<=x”中的x的值与语句“x<=next_x”的值不同,语句”x<=next_x”中的x的值是D触发器经过一个同步脉冲后的输出值,“y<=x”的x是第一个D触发器的初值。
综上总结即是:阻塞赋值是按需执行,非阻塞赋值是并行执行。
在verilog编程中,谨记以下八条原则:
1) 时序电路建模时,用非阻塞赋值。
2) 锁存器电路建模时,用非阻塞赋值。
3) 用always块建立组合逻辑模型时,用阻塞赋值。
4) 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。
5) 在同一个always块中不要既用非阻塞赋值又用阻塞赋值。
6) 不要在一个以上的always块中为同一个变量赋值。
7) 用$strobe系统任务来显示用非阻塞赋值的变量值
8) 在赋值时不要使用 #0 延迟
Tips:1.在always块内部的每一个信号都必须定义成寄存器类型;
2.if else的使用
if (表达式1)语句1;
else if (表达式2)语句2;
else if (表达式3)语句3;
….
else 语句n;
3.在每个always块里,必须要有begin…end。其他如if…else,case的分支语句,超过一句的也都要有begin…end.
计数器的原理,设计及verilog实现的更多相关文章
- 从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(转载)
从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理 1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法, ...
- DRAM的原理设计
在一个电子系统中,CPU.内存.物理存储.IO这些单元必不可少,只不过有的集成在CPU内部,有的分离出来. 这里就针对系统中的内存,此处选用DRAM来进行说明,讲述下基本的原理设计,主要分为以下几个部 ...
- 从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理
从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理 作者:naaoveGI… 文章来源:naaoveGIS 点击数:1145 更新时间: ...
- 从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图
从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图 作者:naaoveGI… 文章来源:naaoveGIS 点击数:2063 更 ...
- 从底层谈WebGIS 原理设计与实现(四):WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图
从底层谈WebGIS 原理设计与实现(四):WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图 作者:naaoveGI… 文章来源:naaoveGIS 点击数:1759 更 ...
- 从底层谈WebGIS 原理设计与实现(二):探究本质,WebGIS前端地图显示之地图比例尺换算原理
从底层谈WebGIS 原理设计与实现(二):探究本质,WebGIS前端地图显示之地图比例尺换算原理 作者:naaoveGI… 文章来源:http://www.cnblogs.com/naaove ...
- 从底层谈WebGIS 原理设计与实现(一):开篇
从底层谈WebGIS 原理设计与实现(一):开篇 作者:naaoveGI… 文章来源:http://www.cnblogs.com/naaoveGIS/ 点击数:4773 更新时间: ...
- Atitit.字节数组转字符串 base64 base16 Quoted-printable 编码原理设计 attilax 总结
Atitit.字节数组转字符串 base64 base16 Quoted-printable 编码原理设计 attilax 总结 1. Base64编码, 1 2. Base64实现转换原理1 3. ...
- SpringMVC 原理 - 设计原理、启动过程、请求处理详细解读
SpringMVC 原理 - 设计原理.启动过程.请求处理详细解读 目录 一. 设计原理 二. 启动过程 三. 请求处理 一. 设计原理 Servlet 规范 SpringMVC 是基于 Servle ...
随机推荐
- eclipse 无法启动,JAVA_HOME 失效
主要是因为JDK和eclipse 版本不兼容导致的,4位jdk配64位eclipse,32位jdk配32位eclipse; Java 设置JAVA_HOME无效 其根本原因是%JAVA_HOME%在p ...
- java之hibernate之组件映射
1.在开发中,有的类信息比较复杂,而且某几个信息可以组成某一个部分,这个时候可以采用组件映射,组件映射是一张表映射到多个类.表结构 2.类的设计 Link.java public class Link ...
- javascript原型链[图]
- JavaScript常用数组操作方法,包含ES6方法
一.concat() concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,仅会返回被连接数组的一个副本. var arr1 = [1,2,3]; var arr2 = [4,5]; ...
- requests爬虫get请求
1.简单get请求 url = 'https://www.baidu.com' headers = { 'accept': 'text/html,application/xhtml+xml,appli ...
- redis 异常 MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. 解决方 ...
- ScheduledExecutorService周期性的定时任务
从j2se的api文档上查看ScheduledExecutorService的方法都是推迟一段时间然后相隔一段时间之后再去执行,没有想Timer定时器一样的可以在定点时间执行的api,如果也想像Tim ...
- c# Group类
- Kali下进行局域网断网攻击
今天我就来演示一下在kali下的局域网断网攻击,即ARP地址欺骗,下图所要用到的arp地址欺骗状态图: 则: 第一步:假设主机A访问某网站,那么要告知某网站我的IP和MAC地址,但这是以广播的方式告知 ...
- sqlserver 排序
sqlserver中有几种排序的方式 1.order by asc||desc [默认值升序(asc).降序:desc] 列:select * from tb order by id 2.ROW_N ...