2014年5月21日 星期三

非同步式計時器, 產生 0:0:0 ~ 23:59:59 計時器





module Timer_24hours (CLOCK_50,KEY,HEX5,HEX4,HEX3,HEX2,HEX1,HEX0);

 output [6:0] HEX5,HEX4,HEX3,HEX2,HEX1,HEX0; //輸出顯示
 input CLOCK_50; //50MHz時鐘
 input [0:0]KEY; //復位

 wire [7:0] H1,M1,S1; 
 timer1 UUT0 (CLOCK_50,KEY[0],H1,M1,S1);  
//Call By in Order
 //module timer2 (Clk50M, Clr, H, M, S);


 //解碼顯示
 hex_7seg h0 (.hex(H1[7:4]),.seg(HEX5));
 hex_7seg h1 (.hex(H1[3:0]),.seg(HEX4));

 hex_7seg h2 (.hex(M1[7:4]),.seg(HEX3));
 hex_7seg h3 (.hex(M1[3:0]),.seg(HEX2));

 hex_7seg h4 (.hex(S1[7:4]),.seg(HEX1));
 hex_7seg h5 (.hex(S1[3:0]),.seg(HEX0));


 endmodule





// Ch10 timer2.v
// 計時器, 產生 0:0:0 ~ 23:59:59 計時值

module timer2 (Clk50M, Clr, H, M, S);
input  Clk50M,Clr; // 一位元輸入
output [7:0] H,M,S; // 八位元輸出
reg    [7:0] H,M,S; // 宣告為暫存器資料
reg    [25:0] Q; // 宣告為暫存器資料
reg    Clk1; // 宣告為暫存器資料
wire   Clk2,Clk3,Clk4,Clk5; // 宣告為連線資料

// 除頻得 1 Hz
always@ (posedge Clk10M)
  begin
    if (!Clr || Q == 49_999_999) // 除 50M
      Q = 0;
    else 
      Q = Q + 1;
    Clk1 = Q[25]; // Clk1 = 1 Hz
  end

// 呼叫各模組例證
mod10 mod10_1 (Clk1,Clr,S[3:0],Clk2);
mod6  mod6_1  (Clk2,Clr,S[7:4],Clk3);
mod10 mod10_2 (Clk3,Clr,M[3:0],Clk4);
mod6  mod6_2  (Clk4,Clr,M[7:4],Clk5);
mod24 mod24   (Clk5,Clr,H[7:0]);

endmodule


// Ch10 mod24.v
// mod-24 計數器

module mod24 (Clk_i, Clr, Q);
input  Clk_i,Clr; // 一位元輸入
output [7:0] Q; // 四位元輸出
reg    [7:0] Q; // 宣告為暫存器資料

// 除 24 (0 ~ 23)
always@ (posedge Clk_i or negedge Clr)
  if (!Clr || Q == 8'h23) // 等於 23
    Q = 0;
  else if (Q[3:0] == 4'h9) // 等於 X9
    begin
      Q[7:4] = Q[7:4] + 1;
      Q[3:0] = 0;
    end
  else
    Q[3:0] = Q[3:0] + 1;

endmodule



// Ch10 mod6.v
// mod-6 計數器

module mod6 (Clk_i, Clr, Q, Clk_o);
input  Clk_i,Clr; // 一位元輸入
output [3:0] Q; // 四位元輸出
output Clk_o; // 一位元輸出
reg    [3:0] Q; // 宣告為暫存器資料

// 除 6 (0 ~ 5)
always@ (posedge Clk_i or negedge Clr)
  if (!Clr || Q == 5) // 除 6
    Q = 0;
  else 
    Q = Q + 1;
assign Clk_o = ~(~Q[3] & Q[2] & ~Q[1] & Q[0]); // = 5 時

endmodule


// Ch10 mod10.v
// mod-10 (BCD) 計數器

module mod10 (Clk_i, Clr, Q, Clk_o);
input  Clk_i,Clr; // 一位元輸入
output [3:0] Q; // 四位元輸出
output Clk_o; // 一位元輸出
reg    [3:0] Q; // 宣告為暫存器資料

// 除 10 (0 ~ 9)
always@ (posedge Clk_i or negedge Clr)
  if (!Clr || Q == 9) // 除 10
    Q = 0;
  else 
    Q = Q + 1;
assign Clk_o = ~(Q[3] & ~Q[2] & ~Q[1] & Q[0]); // = 9 時

endmodule



沒有留言:

張貼留言