深圳市航顺芯片技术研发有限公司
直播中

安德森大

8年用户 1293经验值
擅长:接口/总线/驱动
私信 关注
[问答]

请问一下怎样去设计一个基于clk的秒计数器

怎样去设计一个基于clk的秒计数器?
基于clk的秒计数器具备哪些功能?

回帖(1)

陈波

2021-8-17 17:59:31
  题目描述;
  以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
举报

更多回帖

发帖
×
20
完善资料,
赚取积分