اجرای فیلتر میانگین متحرک (BoxCar)

ساخت وبلاگ

وقتی برای اولین بار فیلتر را بررسی کردیم ، به دو فیلتر ساده دیجیتالی که از آن می دانستم نگاه کردیم: فیلتری که میانگین مقادیر مجاور است و فیلتری که به طور بازگشتی به طور متوسط چندین عدد را در کنار هم قرار می دهد. این دو فیلتر ساده فقط به چند منبع FPGA نیاز داشتند و بنابراین اجرای آنها آسان بود. متأسفانه ، آنها بسیار قابل تنظیم نبودند و بنابراین توانایی فیلتر آنها کاملاً محدود بود.

سپس به موضوع برگشتیم و در مورد نحوه ایجاد یک فیلتر پاسخ محدود (FIR) پاسخ محدود (FIR) بحث کردیم. چنین فیلتر FIR عمومی بسیار قابل تنظیم است. با استفاده از رویکردی که ارائه کردم ، می توانید هر فیلتر دیجیتال FIR را در منطق توصیف کنید. سپس کمی بعد به موضوع برگشتیم و در مورد چگونگی ایجاد فیلتر که نیاز به فلیپ فلیپ های کمتری دارد ، بحث کردیم ، در حالی که هنوز هم تنظیم کامل هر فیلتر FIR عمومی را حفظ می کنیم.

مشکل هر دو این رویکردهای عمومی هزینه آنهاست. مانند اکثر فیلترهای دیجیتال ، این هزینه اغلب در تعداد ضرب (یعنی تعداد شیر آب) اندازه گیری می شود. در حالی که تعداد بلوک های منطق و فلیپ فلاپ ها نیز مورد توجه است ، حتی این مقیاس منطقی با تعداد شیرهای فیلتر مورد نیاز است.

به عنوان نمونه ای از این مشکل ، فرض کنید می خواهید یک سیگنال پخش FM (200 کیلوهرتز) را از جایی در گروه پخش FM (87-108MHz RF در ایالات متحده) انتخاب کنید. حال فرض کنید شما همچنین می خواستید تمام این پردازش ها را در FPGA خود انجام دهید ، و این که می توانید 99 دلار Arty (به علاوه آنتن FM ، پیش AMP ، ADC و غیره) را تحمل کنید. Arty شامل یک FPGA Artix-7/35T Xilinx با برش 90 DSP است. این بدان معناست که می توانید 90 ضرب در منطق خود را در هر کنه ساعت مشخص پیاده کنید. این به شما امکان می دهد یک فیلتر FIR عمومی با 89 شیر آب ایجاد کنید.(بیشتر فیلترهای FIR تعداد شیرهای عجیب و غریب دارند.) با یک فیلتر عمومی 89 TAP ، شما فقط می توانید در مورد جداسازی 6DB بین کانال و هر کانال FM دیگر و حتی بقیه ADCS Passband خود را بدست آورید. چنین عملکردی رقت انگیز است. این یک فریاد دور از 70dB است که به من آموزش داده شده است. در واقع ، یک فیلتر FIR تقریباً ده هزار شیر آب برای جداسازی مورد نیاز 70dB لازم است.

نه تنها Artix 7/35T (35 دلار) در 99 دلار Arty این شیرهای زیادی را ندارد ، بلکه هیچکدام از قطعات سری 7 Xilinx چند ضرب (بلوک های DSP) برای اجرای یک فیلتر بزرگ ندارند. نزدیکترین آنها سنگین ترین Virtex-7 است که دارای 2،820 عنصر DSP است. امروز نمی توانستم این را در Digikey پیدا کنم. نزدیکترین Virtex 7 که امروز می توانم در Digikey پیدا کنم Virtex 7/2000T با 2،160 بلوک DSP با قیمت 18000 دلار است. به عبارت دیگر ، پول شما را از این مشکل خریداری نمی کند.

از طرف دیگر ، اگر می توانید سیگنال خود را به کمتر از 2 مگاهرتز فیلتر کنید ، بدون استفاده از چند برابر ، می توانید چند برابر خود را برای یک مرحله بعدی ذخیره کنید وقتی که می توانید یک تکثیر را بین چندین شیر آب به اشتراک بگذارید. در واقع ، اگر می توانستید این کار را انجام دهید ، ممکن است بتوانید یک کانال FM را برای هزینه فقط یک جفت ضرب انتخاب کنید - 88 ضرب دیگر خود را برای برخی از اهداف دیگر انتخاب کنید.

این جایی است که فیلتر متوسط متحرک در حال پخش است. یک فیلتر متوسط متحرک نیاز به چند برابر ، فقط دو مورد اضافی ، دو نشانگر افزایشی و برخی از رم های بلوک ندارد. اگرچه فیلتر دارای یک توق ف-13 دسی بل است ، اما استفاده از فیلتر در یک بار مد روز آبشار ، یک توقف D B-13 * N DB را به شما می دهد. شش دور چنین فیلتر ممکن است کافی باشد ، به خصوص هنگامی که هر دور متوسط حرکت فقط از حداقل مقدار منطق FPGA استفاده می کند.

بنابراین ، بیایید نگاهی بیندازیم که برای اجرای یک فیلتر متوسط در حال حرکت چه چیزی لازم است.(من آن را یک فیلتر جعبه ای می نامم ، بر اساس این واقعیت که پاسخ ضربه ای این فیلتر یک عملکرد جعبه است.) ما با بررسی نحوه ساخت یک فیلتر متوسط متحرک به طور کلی شروع خواهیم کرد ، و سپس در مورد یک اولیه بحث می کنیم (شکسته) اجرای چنین فیلتر. سپس ایده اصلی را کمی بیشتر ساده خواهیم کرد و نمونه ای از نحوه اجرای "فیلتر جعبه" را نشان می دهیم. سپس بحث را با بحث در مورد عملکرد انجام خواهیم داد و توضیح می دهیم که چه نوع پاسخی را از این فیلتر انتظار دارید.

فرمول

از آنجا که کاری که ما انجام می دهیم ممکن است وقتی که به خود کد حفر می کنیم ، چندان واضح به نظر نرسد ، اجازه دهید برای لحظه ای مکث کنیم تا در مورد کارهایی که قصد انجام آن را داریم ، بحث کنیم. هدف ما ایجاد فیلتر است که یک نمونه N مجاور را با هم اضافه می کند. با پیشرفت زمان ، مقادیری که به طور متوسط با هم جمع می شوند نیز از طریق پنجره ما نیز می چرخند. به همین دلیل این عملیات "میانگین در حال حرکت" نامیده می شود: زیرا انتخاب نمونه ها به طور متوسط با هم حرکت می کنند.

شکل 1: ساختار اجرای فیلتر عمومی

بیایید ابتدا از یک قدم کوچک حمایت کنیم. اگر از قبل به یاد بیاورید ، یک فیلتر FIR عمومی فرم نشان داده شده در شکل 1 را نشان می دهد. در آن شکل ، می بینید که چگونه هر نمونه ورودی ورودی به یک خط تأخیر (در بالا) و در هر مرحله از خط تأخیر می رود. با یک ثابت ضرب می شود.(ثابت نشان داده نشده است.) سپس تمام محصولات ضرب برای تشکیل خروجی به هم اضافه می شوند.

به طور رسمی ، ما ممکن است عملکرد این فیلتر را بنویسیم ،

 

Formula for an FIR Convolution

در جایی که N TAPS به فیلتر وجود دارد ، x [n] دنباله ای از نمونه های ورودی است ، H [k] توالی ضرایب فیلتر است و y [n] خروجی فیلتر است.

فیلتر متوسط متحرک نیز متناسب با این فرم است ، با ویژگی منحصر به فرد که تمام ضرایب فیلتر ، H [K] همه هستند. این بدان معنی است که چند برابر همه به یک هستند و بنابراین می توانند از اجرای آن خارج شوند.

از این رو ، شما ممکن است این فیلتر ساده را همانطور که در شکل 2 نشان داده شده است ، بدون چند برابر بکشید.

شکل 2: یک ساختار اجرای میانگین حرکت مفهومی

به طور رسمی ، ما ممکن است این را بنویسیم ،

 

Moving Average filter

با این ساده سازی ، فیلتر به چیزی بیش از جمع بندی مجموعه ای از مقادیر ورودی ساخته شده در هر کنه ساعت تبدیل نشده است.

حتی در این شکل ، ما هنوز آماده اجرای این فیلتر نیستیم. در عوض ، در نظر بگیرید که اگر دو مورد از این مقادیر y [n] را از یکدیگر جدا کنیم ، چه اتفاقی می افتد. شما می توانید این را از نظر مفهومی در شکل 3 مشاهده کنید.

شکل 3: تفریق یک خروجی از دیگری

آیا آن را گرفتید؟تفاوت بین دو خروجی مجاور فیلتر ما ، y [n] -y [n-1] با تفاوت بین دو نمونه ورودی ، x [n] -x [n-n] داده می شود.

از نظر ریاضی ، ما می توانیم این را بنویسیم ،

 

Moving Average filter simplified

این تغییر ظریف در فرمول ، از فرمول عمومی برای یک حلقوی به سمت بالا ، منطق زیادی را برای ما فراهم می کند-به ما اجازه می دهد تا از یک باتری در حال اجرا و یک قوچ بلوک به جای چند برابر سخت افزاری و بسیاری از فلیپ فلاپ استفاده کنیم.

علاوه بر این ، با وجود این فرمول که به Y [N-1] مراجعه می کند ، یک فیلتر IIR نیست. طراحی دقیق باعث می شود که آن یکی شود.

بیایید ببینیم که چگونه ممکن است این فیلتر را پیاده سازی کنیم.

معادلات اساسی

پیش نویس بسیار سریع ، هرچند ناقص ، این الگوریتم ممکن است به نظر برسد:

با قدم زدن در این اجرا ، اولین قدم ما نوشتن این نمونه جدید برای حافظه و به روزرسانی نشانگر نوشتن ما بود. در همان زمان ، ما مقدار خارج از نمونه های قبل را می خوانیم و نشانگر خوانده شده خود را به روز می کنیم.

ما سپس مقداری را که از حافظه خوانده ایم ، Memval که به عنوان X [N-N] نیز شناخته می شود ، از مقدار جدید ، i_sample یا x [n] ، ما فقط دریافت کردیم. نتیجه آن تفریق سپس به باتری ما ، y [n] اضافه شد ، دقیقاً مانند آنچه در بخش آخر بحث کردیم. مرحله آخر دور کردن خروجی به تعداد مورد نظر بیت ها بود و ما انجام شد.

تا پایان این مقاله متوجه خواهید شد که الگوریتم تمام شده ما ، خیلی پیچیده تر از الگوریتم فوق نخواهد بود ، اگرچه ممکن است متوجه شوید که به نظر نمی رسد مانند الگوریتم فوق باشد.

بازپا

اولین مشکل در اولین تلاش ما ، اطمینان از این است که فیلتر دارای مقدار اولیه مناسب است. یک اشتباه در باتری ، یک اشتباه که اشتباه می کند ، و این فیلتر ممکن است با یک جبران DC ناخواسته به یک فیلتر IIR تبدیل شود. برای جلوگیری از وقوع این امر ، اجازه دهید یک قابلیت تنظیم مجدد ایجاد کنیم تا بتوانیم تضمین کنیم که فیلتر در یک پیکربندی شناخته شده شروع می شود.

به طور خاص ، در زمان تنظیم مجدد ، باتری باید بر روی صفر تنظیم شود ، مانند هر مقادیر محاسبه میانی ، مانند Sub و Memval.

نکته دیگر که باید به آن توجه کنیم ، حافظه است. یک مشکل هنگام استفاده از RAM بلوک ، مانند تمام خاطراتی که من از آن می دانم ، این است که هیچ مدتی برای اولیه کردن تمام حافظه ما به طور هم زمان وجود ندارد. در عوض ، ما "وانمود" خواهیم کرد که حافظه برای تعدادی از ساعتها پس از تنظیم مجدد صفر است ، و سپس از حافظه به عنوان عادی استفاده خواهیم کرد.

از این رو ، ما باید کد خود را مانند ، تغییر دهیم

این یک مقدار جدید ، پر ، ایجاد می کند که می توانیم از آن استفاده کنیم تا مشخص شود که آیا مقدار حافظه معتبر است یا خیر.

این اختلافات بزرگ برس بین پیش نویس سریع فوق و آنچه در زیر ارائه می دهیم است. مرحله بعدی ما ، ساخت الگوریتم نهایی ما خواهد بود.

الگوریتم واقعی

اکنون برای ساختن الگوریتم Verilog خود از درس های بالا استفاده می کنیم. همانطور که در زیر دنبال می کنید ، کد نهایی را در اینجا بررسی کنید.

به عنوان یک مرحله شماره یک ، ما این فیلتر را تا حد امکان عمومی خواهیم کرد. برای انجام این کار ، ما عرض ورودی ، IW و عرض خروجی خود را پارامتر می کنیم. علاوه بر این ، ما تعداد میانگین های مجاز را که باید با ورود به سیستم (دو مبتنی بر دو) از حداکثر تعداد میانگین ، LGMEM کنترل کنیم ، پارامتر می کنیم. این به ما امکان می دهد به طور متوسط به هر مقدار بین 1 تا 1 (1)<

از این رو ، اگر می خواهید به طور متوسط پنجاه و پنج مقادیر 16 بیتی را با هم قرار دهید ، IW را به 16 و LGMEM در 6 تنظیم می کنید. اگر می خواهید یک خروجی بدون گرد و دور باشد ، باید عرض خروجی ، OW ، روی آن تنظیم شودعرض ورودی به علاوه گزارش تعداد میانگین ها. در مثال میانگین پنجاه و پنج مورد 16 بیتی با هم ، این بدان معنی است که ما به عرض خروجی 16+6 یا OW = 22 نیاز داریم. هر بیت خروجی کمتری نسبت به آن نیاز به گردآوری نتیجه داخلی به تعداد مورد نظر بیت های خروجی دارد.

ما همچنین اجازه خواهیم داد که تعداد میانگین ها نیز قابل تنظیم باشند - یا در صورت تنظیم پارامتر Fixed_NAVG. اگر fixed_navg تنظیم شده باشد ، تعداد میانگین ها ثابت می شوند و توسط یک پارامتر اولیه_AVG تنظیم می شوند.

اگر fixed_navg تنظیم نشده باشد ، ما به کاربر اجازه می دهیم تعداد میانگین مورد نظر خود را تنظیم کند. با این حال ، به دلیل وابستگی به رابطه بازخورد ، y [n] به y [n-1] ، ما اصرار خواهیم کرد که تعداد میانگین ها نباید به جز در سیگنال i_reset تغییر کنند.

همانطور که بعداً خواهیم دید ، تنها بخشی از الگوریتم ما که به این تعداد میانگین بستگی دارد ، مقدار اولیه/تنظیم مجدد آدرس خواندن حافظه است. به همین دلیل ، ما ارزش را در یک رجیستری ذخیره نمی کنیم. بعداً وقتی در مورد آدرس خوانده شده بحث خواهیم کرد ، بعداً به این موضوع برمی گردیم.

این ما را به منطق مورد نیاز برای دسترسی به حافظه - هم نوشتن و هم خواندن می رساند. از این دو ، آدرس نوشتن ساده است: ما شروع به نوشتن به اولین آدرس حافظه (آدرس صفر) در اولین نمونه داده خود خواهیم کرد و سپس از طریق مکان های حافظه از آنجا می چرخیم.

این بدان معنی است که ما باید با استفاده از آدرس حافظه خوانده شده ، تفاوت زمانی بین مقدار اولیه و نمونه های مقدار n را اجرا کنیم. ما این کار را با اولیه کردن آدرس خوانده شده به تعداد منفی میانگین انجام خواهیم داد.

همانطور که با آدرس نوشتن ، آدرس خوانده شده را در هر ساعت نمونه افزایش می دهیم.

پس از محاسبه آدرس ، ما نمونه ورودی را به حافظه می نویسیم و نمونه تأخیر خود را از حافظه نیز می خوانیم.

تا کنون ، این همه ساده است. به غیر از مقادیر اولیه ، ما واقعاً از پیش نویس اولیه خود در بالا منحرف نشده ایم. با این حال ، هنگام افزودن نمونه ورودی به این منطق ، چیزها کمی سخت تر می شوند. به طور خاص ، اگر بخواهیم مقدار ورودی ما با خروجی حافظه خوانده شده ، Memval ، مرتبط با X [N-N] تراز شود ، پس باید ورودی را با یک نمونه به تأخیر بیندازیم.

واقعاً واضح نیست که چرا چنین خواهد بود. چرا باید با یک نمونه به تأخیر بیفتد؟پاسخ مربوط به برنامه ریزی خط لوله است. بنابراین ، بیایید ببینیم که چگونه مقادیر داخلی در الگوریتم ما بر روی ساعتهای بعدی تنظیم می شود ، همانطور که در شکل 4 نشان داده شده است.

شکل 4: برنامه ریزی خط لوله میانگین متحرک

این شکل لیستی از کلیه ثبت های داخلی ما را نشان می دهد ، که در ساعت هایی که در ساعت تنظیم شده اند ، در ساعت تنظیم شده اند-قبل از یک نمونه خاص ، i_sample [t] ، T-1 تهیه شده است تا چهار ساعت بعد در T+4. از این رو ، از آنجا که Memval به RDADDR بستگی دارد ، در حالی که RDADDR تنظیم می شود ، در ساعت زیر یک ساعت نشان می دهد. به همین ترتیب ، از آنجا که حافظه پس از تنظیم آدرس نوشتن تنظیم شده است ، MEM [Wraddr] به دنبال Wraddr تنظیم می شود.

در حالی که ارائه ما از طریق کد زیر به ترتیب زمانی خواهد بود ، از زمان T تا T+4 ، نمودار فوق ساخته شده/به عقب برنامه ریزی شده است. O_RESULT نسخه گرد ACC است. محاسبه یک ساعت طول کشید. ACC مجموع آخرین باتری و نتیجه تفریق ، زیر است. علاوه بر این ، ما می دانیم که می خواهیم مقدار ورودی جدید خود را از آخرین مقدار حافظه ، memval و غیره کم کنیم.

بنابراین چرا ما ثبت نام در این نمودار خط لوله را داریم؟به نظر نمی رسد کاری انجام دهد ، پس چرا آنجا است؟

پاسخ ساده است: ما باید ورودی را با یک ساعت به تأخیر بیندازیم تا بتوانیم آن را با خاطره ای که فقط نوشته شده است و سپس خوانده شود ، تنظیم کنیم.

به عنوان مثال ، فرض کنیم ما فقط آرزو داشتیم که یک عنصر را به طور متوسط-یک فیلتر عبور از آن داشته باشیم. از این رو ، ما می خواهیم مقدار جدید خود ، x [n] را اضافه کنیم و مقدار قبلی ، x [n-1] را کم کنیم ، که فقط توسط یک ساعت به تأخیر افتاده است. با توجه به این همان کاری است که ما می خواهیم انجام دهیم ، اجازه دهید این مقدار جدید را از طریق این برنامه خط لوله در شکل 5 در زیر دنبال کنیم.

شکل 5: ردیابی آخرین نمونه از طریق خط لوله متوسط متحرک

i_sample [T-1] در زمان T-1 نشان می دهد ، و در زمان t به حافظه ، mem [wraddr] می رسد. سپس می توان آن را در زمان T+1 به Memval خواند ، و سپس از مقدار جدید در T+2 جدا شد تا Sub ایجاد شود. این بار ، T+2 ، اولین مقدار است که می توان آخرین مقدار را از حافظه خوانده کرد. این همچنین زمانی است که ما به مقدار جدید خود نیاز داریم ، ساعت x [n] - یک ساعت بعد از آن. برای به دست آوردن مقدار نمونه جدید از زمانی که به این دوره ساعت به ما داده می شود ، باید آن را با یک چرخه واحد به تأخیر بیندازیم و آن را برای این منظور شیوع دهیم.

منطق لازم برای انجام این کار بی اهمیت است - مانند استدلال پشت آن در بالا.

نکته دیگری که ما باید بدانیم ، در عین حال می خواهیم ارزشی را که فقط از حافظه می خوانیم بدانیم ، این است که آیا ما به اندازه کافی برای حافظه نوشته شده ایم تا مقادیر خوانده شده از حافظه معتبر باشدبشرمن انتخاب کرده ام که این را به طور کامل بنامم ، نشان دهم که حافظه خط تأخیر در آن پر شده است.

از آنجا که ما آدرس نوشتن را در صفر قرار دادیم و سپس در ساعت اول خود به آدرس صفر نوشتیم ، می دانیم که مقدار خوانده شده از حافظه به محض خواندن از آدرس صفر معتبر خواهد بود.

اکنون تمام مقادیر نشان داده شده در ستون T+1 را از شکل 4 و 5 در بالا تنظیم کرده ایم ، بنابراین به ساعت بعدی حرکت خواهیم کرد. در این ساعت ، ما نمونه ای را که از انتهای لیست میانگین خود از نمونه جدید خود خارج می شود ، کم می کنیم. ما این نتیجه را در زیر قرار خواهیم داد.

بقیه ساده است. ما این تفاوت را به مقدار انباشته شده خود اضافه می کنیم و مقدار خروجی فیلتر ما ، y [n] را ایجاد می کنیم.

مرحله نهایی خط لوله ما خروجی های فیلتر ما را به تعداد بیت های درخواست شده توسط پارامتر ، OW می رساند.

پس از انجام گردآوری مقدار خروجی ، یک مرحله ساعت اضافی برای مقابله با هرگونه تأخیر در ارتباط با گرد خواهیم داشت.

در حالی که اگر نیازی به رها کردن هر بیت نداریم ، ممکن است این تأخیر را کنار بگذاریم ، انجام این کار باعث می شود که فیلتر ما بسته به نحوه پیکربندی آن ، تأخیر متفاوتی داشته باشد. به جای مقابله با آن سردرد نگهداری ، نتیجه همیشه توسط یک ساعت در اینجا به تأخیر می افتد (گرد یا نه).

کارایی

پاسخ فرکانس یک فیلتر متوسط متحرک به خوبی شناخته شده است. به اندازه کافی آسان است که محاسبه شود که این کار را برای دانش آموز اولیه انجام می دهد. توسط آن داده شده است ،

 

H = sin(pi fN)/sin(pi f)

اگر این پاسخ را بررسی کنید ، واقعاً عالی نیست. در بهترین حالت ، می توانید از این فیلتر یک نوار توق ف-13 dB دریافت کنید. این بهتر از نوار بان د-6db از مثال FM ما در بالا است ، اما هنوز هم فریادی دور ا ز-70DB که ممکن است دوست داشته باشیم.

از طرف دیگر ، اگر فیلترهای M از این نوع را با هم آبشار می کنید ، می توانید یک باند بسیار عمیق تر دریافت کنید. برای نشان دادن این موضوع ، شکل 6 در زیر ، به رنگ آبی ، پاسخ یک فیلتر متوسط متحرک را نشان می دهد که میانگین پنج مقدار مجاور در کنار هم است. خطوط دیگر در نمودار نشان می دهد که پس از آبشار این فیلتر با خود دو ، سه ، چهار ، پنج یا شش بار اتفاق می افتد.

شکل 6: در حال حرکت پاسخ فرکانس متوسط

Image showing this filters response function

کد اکتاو مورد استفاده برای ایجاد این شکل را می توان در اینجا یافت.

دو مورد مهم وجود دارد که باید از این رقم توجه کنید. ابتدا ، بند بند فیلتر ، هنگامی که آبشار است ، می تواند بسیار عمیق شود. پس از آبشار شش نفر از این موارد ، Stopban d-78 d B-Prytic چشمگیر است. نکته دوم که باید توجه کنید این است که "Passband" دیگر مسطح نیست. در نتیجه ، ما باید این فیلتر را با یکی دیگر دنبال کنیم تا هرگونه تحریف سیگنال مورد علاقه خود را تمیز کنیم.

نتیجه

در حالی که یک فیلتر متوسط متحرک فریادی از یک فیلتر کم گذر به خوبی طراحی شده است ، اما یک فیلتر بسیار ساده برای اجرای آن است. از دیدگاه تجارت مهندسی ، این سادگی آن را به یک مؤلفه بسیار جذاب برای مقابله با بسیاری از الزامات DSP در FPGA تبدیل می کند.

ما با درس های خود در مورد فیلتر دیجیتال انجام نشده است. من هنوز برنامه ریزی کرده ام که در مورد فیلترهای متقارن ، فیلترهای نیمه باند ، هیلبرت تبدیل و موارد دیگر بحث کنم. علاوه بر این ، من می خواهم نه تنها در مورد اجرای سرعت بالا آنها ، بلکه برخی از پیاده سازی های کندتر که برای آن طرح هایی مناسب است که در آن ساعت های زیادی بین نمونه های ورودی وجود دارد ، بحث کنم.

حتی در این صورت ، ما انجام نشده است ، زیرا فیلتر فوق ، هنگامی که هر بار با خود آبشار می شود و به دنبال آن یک داونیمپلر دنبال می شود ، بدون نیاز به قوچ بلوک می توان ساخته شد.

ما همچنین می خواهیم در مورد چگونگی اثبات این فیلترها بحث کنیم. چه نوع نیمکت آزمایشی برای آزمایش فیلترهای دیجیتال مناسب است؟

با این حال ، اینها هنوز درسهایی هستند.

تنها ، این تنها پیدا کرده ام که خدا انسان را به صورت قائم ساخته است. اما آنها به دنبال اختراعات بسیاری بوده اند.(ECCL 7:29)

Zipcpu توسط Gisselquist Technology

وبلاگ ZIPCPU ، نحوه بحث در مورد طراحی FPGA و طراحی CPU هسته ای. این سایت با استفاده از محصولات IP OpenSource برای طراحی FPGA بر روی راه حل های Verilog متمرکز خواهد شد. زمینه های تمرکز ویژه شامل مباحثی است که اغلب از دوره های اصلی طراحی FPGA بیشتر باقی مانده است مانند نحوه اشکال زدایی در طراحی FPGA.

آشنایی با رمزارزها...
ما را در سایت آشنایی با رمزارزها دنبال می کنید

برچسب : نویسنده : بهاءالدین خرمشاهی بازدید : <-PostHit-> تاريخ : دوشنبه 22 اسفند 1401 ساعت: 14:57