Thông báo

Collapse
No announcement yet.

Nhờ giúp đỡ code Verilog???

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Nhờ giúp đỡ code Verilog???

    Em muốn viết code để thực hiện mạch đếm thời gian hiển thị trên led 7 segment.Các anh chị vào xem giúp em xem em viết thế này có được không vì em không có bo mạch để thí nghiệm.Đây là code của em:

    module timer (clk, rst, sw, led1, led2, led3, led4, led5, led6);
    input clk, sw, rst, s1, s2;
    output [6:0] led1, led2, led3, led4, led5, led6;
    reg [6:0] led1, led2, led3, led4, led5, led6;
    reg [3:0] bcd1, bcd2, bcd3, bcd4, bcd5, bcd6;
    wire[3:0] bcd_next1, bcd_next2, bcd_next3, bcd_next4, bcd_next5, bcd_next6;
    clock1Hz a(clk, clock);
    always @(posedge clock)
    if (rst == 1'b1)
    begin
    bcd1 <= 4'b0;
    bcd2 <= 4'b0;
    bcd3 <= 4'b0;
    bcd4 <= 4'b0;
    bcd5 <= 4'b0;
    bcd6 <= 4'b0;
    end
    else if (sw == 1'b1)
    begin
    bcd1 <= bcd_next1;
    end
    else if ( bcd1 == 4'b1001)
    begin
    bcd2 <= bcd_next2;
    end
    else if ( bcd2 == 4'b0101)
    begin
    bcd3 <= bcd_next3;
    end
    else if ( bcd3 == 4'b1001)
    begin
    bcd4 <= bcd_next4;
    end
    else if ( bcd4 == 4'b0101)
    begin
    bcd5 <= bcd_next5;
    end
    else if ( bcd5 == 4'b1001)
    begin
    bcd6 <= bcd_next6;
    end
    else if ( bcd6 == 4'b0010&& bcd5==4'b0011)
    begin
    bcd1 <= 4'b0;
    bcd2 <= 4'b0;
    bcd3 <= 4'b0;
    bcd4 <= 4'b0;
    bcd5 <= 4'b0;
    bcd6 <= 4'b0;
    end
    assign bcd_next1 = ( bcd1 == 4'b1001) ? 4'b0 : bcd1 + 4'b1;
    assign bcd_next2 = ( bcd2 == 4'b0101) ? 4'b0 : bcd2 + 4'b1;
    assign bcd_next3 = ( bcd3 == 4'b1001) ? 4'b0 : bcd3 + 4'b1;
    assign bcd_next4 = ( bcd4 == 4'b0101) ? 4'b0 : bcd4 + 4'b1;
    assign bcd_next5 = ( bcd5 == 4'b0011) ? 4'b0 : bcd5 + 4'b1;
    assign bcd_next6 = ( bcd6 == 4'b0010) ? 4'b0 : bcd6 + 4'b1;
    always @(posedge clock)
    begin
    case (bcd1)
    4'b0000: led1 = 7'b0111111;
    4'b0001: led1 = 7'b0000110;
    4'b0010: led1 = 7'b1011011;
    4'b0011: led1 = 7'b1001111;
    4'b0100: led1 = 7'b1100110;
    4'b0101: led1 = 7'b1101101;
    4'b0110: led1 = 7'b1111101;
    4'b0111: led1 = 7'b0000111;
    4'b1000: led1 = 7'b1111111;
    4'b1001: led1 = 7'b1100111;
    endcase
    case ( bcd2)
    4'b0000: led2 = 7'b0111111;
    4'b0001: led2 = 7'b0000110;
    4'b0010: led2 = 7'b1011011;
    4'b0011: led2 = 7'b1001111;
    4'b0100: led2 = 7'b1100110;
    4'b0101: led2 = 7'b1101101;
    4'b0110: led2 = 7'b1111101;
    4'b0111: led2 = 7'b0000111;
    4'b1000: led2 = 7'b1111111;
    4'b1001: led2 = 7'b1100111;
    endcase
    case ( bcd3)
    4'b0000: led3 = 7'b0111111;
    4'b0001: led3 = 7'b0000110;
    4'b0010: led3 = 7'b1011011;
    4'b0011: led3 = 7'b1001111;
    4'b0100: led3 = 7'b1100110;
    4'b0101: led3 = 7'b1101101;
    4'b0110: led3 = 7'b1111101;
    4'b0111: led3 = 7'b0000111;
    4'b1000: led3 = 7'b1111111;
    4'b1001: led3 = 7'b1100111;
    endcase
    case ( bcd4)
    4'b0000: led4 = 7'b0111111;
    4'b0001: led4 = 7'b0000110;
    4'b0010: led4 = 7'b1011011;
    4'b0011: led4 = 7'b1001111;
    4'b0100: led4 = 7'b1100110;
    4'b0101: led4 = 7'b1101101;
    4'b0110: led4 = 7'b1111101;
    4'b0111: led4 = 7'b0000111;
    4'b1000: led4 = 7'b1111111;
    4'b1001: led4 = 7'b1100111;
    endcase
    case ( bcd5)
    4'b0000: led5 = 7'b0111111;
    4'b0001: led5 = 7'b0000110;
    4'b0010: led5 = 7'b1011011;
    4'b0011: led5 = 7'b1001111;
    4'b0100: led5 = 7'b1100110;
    4'b0101: led5 = 7'b1101101;
    4'b0110: led5 = 7'b1111101;
    4'b0111: led5 = 7'b0000111;
    4'b1000: led5 = 7'b1111111;
    4'b1001: led5 = 7'b1100111;
    endcase
    case ( bcd6)
    4'b0000: led6 = 7'b0111111;
    4'b0001: led6 = 7'b0000110;
    4'b0010: led6 = 7'b1011011;
    4'b0011: led6 = 7'b1001111;
    4'b0100: led6 = 7'b1100110;
    4'b0101: led6 = 7'b1101101;
    4'b0110: led6 = 7'b1111101;
    4'b0111: led6 = 7'b0000111;
    4'b1000: led6 = 7'b1111111;
    4'b1001: led6 = 7'b1100111;
    endcase
    end
    endmodule

    // bo chia tan
    module clock1Hz(Clk, clock1);
    input Clk;
    output reg clock1; // xung 1 Hz
    reg [30:0]count ;

    always @(posedge Clk)
    begin
    count = count + 1;
    if (count==50000000)
    begin clock1 = ~clock1;
    count = 0;
    end
    end
    endmodule

    Nút rst của e dùng để reset,khi ấn rst thì 6 đèn led đều hiện thị số 0.Khi ấn nút Sw thì mạch bắt đầu đếm.

  • #2
    Bạn gom mấy cái case lại thành module gọi là decode đi, module decode có input là 4 bit, output là 7 bit. Xong rồi instantiate nhiều lần.
    Cho code bạn nó gọn lại.

    Comment


    • #3
      Bạn copy phần code sau vào 1 file
      module Watch(
      input [6:0] hour0,
      input [6:0] hour1,
      input [6:0] minute0,
      input [6:0] minute1,
      input [6:0] second0,
      input [6:0] second);


      wire [3:0] h0,h1,m0,m1,s0,s1;


      decode decodeh0(.sevenseg(hour0) ,.binary(h0));
      decode decodeh1(.sevenseg(hour1) ,.binary(h1));
      decode decodem0(.sevenseg(minute0) ,.binary(m0));
      decode decodem1(.sevenseg(minute1) ,.binary(m1));
      decode decodes0(.sevenseg(second0) ,.binary(s0));
      decode decodes1(.sevenseg(second1) ,.binary(s1));

      always@(*)
      begin
      $display("%d%d:%d%d:%d%d",h1,h0,m1,m0,s1,s0);
      end


      endmodule

      module decode(
      input [6:0] sevenseg,
      output reg [3:0] binary);


      always@(*)
      case(sevenseg)
      7'b0110000:binary = 4'h1;
      7'b1101101:binary = 4'h2;
      7'b1111001:binary = 4'h3;
      7'b0110011:binary = 4'h4;
      7'b1011011:binary = 4'h5;
      7'b1011111:binary = 4'h6;
      7'b1110000:binary = 4'h7;
      7'b1111111:binary = 4'h8;
      7'b1111011:binary = 4'h9;
      7'b1110111:binary = 4'hA;
      7'b0011111:binary = 4'hB;
      7'b1001110:binary = 4'hC;
      7'b0111101:binary = 4'hD;
      7'b1001111:binary = 4'hE;
      7'b1000111:binary = 4'hF;
      7'b1111110:binary = 4'h0;
      default: $display("Invalid code");
      endcase
      endmodule
      Xong rồi dùng modelSim mô phỏng. Đẻ mô phỏng bạn làm như sau:

      Tạo 1 module Testbench
      Trong module testbench:
      - bạn instantiate module mà bạn vừa thiết kế
      - instantiate module Watch
      - kết nối 2 mạch này
      - tạo các tín hiệu giả lập clock và các input khác của module của bạn

      Module watch làm gì? Module Watch giải mã từ tín hiệu đèn 7 đoạn sang nhị phân và in ra.

      Comment


      • #4
        Thanks anh jefflieu.Em mới học về FPGA nên chưa biết cách viết testbench + dùng modelsim.Em sẽ thử làm theo cách của anh.Cho em hỏi thêm là nếu em muốn viết code để hiển thị đồng hồ thời gian thực hiển thị trên màn lcd có đầy đủ ngày tháng năm thì e có thể phát triển từ phần code ở trên không?anh có thể hưỡng dẫn cho e cách viết không?

        Comment


        • #5
          Nguyên văn bởi tigertiger Xem bài viết
          Thanks anh jefflieu.Em mới học về FPGA nên chưa biết cách viết testbench + dùng modelsim.Em sẽ thử làm theo cách của anh.Cho em hỏi thêm là nếu em muốn viết code để hiển thị đồng hồ thời gian thực hiển thị trên màn lcd có đầy đủ ngày tháng năm thì e có thể phát triển từ phần code ở trên không?anh có thể hưỡng dẫn cho e cách viết không?
          Được. Bạn làm từ từ đi. Testbench quan trọng, khoan đem xuống mạch đã.

          Comment

          Về tác giả

          Collapse

          tigertiger Tìm hiểu thêm về tigertiger

          Bài viết mới nhất

          Collapse

          Đang tải...
          X