میانگین متحرک

ساخت وبلاگ

در برخی از برنامه ها، ما باید میانگین متحرک را روی داده های ورودی در طراحی خود انجام دهیم.

در میانگین متحرک برای هر نمونه ورودی، باید معادله ای مانند انجام دهیم

با شروع از این معادله، باید میانگین محاسبه را برای هر نمونه ورودی انجام دهیم.

معادله میانگین متحرک

در حال حاضر، 1/4 را از هم جدا کرده و روی قسمت افزودن تمرکز کنید.

این ملاحظات می تواند معماری بلوک میانگین متحرک را با استفاده از یک انباشته کننده ساده که نمونه ورودی را اضافه می کند و نتیجه را کم می کند مانند شکل 2 ساده کند:

شکل 2 معماری میانگین متحرک برای N=4

تقسیم بر N بسیار ساده شد در صورتی که N توان دو باشد. در واقع در این حالت تقسیم به سادگی به صورت شیفت سمت راست انجام می شود.

در صورتی که N توان دو نباشد می توانید به این پست مراجعه کنید که در آن می توانید نحوه اجرای تقسیم بر ثابت را یاد بگیرید.

کد VHDL برای میانگین متحرک

در اینجا کد VHDL برای معماری میانگین متحرک شکل 2 ارائه شده است. برای اینکه به خوبی کار کنند، همه ثبات ها باید در حالت تنظیم مجدد به عنوان شرایط اولیه باشند. این شرط با استفاده از تنظیم مجدد همزمان "i_sync_reset" اجرا می شود.

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

شبیه سازی میانگین متحرک VHDL ModelSim

در شکل های بعدی شبیه سازی ModelSim از کد VHDL با اجرای الگوریتم میانگین متحرک گزارش شده است. شکل 3 نسبت به نمونه ورودی با فعال کردن داده های پیوسته است.

شکل 3 - شبیه سازی میانگین متحرک در 4 نمونه ورودی فعال کردن پیوسته شکل 4 - شبیه سازی میانگین متحرک در 4 نمونه ورودی فعال نیست.

در هر دو شبیه سازی مشخص شده است که میانگین متحرک زیر را محاسبه کنید

نتیجه

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

منطق کنترل به عنوان یک تنظیم مجدد همزمان اجرا می شود که وضعیت اولیه صحیح لوله داده و ذخیره کننده را تضمین می کند.

در صورت طول متوسط متحرک بسیار طولانی، می توانید اجرای FIFO لوله داده را اتخاذ کنید. لوله داده پیاده سازی شده به عنوان FIFO در این پست بررسی می شود.

در مورد اجرای FIFO ، یک منطق کنترل اضافی برای رسیدگی به وضعیت اولیه FIFO و باتری معرفی می شود.

منابع

20 فکر به "نحوه اجرای میانگین متحرک در VHDL"

کتابخانه IEEE ؛از ieee. std_logic_1164. all استفاده کنید ؛از ieee. std_logic_arith. all استفاده کنید ؛استفاده از ieee. numeric_std. all ؛از ieee. std_logic_unsigned. all استفاده کنید ؛

پیشخوان موجودیت است

پورت (ساعت: در std_logic ؛ تنظیم مجدد: در std_logic ؛ تعداد: std_logic_veector (0 تا 15) ؛ dout: out std_logic) ؛شمارنده پایان ؛

معماری رفتاری پیشخوان سیگنال TMP است: std_logic_veector (0 تا 15) ؛

فرآیند (ساعت ، تنظیم مجدد)

این درست نیست ، اما باید آنچه را که می خواهید انجام دهید روشن کنید. هنگامی که می خواهید شماره را درمان کنید ، بهتر است از std_logic_veector (15 downto 0) استفاده کنید. به جای "به". من نمی فهمم که کد باید چه کاری انجام دهد ، به عنوان مثال ، "dout" std_logic است ، بنابراین شما نمی توانید چیزی مانند dout = "x1068 ″ &" x11f8 ″ بنویسید

من می خواهم کد VHDL را برای حرکت میانگین با استفاده از رویکرد مبتنی بر مؤلفه به عنوان مثال فراخوانی چند ضلعی و افزودنی ها در کد اصلی به عنوان اجزای… plzzz می خواهم

شما باید مؤلفه را فوری کنید و عملگر را به درگاه مؤلفه وصل کنید

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

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

سوال سریع ، آیا من هنوز هم نیاز دارم که با N بر روی خروجی تقسیم کنم ، n G_AVG_LEN_LOG یا این کار در خط 49 انجام شده است؟به سلامتی

اگر می خواهید از کل اعداد استفاده کنید ، لازم نیست تقسیم کنید

سلام ، آیا روشی وجود دارد که بتوانم 10 عدد را به جای 4 ، THX برای کمک پیدا کنم.

فقط عمق حافظه 10 را پیاده سازی کنید. در این حالت نمی توانید نتیجه را به سادگی تغییر دهید زیرا 10 قدرت 2 نیست. شما می توانید 8 یا 16 تقسیم کنید

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

سلام ، در مورد ساخت "g_avg_len_log" به عنوان یک متغیر (به عنوان مثال ثبت ورودی) چطور؟از پست شما بسیار سپاسگذارم. من یک هشدار دارم که "سیگنال g_avg_len_log در زیرگروه-هند-انسجام /نوع-تعریف" در خط "سیگنال r_acc: امضا شده (g_nbit+g_avg_len_log-1 downto 0) استفاده می شود.- باتری متوسط "

کتابخانه IEEE ؛از ieee. std_logic_1164. all استفاده کنید ؛استفاده از ieee. numeric_std. all ؛

Entity Moving_a AVERAL عمومی است (G_nbit: Integer: = 16) ؛پورت (i_clk: در std_logic ؛ i_rstb: در std_logic ؛ i_sync_reset: در std_logic ؛-input i_data_ena: in std_logic ؛ i_data: in std_logic_vector (g_nbittl-1 downtortor (downtoction) downto 0) ؛ std_logoff: in std_loff: in std_loff: in std_loff: in std_logtoft: in std_logyo_data_valid: out std_logic ؛ o_data: out std_logic_veector (g_nbit-1 downto 0)) ؛End Moveing_a AVERIAL ؛

معماری RTL از MoveM_A AVERIAL است

سیگنال g_avg_len_log: عدد صحیح ؛Type T_Moving_a Array (0 تا 2 ** G_AVG_LEN_LOG-1) از امضا (G_NBIT-1 Downto 0) ؛سیگنال p_moving_avery: t_moving_averate ؛سیگنال r_acc: امضا شده (g_nbit+g_avg_len_log-1 downto 0) ؛- میانگین سیگنال جمع کننده R_DATA_VALID: std_logic ؛

پایان اگر ؛فرآیند پایان P_AVENE ؛پایان RTL ؛

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

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

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

این یک FIR با پاسخ ضربه ای است

سلام ، من این کد را در مورد حرکت فیلتر متوسط پیدا کردم.

کتابخانه IEEE ؛از ieee. std_logic_1164. all استفاده کنید ؛استفاده از ieee. numeric_std. all ؛استفاده از std. textio. all ؛از ieee. std_logic_textio. all استفاده کنید ؛

Entity avgfilter عمومی است (g_data_w: integer: = 16 ؛ g_fil_l: integer: = 4) ؛بندر (CLK: در std_logic ؛ اول: در std_logic ؛ en: در std_logic ؛ iv_data: در std_logic_vector (g_data_w-1 downto 0) ؛ ov_avg: std_logic_vector (g_data_w-1 downto 0)) ؛موجودیت پایان ؛

معماری avgfilter_rtl از avgfilter است

- محاسبه تعداد بیت های مورد نیاز برای گسترش عملکرد بردار جمع SUMLOG2 (M: مثبت) بازگشت طبیعی برای شاخص در حلقه 1 تا 30 در صورتی آغاز می شود اگر (m بازده (شاخص) ؛ پایان اگر ؛ حلقه پایان ؛ بازگشت (31) ؛ عملکرد پایان.

سیگنال en_reg: std_logic ؛

-آرایه ای برای ذخیره نمونه های T_ARR_FILL_X_DATA آرایه (g_fil_l-1 downto 0) بدون امضا (g_data_w-1 downto 0) است. سیگنال a_samples: t_arr_fill_x_data ؛

شروع Reg: Process (CLK)

-برای افزودن مقادیر G_FIL_L مورد نیاز SUMLOG2 (G_FIL_L) بیت های بیشتر برای متغیر نتیجه V_SUM: بدون امضا (G_DATA_W+SUMLOG2 (G_FIL_L) -1 DOWNTO 0) ؛

begin if rising_edge(clk) then if rst = '1' then en_reg a_samples (others => ‘0’)); v_sum := (others =>‘0 ') ؛ov_avg ‘0 ') ؛دیگری en_reg

a_samples (0) برای i در 1 به g_fil_l-1 حلقه a_samples (i) ‘0 ') ؛اگر en_reg = ‘1" برای من در 0 به g_fil_l-1 حلقه v_sum: = v_sum + تغییر اندازه (a_samples (i) ، v_sum'l طول) ؛حلقه پایان ؛پایان اگر ؛

و پرونده datain. dat: 890b 0D00 0044 0048 B10E 8F1A 00A0 0A0A

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

G_FIL_L متوسط طول است ، بنابراین باید مبلغ 4 ورودی آخر را با 4 دریافت کنید

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

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

پاسخ دهیدلغو پاسخ

دوره های آنلاین VHDL

به پادکست 5 دقیقه VHDL گوش دهید

دانشجویی با VHDL موفقیت دارد

اینجا را کلیک کنید تا آنچه را که سایر بچه ها درباره Surf-VHDL < SPAN> فکر می کنند ، بخوانید ، اما وقتی شبیه سازی می کنم فقط 6 مقادیر برتر را می گیرد ، و میانگین نتیجه فیلتر فقط به 4 تقسیم می شود. آیا می توانید به من کمک کنید تا این مورد را توضیح دهم و چگونه می توانمبیش از 6 مقدار را کنترل کنید. بسیار سپاس گزارم

حساب اسلامي...
ما را در سایت حساب اسلامي دنبال می کنید

برچسب : نویسنده : کامران فیوضات بازدید : <-PostHit-> تاريخ : چهارشنبه 3 خرداد 1402 ساعت: 23:57