begin
if(m_H==8'h00) m_H<=8'd23; else
m_H<=m_H-1'b1; end end
else if(FLAG==2'b10) begin if(UP)
if(m_M==8'd59) m_M<=8'd0; else
m_M<=m_M+1'b1; else if(DN) if(m_M==8'h00) m_M<=8'd59; else
m_M<=m_M-1'b1; end
else if(FLAG==2'b11) begin if(UP)
if(m_S==8'd59) m_S<=8'b0; else
m_S<=m_S+1'b1; else if(DN) if(m_S==8'h00)
//调分状态 //调秒状态6
m_S<=8'd59; else
m_S<=m_S<=m_S-1'b1; end else
begin //正常计时状态 if(m_MS==8'd99) begin
m_MS<=8'd0; if(m_S==8'd59) begin m_S<=8'd0; if(m_M==8'd59) begin m_M<=8'd0; if(m_H==8'd23) m_H<=0; else
m_H<=m_H+1'b1; end else
m_M<=m_M+8'd1; end else
m_S<=m_S+1'b1; end else
m_MS<=m_MS+1'b1; end
7
endmodule
4.2整数分频模块
由于数字系统提供的基准时钟信号频率往往较高,因此需要分频模块产生所需频率的失踪信号,例如上面时钟校正及计时模块所需的100Hz的时钟信号。整数分频模块int_div可以实现对输入时钟clock进行F_DIV分频后输出clk_out。F_DIV分频系数范围为1~2^n(n=F_DIV_WIDTH),若要改变分频系数,改变参数F_DIV或F_DIV_WIDTH到相应范围即可。若分频系数为偶数,则输出时钟占空比为50%;若分频系数为奇数,则输出的时钟占空比取决于输入的时钟占空比和分频系数(当输入为50%时,输出也是50%)。
代码:
module int_div(clock,clk_out);
parameter F_DIV=48000000; //分频系数 parameter F_DIV_WIDTH=32; //分频计数器宽度
input clock; //输入时钟 output clk_out; //输出时钟
reg clk_p_r; reg clk_n_r;
reg[F_DIV_WIDTH-1:0] count_p; reg[F_DIV_WIDTH-1:0] count_n;
wire full_div_p; //上升沿计数满标志 wire half_div_p; //上升沿计数半满标志 wire full_div_n; //下降沿计数满标志 wire half_div_n; //下降沿计数半满标志
8
//判断计数标志位置位与否 assign full_div_p=(count_p
//时钟输出
assign clk_out=(F_DIV==1)?clock:(F_DIV[0]?(clk_p_r&clk_n_r):clk_p_r);
always @(posedge clock) //上升沿脉冲计数 begin if(full_div_p) begin
count_p<=count_p+1'b1; if(half_div_p) clk_p_r<=1'b0; else
clk_p_r<=1'b1; end else begin count_p<=0; clk_p_r<=1'b0; end end
always @(negedge clock) //下降沿脉冲计数 begin
9
if(full_div_n) begin
count_n<=count_n+1'b1; if(half_div_n) clk_n_r<=1'b0; else
clk_n_r=1'b1; end else begin count_n<=0; clk_n_r<=1'b0; end end endmodule
4.3时钟信号选择模块
时钟信号选择模块clkgen实际上时一个二选一电路,用于提供时钟调校及计时时模块所需的时钟脉冲。当电子表工作在正常计时状态时选择100Hz时钟信号;当电子表工作在调时、调分、调秒是那种设置模式时,如果采用100Hz时钟信号,那么手动一次按键可能引起设置数据的一串跳变,因此为了方便按键时动作对时间的设置,这里采用2Hz的时钟信号。其端口说明如下: flag——时钟选择输入信号;
clk_100Hz———输入100Hz的时钟信号; clk_2Hz——输入2Hz的时钟信号; Clkout——输出时钟信号。
代码:
module clkgen(flag,clk_100hz,clk_2hz,clkout);
10