定时/计数器的verilog代码
定时/计数器
功能:
具有计数和定时两个功能。
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代码相关推荐
- 两位十进制递增/递减计数器的Verilog代码
1.一般利用按键或者拨码开关实现递增/递减控制,该计数器可以写成CNT<=CNT+2*K-1,当K=1时,CNT<=CNT+1,为递增计数,否则为递减计数. 2.递增计数到99时需要回0, ...
- 七种计数器总结(格雷码计数器、环形计数器、约翰逊计数器、FLSR、简易时分秒数字秒表|verilog代码|Testbench|仿真结果)
七种计数器总结 一.可复位/置数计数器 1.1 可复位/置数计数器 1.2 Verilog代码 1.3 Testbench 1.4 仿真结果 二.双向(可加可减)计数器 2.1 双向(可加可减)计数器 ...
- 模24的8421BCD码计数器(Verilog HDL语言描述)(仿真与综合)
目录 前言 原理 Verilog HDL程序设计 测试代码 仿真波形图 ISE综合后 RTL Schematic Technology Schematic 前言 本博文用Verilog HDL语言描述 ...
- 定时/计数器(定时和计数的功能)、定时器中断
定时/计数器实现功能: (1)定时功能: 定时/计数器说明(最高单次计时时间是71毫秒=65535*1.085us,1.085us是机器周期): 使用51定时/计数器步骤: 定时/计算器控制寄存器: ...
- 网页版的svn怎样同步代码_学会使用Hdlbits网页版Verilog代码仿真验证平台
大家推荐一款网页版的 Verilog代码编辑仿真验证平台,这个平台是国外的一家开源FPGA学习网站,通过 "https://hdlbits.01xz.net/wiki/Main_Page&q ...
- [芯片] 2、接口技术·实验二·定时/计数器8253
目录 一.实验目的和要求 二.实验原理与背景 三.实验具体的内容 3-1.计数器方式0实验 3-2.计数器方式3实验 3-3.计数器级联实验 四.实验的代码说明 4-1.计数器方式0实验代码及说明 4 ...
- 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)
移位寄存器总结 一.前言 二.简单循环左移/右移/双向移位寄存器 2.1 简单循环左移/右移/双向移位寄存器 2.2 verilog代码 2.3 Testbench 2.4 仿真结果 三.逻辑移位与算 ...
- 单片机实验七 NE555脉冲发生器实验(定时/计数器)
实验七 NE555脉冲发生器实验(定时/计数器) 一.实验目的 1.熟悉实验软件和硬件,进行正确的接线: 2.1602显示脉冲频率,调节电位器可改变频率. 二.实验软硬件 1.Keil uVision ...
- 学会使用Hdlbits网页版Verilog代码仿真验证平台
大家推荐一款网页版的 Verilog代码编辑仿真验证平台,这个平台是国外的一家开源FPGA学习网站,通过 "https://hdlbits.01xz.net/wiki/Main_Page&q ...
最新文章
- Oracle - 行转列, 列转行
- android 覆盖安装问题
- CodeForces - 1550E Stringforces(二分+状压dp)
- 由“美图秀秀”软件的网站,看网站的生存模式
- 以太坊上DeFi协议总锁仓量突破190亿美元
- Ubuntu 14.04 执行指定用户的命令
- 手机社交游戏与触动用户的环节
- Java系统日志管理
- 2 电感耦合方式的射频前端
- 请在微信客户端中打开链接是什么鬼 ?
- web前端大作业:诗人文化网页主题网站【唐代诗人】纯HTML+CSS制作
- 基于docker的test-containers环境百宝箱
- linux挂载NTFS格式硬盘
- nu.xom.IllegalNameException: 0x20 is not a legal NCName character
- jabref java_Jabref安装及使用教程
- 【Scratch】青少年蓝桥杯_每日一题_11.25_小猫碰到黑块和白块
- Excel:动态图表展示(点击按钮选择不同的员工名字,自动呈现对应的数据展示)
- B 站神曲 damedane:精髓在于深度变换,五分钟就能学会
- adb root 权限运行
- 用SkinMagic工具包创建换皮肤程序
热门文章
- Microsoft Silverlight 4 Tools for Visual Studio 2010 下载
- 桌面文件丢失怎么恢复
- 存储器块清零c语言版,存储器块清零实验报告.doc
- 局域网监控软件推荐(什么局域网监控软件好)
- windows 远程连接debian_Linux远程桌面连接Windows
- arcgispro 影像分类
- 目标检测 R-CNN讲解ppt
- java中文件流close_Java FileInputStream close()方法与示例
- 美团/得物sql面试题
- 一篇文章讲透单片机的RAM和FLASH