Thông báo

Collapse
No announcement yet.

Thiết kế Oscilloscope với Kit xtremedsp_devkitIV

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

  • Thiết kế Oscilloscope với Kit xtremedsp_devkitIV

    Mình đang làm Project "Thiết kế Oscilloscope với Kit xtremedsp_devkitIV" muốn cầu kiến các cao thủ vì bế tắc quá.
    Ở chế độ đồng bộ ngoài Oscilloscope thường nối 1 đống thiết bị nối tiếp về tín hiệu đồng bộ, vì dụ máy phát hàm, tín hiệu này chuẩn 10Mhz.
    Vấn đề đau đầu với mình là cái Kit đang ADC ở 100Mhz chẳng hạn phải chuyển sang chế độ đồng bộ như thế nào, mình có 2 ý tưởng:
    1.
    - Đưa xung đồng bộ 10Mhz vào DCM ( IP Core của Xilinx) nâng lên thành 100Mhz.
    - Ngắt ngồn xung Clk 100Mhz đang dùng để ADC chuyển sang dùng Clk 100Mhz mới.

    Vấn đề là DCM lại không hỗ trợ đầu vào 10Mhz, tối thiểu là 24Mhz mới đau đầu các bác ạ. Bác nào có cách nào để DCM hỗ trợ đầu vào 10Mhz cho ý kiến với?

    2.
    Lấy Clk đồng bộ 10Mhz vào để điều chỉnh pha của Clk 100Mhz đang ADC.
    Bác nào có cao kiến về so pha của hai Clk cho em xin ý kiến với.


    Mong tin các cao thủ từng ngày!

  • #2
    Nguyên văn bởi hungcachan Xem bài viết
    Mình đang làm Project "Thiết kế Oscilloscope với Kit xtremedsp_devkitIV" muốn cầu kiến các cao thủ vì bế tắc quá.
    Ở chế độ đồng bộ ngoài Oscilloscope thường nối 1 đống thiết bị nối tiếp về tín hiệu đồng bộ, vì dụ máy phát hàm, tín hiệu này chuẩn 10Mhz.
    Vấn đề đau đầu với mình là cái Kit đang ADC ở 100Mhz chẳng hạn phải chuyển sang chế độ đồng bộ như thế nào, mình có 2 ý tưởng:
    1.
    - Đưa xung đồng bộ 10Mhz vào DCM ( IP Core của Xilinx) nâng lên thành 100Mhz.
    - Ngắt ngồn xung Clk 100Mhz đang dùng để ADC chuyển sang dùng Clk 100Mhz mới.

    Vấn đề là DCM lại không hỗ trợ đầu vào 10Mhz, tối thiểu là 24Mhz mới đau đầu các bác ạ. Bác nào có cách nào để DCM hỗ trợ đầu vào 10Mhz cho ý kiến với?

    2.
    Lấy Clk đồng bộ 10Mhz vào để điều chỉnh pha của Clk 100Mhz đang ADC.
    Bác nào có cao kiến về so pha của hai Clk cho em xin ý kiến với.


    Mong tin các cao thủ từng ngày!
    Đó giờ mình dùng chỉ thấy "external trigger" chứ không hiểu "external synchronization" như bạn nói là gì. Có nhầm gì không?

    Comment


    • #3
      Mình hơi gà nên không rõ lắm, mong Mod giải thích, tất nhiên là Trigger ngoài là bình thường về tính năng của Oscilloscope, nhưng ví dụ muốn lấy mẫu mà Clk lấy mẫu phải cùng pha với các tín hiệu khác (đặc tính bài toán của mình vậy) vì có rất nhiều thiết bị khác được nối với nhau để cùng xử lý tín hiệu, cái máy của mình chỉ là một khâu.

      Tiện đây hỏi bác luôn, mình là con gà về Fpga và Xilinx, mới bắt đầu, mình muốn hỏi:
      - Bắt đầu với Kit này, mình tạo 1 project Virtex-4 và nạp thành công, mình làm như sau: Đầu vào 40Mhz >> BUFG >> INV >> BUFG >> Đầu ra (Đo thấy Clk 40Mhz ở đầu ra).
      - Mình thử với DCM_BASE, làm theo hướng dẫn ở "Virtex-4 FPGA User Guide" >> hoàn thành thiết kế rồi nối ra các chân vào ra để debug bằng Oscilloscope, chỉ đo thấy chân CLK0 của DCM cho ra xung,các chân CLK90, CLK180, CCK270 không tạo lệch pha với CLKIN và các chân còn lại không thấy phản ứng gì, ví dụ chân CLKDV, mặc dù mình đã kích đúp vào modul để thay giá trị CLKDV_DIVIDE = 2, 4, 6 ..max 32.
      - Có điều mình thắc mắc nữa là kiểu thiết kế Schematic là cứ gắp ra rồi biên dịch >> nạp là chạy thôi chứ không cần thêm code nữa đúng không? vì mình test thấy DCM có dấu hiệu chạy vì chọn chế độ CLKIN_DIVIDE_BY_2 thấy đầu ra CLK0 chia 2.
      Mình đọc hoài mà không hiểu nguyên nhân, bên mục "Tâm sự về FPGA" bạn nói về mục này rất hữu ích, nhưng mình đọc useguide và làm theo không chạy.
      Mong nhận được lời khuyên của Mod.
      [IMG][/IMG]
      Last edited by hungcachan; 30-03-2011, 16:56.

      Comment


      • #4
        Nguyên văn bởi hungcachan Xem bài viết
        Mình hơi gà nên không rõ lắm, mong Mod giải thích, tất nhiên là Trigger ngoài là bình thường về tính năng của Oscilloscope, nhưng ví dụ muốn lấy mẫu mà Clk lấy mẫu phải cùng pha với các tín hiệu khác (đặc tính bài toán của mình vậy) vì có rất nhiều thiết bị khác được nối với nhau để cùng xử lý tín hiệu, cái máy của mình chỉ là một khâu.
        Mình nghĩ ra 1 cách, bạn làm thử
        Dùng clock 100MHz của board tạo clock 10MHz (clk_10m),
        Cách 1: Đưa clk_10m xor với clock 10Mhz ở ngoài của ban, khi lệch pha, xor sẽ tạo ra 1 xung. Và bạn dùng xung này để điều chỉnh pha của DCM cho đến khi 1 xung trùng nhau (không rõ Virtex4 cho phép chỉnh pha trong lúc chay không)
        Cách 2 là dùng PLL loop mà bạn tìm thấy trong appnote của Xilinx.


        Tiện đây hỏi bác luôn, mình là con gà về Fpga và Xilinx, mới bắt đầu, mình muốn hỏi:
        - Bắt đầu với Kit này, mình tạo 1 project Virtex-4 và nạp thành công, mình làm như sau: Đầu vào 40Mhz >> BUFG >> INV >> BUFG >> Đầu ra (Đo thấy Clk 40Mhz ở đầu ra).
        - Mình thử với DCM_BASE, làm theo hướng dẫn ở "Virtex-4 FPGA User Guide" >> hoàn thành thiết kế rồi nối ra các chân vào ra để debug bằng Oscilloscope, chỉ đo thấy chân CLK0 của DCM cho ra xung,các chân CLK90, CLK180, CCK270 không tạo lệch pha với CLKIN và các chân còn lại không thấy phản ứng gì, ví dụ chân CLKDV, mặc dù mình đã kích đúp vào modul để thay giá trị CLKDV_DIVIDE = 2, 4, 6 ..max 32.
        - Có điều mình thắc mắc nữa là kiểu thiết kế Schematic là cứ gắp ra rồi biên dịch >> nạp là chạy thôi chứ không cần thêm code nữa đúng không? vì mình test thấy DCM có dấu hiệu chạy vì chọn chế độ CLKIN_DIVIDE_BY_2 thấy đầu ra CLK0 chia 2.
        Mình đọc hoài mà không hiểu nguyên nhân, bên mục "Tâm sự về FPGA" bạn nói về mục này rất hữu ích, nhưng mình đọc useguide và làm theo không chạy.
        Mong nhận được lời khuyên của Mod.
        Cái này thấy có vẻ đúng rồi mà không hiểu sao không chạy. Bạn nối chân "locked" và chân reset ra ngoài rồi test thử xem có "lock" được không và thử reset nó xem sao.

        Comment


        • #5
          Mình đã giải quyết xong vụ DCM, đúng là nó không chấp nhận CLKin ngoài giá trị cho phép, nó khóa đầu ra hoặc điên điên nó cho tất cả đầu vào bằng đầu ra. Nếu cho vào đúng, không cần Reset, nó chạy liền.
          Hai cách bạn cho mình rất hay, mình sẽ tìm hiểu cách thứ nhất, còn cách thứ hai dùng Pll thì hơi khó vì Virtex-4 không hỗ trợ Pll bên trong (Virtex-5 mới hỗ trợ) còn theo appnote mà cậu chỉ, cần thêm 1 con VCO ngoài, mà chỗ này nó không cho phép mình thêm phần cứng.
          Ngoài hai cách trên, bạn có cách nào dùng bộ đếm để dịch pha của hai tín hiệu: 100 và 10Mhz không?
          Thực ra là trên mạch có 1 con OSC llaapj trình được, mình cho nó ra 500Mhz, như vậy mình có hai Clk: Clk1: 500Mhz (ở sẵn bên trong) và Clk2: 10Mhz (từ bên ngoài). Có cách nào thực sự đơn giản, chỉ dùng bộ đếm, hay dang graphic để trùng pha hai tín hiệu này hay không?
          Ming tin và cảm ơn bạn rất nhiều.

          Comment


          • #6
            Nguyên văn bởi hungcachan Xem bài viết
            Mình đã giải quyết xong vụ DCM, đúng là nó không chấp nhận CLKin ngoài giá trị cho phép, nó khóa đầu ra hoặc điên điên nó cho tất cả đầu vào bằng đầu ra. Nếu cho vào đúng, không cần Reset, nó chạy liền.
            Hai cách bạn cho mình rất hay, mình sẽ tìm hiểu cách thứ nhất, còn cách thứ hai dùng Pll thì hơi khó vì Virtex-4 không hỗ trợ Pll bên trong (Virtex-5 mới hỗ trợ) còn theo appnote mà cậu chỉ, cần thêm 1 con VCO ngoài, mà chỗ này nó không cho phép mình thêm phần cứng.
            Để thay thế VCO, bạn có thể dùng NCO (Numerical Controlled Oscillator)

            Ngoài hai cách trên, bạn có cách nào dùng bộ đếm để dịch pha của hai tín hiệu: 100 và 10Mhz không?
            Thực ra là trên mạch có 1 con OSC llaapj trình được, mình cho nó ra 500Mhz, như vậy mình có hai Clk: Clk1: 500Mhz (ở sẵn bên trong) và Clk2: 10Mhz (từ bên ngoài). Có cách nào thực sự đơn giản, chỉ dùng bộ đếm, hay dang graphic để trùng pha hai tín hiệu này hay không?
            Ming tin và cảm ơn bạn rất nhiều.
            Có cách dùng bộ đếm NCO.
            Ví dụ muốn tạo clock f, Bạn lấy clock nhanh hơn (tối thiểu 2xf) để chạy mạch NCO.
            Mạch NCO sẽ cho ra clock f. Ví dụ f = 100MHz. Bạn dùng clk f chia 10 xuống còn 10MHz, clk 10Mhz này hiển nhiên cùng pha với clk 100MHz.
            Rồi dùng mạch phase detector so sánh phase của clk 10MHz bạn tạo ra với clk 10MHz ở ngoài. Sau đó bạn chỉnh phase của NCO để cho 2 phase này trùng nhau.

            Mạch NCO:

            phase <= phase + delta;
            phase_out <= phase + phase_offset;

            clk_out = phase_out(31) ... tùy theo delta, bạn sẽ có được tần số của clk_out.
            Tần so clock out :
            fout = fin * delta/2^32 ... (phase dùng 32 bit)

            phase_offset có thể dùng để chỉnh phase của clock out.

            Comment


            • #7
              - Mình không tìm thấy NCO trong các symbol cơ bản của Virtex-4 (mình dùng ISE 11.1). Nó là Ip-core thuộc DSP hả bạn? Có cần phải mua không? hay là phải cài phiên bản ISE mới nhất?
              - Mình hiểu ý tưởng của bạn như thế này có đúng không?
              + Mình có Clk nội 500Mhz >>> chia thành 100Mhz >>> dùng NCO chia thành 10Mhz_nco >>> so pha với 10Mhz đầu vào (10Mhz_in) với 10Mhz_nco >> phát hiện sự lệch pha và dùng NCO để điều chỉnh pha của 100Mhz trong vòng lặp.
              + Vậy để chia 500Mhz trong Virtex-4 dùng cách nào là tối ưu, như DCM với con Virtex-4 của mình (XC4VSX35-10FF668), DCM của nó chấp nhận đầu vào tối đa 300Mhz. Tiện về DCM hỏi bạn luôn, mình đã thử hai chế độ:là DLL và DFS của DCM,
              với DFS mình chỉ hiểu là không đấu chân Clkfb, nó chấp nhận đầu vào đến tận 1Mhz và mình đã nhân tần số lên được, nhưng mình chưa hiểu sự khác nhau cơ bản của chế độ DSF và DLL,DSF sẽ tạo ra lệch pha lớn đúng không?
              + Làm thế nào để xác định sự lệch pha giữa hai tín hiệu 10Mhz_in và 10Mhz_nco, như cách bạn nói ở trên dùng (Xor) đúng không?
              + NCO có cho điều chỉnh trong quá trình chạy hay không? dạng như vòng lặp chẳng hạn, vì cái chân 10Mhz_in của mình nó sẽ bị rút ra cắm vào liên tục.
              + Nó cho điều chỉnh với độ phân giải là (32Bit/2*pi) hả bạn, như vậy quá chính xác rồi!
              Mình tìm không thấy tài liệu nào nói riêng về NCO, nếu bạn có cho mình xin đường link, cảm ơn rất nhiều.

              Comment


              • #8
                Nguyên văn bởi hungcachan Xem bài viết
                - Mình không tìm thấy NCO trong các symbol cơ bản của Virtex-4 (mình dùng ISE 11.1). Nó là Ip-core thuộc DSP hả bạn? Có cần phải mua không? hay là phải cài phiên bản ISE mới nhất?
                NCO đơn giản thôi, bạn tư viết VHDL cũng được.
                process(clk)
                begin
                if(rising_edge(clk)) then
                phase <= phase + x"10000000";--frequency out = 1/8 frequency in
                end process;
                clk_out <= phase(31);
                Bạn thử test trước coi có tạo ra đúng tần số ko. Vấn đề của NCO là bị jitter

                - Mình hiểu ý tưởng của bạn như thế này có đúng không?
                + Mình có Clk nội 500Mhz >>> chia thành 100Mhz >>> dùng NCO chia thành 10Mhz_nco >>> so pha với 10Mhz đầu vào (10Mhz_in) với 10Mhz_nco >> phát hiện sự lệch pha và dùng NCO để điều chỉnh pha của 100Mhz trong vòng lặp.
                + Vậy để chia 500Mhz trong Virtex-4 dùng cách nào là tối ưu, như DCM với con Virtex-4 của mình (XC4VSX35-10FF668), DCM của nó chấp nhận đầu vào tối đa 300Mhz.
                Thôi lấy clk 100MHz rồi nhân lên vậy . 500Mhz mạch ko chạy nổi đâu. Nhân lên chừng 250Mhz là được.
                Nếu DCM của Virtex4 cho phép chỉnh phase trong lúc chạy thì chắc ko cần phức tạp như vậy.

                Tiện về DCM hỏi bạn luôn, mình đã thử hai chế độ:là DLL và DFS của DCM,
                với DFS mình chỉ hiểu là không đấu chân Clkfb, nó chấp nhận đầu vào đến tận 1Mhz và mình đã nhân tần số lên được, nhưng mình chưa hiểu sự khác nhau cơ bản của chế độ DSF và DLL,DSF sẽ tạo ra lệch pha lớn đúng không?
                http://www.xilinx.com/itp/xilinx7/bo...dl0021_13.html
                Theo trang web đó thì 2 cái gần như độc lập.
                Khi dùng DFS, bạn vẫn có thể feedback clk0 ... clkFX sẽ cùng pha với clk-in.

                + Làm thế nào để xác định sự lệch pha giữa hai tín hiệu 10Mhz_in và 10Mhz_nco, như cách bạn nói ở trên dùng (Xor) đúng không?
                Uh, mình biết cách đó, bạn có thể kiếm thêm trên mạng, chắc có nhiều mạch khác.

                Comment


                • #9
                  bạn có cách nào nhận biết 1 tín hiệu 10Mhz cắm vào mạch không nhỉ, ví dụ cắm vào là 1, rút ra là 0. tất nhiên là ở bên trong có dao động nội rồi. Mình nghĩ đủ cách nhưng không có cách nào ổn, các loại mạch đếm, rese... bó tay.

                  Comment


                  • #10
                    Nguyên văn bởi hungcachan Xem bài viết
                    bạn có cách nào nhận biết 1 tín hiệu 10Mhz cắm vào mạch không nhỉ, ví dụ cắm vào là 1, rút ra là 0. tất nhiên là ở bên trong có dao động nội rồi. Mình nghĩ đủ cách nhưng không có cách nào ổn, các loại mạch đếm, rese... bó tay.
                    Bạn cần thêm 1 clock khác để chạy mạch watchdog. Khi clk10Mhz co' xung thì mạch watchdog bi reset liên tục còn ko mạch watchdog sẽ báo.

                    Comment


                    • #11
                      bạn hướng dẫn cụ thể hơn được không. mình lần đầu làm, không biết Watchdog trong xilinx thế nào, lấy ở đâu, có giống vi điều khiển không? Mà mình dùng virtex-4 và virtex-2 có watchdog không?
                      Last edited by hungcachan; 01-04-2011, 17:44.

                      Comment


                      • #12
                        Watchdog (canh chừng) là một bộ đếm lùi. Khi bộ đếm xuống 0 thì sẽ báo 1 tín hiệu. Để bộ đếm không xuống 0 thì phải có 1 tín hiệu khác reset bộ đếm lại giá trị ban đầu. Nếu không reset kip thì bộ đếm sẽ = 0.

                        Bạn có thể dùng clock 10MHz để reset bộ đếm. Nếu bộ đếm chạy bằng clock 100Mhz thì cho bộ đếm đếm từ 15 là được, nếu clock 10Mhz chạy thì bộ đếm sẽ luôn bị reset trước khi = 0.

                        Comment

                        Về tác giả

                        Collapse

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

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

                        Collapse

                        Đang tải...
                        X