Thông báo

Collapse
No announcement yet.

Project nhỏ: Bộ lọc số FIR thực hiện bằng FPGA

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #31
    Nguyên văn bởi nemesis21 Xem bài viết
    - Giai đoạn viết VHDL nên là giai đoạn dễ dàng nhất.

    Khuyến khích làm các project là một việc hay, nhưng tôi nghĩ rằng học về process và các trình tự tất yếu còn quan trọng hơn simulation output đối với những người mới.
    Rất hay!

    Chỉ có một vài điều nhỏ :
    - nếu là real-valued filter, thì coefficients sẽ phải đối xứng. Có thể optimize một chút hơn ở đây.
    - Output của adder phải thêm 1 bit cho mổi tầng; hình như trong code thiếu cái này ?
    - bit-exact match: Làm luôn khâu này đi bác, làm ơn cho trót mà! Cách nào dễ để chuyển từ floating point của model qua fixed point, chọn fixedpoint coefficients sao cho gần 0dB nhất, rồi truncate output mà cân bằng được giữa SNR và dynamic range? Mấy cái này lý thuyết thường bị bỏ qua, đụng thực tế mới vỡ nợ, bản thân tui loay hoay mãi cái chuyện này.

    Comment


    • #32
      Nguyên văn bởi DVinh Xem bài viết
      - bit-exact match: Làm luôn khâu này đi bác, làm ơn cho trót mà! Cách nào dễ để chuyển từ floating point của model qua fixed point, chọn fixedpoint coefficients sao cho gần 0dB nhất, rồi truncate output mà cân bằng được giữa SNR và dynamic range? Mấy cái này lý thuyết thường bị bỏ qua, đụng thực tế mới vỡ nợ, bản thân tui loay hoay mãi cái chuyện này.
      Thường thì SNR và dynamic range lệ thuộc vào test bench để bảo đảm sự chính xác độ dài của data. Bạn có thể profile những variables bằng cách dùng "printf" ra bài, rồi dùng excel để sort thì sẽ biết được min và max. Từ đó chọn độ dài (bit width) cho hợp với điều kiện của thiết kế. Nên dùng C/C++ để làm vấn đề này thì lẹ hơn là RTL vì nó chỉ dính líu tới sự hoạt động (functionality) và dùng typedef để fine tune bit width. SystemC data type thường được dùng để mô tả bit accurate models.
      Chúc một ngày vui vẻ
      Tony
      email : dientu_vip@yahoo.com

      Comment


      • #33
        Fir

        Nguyên văn bởi nemesis21 Xem bài viết
        Với FIR, nếu chúng ta khởi đầu với parallel - adder tree VHDL implementation, conversion sang parallel - simple systolic chỉ mất vài chục giây. Chuyển sang serial, 5-15 phút. Chuyển sang semi-parallel, 10-20 phút. Nếu designed well, semi-parallel FIR có thể trade-off throughput vs size chỉ trong vài giây bằng cách thay đổi generics.

        Nếu chúng ta cần gấp một configurable FIR core, chúng ta có thể bỏ ra vài phút với Coregen. FIR filter là một beginner project vừa tầm để introduce basic techniques, nhưng là một unconvincing case cho high level synthesis tools.


        Mentor có một demonstration video dùng Catapult C để implement FIR:
        http://www.mentor.com/products/esl/m...1-b8518e15cbbe

        Phần C code cũng tương tự như bạn đã đưa lên, nhưng phần implementation lại nhắm vào ASIC, nên không thể nói rằng những biến thể đó là parallel vs semi-parallel vs serial architecture trên FPGA.

        Nếu có thể thì bạn làm một high level synthesis demonstration cho FPGA. Demo của Mentor không nhắm vào FPGA cho nên chưa được convincing lắm.


        System C là một chuyện, more exposure về FPGA cho "software crowd" beginners. Có khá nhiều tool để chuyển từ System C sang HDL. Nhưng "algorithm synthesis tool" có lẽ thuộc vào một phạm trù khác. Về cost và availability, nó nằm ngoài tầm với, ngay cả cho nhiều companies. Tôi cảm thấy nó là một sự phụ thuộc vào tool từ một vài specific vendor hơn là một phương pháp đại trà.
        thiết kế bộ FIR theo sơ đồ này dễ hiểu chứ các bạn?
        Attached Files

        Comment


        • #34
          Phần C code cũng tương tự như bạn đã đưa lên, nhưng phần implementation lại nhắm vào ASIC, nên không thể nói rằng những biến thể đó là parallel vs semi-parallel vs serial architecture trên FPGA.

          Nếu có thể thì bạn làm một high level synthesis demonstration cho FPGA. Demo của Mentor không nhắm vào FPGA cho nên chưa được convincing lắm.
          Khi target cho FPGA và nếu muốn tận dụng những cell đặc biệt (DSP, accelerate) thì C/C++ cũng cần phải sửa đổi lại để ám chỉ (infer) cách thiết kế đó.

          Ví dụ cho DSP của Xilinx
          Code:
          #include "fir_filter.h"
          
          #pragma map_to_operator dsp_cell
          void dsp_cell(d_t xin, d_t h, acc_t yin, acc_t &yout)
          {
          	yout = (xin * h) + yin;
          }
          
          #pragma design top
          void fir_filter (d_t *input, c_t coeffs[NUM_TAPS], d_t *output ) {
            static d_t regs[NUM_TAPS];
            acc_t temp = 0;
            int i;
            
            SHIFT:for ( i = NUM_TAPS-1; i>=0; i--) {
              if ( i == 0 ) 
                regs[i] = *input;
              else 
                regs[i] = regs[i-1];
            }
          
            MAC:for ( i = NUM_TAPS-1; i>=0; i--) {
          		dsp_cell(regs[i], coeffs[i], temp, temp);
            }
          
            *output = temp>>7;
          }
          Ví dụ cho Altera
          Code:
          #include "fir_filter.h"
          
          #pragma map_to_operator dsp_cell
          acc_t dsp_cell(d_t xin[4], d_t h[4])
          {
            acc_t temp = 0;
            
            #pragma unroll yes
            MAC:for ( int i=3; i>=0; i--) 
                temp += xin[i]*h[i];
                
            return temp;;
          }
          
          #pragma design top
          void fir_filter (d_t *input, d_t coeffs[NUM_TAPS], d_t *output ) {
            static d_t regs[NUM_TAPS];
            acc_t temp = 0;
            d_t r[4], h[4];
            
            #pragma unroll yes
            for (int i=NUM_TAPS-1; i>=0; i--)
          	if (i==0)
          		regs[i] = *input;
          	else
          		regs[i] = regs[i-1];
          
            for (int j=(NUM_TAPS/4)-1; j>=0; j--)
            {	
          	  #pragma unroll yes
          	  for (int i=3; i>=0; i--)
          	  {
          		r[i] = regs[(j*4)+i];
          		h[i] = coeffs[(j*4)+i];
          	  }
          	  
          	  temp += dsp_cell(r,h);
            }
            *output = temp>>(NUM_TAPS-1);	
          }
          Chú ý : dsp_cell đã viết lại để mô tả cách kiến trúc đặc thù của DSP cell cho mỗi FPGA technology. Khi HLS tổng hợp sẽ tạo ra một khối RTL riêng với cấu trúc để tổng hợp RTL có thể ám chỉ (infer) những DSP cell của technology đó.
          Last edited by tonyvandinh; 29-10-2010, 00:48.
          Chúc một ngày vui vẻ
          Tony
          email : dientu_vip@yahoo.com

          Comment


          • #35
            Các anh có thể mô tả tổng quát quá trình thiết kế bộ lọc IIR bằng mã giả ko ạ? Vì em ko học matlab nên em khó hỉu quá . Các anh giúp em nha. Em cũng đang cần viết bằng C++. Tks mọi ng

            Comment


            • #36
              Nguyên văn bởi ohmygodntt Xem bài viết
              Các anh có thể mô tả tổng quát quá trình thiết kế bộ lọc IIR bằng mã giả ko ạ? Vì em ko học matlab nên em khó hỉu quá . Các anh giúp em nha. Em cũng đang cần viết bằng C++. Tks mọi ng
              Bạn nên mở thread mới cho câu hỏi này. Thread này chỉ bàn về FIR. Xin đừng đi lạc đề. Cám ơn.
              Chúc một ngày vui vẻ
              Tony
              email : dientu_vip@yahoo.com

              Comment


              • #37
                Hỏi cách đưa các hệ số lọc từ Matlab

                Sau khi export hệ số lọc từ FDATool ra em thấy hệ số lọc gồm một dãy số dài dạng nhị phân.
                Mà đầu vào bộ lọc của em chỉ là 14 bit thì bằng cách nào em đưa được các hệ số lọc đó vào
                chuơng trình code được ạ?.Anh chị nào chỉ em với.

                Comment


                • #38
                  bạn dùng FDA tool của Matlab thì sau khi nhập các thông số (pp thiết kế : window,....; bộ lọc dải thông , dải chặn, hay thông thấp , thông cao ...., tương ứng sẽ có thông số cho từng loại , rồi bậc của bộ lọc ...) sau đó ban design bộ lọc đó => kết quả thu đc sẽ là các đáp ứng xung ở dạng số thực chứ !
                  xong bạn muốn chuyển số đó ở dạng nhị phân thì phải chuyển nó về định dạng số thực dấu phẩy tĩnh , hoặc số thực dấu phẩy động.
                  m cũng đang làm đề tài NCKH về thiết kế bộ lọc FIR , mình thiết kế bộ lọc sắp xong rồi (mình viết code bằng VHDL , dùng thuật toán DA ). nếu bạn muốn hỏi gì thì qua Gmail của mình nhé : dangbinhhvktqs44@gmail.com

                  Comment


                  • #39
                    bạn muốn xem cách đổi từ số thực sang dạng fix thì bạn có thể liên lạc với mình qua gmail: dangbinhhvktqs44@gmail.com
                    hj . chúc bạn thành công

                    Comment


                    • #40
                      Chào tất cả các anh, em đang muốn học và đang làm bộ lọc fir trên fpga theo chuẩn thiết kế của zipcore anh đưa lên, cho em hỏi các thông số USE_SATURATE và USE_OPTZERO dùng để làm gì, em đã code và mô phỏng bằng modelsim xong(em code bằng verilog dùng systolic array), em muốn hỏi, khi nạp vào kit FPGA thì làm sao kiểm tra đc là nó đúng, làm sao để có đầu vào của bộ lọc này, @@ em hơi mù mờ cái này, mong các anh quay lại giúp em ! em cám ơn nhiều .

                      Comment


                      • #41
                        Nguyên văn bởi nhandt3 Xem bài viết
                        Chào tất cả các anh, em đang muốn học và đang làm bộ lọc fir trên fpga theo chuẩn thiết kế của zipcore anh đưa lên, cho em hỏi các thông số USE_SATURATE và USE_OPTZERO dùng để làm gì, em đã code và mô phỏng bằng modelsim xong(em code bằng verilog dùng systolic array), em muốn hỏi, khi nạp vào kit FPGA thì làm sao kiểm tra đc là nó đúng, làm sao để có đầu vào của bộ lọc này, @@ em hơi mù mờ cái này, mong các anh quay lại giúp em ! em cám ơn nhiều .
                        Good !!!
                        Bạn mô phỏng như thế nào? Test pattern của bạn là gì?
                        Bạn synthesis như thế nào? Timing constraint của bạn là gì?
                        Bạn có board mạch có ADC ko? Bạn cần signal generator nữa. Bạn có thể tạo signal vào và capture signal ra rồi phân tích phổ bằng Matlab.

                        Comment


                        • #42
                          Chào anh, em hiện tại mới code xong cho phần bộ lọc, các submodule cộng, nhân, delay, rounder đã test và map lại với nhau(phần control em chưa code vì em nghĩ check function bằng modelsim thì điểu khiển trong testbench là được), em giờ đang code matlab để tạo số cửa sổ, hệ số bộ lọc, vector input, output, sau đó đẩy input vào modelsim để so sánh kết quả với nhau. Ít ngày nữa thì em mới mượn được Kit vertex II-pro, em định thực hiện trên Kit này. Đúng là phần tạo signal và phân tích phổ làm em lúng túng quá, em đang định chỉ load vertor input được tạo từ matlab sang ram rồi test nhưng mà thế thì đuối quá em sẽ cố gắng tìm hiểu cách tạo tín hiệu để làm tốt hơn.
                          Còn về synthesis và timing contrain (cái này làm em rất mù mờ). Đây là lần đầu em làm FPGA, nhưng em đã làm 1 project ASIC bằng tool của synopsys thì trong đầu em nghĩ là, chỉ có trong ASIC mới làm timing constrain rồi chỉnh contrains cho phù hợp để fix setup,hold time , còn trong FPGA thì phần timing ,tools sẽ tự tính cho mình và offer khoảng tần số hoạt động, ??? Liệu suy nghĩ của em có đúng không ạ, Mong anh giải thích hộ em dù có thể những câu hỏi của em hơi ngớ ngẩn, hix
                          Giờ em muốn simulation cái code em vừa viết cho đúng đã, sau đó em đinh tìm hiểu cách tạo ram, load vào FPGA, sau đó mới đến tạo tín hiệu, kiểm tra,...
                          Em rất muốn tìm hiểu về cái này, rất mong các anh giúp đỡ và sửa sai về hướng làm và cách làm cho em, em cảm ơn rất nhiều ! @@

                          Comment


                          • #43
                            Nguyên văn bởi nhandt3 Xem bài viết
                            Chào anh, em hiện tại mới code xong cho phần bộ lọc, các submodule cộng, nhân, delay, rounder đã test và map lại với nhau(phần control em chưa code vì em nghĩ check function bằng modelsim thì điểu khiển trong testbench là được), em giờ đang code matlab để tạo số cửa sổ, hệ số bộ lọc, vector input, output, sau đó đẩy input vào modelsim để so sánh kết quả với nhau.
                            Ừ, bạn nên dùng matlab tạo tín hiệu rồi in tín hiệu ra text file rồi đưa vô modelsim mô phỏng. Lấy output của FIR Của bạn và so sánh với output của FIR của Matlab.
                            Bạn làm cẩn thận phần này vì phần này dễ kiểm tra và dễ sửa.

                            Ít ngày nữa thì em mới mượn được Kit vertex II-pro, em định thực hiện trên Kit này. Đúng là phần tạo signal và phân tích phổ làm em lúng túng quá, em đang định chỉ load vertor input được tạo từ matlab sang ram rồi test nhưng mà thế thì đuối quá em sẽ cố gắng tìm hiểu cách tạo tín hiệu để làm tốt hơn.
                            Loadtest vector vô ram cũng được, mình thấy không vấn đề gì. Bạn có thể dùng NCO để tạo các dạng sóng tuần hoàn đơn giản.

                            Còn về synthesis và timing contrain (cái này làm em rất mù mờ). Đây là lần đầu em làm FPGA, nhưng em đã làm 1 project ASIC bằng tool của synopsys thì trong đầu em nghĩ là, chỉ có trong ASIC mới làm timing constrain rồi chỉnh contrains cho phù hợp để fix setup,hold time , còn trong FPGA thì phần timing ,tools sẽ tự tính cho mình và offer khoảng tần số hoạt động, ??? Liệu suy nghĩ của em có đúng không ạ, Mong anh giải thích hộ em dù có thể những câu hỏi của em hơi ngớ ngẩn, hix
                            Giờ em muốn simulation cái code em vừa viết cho đúng đã, sau đó em đinh tìm hiểu cách tạo ram, load vào FPGA, sau đó mới đến tạo tín hiệu, kiểm tra,...
                            Em rất muốn tìm hiểu về cái này, rất mong các anh giúp đỡ và sửa sai về hướng làm và cách làm cho em, em cảm ơn rất nhiều ! @@
                            Trong FPGA cũng cần timing constraint. Bạn cứ làm tiếp theo hướng này, khi mô phỏng hoàn chỉnh, bắt đầu lắp đặt lên FPGA thì tìm hiều timing constraint.

                            Good luck!

                            Comment


                            • #44
                              Vâng a, em cảm ơn anh, nếu có gì thắc mắc, em sẽ lại lên đây hỏi anh, @@

                              Comment


                              • #45
                                [jefflieu ][/Good luck]

                                Chào anh,

                                Thực ra em đã làm được project này 1 thời gian, em cho véc tơ input qua fpga và đã thu được output đúng khi so sánh với matlab, sau này em gặp một người (theo em là cũng có kinh nghiệm), anh ấy bảo là, việc em so sánh đúng vector output với vector output chuẩn của matlab chỉ nói lên là : bộ em thực hiện giống với bộ fir trên matlab thôi, kiểu như là cần 1 cách kiểm tra khác, em không rõ lắm về vấn đề này mà cũng không có điều kiện gặp anh ấy để hỏi thêm, anh cho ý kiến giúp em với ạ, em cảm ơn anh nhiều...

                                Với lại em biết là trong các core của FPGA, trong xillinx thì có core của bộ fir, thì nó có khác với bộ fir mình làm đây ạ?

                                Trong code của em, em chia ra các bộ riêng biệt, bộ cộng, nhân, delay(thực ra là register), và rounder, sau đó thì nối lại bằng vòng for. Có người nói với em, nếu làm theo kiểu song song thế này rất dễ vì chỉ cần một vòng for và các lênh ở phía trong, một ít code là đủ, thậm chỉ tool synthesize còn gen ra mạch tốt hơn code của mình? Em muốn hỏi là người đó nói thế có đúng không ạ? có những ưu điểm gì khi làm theo 2 cách ạ?

                                Em là người rất muốn tìm hiểu nhưng có quá ít kiến thức, các câu hỏi của em có thể rất vớ vẩn nhưng em rất mong được anh giúp đỡ, em cảm ơn anh nhiều ạ !

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X