若计数器由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实现的更多相关文章

  1. 从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(转载)

    从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理 1.前言   在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法, ...

  2. DRAM的原理设计

    在一个电子系统中,CPU.内存.物理存储.IO这些单元必不可少,只不过有的集成在CPU内部,有的分离出来. 这里就针对系统中的内存,此处选用DRAM来进行说明,讲述下基本的原理设计,主要分为以下几个部 ...

  3. 从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理

    从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理 作者:naaoveGI…    文章来源:naaoveGIS    点击数:1145    更新时间: ...

  4. 从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图

    从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图 作者:naaoveGI…    文章来源:naaoveGIS    点击数:2063    更 ...

  5. 从底层谈WebGIS 原理设计与实现(四):WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图

    从底层谈WebGIS 原理设计与实现(四):WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图 作者:naaoveGI…    文章来源:naaoveGIS    点击数:1759    更 ...

  6. 从底层谈WebGIS 原理设计与实现(二):探究本质,WebGIS前端地图显示之地图比例尺换算原理

    从底层谈WebGIS 原理设计与实现(二):探究本质,WebGIS前端地图显示之地图比例尺换算原理 作者:naaoveGI…    文章来源:http://www.cnblogs.com/naaove ...

  7. 从底层谈WebGIS 原理设计与实现(一):开篇

    从底层谈WebGIS 原理设计与实现(一):开篇 作者:naaoveGI…    文章来源:http://www.cnblogs.com/naaoveGIS/    点击数:4773    更新时间: ...

  8. Atitit.字节数组转字符串 base64 base16 Quoted-printable 编码原理设计 attilax 总结

    Atitit.字节数组转字符串 base64 base16 Quoted-printable 编码原理设计 attilax 总结 1. Base64编码, 1 2. Base64实现转换原理1 3.  ...

  9. SpringMVC 原理 - 设计原理、启动过程、请求处理详细解读

    SpringMVC 原理 - 设计原理.启动过程.请求处理详细解读 目录 一. 设计原理 二. 启动过程 三. 请求处理 一. 设计原理 Servlet 规范 SpringMVC 是基于 Servle ...

随机推荐

  1. Delphi调用爷爷类的方法(自己构建一个procedure of Object)

    Delphi通过inherited 可以调用父类的方法,但是没有提供直接调用父类的父类的方法(爷爷类),通过变通的方式实现如下: 假设父类是TFather,爷爷类TGrand,调用爷爷类的Write方 ...

  2. Rediskey生命周期管理-key聚合

    | 导语 Redis中的数据以k-v的方式组织:为了方便管理key一般具有某些特定的模式:有些key直接是由mysql中的表行数据转化而来:如果要对Redis的key进行生命周期管理,由于Redis的 ...

  3. [高清] Excel函数速记手册

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...

  4. JavaNetty

    Netty的简单使用: import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import io.netty.ch ...

  5. “SQL Server does not exist or access denied.”

    Have resolved the problem, the Port was different and so the Connection String now reads: <connec ...

  6. HttpClinet工具类

    一.URL调用 忽略https证书 1.调用 InputStream in = null; try { URL url = new URL( "url地址" ); IgnoreSS ...

  7. vue应用难点总结

    一.父子组件生命周期 父组件create->子组件create->子组件mounted->父组件mounted 当一个钩子函数使用了异步请求时,并不会等该钩子函数中所有异步的回调都执 ...

  8. c#测量字体宽度

    Bitmap image_size = * count, f.Height);//初始化大小 Graphics size_g = Graphics.FromImage(image_size); Siz ...

  9. 计算机网络原理,TCP&UDP

    UDP伪首部:计算校验和时会用到,然后实际传输过程中里包含的IP地址没有什么用. UDP校验和计算:求数值之和,如果溢出回卷,最后求出反码;UDP伪首部,UDP首部,应用层数据相加 tcp报文,最短2 ...

  10. jqGrid行编辑配置,方法,事件

    行编辑可以在行修改后更新数据,如下图所示 用户用鼠标点击选择一行,jqGrid将可编辑的字段转换为数据输入单元,如上面图所示.不可编辑的列,如id,不会转为可输入单元,而是保持不变.可以通过配置col ...