Thông báo

Collapse
No announcement yet.

Bản chất của metastable của flip-flop là gì?

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

  • Bản chất của metastable của flip-flop là gì?

    Mấy bạn bên ASIC cho mình hỏi, bản chất của metastable của flip-flop là gì?
    Mình nghĩ bản chất của nó thuộc phạm trù analog ko phải digital nữa.
    Tại sao dùng double-clock thì lại tránh được tình huống này?
    Cảm!

  • #2
    Nguyên văn bởi jefflieu Xem bài viết
    Mấy bạn bên ASIC cho mình hỏi, bản chất của metastable của flip-flop là gì?
    Mình nghĩ bản chất của nó thuộc phạm trù analog ko phải digital nữa.
    Tại sao dùng double-clock thì lại tránh được tình huống này?
    Cảm!
    Chào bạn Jefflieu,

    Tớ đã từng làm về Clock Domain Crossing nên mấy cái này tớ cũng có biết chút ít. Tớ có cả tài liệu của hãng Realintent về CDC nữa nếu bạn muốn tớ cũng có thể đưa lên được. Về Metastable tớ có thể giải thích với bạn một cách sơ lược thế này.

    Mạch flipflop của bạn có thể coi như là 2 latch master và slave nối tiếp nhau. Mạch latch lại thực chất có thể coi như 2 mạch inverter nối với nhau theo kiểu positive feedback. Và cuối cùng mạch inverter lại có thể coi như một mạch khuếch đại tín hiệu đảo. Vì thế khi tín hiệu vào mạch flipflop, nó sẽ được khuếch đại rất nhanh sự khác biệt với mức giữa để tín hiệu đầu ra là 0/1. Tuy nhiên nếu như sự khác biệt với mức giữa quá nhỏ tại thời điểm xuất hiện xung đồng hồ, thì mạch flipflop có thể khuếch đại tín hiệu sai. Vì vậy người ta mới có yêu cầu về setup và hold time. Setup time là thời gian cần thiết để tín hiệu đầu vào ổn định trước khi xuất hiện xung clock và hold time là thời gian cần thiết mà tín hiệu đầu vào vẫn không đổi sau khi có xung clock. Bản chất của nó thì đúng là analog tuy nhiên trên thực tế chẳng ai sử dụng kiến thức analog để phân tích nó cả. Thay vào đó người ta thường sử dụng một hàm phân bố xác suất để xác định khả năng xảy ra metastable.

    Nếu bạn để ý thì một cách thô sơ và đơn giản nhất để tránh metastable khi tín hiệu truyền qua 2 miền clock là dùng 2 flipflop in series. Có thể hiểu một cách thô sơ thì việc sử dụng 2 flipflop cũng như dùng 2 tầng khuếch đại để xác định mức tín hiệu một cách tốt hơn. Nếu nói về xác suất xảy ra metastable thì khi dùng nhiều flipflop in series thì xác suất này giảm theo hàm mũ.

    Về việc tránh metastable thì tớ không rõ bạn muốn nói đến double-clock là kỹ thuật gì nhưng bên tớ làm thì như sau. Nếu tín hiệu nằm trong cùng một clock domain thì có thể dùng các tools để kiểm tra static timing analysis như Goldtime, Primetime... Khi tín hiệu truyền giữa 2 miền clock thì phải checking rất nhiều thứ. Nếu như tín hiệu là quasi-static ví dụ như bạn dùng register chain để shift các tín hiệu control vào rồi đưa ra điều khiển thì chẳng cần gì hết. Nếu tín hiệu của bạn là từ một bộ đếm thì bạn phải sử dụng mã GRAY, ví dụ như pointer của fifo. Khi tín hiệu của bạn truyền trên một bus thì cần phải có handshaking... Ngoài ra còn phải có các mạch loại trừ glitch, tín hiệu từ 2 miền clock không được kết hợp với nhau rồi đi vào miền thứ 3...

    Comment


    • #3
      Nguyên văn bởi Rommel.de Xem bài viết
      Chào bạn Jefflieu,

      Tớ đã từng làm về Clock Domain Crossing nên mấy cái này tớ cũng có biết chút ít. Tớ có cả tài liệu của hãng Realintent về CDC nữa nếu bạn muốn tớ cũng có thể đưa lên được. Về Metastable tớ có thể giải thích với bạn một cách sơ lược thế này.

      Mạch flipflop của bạn có thể coi như là 2 latch master và slave nối tiếp nhau. Mạch latch lại thực chất có thể coi như 2 mạch inverter nối với nhau theo kiểu positive feedback. Và cuối cùng mạch inverter lại có thể coi như một mạch khuếch đại tín hiệu đảo. Vì thế khi tín hiệu vào mạch flipflop, nó sẽ được khuếch đại rất nhanh sự khác biệt với mức giữa để tín hiệu đầu ra là 0/1. Tuy nhiên nếu như sự khác biệt với mức giữa quá nhỏ tại thời điểm xuất hiện xung đồng hồ, thì mạch flipflop có thể khuếch đại tín hiệu sai. Vì vậy người ta mới có yêu cầu về setup và hold time. Setup time là thời gian cần thiết để tín hiệu đầu vào ổn định trước khi xuất hiện xung clock và hold time là thời gian cần thiết mà tín hiệu đầu vào vẫn không đổi sau khi có xung clock. Bản chất của nó thì đúng là analog tuy nhiên trên thực tế chẳng ai sử dụng kiến thức analog để phân tích nó cả. Thay vào đó người ta thường sử dụng một hàm phân bố xác suất để xác định khả năng xảy ra metastable.


      Nếu bạn để ý thì một cách thô sơ và đơn giản nhất để tránh metastable khi tín hiệu truyền qua 2 miền clock là dùng 2 flipflop in series. Có thể hiểu một cách thô sơ thì việc sử dụng 2 flipflop cũng như dùng 2 tầng khuếch đại để xác định mức tín hiệu một cách tốt hơn. Nếu nói về xác suất xảy ra metastable thì khi dùng nhiều flipflop in series thì xác suất này giảm theo hàm mũ.
      Vẫn chưa hiểu lắm, để hỏi cách khác.
      Nếu như không thỏa thời gian set-up thì đầu ra của FF sẽ có giá trị gì? 1/0, giá trị cũ, lơ lửng, hay nhảy qua giá trị mới chút xíu rồi về giá trị cũ, trên mạng nói "undefined" và cũng không biết thời gian tín hiệu đầu ra settle-down ?? Khi đầu vào của FF thứ 2 như vậy thì đầu ra sẽ có giá trị gì?

      Về việc tránh metastable thì tớ không rõ bạn muốn nói đến double-clock là kỹ thuật gì nhưng bên tớ làm thì như sau. Nếu tín hiệu nằm trong cùng một clock domain thì có thể dùng các tools để kiểm tra static timing analysis như Goldtime, Primetime... Khi tín hiệu truyền giữa 2 miền clock thì phải checking rất nhiều thứ. Nếu như tín hiệu là quasi-static ví dụ như bạn dùng register chain để shift các tín hiệu control vào rồi đưa ra điều khiển thì chẳng cần gì hết. Nếu tín hiệu của bạn là từ một bộ đếm thì bạn phải sử dụng mã GRAY, ví dụ như pointer của fifo. Khi tín hiệu của bạn truyền trên một bus thì cần phải có handshaking... Ngoài ra còn phải có các mạch loại trừ glitch, tín hiệu từ 2 miền clock không được kết hợp với nhau rồi đi vào miền thứ 3...
      Uh double-clock ý mình là dùng 2 FF.
      Mình cũng tuân thủ quy tắc là khi cross clock domain thì chỉ được 1 tín hiệu thay đổi và dùng FF cho tín hiệu này. Và khi dùng handshake thì register data ở phía bên kia khi tất cả databus không thay đổi.
      Làm theo quy tắc thôi, nhưng chưa hiểu rõ một số vấn đề như đã hỏi.
      Thanks!

      Comment


      • #4
        bạn có thể tham khảo tiết học sau:

        Electrical Engineering 141 - Lecture 3 - YouTube

        Khoảng từ phút 40 có đề cập tới Regenerative; sau đó đến phút 46 có đề cập tới điểm metastable, theo mình, đây chính là bản chất của metastable các bạn gặp phải trong thiết kế số.

        Thực chất trong thiết kế số người ta tránh trường hợp có xung clock khi tín hiệu đầu vào có khả năng có giá trị ở khoảng giữa 0 và 1; về mặt nguyên tắc đợi thêm một chút nữa thì đầu ra của bạn cũng sẽ là 0 hoặc 1. "Undefined" có tính thời gian, nghĩa là lúc tôi có clock thì tôi muốn đầu ra bằng đầu vào (vì clock có tác dụng như là enable mạch FF vậy, chuyển giá trị đầu vào tới đầu ra), nhưng khi có clock mà đầu vào không xác định (xung quanh điểm metastable) thì đầu ra cũng mang giá trị không xác định (lý thuyết là như thế.)

        Tuy nhiên vì có độ trễ trong mạch điện nên nếu bạn nối hai FF lại với nhau thì khả năng đầu ra của FF thứ hai ở trạng thái không xác định hơi bị khó vì:
        - thứ nhất, như mình nói ở trên đợi thêm một tí thôi là output sẽ chuyển thành 0 hoặc 1 luôn, chứ không có chuyện ở vị trí không xác định, do đó đối với FF thứ hai gần như là khi có clock sẽ nhận được tín hiệu vào clean
        - thứ hai, để chuyển được tín hiệu không xác định đầu vào thành tín hiệu không xác định ở đầu ra cũng cần delay của FF đầu tiên, nên cơ hội để FF thứ hai bắt được đầu vào không xác định là cũng may mắn lắm. Tất nhiên nếu bạn đen, delay của clock từ FF thứ nhất tới FF thứ 2 cũng bằng delay để chuyển tín hiệu không xác định ở đầu vào tới đầu ra của FF1 thì FF thứ hai cũng bị dính chưởng như thường, vậy thì nối thêm FF thứ 3 nữa cho chắc ăn

        P/S: thông thường các phần mềm mô phỏng mạch số nếu phát hiện đầu vào không xác định khi có clock là đầu ra không xác định và propagate đến cuối hàng luôn, tức là chú nào dính màu đỏ là dính suốt luôn, mạch thực tế không phải vậy, sau một hay hay xung clock là đầu ra lại ngon lành ngay do đó khi mô phỏng mixed-signal khi nhìn thấy màu đỏ bọn mình không sợ lắm
        Last edited by hithere123; 16-10-2012, 23:10. Lý do: thêm P/S

        Comment


        • #5
          à, mình nhớ ra là khi làm việc với các bác làm standard lib thì khi các bác ấy characterize cho FF thì mấy cái thông số delay chỉ là delay sườn lên và sườn xuống, không test trường hợp nếu input nằm ở khoảng giữa thì sau bao lâu đầu ra sẽ là 0 hay 1. Đến khi designers viết constraint để tổng hợp và mô phỏng thì cũng dựa vào data về delay trong standard lib nên các bác ấy nhất quyết không muốn mạch hoạt động ở xung quanh điểm metastable vì các bác ấy không biết được chính xác delay input-output.

          Comment


          • #6
            Chào bạn Jefflieu,

            Đây là tài liệu về CDC của hãng Realintent. Rất có ích nếu bạn định làm CDC.

            http://wikisend.com/download/256146/...ng_072012.pptx

            Nhân tiện phải nói là cách dùng 2 FF in series này rất đơn giản nhưng không còn hiệu quả với những hệ thống quá phức tạp nữa.
            Last edited by Rommel.de; 17-10-2012, 03:05.

            Comment


            • #7
              Nguyên văn bởi Rommel.de Xem bài viết
              Chào bạn Jefflieu,

              Đây là tài liệu về CDC của hãng Realintent. Rất có ích nếu bạn định làm CDC.

              Wikisend: free file sharing service

              Nhân tiện phải nói là cách dùng 2 FF in series này rất đơn giản nhưng không còn hiệu quả với những hệ thống quá phức tạp nữa.
              Bạn cho một vài ví dụ về hệ thống phức tạp được hông?

              Comment


              • #8
                Nguyên văn bởi jefflieu Xem bài viết
                Bạn cho một vài ví dụ về hệ thống phức tạp được hông?
                Chào bạn Jefflieu,

                Truyền dữ liệu giữa các clock domain là một trong những vấn đề khó khăn nhưng không thể tránh được với các thiết kế ASIC lớn. Clock domain thường được chia ra làm 2 loại. Bạn có thể truyền dữ liệu qua 2 clock domain mà có cùng tần số nhưng khác nhau về pha. Cái này là do tần số đồng hồ của bạn rất lớn, và clock screw trên đường clock tree không cho phép bạn có một clock domain rất lớn. Trường hợp thứ 2 là bạn truyền dữ liệu qua 2 clock domain mà tần số đồng hồ khác nhau, ví dụ như từ một processor core có frequency lớn sang một IO có tần số nhỏ hơn. Trong hầu hết các thiết kế đơn giản thì CDC là do trường hợp thứ 2. Khi đó bạn không nên truyền dữ liệu một cách bừa bãi từ 2 miền clock. Thay vào đó bạn hãy làm một dedicated bridge chỉ chuyên để truyền dữ liệu qua 2 miền. Khi bạn muốn truyền dữ liệu thì phải đưa nó vào bridge trước rồi mới truyền sang.Từ từ rồi tớ tìm vài ví dụ thiết kế cụ thể sử dụng bridge và loại truyền giữa 2 domain có cùng tần số để mọi người cùng tham khảo.

                Comment


                • #9
                  Oke con ga den. Cái power-point đó rất hữu ích, recommend cho các bạn làm digital design, nhưng mình chịu cái phần solution của cty đó. Tool dùng để verify CDC gì đó.
                  Bên Mỹ nhiều tool nhỉ :-s
                  Bên Châu Á này dùng tool cùi thôi
                  Nhiều tool thì công việc của Engineer có bị đe dọa không bạn

                  Comment


                  • #10
                    Chào bạn Jefflieu,

                    Hôm nay tớ hỏi được một đồng nghiệp có biết về thiết kế clock tree cho AMD. Cái này có thể trả lời được một phần câu hỏi về CDC. Thiết kế bên AMD nhiều khi rất lớn, không thể tổng hợp clock tree nổi vì clock skew quá lớn. Khi đó người ta tổng hợp clock tree cho từng phần của mạch. Sau đó tín hiệu clock được đưa đến các clock buffer gốc của mỗi clock domain. Tại mỗi clock buffer này có một mạch làm tăng độ trễ của tín hiệu đồng hồ và sự trễ này có thể điều chỉnh được. Khi chạy mạch thật người ta sẽ điều chỉnh các độ trễ này để tín hiệu đồng hồ trên tất cả các domain đều đồng bộ cùng nhau. Khi đó các tín hiệu sẽ không cần quan tâm đến CDC nữa.

                    Tớ hiện giờ đang định giới thiệu cách thiết kế một bus AXI trong arm processor nhưng bây giờ bận quá, cuối tuần cũng phải đi cầy. Với lại tớ phải viết lại một cách đơn giản và abstract một chút, một phần để các bạn dễ hiểu một phần vì đây là thiết kế của công ty không thể tiết lộ được. Bus này có thể dùng để nối từ memory controller hoặc fabric vào core, bandwidth cao, chạy không đồng bộ, khá hay.

                    Comment


                    • #11
                      Uh huh ... noted & thanks!

                      Comment

                      Về tác giả

                      Collapse

                      jefflieu Email minh trực tiếp nếu bạn cần download tài liệu gấp Tìm hiểu thêm về jefflieu

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

                      Collapse

                      Đang tải...
                      X