使用Verilog语言描述计数器——脉动计数器;脉动计数器具有减法计数功能。采用模块设计和行为级设计方法。
使用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语言描述计数器——脉动计数器;脉动计数器具有减法计数功能。采用模块设计和行为级设计方法。相关推荐
- 《数据结构与抽象:Java语言描述(原书第4版)》一2.1.7 删除项的方法
本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,第2.1.7节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timo ...
- 8线-3线编码器的Verilog语言描述
3位二进制编码器的真值表: 直接上代码:用的是case语句 module coder8_3(a,b);input a;output b;wire [7:0] a;reg [2:0] b;always@ ...
- Verilog语言快速入门(一)
组合逻辑的一般模板 时序电路的一般模板 模块总体结构 模块说明 功能描述 1.assign语句 1)算数型 2)逻辑型 3)关系运算符 4) 等价运算符 5)按位运算符 6)缩减运算符 7) 移位 ...
- 对于Verilog语言的一些总结
1.不使用初始化语句: 2.不使用延时语句: 3.不使用循环次数不确定的语句,如:forever,while等: 4.尽量采用同步方式设计电路: 5.尽量采用行为语句完成设计: 6.always过程块 ...
- HDL4SE:软件工程师学习Verilog语言(十四)
14 RISC-V CPU初探 前面我们介绍了verilog语言的基本语法特征,并讨论了数字电路设计中常用的状态机和流水线结构,然后我们借鉴SystemC的做法,引入了HDL4SE建模语言,以及相应的 ...
- Verilog语言实现并行(循环冗余码)CRC校验
1 前言 (1) 什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能, ...
- 模24的8421BCD码计数器(Verilog HDL语言描述)(仿真与综合)
目录 前言 原理 Verilog HDL程序设计 测试代码 仿真波形图 ISE综合后 RTL Schematic Technology Schematic 前言 本博文用Verilog HDL语言描述 ...
- 级联模60计数器(Verilog HDL语言描述)(仿真与综合)
目录 前言 模60计数器 Verilog HDL语言描述 测试文件 仿真波形 RTL Schematic Technology Schematic 前言 看这篇文章前,推荐先看看模10计数器和模6计数 ...
- 模6计数器以及模10计数器(Verilog HDL语言设计)(Modelsim仿真与ISE综合)
目录 前言 模6计数器 Verilog HDL语言描述 测试文件 仿真电路图 RTL Schematic Technology Schematic 模10计数器 Verilog HDL语言描述 测试文 ...
最新文章
- 刚刚,“达摩院2020十大科技趋势”正式发布!
- LA2678最短子序列
- java的23设计模式
- 达内python人工智能19年大纲_2019年想转行人工智能的同学们机会来了
- go 服务器 源码,LollipopGo开源游戏服务器框架--global服务器源码
- 惠新宸php教程_百度PHP高级顾问惠新宸:PHP在百度的发展历程
- Vue 动态数据滚动
- Linux netstat命令详解和使用例子(显示各种网络相关信息)
- 计算机图书管理属于计算机应用中的,计算机在图书管理中应用探究.doc
- 【Elasticsearch】分片未分配 (UNASSIGNED) failed to obtain in-memory shard lock
- base——JRE和JDK的区别【转】
- 命令行方式使用FTP
- (我总结的实用主义)Loadrunner运行常见错误
- Tutorials 使用窗口功能分析信息
- 高中函数知识点太多记不住?一张思维导图教你轻松学习函数
- 手机管家中的黑名单功能
- 机器学习基石1 学习笔记
- PHP格式化数组输出样式
- 深度学习环境搭建(ubuntu16.04+Titan Xp安装显卡驱动+Cuda9.0+cudnn+其他软件)
- Python 打开/关闭其他应用程序方法
热门文章
- fs.aio max nr mysql_MySQL主机该如何配置fs.aio-max-nr
- 山东潍坊计算机二级考试时间,2020年山东潍坊注会什么时候考试?是计算机考试吗?...
- 在C语言中如何取一个数的小数部分?
- 最新数字藏品系统源码一套+价值9000
- 亚马逊卖家怎样让茶叶乘风破浪,远销海外?-跨境创业找众光
- 手机怎么编辑PDF签名?这个方法有掌握吗
- 宋晓丽20190919-1 每周例行报告
- 如何学习python数据分析?
- 入手Blackberry9000
- 回顾艾维在苹果的15款最经典设计:最后一个特别大