Thông báo

Collapse
No announcement yet.

Lập trinh trong core MicroBlaze

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

  • Lập trinh trong core MicroBlaze

    Chào các bạn,
    Mình mới bắt đầu làm quen voi ISE và EDK phiên bản 10.1 đươc gần 1 tháng. Mình đang viết một ví dụ nhỏ cho phần tutorial. Ví dụ về bộ đếm 00->99 dùng microBlaze. Mình đã hoàn thành các IP gồm bộ đếm 00->99 và interrupter bằng ngôn ngữ VHDL. Sau đó thì thầy của mình yêu cầu mình lập trình cho cỏe microBlaze với mục đích như sau:

    Khi bộ đếm nhận đươc tín hiệu ngừng đếm, số đếm sẽ ngừng lại trong một khoảng thời gian mà mình đã program trong IP. Nhưng đồng thời số đếm sẽ đươc lưu vào trong microBlaze. Sau đó microBlaze sẽ có nhiệm vụ tiếp tục đếm theo xung đồng hồ để khi bộ đếm bắt đầu đếm trở lại, nó sẽ lấy giá trị đếm cua microBlaze đếm đến thợi điểm đó sao cho bộ đếm không bị trễ.

    Mình đã gán chân DPLB_mrddBus,DPLB_m_wrdBus, IPLB_mrddBus va IPLB_m_wrdBus với đầu in va out của bộ đếm, DWAIT với tín hiệu cua interrupter. Mình cũng lập trình bằng VHDL cho microBlaze trong file microblaze_0_wrapper.vhd trong folder simulation nhưng mình không thể quan sát đươc tín hiệu của đầu ra ở chân DPLB_m_wrdBus và IPLB_m_wrdBus.

    Các bạn có thể giúp mình về vấn đề này đươc không? Xin cám ơn nhiều.

  • #2
    Việc của bạn làm gồm 2 phần:
    - Thiết kế Bộ đếm
    - Kết nối bộ đếm vô trong microBlaze qua Bus PLB hoặc OPB
    ...
    Bạn đang vướng ở phấn nào? Bạn có chắc là nắm vững hoạt động của PLB chưa. Bạn giải thích thêm về cách bạn kết nối bộ đếm với PLB hy vọng mọi người giúp được.

    Comment


    • #3
      Mình đã hoàn thành bộ đếm, interrupter và test trên modelsim. nhung mình vẫn chưa thành công trong việc lập trình trong microBlaze
      Mình tạo trong IP count của mình 5 cổng bao gồm: dizaine_in(hàng chục), unite_in(hàng đơn vị), dizaine_out, unite_out, và interrupter. Trong đó mình gắn chân dizaine_in va unite_in lần lượt với DPLB_m_wrdbus và IPLB_m_wrdbus cua microBlaze vì hai cổng này là cổng out dữ liều của microBlaze, tương tự mình gán dizaine_out và unite_out với DPLB_rddbus và IPLB_rddbus cua microBlaze(hai cổng in dữ liệu của microBlaze) còn interrupt_enable thì với DWAIT của microBlaze. Mình muốn lập trình bằng VHDL trong microblaze chức năng của nó như mình đã nêu ở trên. Mình đã viết xong phần code, nhưng mình không biết đặt nó vào đâu, chẳng hạn mình có thể đặt phần code mình viết cho IP trong user.vhd nhưng đối với microBlaze thì mình không biết. Tại vì khi mình xem simulation trên modelsim mình chỉ thấy tín hiệu vạo microblaze nhưng không thấy tín hiệu viết trên cổng ra của microblaze.
      Mình dung bản EDK10.1. Mình không ở trên laboratory nên không thể up đoạn code và phần đã làm. Mình se up hình vào ngày mai để các bạn xem.

      Comment


      • #4
        Nếu nhớ không lầm thì: DPLB = Data Bus, IPLB = Instruction Bus ... Cách bạn kết nối hơi lạ.
        Thong thường, để giao tiếp từ MicroBlaze qua thiết bị ngoại vi (peripheral), người ta dùng Memory Map. Để ghi và đọc dữ liệu từ MicroBlaze và peripherals, người ta dùng các tin hiệu:
        - Address
        - Chip select (CS)
        - Write Enable / Read Enable
        - Data In
        - Data Out
        .......
        Mình không rõ tại sao bạn lại kết nối như trên. Có thể mình hiểu sai ý bạn.

        Comment


        • #5
          Có lẽ mình đã lầm trong cách kết nối giữa microblaze và IP ngoại vi, mình cũng đã nghĩ như cách của bạn, ban đầu mình cho kết nối IP ngoại vi với cổng DREAD và DWRITE của microBlaze, nhưng mình lại không sử dụng addresse, Chip select và Write Enable/Read Enable, chắc đây là vấn đề dẫn đến lỗi trong simulation.
          Mình có vài câu hỏi muốn nhờ bạn giúp đỡ:
          Memory map ma bạn nói có phải là Portmap trong System Assembly View không
          Làm cách nào mình có thể biết đươc địa chỉ của dữ liệu mình xử lí ở trong IP ngoại vi, vì trong mỗi IP ngoại vi thì có ít nhất một register, mình lại không hề sử dụng register này. Nên khi mình nhìn địa chỉ của counter trong xparameters.h(trong đó có count_BASEADDR và count_HIGHADDR), mình không biết đây là địa chỉ của dữ liêu mình xử lí hay địa chỉ của register trong IP ngoại vi. Mình có gửi kèm trong ảnh đoan code mình làm lúc đầu.
          Theo bạn mình nên lập trình bằng ngôn ngữ C hay VHDL, mình thì thích làm bằng VHDL hơn, nếu lạm bằng VHDL thì mình nên làm như thế nào.
          Cám ơn sự giúp đỡ của bạn.
          .

          Comment


          • #6
            [IMG][/IMG]
            [IMG][/IMG]

            Comment


            • #7
              Mình hiện giờ chỉ làm chay, chỉ làm simulation,chưa có điệu kiên làm trên board. Có lẽ đến cuối thưc tập mới được test thử trên board. Thầy mình cũng yêu cầu mình tìm một ứng dụng nhưng chỉ xem trên simulation, không chạy thử trên board. Vì labo không có đủ board cho sinh viên chậy thử trong lúc thực hành. Mình cũng đã nghĩ ra một vài ứng dung nhưng tất cả đều phải dung board cả, không biết bạn nào đã từng làm những ứng dụng kiểu này có thể cung cấp cho mình một vài ý tưởng đươc không?

              Comment


              • #8
                Nguyên văn bởi vhoang Xem bài viết
                Có lẽ mình đã lầm trong cách kết nối giữa microblaze và IP ngoại vi, mình cũng đã nghĩ như cách của bạn, ban đầu mình cho kết nối IP ngoại vi với cổng DREAD và DWRITE của microBlaze, nhưng mình lại không sử dụng addresse, Chip select và Write Enable/Read Enable, chắc đây là vấn đề dẫn đến lỗi trong simulation.
                Mình có vài câu hỏi muốn nhờ bạn giúp đỡ:
                Memory map ma bạn nói có phải là Portmap trong System Assembly View không
                Uh ... Address map la phần address base_address với high_address.
                Nguyên văn bởi vhoang Xem bài viết
                Làm cách nào mình có thể biết đươc địa chỉ của dữ liệu mình xử lí ở trong IP ngoại vi, vì trong mỗi IP ngoại vi thì có ít nhất một register, mình lại không hề sử dụng register này. Nên khi mình nhìn địa chỉ của counter trong xparameters.h(trong đó có count_BASEADDR và count_HIGHADDR), mình không biết đây là địa chỉ của dữ liêu mình xử lí hay địa chỉ của register trong IP ngoại vi.
                Trong phần system View, bạn phải thiết lập base_address (có thể để máy tự generate) ...
                Ví dụ thiết bị ngoại vi của bạn chiếm address từ 0x1000 tới 0x1fff, để sử dụng vùng nhớ này bạn cần làm 2 việc:
                - 1) Ở phần software, bạn dùng hàm/function/procedure: Xio_*** (mình không nhớ rõ) để viết, đọc một vùng nhớ nào đó.
                - 2) Ở phẩn hardware, bạn phải thiết kể sao cho:
                + Ghi data tù Datain bus vào register nếu như tín hiệu write_enable, address, chip select active.
                + Xuất data từ thiết bị ngoại vi lên data_out bus khi read_enable, address, chip select active.
                ----
                Ví dụ bạn muốn có 1 register ở địa chỉ offset = 4 so với base_address. Và ghi vào địa chỉ đó:


                ---ghi từ MicroBlaze
                process(clk)
                begin
                if (rising_edge(clk)) then
                if (cs='1' and write_en='1' and address(11 downto 0)=x"004") then
                my_register<= data_in;
                end;
                end if;
                end process;
                -------
                đọc từ MicroBlaze
                data_out <= my_register_1 when address(11 downto 0) = x"004" else
                my_register_2 when address(11 downto 0) = x"008" else
                my_register_3 when address(11 downto 0) = x"00C" else
                x"12345678" ;
                ----------
                Mình viết đại khái thế cho bạn hình dung được khái niệm, bạn kiếm tài liệu đọc thêm:
                - Bus specification (các tín hiệu hoạt động thế nào)
                - Các lệnh IO dùng trong C cho MicroBlaze (Xio_in, Xio_out)

                Nguyên văn bởi vhoang Xem bài viết
                Mình có gửi kèm trong ảnh đoan code mình làm lúc đầu.
                Theo bạn mình nên lập trình bằng ngôn ngữ C hay VHDL, mình thì thích làm bằng VHDL hơn, nếu lạm bằng VHDL thì mình nên làm như thế nào.
                Cám ơn sự giúp đỡ của bạn.
                VHDL và C là 2 công cụ khác nhau, bạn dùng VHDL đế thiết kế thiết bị ngoại vi phù hợp với mục đích của bạn. Bạn dùng C đế thiết kế ứng dụng (software/firmware) để sử dụng thiết bị ngoại vi của bạn. Giống như các thiết bị phần cứng của máy tính và driver vậy.
                ...
                Mình chỉ có thế chỉ bạn khái niệm, không thể chỉ chi tiết, bạn tự tìm hiểu vì có rất nhiều thứ bạn cần phải biết trước khi có thể thiết lập một hệ thống hoàn chỉnh. Cứ tù từ, tìm ví dụ và tài liệu.

                Comment


                • #9
                  thanks Jefflieu vi sự giúp đỡ của bạn.

                  Comment


                  • #10
                    Như tin nhắn mình gửi bạn, mình không biết làm thế nào lấy được dữ liệu mình tạo trong IP vào microblaze. Mình đã cố gán dữ liệu mình viết vào register của IP như hình sau
                    Dữ liệu mình viết đã gửi ở hình trước, bạn có thể xem ở tin nhắn trước.Sau đó mình viết lệnh C cho phần test trong microBlaze như sau

                    Sau đó mình simulate trên ModelSim thì thấy tín hiệu ở cổng UART chỉ có khi reset = 1, còn lúc compter mình đếm thì nõ không có tín hiệu gì cả. Mình đã thử sửa đổi bằng nhiều cách nhưng không đươc. Bạn có thể xem hình dưới đây:

                    Comment


                    • #11
                      EDK có XPSTIMER bạn thử sủ dung xem, với lai nên mượng kit của thầy bán sẽ hoàn thành sớm, mình ỏ HN, nếu cần đén cho mình mà tét chương trình, ngày thứ 7 hay chu nhật chẳng hạn! chúc viu vẻ! DT 0982491356
                      Cung cấp kít FPGA giá sinh viên!
                      Nhận thiết kế và phát triển các mạch ARM và FPGA theo yêu cầu.
                      Email:

                      Comment


                      • #12
                        Nhân tiện hỏi các bạnddax thử thiết kế bộ điều khiển CY7C68013A dùng cho EDK chửa?? híc mình đang tìm hiểu!
                        Cung cấp kít FPGA giá sinh viên!
                        Nhận thiết kế và phát triển các mạch ARM và FPGA theo yêu cầu.
                        Email:

                        Comment


                        • #13
                          Ban check coi reset active high hay active low (lúc tạo MicroBlaze, wizard có hỏi là reset active high hay active low)...
                          Ban coi các tín hiệu tren bus plb hoạt động như thế nào ...
                          Cách bạn làm có vẻ gần đúng, kiểm tra lại mấy cái linh tinh nữa thôi ...

                          Comment


                          • #14
                            Cho mình hỏi trên diễn đàn đã có ai lập trình c với microblaze chưa?nếu có thì có thể share tài liệu và truyền đạt cho mình 1 it kinh nghiệm dc không?Thanks

                            Comment


                            • #15
                              Khi bạn cấu hình MicroBlaze thì nó sẽ tạo ra một bộ thư viện c tương ứng với các phần cứng mà bạn import (thư viện này nằm trong nơi cài đặt EDK). Bạn cần dựa vào những file này để tham khảo việc viết chương trình cũng như các tham số, hằng số. Sự thực là mình cũng đang học về cái này nên cũng chưa biết nhiều. Không biết bác jefflieu có viết một TUT hướng dẫn anh em cơ bản không nhỉ?hj

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X