一、定时器设计
1.定时器简介
定时器即计数器,可以循环定时,也可以单次定时。
2.定时器代码
module timer(
Clk, //时钟信号
Rst_n, //复位信号
CNT_ARR, //定时预设值
MODE, //该信号决定定时模式:1为循环定时;0为单次定时
Cnt_Go, /* 循环定时模式:高电平使能计时,低电平停止计时。
单次计数模式:该信号的一个单基准时钟周期的脉冲使能一次定时。*/
CNT_NOW, //当前定时值
Full_Flag //定时满信号
);
input Clk;
input Rst_n;
input [31:0]CNT_ARR;
input MODE;
input Cnt_Go;
output [31:0] CNT_NOW;
output reg Full_Flag;
reg [31:0] cnt; //定义一个32位的寄存器用作计数器
reg oneshot; //单次定时的内部使能信号
wire Full_Flag_r;
assign CNT_NOW = cnt; //输出当前定时值
assign Full_Flag_r = (cnt == CNT_ARR - 1)?1'b1:1'b0;
always@(posedge Clk)
Full_Flag <= Full_Flag_r; //这里设置了一个Full_Flag_r,用于将Full_Flag信号延后一个周期,使其与记满时的值对齐
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
cnt <= 0;
else if(MODE == 1'b1)begin //循环定时模式
if((Cnt_Go == 1'b1) && (cnt < CNT_ARR)) //当计数使能且当前计数值小于预设值时,计数器+1
cnt <= cnt + 1'b1;
else
cnt <= 0;
end
else if(!MODE)begin //单次定时模式
if(oneshot)
cnt