اطلاعیه

Collapse
No announcement yet.

FIFO Implementation (پیاده سازی FIFO)

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

    FIFO Implementation (پیاده سازی FIFO)

    سلام، پیشاپیش ممنون از دوستانی که دانسته‌هاشون رو share کنن

    نیاز به طراحی FIFO دارم در ۲ قسمت receiver و sender :read:

    تا در نهایت مقایسه کنم و تعداد بیتهای خطا رو بدونم.

    برای طراحی FIFO تصمیم گرفتم ازIP CORE استفاده کنم داخل کدی که random bit تولید می‌کنه .

    طوری که خروجیش save بشه در FIFO.

    قبل از شروع چند تا سوال پیش اومد برام، الان 3 تاشو میگم

    اینکه

    ۱.FIFO ای‌ که قراره بیتهای دریافتی‌ رو SAVE کنه چطور پیاده سازی کنم؟

    ۲.چطور مطمئن باشم که بیتها یه متناظر در ۲ FIFO دقیق باهم مقایسه میشند؟
    3.delay رو چطور محاسبه کنم؟ ( به کابل انتقال ربط داره فقط؟!)

    (باید FIFO Depth رو محاسبه کنم؟ برای این باید write clk و read clk رو داشته باشم ..

    که می‌خوام جفتش رو مساوی با کلاک اصلی‌ تولید بیت (۱۰۰ محض ) قرار بدم.

    ولی‌ برای فرمول باید read delay رو بدونم)

    #2
    پاسخ : FIFO Implementation (پیاده سازی FIFO)

    راستش من از FIFO که تو IP CORE هستش راضی نبودم خودم یکی طراحی کردم.اول اینکه وقتی میسازیش عمقش رو وارد می کنی.و پهنای بیت ها رو.مثلا یه فیفو به عمق 32 که 8 بیتیه هستش (هر خونش 8 بیت یا یه بایته)4 تا سیگنال داره حداقل.دوتاش نشون میدن که فیفو خالیه یا پر.دوتای دیگه هم برای خوندن یا نوشتن هستش.
    شما باید کنترلری بنویسی که وقتی داده ای رو دریافت کرد ببینه فیفو پره یا خالی.اگه خالی بود داخلش بنویسه.از طرفی یه کنترلر دیگه هم باید بنویسی که فیفو رو چک کنه اگه خالی نبود داده رو ازش بخونه و مقایسه رو انجام بده.البته خیلی خلاصه و مبهم توضیح دادی.

    دیدگاه


      #3
      پاسخ : FIFO Implementation (پیاده سازی FIFO)





      سلام،

      مرسیآ‌ از جوابتون، چرا راضیآ‌ نبودید ازIP CORE؟

      ببخشید ، من فارسی صحبت کردنم عالیه، نوشتن سخت ..

      البته شاید این مبهمی از این هم باشه که آیده ایآ‌آ‌ که میگم اونقدر اشتباست که درکش و سخت کرده..

      ببینین، هدف اصلیآ‌ من Bit Error Counting هست.

      اول اومدم کد یه Random Bit Generator رو نوشتم.

      بعد به این فکر کردم که قبل از فرستادن data به کابل بایدsave جائیآ‌ داشته بأشمش که بتونم با اون چیزی که دریافت میآ‌شه اونطرف کابل مقایسه کنم..

      FIFO...

      خوب الان سوالیآ‌ که میاد تو ذهنم اینه که من چطور دادهآ‌های ورودی و خروجی کا بل رو بیت به بیت با هم مقایسه کنم..

      چطور مطمئن شم که بیتآ‌ها متناظر با هم مقایسه میشند..(چطور delay رو جبران کنم؟)
      ..
      ...

      میآ‌شه یه کم بیشتر راجع به فیفو که پیاده سازی کردید توضیح بدید؟

      دیدگاه


        #4
        پاسخ : FIFO Implementation (پیاده سازی FIFO)

        درسته با فیفو میشه اما نکته ای که هست اینه که مگه نمی خوای مطمئن شی که داده ها درست ارسال شدن یا نه؟
        خوب وقتی داده ها ارسال شدن چطوری می خوای با داده های این طرف کابل مقایسشون کنی؟
        بهتره روش دیگه ای انتخاب کنی.چندتا راه هست.می تونی از روش بیت توازن استفاده کنی.انتهای هر 8 بیت یه بیت اضافی که حاصل xor کردن بیت ها هستش هم ارسال میشه و گیرنده 8 بیت دریافتی رو xor میکنه و با این بیت اضافی مقایسه می کنه.اگه یکی نباشن ینی خطایی رخ داده اما کجا؟معلوم نیست.از طرفی ممکنه خود این بیت هم دچار خطا شده باشه.یه روش خیلی خوب هست به اسم CRC که تو شبکه و ارتباطات ازش استفاده میشه.روش دیگه ای هست به اسم همینگ که حجم داده های ارسالی رو زیاد می کنه اما میشه باهاش فهمید کدوم بیت ها مشکل دارند.

        دیدگاه


          #5
          پاسخ : FIFO Implementation (پیاده سازی FIFO)

          سلام

          پیاده سازی FIFO اصلا کار سختی نیست. اول از همه با توجه به پکت های دیتایی که میخوای ذخیره کنی عمق رو تعیین میکنی. مثلا اگر دیتای ۱۶ بیتی داری ارسال میکنی باید عمق FIFO مضربی از 16 باشه. حالا با توجه به اختلاف سرعت ورودی و خروجی یک عمق حداقلی در نظر گرفته میشه.
          همونظور که دوستمون گفتن ۴ تا سیگنال کنترل میخوای به علاوه کلاک و ریست. همچنین باس ورودی و خروجی. یک متغییر counter هم باید در نظر بگیرید که تعداد بلوک های استفاده شده رو نگه داره. در حالت خیلی ساده, با اومدن لبه بالا رونده کلاک, ریست چک میشه اگر سیگنال ها رو به مقدار های اولیه برمیگرونید. اگر صفر بود چک میکنید که write یا read فعال هستند یا نه. در هر حالت write چک میکنید که آیا جای خالی برای نوشتن وجود داره یا نه (توسط متغییر counter) اگر وجود داشت دیتا رو مینویسید و counter رو افزایش میدید(چک میکنید که counter از عمق FIFO بیشتر نشنه وگرنه سیگنال FULL رو باید یک کنید) و سیگنال های FULL و EMPTY رو هم به روز میکنید. حالت read هم همینقدر ساده هست.
          به غیر از سنکرون کردن دیتا, موارد دیگه ایی هم هست که FIFO به دردبخور هست. مثلا جاهایی که یک دیتا از طریق نرمافزاری باید توسط یک سخت افزار خونده بشه. مثلا من خودم برای یک Encoder Jpeg توی SystemC یک FIFO نوشته بودم که متشکل از ۵ بلوک بود. ۴ تاشون نرم افزاری و thread based طراحی شده بودن و یک بلوک سخت افزاری طراحی شده بود. واسط بین اینها یک FIFO بود. طراحی این FIFO یکم مشکل تر از اینی که گفتم هست و باید semaphore استفاده کنی. ولی اصولش همونی بود که گفتم.

          در نهایت من اصلا متوجه نمیشم چرا میخوای FIFO استفاده کنی!!!!!!!! میشه بیشتر توضیح بدی؟؟؟

          دیدگاه


            #6
            پاسخ : FIFO Implementation (پیاده سازی FIFO)

            نوشته اصلی توسط vishy71
            درسته با فیفو میشه اما نکته ای که هست اینه که مگه نمی خوای مطمئن شی که داده ها درست ارسال شدن یا نه؟
            خوب وقتی داده ها ارسال شدن چطوری می خوای با داده های این طرف کابل مقایسشون کنی؟
            بهتره روش دیگه ای انتخاب کنی.چندتا راه هست.می تونی از روش بیت توازن استفاده کنی.انتهای هر 8 بیت یه بیت اضافی که حاصل xor کردن بیت ها هستش هم ارسال میشه و گیرنده 8 بیت دریافتی رو xor میکنه و با این بیت اضافی مقایسه می کنه.اگه یکی نباشن ینی خطایی رخ داده اما کجا؟معلوم نیست.از طرفی ممکنه خود این بیت هم دچار خطا شده باشه.یه روش خیلی خوب هست به اسم CRC که تو شبکه و ارتباطات ازش استفاده میشه.روش دیگه ای هست به اسم همینگ که حجم داده های ارسالی رو زیاد می کنه اما میشه باهاش فهمید کدوم بیت ها مشکل دارند.
            یعنیآ‌ باFIFO نمیآ‌شه مطمئن شد؟

            روشهأی که نام بردید، غیر از استفاده از fifo هست؟

            از بین اینا کدوم رو برای کار من توصیه میآ‌کنین که به نظرتون بهترینه ؟

            برم یادش بگیرم :read:

            دیدگاه


              #7
              پاسخ : FIFO Implementation (پیاده سازی FIFO)

              نوشته اصلی توسط mohammadh1387
              سلام

              پیاده سازی FIFO اصلا کار سختی نیست. اول از همه با توجه به پکت های دیتایی که میخوای ذخیره کنی عمق رو تعیین میکنی. مثلا اگر دیتای ۱۶ بیتی داری ارسال میکنی باید عمق FIFO مضربی از 16 باشه. حالا با توجه به اختلاف سرعت ورودی و خروجی یک عمق حداقلی در نظر گرفته میشه.
              همونظور که دوستمون گفتن ۴ تا سیگنال کنترل میخوای به علاوه کلاک و ریست. همچنین باس ورودی و خروجی. یک متغییر counter هم باید در نظر بگیرید که تعداد بلوک های استفاده شده رو نگه داره. در حالت خیلی ساده, با اومدن لبه بالا رونده کلاک, ریست چک میشه اگر سیگنال ها رو به مقدار های اولیه برمیگرونید. اگر صفر بود چک میکنید که write یا read فعال هستند یا نه. در هر حالت write چک میکنید که آیا جای خالی برای نوشتن وجود داره یا نه (توسط متغییر counter) اگر وجود داشت دیتا رو مینویسید و counter رو افزایش میدید(چک میکنید که counter از عمق FIFO بیشتر نشنه وگرنه سیگنال FULL رو باید یک کنید) و سیگنال های FULL و EMPTY رو هم به روز میکنید. حالت read هم همینقدر ساده هست.
              به غیر از سنکرون کردن دیتا, موارد دیگه ایی هم هست که FIFO به دردبخور هست. مثلا جاهایی که یک دیتا از طریق نرمافزاری باید توسط یک سخت افزار خونده بشه. مثلا من خودم برای یک Encoder Jpeg توی SystemC یک FIFO نوشته بودم که متشکل از ۵ بلوک بود. ۴ تاشون نرم افزاری و thread based طراحی شده بودن و یک بلوک سخت افزاری طراحی شده بود. واسط بین اینها یک FIFO بود. طراحی این FIFO یکم مشکل تر از اینی که گفتم هست و باید semaphore استفاده کنی. ولی اصولش همونی بود که گفتم.

              در نهایت من اصلا متوجه نمیشم چرا میخوای FIFO استفاده کنی!!!!!!!! میشه بیشتر توضیح بدی؟؟؟
              ممنون از توضیحات..

              باید یه بار دیگه دقیق بخونم بفهممش..

              راستش خوب من تازه کارم،، چیزی که به ذهنم رسید FIFO بود ..

              می‌شه اگر پیشنهاد بهتری دارید بگید ؟

              در حقیقت من می‌خوام یه ذخیره از سیگنال ورودی و خروجی داشته باشم و بعد بیت به بیت اینا رو با هم مقایسه کنم.

              مثلا اگر ۳۲ بیت میفرستم و دریافت می‌کنم ،، بیت ۲۸ با ۲۸ مقایسه شه نه با چیز دیگه..

              فکر کردم شایدFIFO بتونه کمک کنه ..

              دیدگاه

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