اطلاعیه

Collapse
No announcement yet.

دسترسی به اس دی رم ، بوردDE2

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    دسترسی به اس دی رم ، بوردDE2

    سلام
    کسی از دوستان با بورد DE2 کار کرده ، یا از قابلیت NiosII استفاده کرده؟؟؟
    من میخوام به تک تک آدرسهای SDRAM روی بورد DE2 دسترسی پیدا کنم ( با استفاده از NiosII) کسی میتونه راهنمایی کنه؟؟؟ ممنون میشم.

    #2
    پاسخ : دسترسی به اس دی رم ، بوردDE2

    نوشته اصلی توسط mr_magic
    سلام
    کسی از دوستان با بورد DE2 کار کرده ، یا از قابلیت NiosII استفاده کرده؟؟؟
    من میخوام به تک تک آدرسهای SDRAM روی بورد DE2 دسترسی پیدا کنم ( با استفاده از NiosII) کسی میتونه راهنمایی کنه؟؟؟ ممنون میشم.
    سلام،
    وقتی که NIOS-II رو میسازید، برای بخش حافظش باید SDRAM رو انتخاب کنید، اما قبلش باید Core برای SDRAM اضافه کرده باشید و تنظیمش هم کرده باشید.
    روی بردها معمولا هیشه یک نوع SDRAM نسب نمیشه و ممکنه با دیتاشیت کمی متفاوت باشه، اول از این مطمئن بشید. بعد از ساخت و سنتز کامل NIOS اون آدرسهایی که به صورت خودکار به SDRAM داده شده. وقتی NIOS بالا اومد شما نمیتوید مثل یک رم معمولی با SDRAM کار کنید، باید با Pointer در C++ کار کنید تا دقیقا به هر آدرس Physical دست رسی داشته باشید، اونم وقتی ممکنه که از OS استفاده نمیکیند که فکر نکنم کار شما با OS باشه.
    کاری که من کردم از حافظه M4K خود چیپ برای NIOS-II استفاده کردم که خیلی سریعتره و درایور SDRAM رو جدا از OPENCORES.ORG گرفتم و تغییرش دادم برای DE-1 چون من روی اون کار میکردم، بعد دو تا آدرس برای NIOS-II تعریف کردم که درصورتی که آدرس NIOS یکی از اون دو آدرس بشه به داده و آدرس رم و کنترل رجیستر های درایورش دسترسی داشته باشم، برای این کار باید در زمان ساخت NIOS-II یک پور IO تعریف کنید که کاملا تنظیماتش سلیقه ای هست.

    موفق باشید.
    اسمایل، تومورو ویل بی وُرس

    دیدگاه


      #3
      پاسخ : دسترسی به اس دی رم ، بوردDE2

      سلام، مرسی ار پاسختون.
      منظورتون رو از "Core برای SDRAM اضافه کرده باشید و تنظیمش هم کرده باشید" نفهمیدم.
      من SDRAM رو در قسمت SOPC اضافه کردم و آدرسی بیسی هم که بهش اختصاص داده شده 0x00800000 هست.
      میخوام به مقدار تک تک آدرسهای SDRAM دسترسی پیدا کنم، برنامه زیر برنامه C من هست که از دو روش استفاده کردم. هر دو روش جواب شبیه هم میده ولی غلط !!!
      سعی کردم Flash رو هم بخونم ولی بازم جواب درستی نگرفتم.

      #include<stdio.h>
      #include"io.h"
      #define BASE_SDRAM 0x00800000
      #define basic_Addr (int *) 0x00800000
      void main(){
      int Val;
      Val=IORD(BASE_SDRAM, 6000); // Method 1
      printf("%d",Val);
      Val=*(basic_Addr+6000); // method 2
      printf("%d",Val)

      دیدگاه


        #4
        پاسخ : دسترسی به اس دی رم ، بوردDE2

        نوشته اصلی توسط mr_magic
        سلام، مرسی ار پاسختون.
        منظورتون رو از "Core برای SDRAM اضافه کرده باشید و تنظیمش هم کرده باشید" نفهمیدم.
        من SDRAM رو در قسمت SOPC اضافه کردم و آدرسی بیسی هم که بهش اختصاص داده شده 0x00800000 هست.
        میخوام به مقدار تک تک آدرسهای SDRAM دسترسی پیدا کنم، برنامه زیر برنامه C من هست که از دو روش استفاده کردم. هر دو روش جواب شبیه هم میده ولی غلط !!!
        سعی کردم Flash رو هم بخونم ولی بازم جواب درستی نگرفتم.

        #include<stdio.h>
        #include"io.h"
        #define BASE_SDRAM 0x00800000
        #define basic_Addr (int *) 0x00800000
        void main(){
        int Val;
        Val=IORD(BASE_SDRAM, 6000); // Method 1
        printf("%d",Val);
        Val=*(basic_Addr+6000); // method 2
        printf("%d",Val)
        همون بخشی که در SOPC قسمت SDRAM رو اضافه میکنین، همون IP CORE برای SDRAM هستش که اضافه میشه.
        در بخش C هم به این صورته:
        #define DATA_PORT_OUT (int*)0x1009020
        #define DATA_PORT_IN (int*)0x1009030
        #define ADDRESS_PORT_OUT (int*)0x1009040

        #define MM_SEVEN_SEG 1
        #define MM_SDRAM_ADDRESS 2
        #define MM_SDRAM_DATA 3
        #define MM_SDRAM_COMMAND 4
        #define MM_FLASH_ADDRESS_MSB 5
        #define MM_FLASH_ADDRESS_LSB 6
        #define MM_FLASH_DATA 7
        #define MM_FLASH_COMMAND 8


        void MM_Write(int Address, int Data)
        {
        int* PORT;
        PORT = ADDRESS_PORT_OUT;
        *PORT = 0xFFFF;
        PORT = DATA_PORT_OUT;
        *PORT = Data;
        PORT = ADDRESS_PORT_OUT;
        *PORT = Address;
        return;
        }

        int MM_Read(int Address)
        {
        int* PORT;
        PORT = ADDRESS_PORT_OUT;
        *PORT = Address;
        PORT = DATA_PORT_IN;
        return(*PORT);
        }

        void SDRAM_Write(int Address, int Data)
        {
        MM_Write(MM_SDRAM_ADDRESS, Address);
        MM_Write(MM_SDRAM_DATA, Data);
        MM_Write(MM_SDRAM_COMMAND, 0x0000);
        MM_Write(MM_SDRAM_COMMAND, 0x0001);
        }

        int SDRAM_Read(int Address)
        {
        MM_Write(MM_SDRAM_ADDRESS, Address);
        return MM_Read(MM_SDRAM_DATA);
        }


        در کد بالا من IP CORE جدا برای SDRAM گذاشتم و اصلا NIOS اون رو نمیبینه، خود NIOS از رمهای داخلی استفاده میکنه که فکر کنم برای این کد 16 کیلوبایتی براش گذاشته بودم، یک MEMORY MAP هم تعریف کردم که از طریق اون با هر بلاکی که در VHDL کد زده بودم، ارتباط برقرار میکردم، یعنی هر بلاک یک آدرس فیزیکی و دیتا داره که از طریق این MEMORY MAP تنظیم میشن.
        اسمایل، تومورو ویل بی وُرس

        دیدگاه

        لطفا صبر کنید...
        X