Thông báo

Collapse
No announcement yet.

Mô phỏng ModelSim được nhưng đổ trên kit không như ý muốn

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

  • Mô phỏng ModelSim được nhưng đổ trên kit không như ý muốn

    Chào mọi người, hiện tại mình đang thực hiện 1 project trên kit DE0-nano. Project của mình build trên quatus và mô phỏng bằng modelsim thì kết quả ra rất giống với ý đồ thiết kế. Tuy vậy, khi mình đổ ra kit để chạy trên mạch thực tế thì không điều khiển được như mong muốn. Mọi người cho mình hỏi những nguyên nhân nào có thể gây ra vấn để nêu trên để mình có thể khắc phục.

    Mặc khác, trong lúc mò mẫm sửa lỗi, mình phát hiện ra 1 hiện tượng đó là mình có 1 tín hiệu điều khiển sel để lựa chọn giữa 2 tín hiệu. Khi đổ ra kit thì chỉ có 1 tín hiệu xuất hiện (mặc dù trong modelsim là 2 tín hiệu xuất hiện luân phiên). Mình kiểm tra tín hiệu sel có thay đổi không bằng cách gắn thêm 1 đèn (trên kit) và ngõ ra của tín hiệu thì lúc này 2 khối lại được lựa chọn luân phiên, và dĩ nhiên đèn cũng chớp tắt như tín hiệu điều khiển. Mọi người có thể cho biết hiện tượng này là ntn không?

    Cám ơn mọi người đã quan tâm.

  • #2
    Nguyên văn bởi strangepheno Xem bài viết
    Chào mọi người, hiện tại mình đang thực hiện 1 project trên kit DE0-nano. Project của mình build trên quatus và mô phỏng bằng modelsim thì kết quả ra rất giống với ý đồ thiết kế. Tuy vậy, khi mình đổ ra kit để chạy trên mạch thực tế thì không điều khiển được như mong muốn. Mọi người cho mình hỏi những nguyên nhân nào có thể gây ra vấn để nêu trên để mình có thể khắc phục.

    Mặc khác, trong lúc mò mẫm sửa lỗi, mình phát hiện ra 1 hiện tượng đó là mình có 1 tín hiệu điều khiển sel để lựa chọn giữa 2 tín hiệu. Khi đổ ra kit thì chỉ có 1 tín hiệu xuất hiện (mặc dù trong modelsim là 2 tín hiệu xuất hiện luân phiên). Mình kiểm tra tín hiệu sel có thay đổi không bằng cách gắn thêm 1 đèn (trên kit) và ngõ ra của tín hiệu thì lúc này 2 khối lại được lựa chọn luân phiên, và dĩ nhiên đèn cũng chớp tắt như tín hiệu điều khiển. Mọi người có thể cho biết hiện tượng này là ntn không?

    Cám ơn mọi người đã quan tâm.
    Có nhiều lý do lắm bạn. Bạn tự debug bằng SignalTapII (Tool --> SignalTapII)

    Cái bạn mô tả nghe có vẻ giống như tín hiệu của bạn bị optimized. Nếu một tín hiệu nào đó không được sử dụng (output hoạc input của các mạch khác) thì sẽ bị triệt tiêu.

    Comment


    • #3
      Anh jefflieu cho em hỏi tí. Khi em build project không bị lỗi nhưng critical warning là "Time requirement not met". Em xem qua bảng phân tích thì thấy có một số đường màu đỏ - em nghĩ các đường này là nguyên nhân dẫn đến tình trạng trên. Không biết có đúng không anh.

      Em tra trên mạng thì thấy khắc phục bằng các giảm tốc độ hoặc phải thiết kế lại phần đó. Em đã thử một số cách: kẹp thanh ghi vào giữa, giảm tốc độ nhưng đều không khả thi.

      Em đang thực hiện việc ghi dữ liệu vào 1 Ram có 2 ngõ lựa chọn wr và rd được tạo bằng Megafunction. Đường data do MCU bên ngoài đưa vào thông qua GPIO. Em mô phỏng thì đã chạy được kết quả đúng nhưng thực tế trên kit thì không đọc lại đúng được giá trị được ghi. Nói rõ ràng hơn là việc ghi không như mong muốn.

      Anh có thể gọi ý cho em một số cách có thể thử không hoặc anh có project nào giao tiếp giữa ngoại vi và FPGA cho em tham khảo được không anh?

      Em xin cám ơn.

      Comment


      • #4
        Hi strangepheno,

        Bạn kiểm tra lại tất cả các warning trong các quá trính Analyzer và Fitter. Nếu thiết kế của bạn không dùng các cell đặc biệt (như IO cell sử dụng trong DDR, ...) thì sẽ không tồn tại bất kỳ warning nào liên quan đến các tín hiệu của thiết kế hết (sẽ tồn tại các warning liên quan đến bản quyền, tụ kí sinh, định thời). Sau khi kiểm tra lại các quá trình trên mà vẫn thấy lỗi thì hãy kiểm tra lại gáng chân của thiết kế lên FPGA. Nếu tất cả các vấn đề đền đã kiểm tra mà vẩn không phát hiện lỗi thì bạn mới dùng Signal tap II cho việc kiểm tra (Công cụ này nên hạn chế dùng nếu bạn sử dụng chip FPGA giá rẻ - dòng Cyclone của Altera).

        Note: Tốt nhất bạn nên kèm theo các warning của Modelsim (trong file "transcript") và Quartus II khi bạn hỏi trên diễn đàn.

        Chúc bạn thành công,
        ^_^

        Comment


        • #5
          Cám ơn mọi người đã quan tâm.

          Em xin post một số hình ảnh trong phần warning và analyze. Phần này được trình biên dịch báo màu đỏ nên em nghĩ nguyên nhân từ đây. Không biết có phải thế không?

          Như đã nói em đã kiểm tra lại toàn bộ hệ thống và dùng các cách giải quyết khác nhau nhưng vẫn không cải thiện được. Các khối khác không có lỗi gì nhưng riêng khối này giao tiếp với MCU - nhận tín hiệu điều khiển thông qua GPIO và các đường tín hiệu bị báo warning có màu đỏ như trong hình.

          Lỗi warning là "Timing contraint not met". Theo em nghĩ là tín hiệu clock không đảm bảo trên thực tế nên gây ra hiện tượng trên đúng không mọi người?

          Cho em hỏi là Signal Tap không nên dùng với 1 số thiết bị nguyên nhân là do đâu vậy? Khi mình dùng nhiều thì có gây ảnh hưởng gì đến kit không?

          Nhân tiện mọi người có thể vui lòng cho mình biết các slack, relationship, launchclock, latch clock, clock skew và data delay có ảnh hưởng như thế nào đối với hệ thống thiết kế trên thực tế và làm sao để cải thiện không? Em xem tài liệu chỉ biết được một số định nghĩa sơ khai như clock skew là việc clock bị xiên ở các cạnh lên và cạnh xuống (quan trọng khi hoạt động ở tần số cao), data delay là thời gian data bị trễ, ...

          Cám ơn mọi người. Em mới tập tành đi vào mảng này mong mọi người thông cảm.
          hinh anh.zip

          Comment


          • #6
            Timing constraint not met nghĩa là trình dịch của bạn không thỏa các ràng buộc về thời gian.
            Cái này đặc biệt quan trong khi bạn giao tiếp vơi các chip khác. Ở chỗ interface thường phức tạp.

            1) Bạn vẽ waveform của các chân IO giao tiếp với CPU ra
            2) Ban post xem bạn thiết lập constraint như thế nào

            Mình sẽ comment thêm. Bạn đã nên theo đuối lỗi này và hiểu rõ khái niệm.

            Bạn có thể xem khái niệm vể trễ ở tài liệu đính kèm

            Jeff
            Attached Files

            Comment


            • #7
              Launch clock là clock ở tại FF sinh ra data
              Latch clock là clock ở tại FF nhận data

              Relationship thì tùy vào trường hợp:

              - Thí dụ latch clock negative edge, launch clock positive edge --> relationship = 1/2 chu kì
              - Nếu như CPU launch data và 1 clock đưa vào FPGA thì do trễ ở các IO buffer ---> relationship = 1/2 chu kì + Buffer delay
              - Nếu như FPGA lauch data và CPU latch data thì relationship = 1/2 chu kì - Buffer delay

              Bạn vẽ hình ra sẽ hình dung được

              Vẽ 2 clock: 1 clock là "lauch" Flops "thấy", 1 clock là "latch" flop "thấy" ...

              Jeff

              Comment


              • #8
                Cám ơn mọi người. Em mới tập tành đi vào mảng này mong mọi người thông cảm.
                Bạn không lo ... mọi người chỉ có thể giúp nhau ở "khái niệm" còn thực hành thì bạn tự mày mò ... cứ làm thế là được!

                Comment


                • #9
                  Theo mình thấy thì constraint của bạn không đúng, không thể có relationship của 2 clock nào là 0.5ns cả ... 0.5ns = 2GHz

                  Comment


                  • #10
                    Hi strangepheno,

                    Cho mình hỏi một số câu hỏi liên quan đến thiết kế bạn đang làm:
                    1) Có những warning nào trong khâu analyzer?
                    2) Có những warning nào trong khâu fitter?
                    3) Nếu bạn giao tiếp với RAM (hay thiết bị khác bên ngoài) bằng GPIO thì phải tạo các ràng buộc cho thiết kế về tốc độ, độ trể (sử dụng file .sdc và tcl script). Tuy nhiên, nếu xung clock của bạn thiết kế dưới hoặc bằng 25MHz thì cũng không vấn đề gì. Tuy nhiên nếu trên thì phải cẩn thận vì chân trong GPIO không có "clock out" nên phần ràng buộc phải xem xét kỹ nếu thiết kế trên 25MHz. Ở cả 2 điều kiện của xung clock trên, dữ liệu ngõ vào phải được đệm lại bằng FF nhằm đồng bộ lại dữ liệu bên ngoài FPGA.

                    Nếu mọi vấn đề đều thỏa các yêu cầu của bạn đưa ra thì hãy kiểm tra lại board mạch ngoài, xem có lỗi gì hay không?

                    Note: Các file báo cáo của quartus II có đuôi là .rpt, nếu có thể bạn nên up file này cho mọi người. Hoặc trích các warning của nó cho mọi người.

                    Chúc bạn thành công,
                    ^_^

                    Comment


                    • #11
                      Chào mọi người. Cám ơn sự đóng góp ý kiến từ mọi người. Trước giờ mình chưa biết về cách tạo ràng buộc và dùng signal tap. Thông qua ý kiến của mọi người hiện nay mình đang nghiên cứu về cách sử dụng của các phần này.

                      Mình đang làm project về hiển thị led ma trận nên cần làm việc ở tần số 50Mhz đến 100Mhz. Việc đọc dữ liệu từ RAM mình đã thực hiện được. Vấn đề của mình hiện tại có lẽ là việc ghi dữ liệu vào RAM thông qua việc điềi khiển bằng MCU.

                      Ý tưởng của mình thế này. Mình có 1 khối FSMwrite điều khiển việc ghi dữ liệu vào RAM. Khối này sẽ giao tiếp với MCU thông qua các đường data, strobe và enable. Khi thực hiện việc write, enable sẽ xuống mức 0, khi đó với 1 data đưa vào mình sẽ tạo 1 xung strobe cho khối FSM hiểu để tăng address tương ứng. Sau khi hoàn tất quá trình ghi, enable sẽ lên mức 1.

                      Mình đã thiết kế 1 hệ thống đơn giản để ghi vào đọc dữ liệu vào RAM bằng MCU theo ý tưởng trên nhưng kết quả không như mong đợi cả 2 phần read và write. Hệ thống trước của mình phần read điều khiểu bằng FPGA luôn nên hoạt động đúng.

                      Mọi người cho mình xin ý kiến góp ý về cách interface giữa MCU và FPGA nhé.

                      Đây là project đoc và ghi RAM bằng MCU mà mình đã thiết kế.

                      test RAM wr rd.zip

                      Xin lỗi vì mình không thể upload lên server của diễn đàn được do lỗi mạng.

                      Cám ơn mọi người đã quan tâm.

                      Comment


                      • #12
                        Nguyên văn bởi jefflieu Xem bài viết
                        Timing constraint not met nghĩa là trình dịch của bạn không thỏa các ràng buộc về thời gian.
                        Cái này đặc biệt quan trong khi bạn giao tiếp vơi các chip khác. Ở chỗ interface thường phức tạp.

                        1) Bạn vẽ waveform của các chân IO giao tiếp với CPU ra
                        2) Ban post xem bạn thiết lập constraint như thế nào

                        Mình sẽ comment thêm. Bạn đã nên theo đuối lỗi này và hiểu rõ khái niệm.

                        Bạn có thể xem khái niệm vể trễ ở tài liệu đính kèm

                        Jeff
                        Cám ơn anh về tài liệu. Em đã đọc và hiểu thêm 1 số vấn đề về clock. Tài liệu anh đưa hình như chưa hoàn chỉnh thì phải? Em đọc thấy thiếu vài hình và phần sau.

                        Cho em hỏi vì sao ta có thể biết được các thời gian truyền mà tính toán và thiết lập cho thích hợp được vậy anh. Vd em dùng 1 đường bus để kết nối từ MCU và FPGA, em làm sao biết được tín hiệu truyền trên đường bus đó mất thời gian bao lâu để tính tần số cho phù hợp được vậy anh?

                        Thiết lập contraint anh nói có phải là dùng file.sdc không anh?

                        Comment


                        • #13
                          Hi strangepheno,

                          Mình đã xem qua file kèm theo của bạn và mình có một số nhận xét sau đây:
                          1) FSMWrite.v: Đây không phải FSM!!!! Bạn thiết kế một bộ điều khiển quá nhiều latch (điều này không nên làm khi thiết kế trên FPGA).
                          2) Trong thiết kế bạn sử dụng "<=" và "=" một cách tùy tiện. Hai toán tử này có tác dụng khác nhau nên khi mô phỏng cũng có tác dụng khác nhau. Nhưng trong thiết kế mạch tổ hợp của bạn thì bạn sử dụng "=" hay "<=" Quartus II cũng sẽ chỉ cho ra một kết quả.
                          3) Bạn sử dụng PLL trong thiết kế nhưng lại dùng MCU ngoài để điều khiển, như vậy sẽ phát sinh thêm vấn đề đồng bộ dữ liệu giữa MCU và FPGA.

                          Nói chung thiết kế của bạn gặp khá nhiều vấn đề. Nếu bạn mới bắt đầu viết verilog thì hãy bắt đầu với các khái niệm căn bản về mạch tồ hợp và mạch tuần tự cũng như FSM. Còn việc nhận dữ liệu từ một thiết bị khác bạn nên tham khảo các thiết kế liên quan giữa giao tiếp FPGA và các thiết bị ngoại vi sau đó tập đồng bộ dữ liệu giữa chúng với nhau.
                          Hệ thống của bạn có vấn đề trong khâu thiết kế chứ chưa phát sinh vấn đề trong định thời đâu. Bạn nên kiểm tra lại thiết kế của mình nha.

                          Chúc bạn thành công,
                          ^_^

                          Comment


                          • #14
                            Nguyên văn bởi danbeo85 Xem bài viết
                            Hi strangepheno,

                            Mình đã xem qua file kèm theo của bạn và mình có một số nhận xét sau đây:
                            1) FSMWrite.v: Đây không phải FSM!!!! Bạn thiết kế một bộ điều khiển quá nhiều latch (điều này không nên làm khi thiết kế trên FPGA).
                            2) Trong thiết kế bạn sử dụng "<=" và "=" một cách tùy tiện. Hai toán tử này có tác dụng khác nhau nên khi mô phỏng cũng có tác dụng khác nhau. Nhưng trong thiết kế mạch tổ hợp của bạn thì bạn sử dụng "=" hay "<=" Quartus II cũng sẽ chỉ cho ra một kết quả.
                            3) Bạn sử dụng PLL trong thiết kế nhưng lại dùng MCU ngoài để điều khiển, như vậy sẽ phát sinh thêm vấn đề đồng bộ dữ liệu giữa MCU và FPGA.

                            Nói chung thiết kế của bạn gặp khá nhiều vấn đề. Nếu bạn mới bắt đầu viết verilog thì hãy bắt đầu với các khái niệm căn bản về mạch tồ hợp và mạch tuần tự cũng như FSM. Còn việc nhận dữ liệu từ một thiết bị khác bạn nên tham khảo các thiết kế liên quan giữa giao tiếp FPGA và các thiết bị ngoại vi sau đó tập đồng bộ dữ liệu giữa chúng với nhau.
                            Hệ thống của bạn có vấn đề trong khâu thiết kế chứ chưa phát sinh vấn đề trong định thời đâu. Bạn nên kiểm tra lại thiết kế của mình nha.

                            Chúc bạn thành công,
                            ^_^
                            Cám ơn anh. Đúng là đây không phải là FSM thật. Sau khi em nghiên cứu. Em chuyển sang dùng RAM-2-PORT với 2 clock riêng biệt cho việc đọc và ghi RAM. Việc ghi RAM em ghi bằng MCU và việc đọc RAM em thực hiện bằng PLL. Kết quả cũng không khả quan hơn là mấy.

                            Em đang cố gắng thực hiện kiểm soát việc đọc và ghi vào RAM. Ban đầu em nghĩ do address và data không thích hợp nhau nên việc ghi dữ liệu bị sai. Hôm nay sau khi dùng Signal Tap kiểm tra các chân address và data, em thu được một kết quả thật bất ngờ. Khi chạy bằng signal tap tín hiệu của em đúng và việc ghi vào RAM cũng thực hiện rất chính xác. Em disable file Signal Tap và chạy lại thì kết quả vẫn như trước đây.

                            Anh có thể cho em ý kiến về vấn đề này được không?

                            Thân chào

                            Comment


                            • #15
                              Hi strangepheno,

                              Bạn có thể cho mình biết giá trị dữ liệu và địa chỉ bạn dùng trong quá trình ghi là như thế nào và kết quả đọc ra sao không?

                              ^_^

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X