module cnt_circle_0to9(
CLK , // clock
RST , //reset
CNT); // output
input CLK;//clock
input RST;//reset,
output [4-1:0] CNT;//output counter value
parameter CNT_VAL_MIN=6;//counter cycle min value
parameter CNT_VAL_MAX=9;//counter cycle max value
reg [4-1:0] CNT;
reg [4-1:0] CNT_VAL=CNT_VAL_MIN;
//异步高电平复位就是复位信号只要变高电平就执行复位操作,如果是同步的话就要看复位信号是否在时钟有效沿为高电平。
//异步高电平复位
always @ (posedge CLK or posedge RST)begin
if(RST)begin
CNT <= 0;
CNT_VAL <= CNT_VAL_MIN;
end
else begin
if(CNT >= CNT_VAL)begin //Less Than0
CNT <= 0;
CNT_VAL <= CNT_VAL + 1'b1; //ADD0,非阻塞赋值,同时完成
if(CNT_VAL >= CNT_VAL_MAX) //Less Than1
CNT_VAL <= CNT_VAL_MIN;
end
else CNT <= CNT + 1'b1; //ADD1
end
end
////同步高电平复位
//always @ (posedge CLK) begin
// if(RST)begin
// CNT <= 0;
// CNT_VAL <= CNT_VAL_MIN;
// end
// else begin
// if(CNT >= CNT_VAL)begin //Less Than0
// CNT <= 0;
// CNT_VAL <= CNT_VAL + 1'b1; //ADD1
// if(CNT_VAL >= CNT_VAL_MAX) //Less Than1
// CNT_VAL <= CNT_VAL_MIN;
// end
// else CNT <= CNT + 1'b1; //ADD0
// end
//end
endmodule // module cnt_circle_0to9
module cnt_circle_v2_0to9(
CLK , // clock
RST , //reset
CNT); // output
input CLK;//clock
input RST;//reset,
output [4-1:0] CNT;//output counter value
parameter MAX_min=6;//counter cycle min value
parameter MAX_max=9;//counter cycle max value
reg [4-1:0] CNT_maxR = MAX_min;//count for MAX
reg enR , ovR ;
reg [4-1:0] CNT_resultR;//count for result
//异步高电平复位就是复位信号只要变高电平就执行复位操作,如果是同步的话就要看复位信号是否在时钟有效沿为高电平。
//异步高电平复位
always @ (posedge CLK)begin
if(RST)begin
CNT_resultR <= 0;
CNT_maxR <= MAX_min;
end
else begin
if(CNT_resultR < CNT_maxR)begin
CNT_resultR <= CNT_resultR + 1'b1;
end
else begin
CNT_resultR <= 0;
end
if(enR)begin
if(CNT_maxR < MAX_max)begin
CNT_maxR <= CNT_maxR + 1'b1;
end
else
CNT_maxR <= MAX_min;
end
else
CNT_maxR <= CNT_maxR ;
end
end
always @ (CNT_resultR)begin
enR = ovR;
if(CNT_resultR == CNT_maxR)
ovR = 1;
else
ovR = 0;
end
assign CNT = CNT_resultR;
endmodule // module cnt_circle_v2_0to9