Thông báo

Collapse
No announcement yet.

Tâm sự về FPGA

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

  • #61
    Vào năm cuối nên e cũng bận đi thực tập. hôm nay Em mới tiếp tục được. E có một số câu hỏi thế này:
    - Với edk mình có thể viết code C được không hay bắt buộc phải qua SDK để viết.
    - Em cũng đã biết cách add IP user port, còn phần lập trình C mình sẽ tham khảo các hàm trong file ip_user_port.h có phải không anh? Mong anh đi sâu vào phần này giúp em.
    Đây là phần code C em viết. Anh cho e ý kiến
    #include"stdio.h"
    #include"conio.h"
    #include"led_port.h"
    #include"xutil.h"
    #define LED_PORT_BASE_ADDR 0xC7200000(Địa chỉ trong file xparameter.h)
    #define LED_PORT_WRITE(value)\
    LED_PORT_mWriteSlaveReg0(LED_PORT_BASE_ADDR,(Value ))
    void delay(unsigned int n)
    {
    unsigned int i,j;
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=50;j++)
    {
    }
    }
    }
    void delay(unsigned int n)
    {
    unsigned int i,j;
    for(i=0;i<n;i++)
    for(j=0;j<i;j++)
    {}
    }
    void main(void)
    {
    while(1)
    {
    LED_PORT_WRITE(0xC7200001);
    delay(10000);
    LED_PORT_WRITE(0xC7200000);
    delay(10000);
    }

    }
    Em chưa biết cách mô phỏng bằng Modelsim vs cap cũng không có(Vì đắt mà ở trường lại ít người quan tâm lên đành chịu).

    Comment


    • #62
      Ok, trong thực tế khi đi làm việc, trước khi cho ra lò (release) một phiên bản mới, mọi người phải qua phần duyệt code (code review), các thành viên trong nhóm sẽ duyệt code cho nhau để code tốt hơn.
      Các bạn khi thực tập nhóm cũng nên làm như vậy.

      Nguyên văn bởi ngocdt2k3 Xem bài viết
      #include"stdio.h"
      #include"conio.h"
      #include"led_port.h"
      #include"xutil.h"
      #define LED_PORT_BASE_ADDR 0xC7200000(Địa chỉ trong file xparameter.h)
      #define LED_PORT_WRITE(value)\
      LED_PORT_mWriteSlaveReg0(LED_PORT_BASE_ADDR,(Value ))
      void delay(unsigned int n)
      {
      unsigned int i,j;
      for(i=1;i<=n;i++)
      {
      for(j=1;j<=50;j++)
      {
      }
      }
      }
      void delay(unsigned int n)
      {
      unsigned int i,j;
      for(i=0;i<n;i++)
      for(j=0;j<i;j++)
      {}
      }
      void main(void)
      {
      while(1)
      {
      LED_PORT_WRITE(0xC7200001);
      delay(10000);
      LED_PORT_WRITE(0xC7200000);
      delay(10000);
      }

      }
      Em chưa biết cách mô phỏng bằng Modelsim vs cap cũng không có(Vì đắt mà ở trường lại ít người quan tâm lên đành chịu).
      Đoạn code này đơn giản không cần kiến thức chuyên ngành, nên mình có thể giúp bạn review được:

      1) Nếu không lầm thì trong file xparameter.h đã có sẵn
      #define LED_PORT_BASE_ADDR
      Tại sao bạn lại define lại ? Bạn nên include "xparameter.h" và dùng luôn macro trong file xparameter. Vì khi bạn thay đổi system --> file xparamter sẽ được tạo lại bởi software --> bạn không cần sửa code của bạn nếu bạn dùng luôn macro trong xparameter.

      2) Sao bạn lại có 2 hàm delay với giải thuật khác nhau mà lại có cùng 1 prototype?

      3) Vì sao giá trị bạn ghi vào LED lại là :0xC7200001?

      Comment


      • #63
        Một ứng dụng đơn giản như trên là đủ làm quen với phần mềm rồi.
        Khi làm project, bạn cần phân biệt "mục tiêu":
        - Làm quen với Tool (Verilog,VHDL, Xilinx/Altera FPGA)
        Hay
        - Làm quen với các kiến thức chuyên ngành như xử lý ảnh, tín hiệu số ....
        Bạn cần phải nhắm diệt từng cái một.

        Comment


        • #64
          Nice and slowly ! Mình thích topic này của Jefflieu, nó cho tôi thấy nhiều thứ cần thiết mà trên trường các thầy cô có lẽ quên không dậy,mình đang nhắm tới một cái đề tài bảo vệ hơi "siêu thực" một chút (với tôi thì thế ^^) là thực hiện mô tả ở một mức độ cao một bộ vi điều khiển 16 bit,hướng đến là trong họ avr. Thực sự xuất phát điểm của mình hiện tại là hơi thấp về mảng thiết kế số, nếu Jefflieu rảnh cho mình một vài cái định hướng và gợi ý, thực sự mình đang "bơi" theo nghĩa đen... Thanks Jefflieu trước !!!

          Comment


          • #65
            3) Vì sao giá trị bạn ghi vào LED lại là :0xC7200001?[/QUOTE]
            trong phần khai báo IP user port, Em có khai báo sử dụng thanh ghi 32bit là slv_reg0(0xc7200000->0xc720ffff). Nên em nghĩ mình xuất giá trị ra thanh ghi này. Phần user_port.vhd: led_port<=slv_reg0; Vì giá trị của thanh ghi này sẽ được xuất ra port led.

            Comment


            • #66
              Nguyên văn bởi WhiteFangVN Xem bài viết
              Nice and slowly ! Mình thích topic này của Jefflieu, nó cho tôi thấy nhiều thứ cần thiết mà trên trường các thầy cô có lẽ quên không dậy,mình đang nhắm tới một cái đề tài bảo vệ hơi "siêu thực" một chút (với tôi thì thế ^^) là thực hiện mô tả ở một mức độ cao một bộ vi điều khiển 16 bit,hướng đến là trong họ avr. Thực sự xuất phát điểm của mình hiện tại là hơi thấp về mảng thiết kế số, nếu Jefflieu rảnh cho mình một vài cái định hướng và gợi ý, thực sự mình đang "bơi" theo nghĩa đen... Thanks Jefflieu trước !!!
              Mình không hiểu khái niệm "thực hiện mô tả ở mức độ cao" của bạn.
              Trong thiết kế kĩ thuật số có các mức độ sau:
              - Gate level, bạn thiết kế ở mức cổng AND/OR
              - Register transfer level, thiết kế ở mức Register, Multiplexer ...
              - Cao hơn chút là behavioral level, mức hành vi, viết code VHDL và Verilog
              - Transaction Level ... mức giao dịch, ở mức này, người ta không quan tâm đến việc giao tiếp giữa 2 module cụ thể diễn ra như thế nào, các tín hiệu bắt tay (handshake) như thế nào, bao nhiêu chu kì clock ... mà chỉ quan tâm là có một gói dữ liệu được trao đổi giữa 2 module.

              Bạn có mấy tháng để làm đề tài?

              Comment


              • #67
                Nguyên văn bởi ngocdt2k3 Xem bài viết
                3) Vì sao giá trị bạn ghi vào LED lại là :0xC7200001?
                trong phần khai báo IP user port, Em có khai báo sử dụng thanh ghi 32bit là slv_reg0(0xc7200000->0xc720ffff). Nên em nghĩ mình xuất giá trị ra thanh ghi này. Phần user_port.vhd: led_port<=slv_reg0; Vì giá trị của thanh ghi này sẽ được xuất ra port led.[/QUOTE]

                Tại sao không phải là 0x12345001 mà là 0xC72000000 ? Giá trị bạn đưa vào macro LED_PORT_WRITE là giá trị bạn muốn ghi vào register slv_reg0.
                Register slv_reg0 của bạn nằm ở đạ chỉ 0xC7200000
                Bạn ghi : LED_PORT_WRITE(0xC7200001) có nghĩa là ghi giá trị 0xC7200001 vào điạ chỉ 0xC7200000?

                Comment


                • #68
                  Ý mình "mức cao" ở đây có nghĩa là cố gắng mô tả được càng nhiều và càng tốt vi điều khiển avr càng tốt, không phải mức logic. Mình chưa thật sự nhận đề tài, bởi phải học hết kỳ này và còn phải đi thực tập, thời gian mình có là tầm 4 tháng.Thanks bạn nha ^^

                  Comment


                  • #69
                    Nguyên văn bởi WhiteFangVN Xem bài viết
                    Ý mình "mức cao" ở đây có nghĩa là cố gắng mô tả được càng nhiều và càng tốt vi điều khiển avr càng tốt, không phải mức logic. Mình chưa thật sự nhận đề tài, bởi phải học hết kỳ này và còn phải đi thực tập, thời gian mình có là tầm 4 tháng.Thanks bạn nha ^^
                    Đây là đề tài cũng hay và có thể làm được. Mình thấy bạn nên làm một vài nghiên cứu bước đầu:
                    - Cấu trúc đơn giản nhất của AVR, không biết bạn có thể kiếm ra tài liệu chi tiết của cấu trúc này không.
                    - Với 4 tháng thì mình nghĩ bạn cần 2 người, một người phát triển 1 người viết các testcase để chạy mô phỏng.

                    Comment


                    • #70
                      Ở đây có các project tương tự đã làm Projects :: OpenCores
                      Các bạn có thể đặt mục tiêu phát triển xong rồi đưa lên đó.

                      Comment


                      • #71
                        Nguyên văn bởi jefflieu Xem bài viết
                        trong phần khai báo IP user port, Em có khai báo sử dụng thanh ghi 32bit là slv_reg0(0xc7200000->0xc720ffff). Nên em nghĩ mình xuất giá trị ra thanh ghi này. Phần user_port.vhd: led_port<=slv_reg0; Vì giá trị của thanh ghi này sẽ được xuất ra port led.
                        Tại sao không phải là 0x12345001 mà là 0xC72000000 ? Giá trị bạn đưa vào macro LED_PORT_WRITE là giá trị bạn muốn ghi vào register slv_reg0.
                        Register slv_reg0 của bạn nằm ở đạ chỉ 0xC7200000
                        Bạn ghi : LED_PORT_WRITE(0xC7200001) có nghĩa là ghi giá trị 0xC7200001 vào điạ chỉ 0xC7200000?[/QUOTE]
                        Em có thắc mắc thế này, trong phần user_std_logic.VHD em có khai báo post led: led_port_pin: out std_logic_vector(0 to 7); Và gán :led_port_pin<=slv_reg0; điều em thắc mắc là
                        kích thước của port_led là 8 và của reg0 là 32 mà tại sao trình biên dịch lại ko báo lỗi(khi add user port em thấy 32 là kích thước thấp I rồi) và giá trị của port_led sẽ được gán ntn ạ?
                        Code e sửa thành:
                        #include"stdio.h"
                        #include"conio.h"
                        #include"led_port.h"
                        #include"xutil.h"
                        void delay(unsigned int n)
                        {
                        unsigned int i,j;
                        for(i=1;i<=n;i++)
                        {
                        for(j=1;j<=50;j++)
                        {
                        }
                        }
                        }
                        void main(void)
                        {
                        while(1)
                        {
                        LED_PORT_mWriteReg(0x7200000,0,0x0000);
                        delay(10000);
                        LED_PORT_mWriteReg(0x7200000,0,0x0001);
                        delay(10000);
                        }
                        return 0;
                        }

                        Comment


                        • #72
                          Nguyên văn bởi ngocdt2k3 Xem bài viết
                          Em có thắc mắc thế này, trong phần user_std_logic.VHD em có khai báo post led: led_port_pin: out std_logic_vector(0 to 7); Và gán :led_port_pin<=slv_reg0; điều em thắc mắc là
                          kích thước của port_led là 8 và của reg0 là 32 mà tại sao trình biên dịch lại ko báo lỗi(khi add user port em thấy 32 là kích thước thấp I rồi) và giá trị của port_led sẽ được gán ntn ạ?
                          Ừ bạn thắc mắc có lý, đúng ra trình dịch sẽ báo lỗi, hay ít nhất là WARNING, ban kiếm trong synthesis report xem có warning ko. VHDL khá chặt chẽ trong việc gán tín hiệu khác kích thước như thế này nhưng cũng tùy nữa, nhiều khi chuẩn mới lại thả lỏng các yêu cầu. Nếu xuất warning thì mình đoán nó sẽ gán Least Significant Bit Của slv_reg0 vào port_led: nghĩa là slv_reg0(24 to 31) sẽ được gán, hay nói đúng hơn bit 24 tới bít 31 của slv_reg0 sẽ được nối vào port_led

                          Code bạn có vẻ hợp lý rồi, để tốt hơn bạn có thể ghi:
                          LED_PORT_mWriteReg(LED_REG,0,0x0000);
                          Trong đó LED_REG là địa chỉ được define trong led_port.h hoặc xparameters.h

                          Đối với các địa chỉ, bạn nên dùng các parameters được định nghĩa trong xparameters.h để khi bạn sắp xếp lại các vùng nhớ, bạn không cần viết code lại, vì xparameter.h sẽ được EDK viết lại.

                          Comment


                          • #73
                            cảm ơn anh Jeplieu với phần kiến thức khá bổ ích về FPGA. chỉ tiếc chút xíu là e ko biết tý gì về verilog. Tiện đây a có thể làm một tutorial về phần tạo block ram để nạp code không ạ. Em đang bí chỗ này.

                            Comment


                            • #74
                              Nguyên văn bởi ngocdt2k3 Xem bài viết
                              cảm ơn anh Jeplieu với phần kiến thức khá bổ ích về FPGA. chỉ tiếc chút xíu là e ko biết tý gì về verilog. Tiện đây a có thể làm một tutorial về phần tạo block ram để nạp code không ạ. Em đang bí chỗ này.
                              Về EDK thì có khái niệm như vầy bạn cần nắm rõ:
                              - Thiết kê phần cứng ở XPS
                              - Thiết kế phần mềm ở SDK

                              Khi thiết kế phần mềm bạn cần biết cấu hình của phần cứng: ví dụ như có bao nhiêu vùng nhớ, có các loại vùng nhớ nào ... Khi thiết kế trong SDK, bạn sẽ phải chỉ định một file để mô tả hệ thống phần cứng cho SDK hiểu phần cứng của bạn có gì. File này thay đổi theo thời gian, hồi xưa mình làm là file .xmp tức file project của XPS. Bây giờ mình mới làm thử lại thì la file .xml.

                              Bạn vô XPS tạo project mới gồm có
                              CPU
                              BLOCKRAM
                              BLOCKRAM Controller 1, nối vào Data Bus và vào cổng A của block RAM
                              BLOCKRAM Controller 2, nối vao Instruction Bus và vào cổng B của Block RAM
                              LED

                              Sau đó bạn export hệ thống phần cứng này qua SDK (bạn kiểm trong mấy cai menu, bản của bạn có thể khác bản của mình). Nếu dùng bản cũ có thể bạn không cần export.

                              Sau đó qua bên SDK, tạo một ứng dụng, mình thấy nó có sẵn mấy cái hello world, test peripherals gì đó bạn chọn đại đi. Bạn cần chỉ định file mô tả phần cứng của bạn, có thể là file xmp có thể là xml.

                              Sau đó bạn dịch ứng dụng của bạn ra file .elf

                              Sau đó ban qua bên EDK chỉ định file execuation của bạn là file .elf vừa tạo ra, bạn build hardware và update block RAM.
                              Nó sẽ tạo ra 2 file .bit

                              File system.bit là file chỉ có phần cứng
                              File download.bit là file có code ứng dụng của bạn sẵn trong BlockRAM


                              Bạn coi hình vẽ.
                              Click image for larger version

Name:	EDKBlockRAM.jpg
Views:	1
Size:	101.8 KB
ID:	1359174

                              Comment


                              • #75
                                Mình làm nó bị lỗi quái gì đó chưa biết. Bạn làm thử coi ... Đường lối ý tưởng khái niệm là vậy đó.

                                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