定时/计数器
功能:
具有计数和定时两个功能。
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;
initial
begin
count0=0;//用于计数
end
always @(posedge CLK)
begin
if(CS)
begin
if(Reset)
begin
ms[31:0]=0;
ini[31:0]=0;
count0=0;
count1=0;
count2=0;
end
if(IOW)//CPU写数据
begin
if(address[7:0]==8'b0010_0000) ms=wdata;//CPU写方式寄存器,CNT1此处应该是22
else if(address[7:0]==8'b0010_0100)
begin
ini=wdata;//CPU写初值寄存器,CNT1此处应该是26
count1=ini;//count1用来备份初值寄存器的值
end
end
if(IOR)//CPU读数据
begin
if(address[7:0]==8'b0010_0000)
begin
rda=ms;