Trung tâm đào tạo thiết kế vi mạch Semicon


  • ĐĂNG KÝ TÀI KHOẢN ĐỂ TRUY CẬP NHIỀU TÀI LIỆU HƠN!
  • Create an account
    *
    *
    *
    *
    *
    Fields marked with an asterisk (*) are required.
semicon_lab.jpg

Đồng hồ bấm giờ trên FPGA dùng verilog

E-mail Print PDF

Thời gian tối đa của đồng hồ này là 10p. Đồng hồ này gồm 4 chữ số để đếm từ 0:00:0 tới 9:59:9. Chữ số đầu tiên bên phải sẽ dùng một bộ đếm tăng lên 0,1s. Khi chữ số đó đạt đến 9 thì hai chữ số ở giữa sẽ tăng lên 1 đơn vị và chúng ta có bộ đếm thứ 2. Và khi 2 số ở giữa tăng đến 59 thì số đầu tiên bên trái sẽ tăng một đơn vị.Đồng hồ này hiển thị theo dạng M:SS:D.


Và làm thế nào để chia chuẩn thời gian cho các bộ đếm thì các bạn xem lại bài viết Please login or register to view links.
Và sau đây là đoạn code verilog:

module stopwatch(     input clock,     input reset,     input start,     output a, b, c, d, e, f, g, dp,     output [3:0] an     ); reg [3:0] reg_d0, reg_d1, reg_d2, reg_d3; //registers that will hold the individual counts reg [22:0] ticker; //23 bits needed to count up to 5M bits wire click; //the mod 5M clock to generate a tick ever 0.1 second always @ (posedge clock or posedge reset) begin if(reset)   ticker <= 0; else if(ticker == 5000000) //if it reaches the desired max value reset it   ticker <= 0; else if(start) //only start if the input is set high   ticker <= ticker + 1; end assign click = ((ticker == 5000000)?1'b1:1'b0); //click to be assigned high every 0.1 second always @ (posedge clock or posedge reset) begin if (reset)   begin    reg_d0 <= 0;    reg_d1 <= 0;    reg_d2 <= 0;    reg_d3 <= 0;   end    else if (click) //increment at every click   begin    if(reg_d0 == 9) //xxx9 - the 0.1 second digit    begin  //if_1     reg_d0 <= 0;          if (reg_d1 == 9) //xx99     begin  // if_2      reg_d1 <= 0;      if (reg_d2 == 5) //x599 - the two digit seconds digits      begin //if_3       reg_d2 <= 0;       if(reg_d3 == 9) //9599 - The minute digit        reg_d3 <= 0;       else        reg_d3 <= reg_d3 + 1;      end      else //else_3       reg_d2 <= reg_d2 + 1;     end          else //else_2      reg_d1 <= reg_d1 + 1;    end        else //else_1     reg_d0 <= reg_d0 + 1;   end end //The Circuit for Multiplexing - Look at my other post for details on this localparam N = 18; reg [N-1:0]count; always @ (posedge clock or posedge reset) begin   if (reset)    count <= 0;   else    count <= count + 1; end reg [6:0]sseg; reg [3:0]an_temp; reg reg_dp; always @ (*) begin   case(count[N-1:N-2])        2'b00 :     begin      sseg = reg_d0;      an_temp = 4'b1110;      reg_dp = 1'b1;     end        2'b01:     begin      sseg = reg_d1;      an_temp = 4'b1101;      reg_dp = 1'b0;     end        2'b10:     begin      sseg = reg_d2;      an_temp = 4'b1011;      reg_dp = 1'b1;     end         2'b11:     begin      sseg = reg_d3;      an_temp = 4'b0111;      reg_dp = 1'b0;     end   endcase end assign an = an_temp; reg [6:0] sseg_temp; always @ (*) begin   case(sseg)    4'd0 : sseg_temp = 7'b1000000;    4'd1 : sseg_temp = 7'b1111001;    4'd2 : sseg_temp = 7'b0100100;    4'd3 : sseg_temp = 7'b0110000;    4'd4 : sseg_temp = 7'b0011001;    4'd5 : sseg_temp = 7'b0010010;    4'd6 : sseg_temp = 7'b0000010;    4'd7 : sseg_temp = 7'b1111000;    4'd8 : sseg_temp = 7'b0000000;    4'd9 : sseg_temp = 7'b0010000;    default : sseg_temp = 7'b0111111; //dash   endcase end assign {g, f, e, d, c, b, a} = sseg_temp; assign dp = reg_dp; endmodule

 


Bạn có đam mê ngành thiết kế vi mạch và bạn muốn có mức lương 1000 usd cùng lúc bạn

đang muốn tìm một Trung tâm để học vậy hãy đến với ngành vi mạch tại SEMICON

     HotLine: 0972 800 931 Ms Duyên

 

Related Articles

Chat Zalo