使用Verilog语言描述计数器——脉动计数器。

内容说明:

本次设计的计数器属于脉动计数器。使用Verilog语言设计,并且设计方法采用模块设计和简单的行为级设计。会有这两种设计的对比测试。最后,会有对这次设计计数器过程中的一些小心得。

计数器

什么是计数器?

计数是一种最简单基本的运算。计数器就是实现这种运算的逻辑电路。计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能,同时兼有分频功能。(百度)

自己对计数器的理解。

计数器就是一个简简单单具有计数功能的模块(module)。不过,这个原理简单的计数模块在芯片和计算机中却是不可或缺的部分。计数器虽然是对脉冲个数进行计数,但是如果把脉冲个数进行某种运算,而且这种运算可以具有某种含义,那么“计数”便可以统计“某种关键量”的次数(数量)。

计数器分类:

按照触发条件:同步计数器和异步计数器。
按照功能:加法计数器、减法计数器,移位计数器、可以记录固定数值的计数器。
本次设计的脉动计数器属于减法计数器。

脉动计数器

脉动计数器是由4个T触发器组成的计数模块。具体逻辑图如图1

图1:脉动计数器逻辑图

设计思想:

这次设计给出了电路的逻辑图。在这个图中,我们可以看出需要调用4个T触发器,用时钟信号和复位信号把4个T触发器连接起来,4个T触发器的输出组成了最终的输出结果。需要先设计出T触发器,一个T触发器是由一个D触发器和一个非门构成,而D触发器之前设计过。这样设计逻辑就很简单了,先设计D触发器,之后和非门组成T触发器,最后构成脉动计数器。
这次的设计方面继续采用模块化设计。

设计代码:

D触发器设计代码:
这个D触发器功能比较完善,具有复位、置数功能。

module dff (clk,rst,load,d,q);
input   clk,rst,load;
input   d;
output  q;
reg q;always @ (posedge clk or negedge rst or negedge load)if(!rst)q<=0;else if (!load)q<=1;elseq<=d;endmodule

T触发器设计代码:

module   tff (clk,rst,q);
input   clk,rst;
output  q;
//wire  a;
//not (a,q);
//dff u1 (clk,rst,1'b1,a,q);
dff u1 (clk,rst,1'b1,~q,q);endmodule

T触发器设计时,可以有两种想法。一种是如同注释一样,调用一个非门;另一种是在模块调用总直接取非。两种各自选取。
注:在dff u1 (clk,rst,1'b1,~q,q);中,1'b1不可偷懒写成1。因为,前者代表1位二进制的1;后者代表十进制的1,具体几位看自己的计算机,一般是32位。在赋值的时候,有时会忽略数字的位数和进制,这样只要你自己可以理解不出错误,都可以(开心就好)。但是模块调用是“很严肃”的事情,这样“无所谓”会让模块调用(实例化)出现问题。

顶层模块设计代码:

module counter (clk,rst,q);
input       clk,rst;
output  [3:0]   q;
tff u1 (.clk(clk),.rst(rst),.q(q[0]));
tff u2 (.clk(q[0]),.rst(rst),.q(q[1]));
tff u3 (.clk(q[1]),.rst(rst),.q(q[2]));
tff u4 (.clk(q[2]),.rst(rst),.q(q[3]));
endmodule

在使用模块设计之后,使用行为级编写一个简单的计数器,功能和上面设计的脉动计数器一样。不过,代码长度和难度完全不一样。
代码如下:

module counter_1 (clk,rst,q);
input       clk,rst;
output  [3:0]   q;
reg [3:0]   q;
always @ (posedge clk or negedge rst)
beginif(!rst)q<=0;elseq<=q-1;
end
endmodule

测试代码:

module counter_tb;
reg     clk,rst;
wire    [3:0]   q1,q2;
counter   t1 (clk,rst,q1);
counter_1 t2 (clk,rst,q2);
initial
beginclk=0;rst=0;
#10 rst=1;
#50 rst=0;
#10 rst=1;
#200    rst=0;
#10 $stop;
#10 $finish;
endalways   #6 clk=~clk;endmodule

运行结果:

两中不同设计方法的计数器测试结果如图2所示。
十进制输出结果如图3所示。
异步复位部分如图4所示。

图2:两中不同设计方法的计数器测试结果
注:图上显示的数值是把二进制转换为了无符号的数值。就是输出没有负数。但是如果改变输出数值的格式,比如改成十进制,结果如图3所示。

图3:十进制输出结果
对于为什么会有-8后面是7这个现象的解释。

可以这样理解,0000减1,但是减不了。向“远方”借1,最后变成了1111。这种理解方式只是让你“强行”明白减法。这里的标准回答是补码,十进制中的4位二进制数中规定最高一位是标志位。“1”表示负数;“0”表示正数。有关补码的知识之后再说。
这样也可以解释(-8)的下一位为什么是(7)。


图4:异步复位部分
可以看出异步复位不需要等待时钟的到来,就可以把输出结果复位(置零)。但是新的输出的出现需要等待时钟。

总结

本次主要介绍计数器和如何使用Verilog编写一个计数器。两种设计方法的区别,使用分模块(复杂)设计可以控制模块内部功能,自主性强一些,通过修改内部代码可以实现功能的“微调”;但是编写代码难度加大,对设计者素质要求高。使用行为级(容易)设计最大的优点简单、方便;同时缺点无法做到“窥看”内部。

预告

其他计数器的设计。计数器也有新花样。

感想

不入其行,不知其难。
入了其行,方知世界之大!!!

使用Verilog语言描述计数器——脉动计数器;脉动计数器具有减法计数功能。采用模块设计和行为级设计方法。相关推荐

  1. 《数据结构与抽象:Java语言描述(原书第4版)》一2.1.7 删除项的方法

    本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,第2.1.7节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timo ...

  2. 8线-3线编码器的Verilog语言描述

    3位二进制编码器的真值表: 直接上代码:用的是case语句 module coder8_3(a,b);input a;output b;wire [7:0] a;reg [2:0] b;always@ ...

  3. Verilog语言快速入门(一)

    组合逻辑的一般模板 时序电路的一般模板 模块总体结构 模块说明 功能描述 1.assign语句   1)算数型 2)逻辑型 3)关系运算符 4) 等价运算符 5)按位运算符 6)缩减运算符 7) 移位 ...

  4. 对于Verilog语言的一些总结

    1.不使用初始化语句: 2.不使用延时语句: 3.不使用循环次数不确定的语句,如:forever,while等: 4.尽量采用同步方式设计电路: 5.尽量采用行为语句完成设计: 6.always过程块 ...

  5. HDL4SE:软件工程师学习Verilog语言(十四)

    14 RISC-V CPU初探 前面我们介绍了verilog语言的基本语法特征,并讨论了数字电路设计中常用的状态机和流水线结构,然后我们借鉴SystemC的做法,引入了HDL4SE建模语言,以及相应的 ...

  6. Verilog语言实现并行(循环冗余码)CRC校验

    1 前言 (1)    什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能, ...

  7. 模24的8421BCD码计数器(Verilog HDL语言描述)(仿真与综合)

    目录 前言 原理 Verilog HDL程序设计 测试代码 仿真波形图 ISE综合后 RTL Schematic Technology Schematic 前言 本博文用Verilog HDL语言描述 ...

  8. 级联模60计数器(Verilog HDL语言描述)(仿真与综合)

    目录 前言 模60计数器 Verilog HDL语言描述 测试文件 仿真波形 RTL Schematic Technology Schematic 前言 看这篇文章前,推荐先看看模10计数器和模6计数 ...

  9. 模6计数器以及模10计数器(Verilog HDL语言设计)(Modelsim仿真与ISE综合)

    目录 前言 模6计数器 Verilog HDL语言描述 测试文件 仿真电路图 RTL Schematic Technology Schematic 模10计数器 Verilog HDL语言描述 测试文 ...

最新文章

  1. 刚刚,“达摩院2020十大科技趋势”正式发布!
  2. LA2678最短子序列
  3. java的23设计模式
  4. 达内python人工智能19年大纲_2019年想转行人工智能的同学们机会来了
  5. go 服务器 源码,LollipopGo开源游戏服务器框架--global服务器源码
  6. 惠新宸php教程_百度PHP高级顾问惠新宸:PHP在百度的发展历程
  7. Vue 动态数据滚动
  8. Linux netstat命令详解和使用例子(显示各种网络相关信息)
  9. 计算机图书管理属于计算机应用中的,计算机在图书管理中应用探究.doc
  10. 【Elasticsearch】分片未分配 (UNASSIGNED) failed to obtain in-memory shard lock
  11. base——JRE和JDK的区别【转】
  12. 命令行方式使用FTP
  13. (我总结的实用主义)Loadrunner运行常见错误
  14. Tutorials 使用窗口功能分析信息
  15. 高中函数知识点太多记不住?一张思维导图教你轻松学习函数
  16. 手机管家中的黑名单功能
  17. 机器学习基石1 学习笔记
  18. PHP格式化数组输出样式
  19. 深度学习环境搭建(ubuntu16.04+Titan Xp安装显卡驱动+Cuda9.0+cudnn+其他软件)
  20. Python 打开/关闭其他应用程序方法

热门文章

  1. fs.aio max nr mysql_MySQL主机该如何配置fs.aio-max-nr
  2. 山东潍坊计算机二级考试时间,2020年山东潍坊注会什么时候考试?是计算机考试吗?...
  3. 在C语言中如何取一个数的小数部分?
  4. 最新数字藏品系统源码一套+价值9000
  5. 亚马逊卖家怎样让茶叶乘风破浪,远销海外?-跨境创业找众光
  6. 手机怎么编辑PDF签名?这个方法有掌握吗
  7. 宋晓丽20190919-1 每周例行报告
  8. 如何学习python数据分析?
  9. 入手Blackberry9000
  10. 回顾艾维在苹果的15款最经典设计:最后一个特别大