定时/计数器

功能:
具有计数和定时两个功能。
1)计数方式下可以对输入的外部脉冲进行计数,当计数到初值寄存器的值的时候,设置状态寄存器的相应位。
2)定时方式下,在时钟作用下计时器做减1,到1的时候设置状态寄存器的相应位,并在相应的COUT脚输出一个时钟的低电平(平时COUT是高电平)。
3)状态寄存器在被读取后被清零。

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2016/12/01 15:05:19
// Design Name:
// Module Name: CNT0
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module CNT0(
rdata,wdata,CS,CLK,Reset,pulse0,address,IOW,IOR,COUT0,timing,counting,COUT2);
input[31:0] wdata;//cpu写数据
input[31:0] address;//端口地址
input CS,CLK,Reset,pulse0,IOW,IOR,timing,counting;//片选端,时钟端,复位信号,外部脉冲信号,写信号,读信号,计时控制信号,计数控制信号
output [31:0] rdata;//cpu读数据
output COUT0;//定时/计数器输出
output [31:0] COUT2;//计数测试reg[31:0] ms;//方式/状态寄存器
reg[31:0] ini;//初值寄存器
reg[31:0] rda;//rdata的驱动寄存器
reg COU;//COUT0的驱动寄存器
reg[31:0] COU2;//COUT2的驱动寄存器
integer count0;//计数值
integer count1;//计时器初值
integer count2;//用来测试计数是否正常工作,最后删除掉
assign rdata=rda;//驱动
assign COUT0=COU;
assign COUT2=COU2;initialbegincount0=0;//用于计数endalways @(posedge CLK)
begin
if(CS)
beginif(Reset)beginms[31:0]=0;ini[31:0]=0;count0=0;count1=0;count2=0;endif(IOW)//CPU写数据
beginif(address[7:0]==8'b0010_0000) ms=wdata;//CPU写方式寄存器,CNT1此处应该是22else if(address[7:0]==8'b0010_0100) beginini=wdata;//CPU写初值寄存器,CNT1此处应该是26count1=ini;//count1用来备份初值寄存器的值end
endif(IOR)//CPU读数据
beginif(address[7:0]==8'b0010_0000)beginrda=ms;//CPU读状态寄存器,CNT1此处应该是22ms[3:2]=2'b00;//状态寄存器读取后清零ms[15]=0;COU2=count2;endelse if(address[7:0]==8'b0010_0100) rda=ini;//CPU读初值寄存器,CNT1此处应该是26
endif(timing)//计时
beginif({ms[1],ms[0]}==2'b00)//读方式寄存器,非循环定时beginms[15]=1;//写状态寄存器,定时开始if(ini==1)//初值寄存器减到1,定时结束beginms[15]=0;//定时结束ms[3:2]=2'b01;//定时到COU=0;//定时到输出一个低电平endelse if(ini>1)//尚未定时到beginini=ini-1;//初值减1COU=1;//平时输出高电平endelse COU=1;end    else if({ms[1],ms[0]==2'b10})//循环定时beginms[15]=1;//写状态寄存器,定时开始if(ini==1)//初值寄存器减到1,定时到beginms[3:2]=2'b01;ini=count1;//count1保存的初值再赋值给ini寄存器COU=0;//定时到输出一个低电平endelse if(ini==count1-1)beginms[3:2]=2'b00;//清除定时到ini=ini-1;COU=1'b1;endelsebeginini=ini-1;COU=1;//平时输出高电平endend
end
else begin COU=1;ms[15]=0;//没有处在计时的状态endif(counting && pulse0)//计数
beginif({ms[1],ms[0]}==2'b01)beginms[15]=1;//计数开始beginif(count0==ini)//计数值等于初值beginms[15]=0;//计数结束ms[3:2]=2'b10;//设置状态寄存器,计数到endelse begincount0=count0+1;//计数count2=count2+1;//测试endendend else if({ms[1],ms[0]}==2'b11)//循环计数beginms[15]=1;//计数开始if(count0==ini)//计数值等于初值beginms[3:2]=2'b10;//设置状态寄存器,计数到count0=1;//循环,重置计数值寄存器count2=count2+1;//测试endelse if(count0==0)begin ms[3:2]=2'b00;//清除状态寄存器count0=count0+1;count2=count2+1;//测试endelse begin count0=count0+1;//计数count2=count2+1;//测试endend
end else ms[15]=0;//没有处在计数的状态ms[15]为0,COUNTING
end//CS
end//always
endmodule

顶层文件

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2016/12/03 17:03:20
// Design Name:
// Module Name: timepiece
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module timepiece(
rdata,wdata,CS,CLK,Reset,pulse0,address,IOW,IOR,COUT0,timing,counting,COUT2);
input[31:0] wdata;//cpu写数据
input[31:0] address;//端口地址
input CS,CLK,Reset,pulse0,IOW,IOR,timing,counting;//片选端,时钟端,复位信号,外部脉冲信号,写信号,读信号
output[31:0] rdata;//cpu读数据
output COUT0;//定时/计数器输出
output[31:0] COUT2;//计数测试CNT0 U0(.rdata(rdata),.wdata(wdata),.CS(CS),.CLK(CLK),.Reset(Reset),.pulse0(pulse0),.address(address),.IOW(IOW),.IOR(IOR),.COUT0(COUT0),.timing(timing),.counting(counting),.COUT2(COUT2)
);
endmodule

仿真文件

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2016/12/03 17:13:25
// Design Name:
// Module Name: timepiece_sim
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module timepiece_sim();
//input wdata,CS,CLK,Reset,pulse0,address,IOW,IOR
reg CLK=1;
reg [31:0] wdata=0;
reg CS=0;
reg Reset=0;
reg pulse0=1;
reg [31:0] address=0;
reg IOW=0;
reg IOR=0;
reg timing=0;
reg counting=0;//output rdata,COUT0
wire [31:0] rdata;
wire COUT0;
wire [31:0] COUT2;timepiece uut(
//input wdata,CS,CLK,Reset,pulse0,address,IOW,IOR
//output rdata,COUT0.CLK(CLK),.CS(CS),.wdata(wdata),.Reset(Reset),.pulse0(pulse0),.address(address),.IOW(IOW),.IOR(IOR),.rdata(rdata),.COUT0(COUT0),.timing(timing),.counting(counting),.COUT2(COUT2)
);initialbegin#100 CS=1;//非循环定时,2个clock输出一个时钟低电平#10 address[31:0]=8'hFFFF_FC24;//写初值寄存器#10 wdata[31:0]=8'h0000_0003;#10 IOW=1;#10 IOW=0;#10 address=8'hFFFF_FC20;//写方式寄存器#10 wdata=8'h0000_0000;#10 IOW=1;#10 IOW=0;#10 timing=1;//循环定时,2个clock输出一个时钟低电平,输出5个#30 timing=0; #10 address=8'hFFFF_FC24;//写初值寄存器#10 wdata=8'h0000_0003;#10 IOW=1;#10 IOW=0;#10 address=8'hFFFF_FC20;//写方式寄存器#10 wdata=8'h0000_0003;#10 IOW=1;#10 IOW=0;#10 timing=1;//非循环计数,5个pulse0#150 timing=0;#10 address=8'hFFFF_FC24;//写初值寄存器#10 wdata=8'h0000_0005;#10 IOW=1;#10 IOW=0;#10 address=8'hFFFF_FC20;//写方式寄存器#10 wdata=8'h0000_0001;#10 IOW=1;#10 IOW=0;#10 counting=1;#10 address=8'hFFFF_FC20;//读状态寄存器#100 counting=0;#10 IOR=1;#10 IOR=0;//循环计数,每次2个pulse0,跑5次#10 Reset=1;//Reset#10 Reset=0;#10 address=8'hFFFF_FC24;//写初值寄存器#10 wdata=8'h0000_0002;#10 IOW=1;#10 IOW=0;#10 address=8'hFFFF_FC20;//写方式寄存器#10 wdata=8'h0000_0003;#10 IOW=1;#10 IOW=0;#10 counting=1;#10 address=8'hFFFF_FC20;//读状态寄存器#190 counting=0;#10 IOR=1;#10 IOR=0;endalways #5 CLK = ~CLK;always #10 pulse0=~pulse0;endmodule

状态/方式寄存器

15

3

2

1

0

定时/计数(状态)

计数到(状态)

定时到(状态)

循环/非循环(方式)

定时/计数(方式)

注意事项:

1)不同的register不能在不同的always语句块中重复赋值。

2)always以及initial语句块不能嵌套。

3)仿真文件中的延时是相邻两句之间的延时。

定时/计数器的verilog代码相关推荐

  1. 两位十进制递增/递减计数器的Verilog代码

    1.一般利用按键或者拨码开关实现递增/递减控制,该计数器可以写成CNT<=CNT+2*K-1,当K=1时,CNT<=CNT+1,为递增计数,否则为递减计数. 2.递增计数到99时需要回0, ...

  2. 七种计数器总结(格雷码计数器、环形计数器、约翰逊计数器、FLSR、简易时分秒数字秒表|verilog代码|Testbench|仿真结果)

    七种计数器总结 一.可复位/置数计数器 1.1 可复位/置数计数器 1.2 Verilog代码 1.3 Testbench 1.4 仿真结果 二.双向(可加可减)计数器 2.1 双向(可加可减)计数器 ...

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

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

  4. 定时/计数器(定时和计数的功能)、定时器中断

    定时/计数器实现功能: (1)定时功能: 定时/计数器说明(最高单次计时时间是71毫秒=65535*1.085us,1.085us是机器周期): 使用51定时/计数器步骤: 定时/计算器控制寄存器: ...

  5. 网页版的svn怎样同步代码_学会使用Hdlbits网页版Verilog代码仿真验证平台

    大家推荐一款网页版的 Verilog代码编辑仿真验证平台,这个平台是国外的一家开源FPGA学习网站,通过 "https://hdlbits.01xz.net/wiki/Main_Page&q ...

  6. [芯片] 2、接口技术·实验二·定时/计数器8253

    目录 一.实验目的和要求 二.实验原理与背景 三.实验具体的内容 3-1.计数器方式0实验 3-2.计数器方式3实验 3-3.计数器级联实验 四.实验的代码说明 4-1.计数器方式0实验代码及说明 4 ...

  7. 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)

    移位寄存器总结 一.前言 二.简单循环左移/右移/双向移位寄存器 2.1 简单循环左移/右移/双向移位寄存器 2.2 verilog代码 2.3 Testbench 2.4 仿真结果 三.逻辑移位与算 ...

  8. 单片机实验七 NE555脉冲发生器实验(定时/计数器)

    实验七 NE555脉冲发生器实验(定时/计数器) 一.实验目的 1.熟悉实验软件和硬件,进行正确的接线: 2.1602显示脉冲频率,调节电位器可改变频率. 二.实验软硬件 1.Keil uVision ...

  9. 学会使用Hdlbits网页版Verilog代码仿真验证平台

    大家推荐一款网页版的 Verilog代码编辑仿真验证平台,这个平台是国外的一家开源FPGA学习网站,通过 "https://hdlbits.01xz.net/wiki/Main_Page&q ...

最新文章

  1. Oracle - 行转列, 列转行
  2. android 覆盖安装问题
  3. CodeForces - 1550E Stringforces(二分+状压dp)
  4. 由“美图秀秀”软件的网站,看网站的生存模式
  5. 以太坊上DeFi协议总锁仓量突破190亿美元
  6. Ubuntu 14.04 执行指定用户的命令
  7. 手机社交游戏与触动用户的环节
  8. Java系统日志管理
  9. 2 电感耦合方式的射频前端
  10. 请在微信客户端中打开链接是什么鬼 ?
  11. web前端大作业:诗人文化网页主题网站【唐代诗人】纯HTML+CSS制作
  12. 基于docker的test-containers环境百宝箱
  13. linux挂载NTFS格式硬盘
  14. nu.xom.IllegalNameException: 0x20 is not a legal NCName character
  15. jabref java_Jabref安装及使用教程
  16. 【Scratch】青少年蓝桥杯_每日一题_11.25_小猫碰到黑块和白块
  17. Excel:动态图表展示(点击按钮选择不同的员工名字,自动呈现对应的数据展示)
  18. B 站神曲 damedane:精髓在于深度变换,五分钟就能学会
  19. adb root 权限运行
  20. 用SkinMagic工具包创建换皮肤程序

热门文章

  1. Microsoft Silverlight 4 Tools for Visual Studio 2010 下载
  2. 桌面文件丢失怎么恢复
  3. 存储器块清零c语言版,存储器块清零实验报告.doc
  4. 局域网监控软件推荐(什么局域网监控软件好)
  5. windows 远程连接debian_Linux远程桌面连接Windows
  6. arcgispro 影像分类
  7. 目标检测 R-CNN讲解ppt
  8. java中文件流close_Java FileInputStream close()方法与示例
  9. 美团/得物sql面试题
  10. 一篇文章讲透单片机的RAM和FLASH