/*******************************************
クロック動作関係モジュール
======================
分周を計算し、1秒間を求め1秒ごとに1をカウントし
対応する7SEQに値を加算する。 ダイナミックドライブ使用
********************************************/
`ifdef DEFAULT_NETTYPE_NONE
`default_nettype none
`endif
module CLK_Timing(CLK,SEQ_POINT,S1,S2,S3,S4);
//入力
input wire CLK;
//出力
output[1:0] SEQ_POINT;//7SEQのポイントを出力
output[3:0] S1,S3; //7SEQの値を出力
output[2:0] S2,S4; //7SEQの値を出力
wire SCAN_ON; //待機時間が経過したので、ダイナミックドライブ動作
//変数宣言
reg [15:0] CLK_SEC; //クロック待機時間カウンター
reg [7:0] SCAN_SEQ; //7SEQ切り替え待機時間
reg [6:0] CLK_ON; //待機時間が経過したので、動作(100回)
//戻り値
reg [1:0] SEQ_POINT; //ダイナミックドライブポイント
reg [3:0] S1,S3; //7SEQ 0-9
reg [2:0] S2,S4; //7SEQ 0-5
assign SCAN_ON = (SCAN_SEQ ==(8'hff))? 1'b1 : 1'b0; //255回カウントしたらON
/************************************
7SEQ待機時間カウント処理
************************************/
always @(posedge CLK)
begin
SCAN_SEQ <= SCAN_SEQ + 1; //7SEQスキャン待機時間カウント
end
/************************************
分周処理:6Mカウント@1秒間算出ループ
*************************************/
always @(posedge CLK)
begin
//CLK_SECが6万回(60K)カウントされたら
if(CLK_SEC >= 60000)
CLK_SEC <= 0; //再度0からループ
else if(CLK_ON == 100)
CLK_SEC <= 0; //待機時間初期化
else
CLK_SEC <= CLK_SEC + 1; //1秒間待機カウント
end
/******************************
1秒間検出処理
*******************************/
always @(posedge CLK)
begin
//CLK_SECが6万回(60K)カウントされたら
if(CLK_SEC >= 60000)
CLK_ON <= CLK_ON + 1; //周回カウント
//100回周回した場合、1秒経過 (60K*100=6M=1秒)
else if(CLK_ON == 100)
CLK_ON <= 0; //周回回数初期化
end
/********************************
各対応する7SEQの値計算処理
*********************************/
always @(posedge CLK)
begin
//100回周回した場合、1秒経過 (60K*100=6M=1秒)
if(CLK_ON == 100)
begin
//7Seq 1番目
if(S1 >= 4'b1001) //9以上か?
begin
S1 <= 4'b0000; //繰り上げ初期化
S2 <= S2 + 1;
//7Seq 2番目
if(S2 >= 4'b0101) //5以上か?
begin
S2 <= 4'b0000; //繰り上げ初期化
S3 <= S3 + 1;
//7Seq 3番目
if(S3 >= 4'b1001) //9以上か?
begin
S3 <= 4'b0000;
S4 <= S4+ 1;
//7Seq 4番目
if(S4 >= 4'b0101) //5以上か?
S4 <= 4'b0000;
else S4 <= S4 + 1; //S4加算
end else S3 <= S3 + 1; //S3加算
end else S2 <= S2 + 1; //S2加算
end else S1 <= S1 + 1; //S1加算
end
end
/*********************************
7SEQのダイナミックドライブ処理@7SEQ間ハイインピーダンス移動
**********************************/
always @(posedge CLK)
begin
//7Seqを移動、ダイナミックドライブ
if (SCAN_ON == 1'b1)
SEQ_POINT <= SEQ_POINT + 2'b1; //SEQ_POINTを加算し、移動
end
endmodule
`default_nettype wire