题目描述;
以clk为基准,设计一个秒计数器,在指定的计数值产生中断,实时输出当前的秒计数值
(1) clk时钟输入,频率为32.768KHz
(2) rst_n是异步复位输入,低电平有效,复位整个系统,为高则整个系统开始工作,其上升沿易同步于clk
(3) statr是启动信号,一个clk时钟周期的正脉冲,同步于clk。alarm[7:0]是配置信息,单位为秒,同步于clk
(4) 工作模式:收到start后,秒计数器sec_cnt从零开始以秒为单位来计数,计数到alarm[7:0]指定的数值时,产生一个int pulse(一个时钟周期的正脉冲),秒计数器回0并停止
module timer(
input clk,
input rst_n,
input start,
input [7:0] alarm,
output reg [31:0] sec_cnt,
output int_pulse
);
reg [14:0] one_sec_cnt; //时钟翻转计数器
reg state; //计数状态
parameter TIMES=32767; //时钟计数器计数值,计数32767次,刚好15位就可以,计满自动溢出
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
state《=1‘b0;
end
else if(start)
begin
state《=1’b1;
end
else if(sec_cnt==alarm)
begin
state《=1‘b0;
end
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
one_sec_cnt《=15’d0;
end
else if(state)
begin
one_sec_cnt《=one_sec_cnt+15‘d1;
end
else
begin
one_sec_cnt《=15’d0;
end
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
sec_cnt《=32‘d0;
end
else if(state)
begin
if(&one_sec_cnt)
sec_cnt《=sec_cnt+32’d1;
else
sec_cnt《=sec_cnt;
end
else
begin
sec_cnt《=32‘d0;
end
assign int_pulse=sec_cnt==alarm;
endmodule