/***************************************************************************** * 文件: counter.v * 模块: 计数器 * 版权: * copyright(c) 北京联华众科科技有限公司 * http://www.lianhua-zhongke.com.cn * 版本: version 1.0 * * 功能说明: * 对输入时钟按照参数指定的最大值进行计数,并输出计数值 * * 端口说明: * 输出 * o - 每个输入时钟到来后加1,达到计数器模值UNIT-1后恢复为0 * * 输入 * i - 待分频的输入脉冲 * sel - 1表示对clk分频,其他表示对i分频 * clk - 时钟 * rst - 复位信号,低电平有效 * * 双向 * 无 * * 参数说明: * UNIT - 计数器输出的最大值+1 * COUNTER_WIDTH - 输出的计数值位宽 * * 变更记录: * 2009.12.23, 新建 * *****************************************************************************/ module counter ( output[3:0] o, input i, input clk, input rst ); parameter UNIT = 16;//计数器模值 parameter COUNTER_WIDTH = 4;//UNIT所需位宽 reg[COUNTER_WIDTH-1:0] counter; reg din_1; reg i_posedge; assign o = counter; always@(negedge clk, negedge rst) begin if (rst == 1'B0) din_1 <= 1'B1; else if(clk == 1'B0) begin i_posedge <= (~din_1) & i; din_1 <= i; end end always@(posedge clk, negedge rst) begin if (rst == 1'B0) counter <= 0; else if(clk == 1'B1) begin if (i_posedge == 1'B1) begin if (counter == UNIT-1'B1) counter <= 0; else counter <= counter+1'B1; end end end endmodule