定时/计数器的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;


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;
  • 4
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值