Thông báo

Collapse
No announcement yet.

Tâm sự về FPGA

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

  • hungk41
    replied
    Em xin lỗi các bác, mạng bị “gà” quá nên không up được, để e kiếm cách khác up vậy

    Leave a comment:


  • hungk41
    replied
    À mà quên, em làm theo đúng như tài liệu này nhưng cuối cùng vẫn không được. Bản e đang dùng là bản 10.1 còn trong hướng dẫn là 8.2 nó cũng có khác nhau đôi chút.

    Leave a comment:


  • hungk41
    replied
    Câu này kông dám hỏi bác jefflieu: tại sao em import một USER_IP xong xuôi nhưng cuối cùng chẳng thấy thư mục drivers đâu cả để chỉnh sửa code thưa các bác.

    Leave a comment:


  • jefflieu
    replied
    Nguyên văn bởi ngocdt2k3 Xem bài viết
    Em đã làm đến bước tạo ra file elf bên SDK rồi. bước tiếp theo làm thế nào anh có thể nói rõ hơn ko ạ? nếu có hình thì càng tốt ạ.
    Bạn vào hardware, generate bit file trước, hệ thống sẽ tao ra file system.bit
    Tronh hình mình post, o trong cửa sổ project của SDK có phần elf file đó, bạn chỉ đường dẫn vào file elf mà bạn tạo ra bằng SDK. Xong rồi trong phần hardware chọn "update bram", update bit file, file download.bit sẽ được tạo, file này có chứa sẵn code của bạn. trong Block RAM, khi download bit file xuống là chạy ngay.

    Leave a comment:


  • ngocdt2k3
    replied
    Em đã làm đến bước tạo ra file elf bên SDK rồi. bước tiếp theo làm thế nào anh có thể nói rõ hơn ko ạ? nếu có hình thì càng tốt ạ.
    Last edited by ngocdt2k3; 29-03-2012, 16:24.

    Leave a comment:


  • jefflieu
    replied
    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 đó.

    Leave a comment:


  • jefflieu
    replied
    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

    Leave a comment:


  • ngocdt2k3
    replied
    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.

    Leave a comment:


  • jefflieu
    replied
    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.

    Leave a comment:


  • ngocdt2k3
    replied
    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;
    }

    Leave a comment:


  • jefflieu
    replied
    Ở đâ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 đó.

    Leave a comment:


  • jefflieu
    replied
    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.

    Leave a comment:


  • WhiteFangVN
    replied
    Ý 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 ^^

    Leave a comment:


  • jefflieu
    replied
    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?

    Leave a comment:


  • jefflieu
    replied
    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?

    Leave a 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