در قسمت یازدهم از آموزش FPGA با ساختار شرطی case آشنا شدیم و به مقایسه ساختارهای شرطی در محیط ترتیبی پرداختیم. در نهایت مقایسهای تخصصی در رابطه با این ساختارها ارائه دادیم و نوصیههایی برای هرچه حرفهایتر شدن شما بیان کردیم.
در قسمتهای قبل چندین فیدبک از دوستان داشتیم که گفته بودند اگر کد را به نحو دیگری بنویسیم صحیحتر میباشد، بله حرف دوستان عزیز کاملا درست بود و ما هم قصد نداریم که سخن قبلیمون که گفته بودیم: همه برابرند، را تکذیب کنیم و اکنون بگوییم: همه برابرند ولی بعضیها برابرترند (اشاره به یک رمان معروف). اکنون میخواهیم به شما بگوییم که آن کارهای غیر اصولی که در قسمتهای قبل انجام میدادیم به عمد بود! ولی در این قسمت قصد داریم که کمکم از آن کارهای غیر اصولی گذر کرده و شما را با کدنویسی اصولی و حرفهای آشنا کنیم. تنها دلیلی هم که ما در قبل به صورت غیر اصولی کد مینوشتیم این بود که شما اشتباهات مختلف را بشناسید و مفهوم را به خوبی درک کنید، حال وقتی به شما کدنویسی اصولی گفته شود قدر عافیت میدانید، بالاخره قدر عافیت کسی داند که به مصیبتی گرفتار آید.
قبلا ما مدارات ترکیبی را در محیط ترتیبی توصیف میکردیم که کاری اشتباه بود، از این قسمت به بعد دیگر مدرات ترکیبی را در محیط ترتیبی توصیف نخواهیم کرد. دقت بفرمائید که یک مدار ترتیبی در دل خود شامل مدار ترکیبی است، اما ما به صورت مستقیم یک مدار ترکیبی خالص را در محیط ترتیبی توصیف نخواهیم کرد. در ادامه همچنین مقدماتی از بحث کلاک بیان میکنیم و نهایتا در این قسمت به توصیف عناصر پایه در FPGA بسنده خواهیم کرد.
در مدارات ترتیبی، خروجی علاوه بر ورودی در همین لحظه به ورودیهای لحظات قبل نیز بستگی دارد. حال ما برای ساخت چنین مداراتی ابتدا باید به تشریح و ساختن حافظهها که عناصر پایه این مدارات هستند بپردازیم.
حافظهها در دیجیتال و منحصرا در مدارات ترتیبی
در دیجیتال معمولا حافظهها را به دو دسته کلی به صورت زیر تقسیم میکنند:
- لچ
- فلیپفلاپ
تفاوت بین لچ و فلیپفلاپ
کار حافظهها این است که مقادیر دیجیتال را در خود نگه دارند و این مقادیر تا زمانی که ما تعیین میکنیم در حافظه ثابت خواهند ماند. مقادیر دیجیتال ذخیره شده در حافظه چه زمانی و چگونه تغییر میکنند؟ جواب این سوال تفاوت بین لچ و فلیپفلاپ را نتیجه میدهد، پس با دقت به ادامه توضیحات توجه کنید.
پیادهسازی با لچ یا فلیپفلاپ؟
اگر مدارات منطقی را به صورت خیلی دقیق بررسی کنیم در جزئیات لچ و فلیپفلاپ تفاوتهایی وجود خواهد داشت، اما تفاوت اصلی همان مورد بالا بود که بیان کردیم. همین تفاوتها و یک سری پارامترهای دیگر مربوط به FPGA ها گاها باعث ایجاد مشکلاتی در پیادهسازی میشود که هم افراد حرفهای و هم خود شرکت xilinx پیشنهاد میکند که از لچ در پیادهسازی استفاده نکنیم.
ما هم در این مجموعه آموزشی نه به توصیف لچ خواهیم پرداخت و نه از این به بعد در هیچ کدام از مثالها یا پیادهسازیها از لچ استفاده خواهیم کرد. بلکه در تمامی مثالها و پیادهسازیها حافظه مورد استفاده ما فلیپفلاپ خواهد بود.
قبل از اینکه به پیادهسازی فلیپفلاپ بپردازیم نیاز است که مقدماتی از توصیف کلاک در FPGA بدانیم، چون برای توصیف فلیپفلاپ نیاز است که لبهی سیگنال کلاک را تشخیص بدهیم.
پیادهسازی مدارات ترتیبی در محیط Sequential
فرض کنید میخواهیم یک فلیپفلاپ را با استفاده از زبان VHDL توصیف و در نهایت در FPGA پیادهسازی کنیم، بدین منظور ابتدا باید یک process ایجاد کنیم، سیگنالی که در لیست حساسیت process قرار خواهد گرفت، چیست؟ همانطور که میدانید ذات مدارات ترتیبی وابسته به سیگنال کلاک میباشد پس حداقل باید سیگنال کلاک در لیست حساسیت process قرار بگیرد، البته در نهایت به شما خواهیم گفت که در اکثر مواقع فقط همین سیگنال کلاک باید در لیست حساسیت نوشته شود.
وقتی سیگنال کلاک را در لیست حساسیت process نوشتیم، هر تغییری که روی کلاک رخ بدهد process فعال خواهد شد و هر ارجاعی که در این محیط وجود داشته باشد با هر گونه تغییر کلاک انجام میشود که این موضوع مطلوب و مدنظر ما نمیباشد. برای رفع کردن این مشکل باید بتوانیم لبهی سیگنال کلاک را تشخیص بدهیم تا تغییرات با لبهی کلاک صورت بپذیرند، در اینجا ما قصد داریم که مدار ترتیبی موردنظر با لبهی بالارونده کار کند، پس در ادامه ابتدا با نحوهی تشخیص لبهی بالاروندهی کلاک در FPGA آشنا خواهیم شد و سپس فلیپفلاپ حساس به لبهی بالارونده را توصیف خواهیم کرد.
لبهی کلاک
همانطور که گفتیم وقتی در لیست حساسیت process، سیگنال کلاک را قرار میدهیم، با هرگونه تغییر کلاک، process فعال میشود. حال ما باید پس از فعال شدن process شرطی را قرار بدهیم که یکی لبههای کلاک را بررسی کند و زمانی که لبهی کلاک تشخیص داده شد ارجاعات مورد نظر انجام بشوند، به عبارتی دیگر ارجاعات را زیر شرط لبهی کلاک مینویسیم تا تمامی ارجاعات سنکرون با لبهی کلاک باشند و مشکلی که در بالا بیان کردیم رفع گردد و با هرگونه تغییر کلاک ارجاعات انجام نشوند.
تشخیص لبهی کلاک
راههای مختلفی برای اینکه لبههای کلاک را تشخیص بدهیم وجود دارد، در ادامه دو روش به شما معرفی خواهیم کرد و در نهایت یکی از این دو روش را برخواهیم گزید و هر موقع خواستیم لبهی کلاک را تشخیص بدهیم از این راه استفاده خواهیم کرد.
ابتدا به کد زیر توجه کنید:
1 | if (Clock'event and Clock = '1') then |
در کد بالا از event استفاده کردیم و عبارت شرط وقتی برقرار است که هم تغییری روی سیگنال کلاک رخ داده باشد و هم سیگنال کلاک در آن لحظه برابر با ‘1’ باشد و این یعنی لبهی بالاروندهی کلاک.
برای توصیف لبهی پایین به کد زیر توجه کنید:
1 | if (Clock'event and Clock = '0') then |
در کد بالا عبارت شرط وقتی برقرار است که هم تغییری روی سیگنال کلاک رخ داده باشد و هم سیگنال کلاک در آن لحظه برابر با ‘0’ باشد و این یعنی لبهی پایینروندهی کلاک.
روش سرراستتر و سادهتری برای تشخیص لبهی کلاک وجود دارد که همان روش برگزیده ما خواهد بود و از این به بعد فقط از این روش استفاده خواهیم کرد.
1 | if rising_edge(Clock) then |
کد بالا به لبهی بالاروندهی کلاک اشاره میکند، مشابها همین روش برای لبهی پایینروندهی کلاک نیز وجود دارد.
خب حالا که مقدمات کلاک را به خوبی بررسی کردیم و با تمامی زیر و بم آن آشنا شدیم، قصد داریم فلیپفلاپ را با استفاده از زبان VHDL توصیف کنیم، به کد زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Flip_Flop is Port ( Clock : in STD_LOGIC; D : in STD_LOGIC; Q : out STD_LOGIC ); end Flip_Flop; architecture Behavioral of Flip_Flop is begin process (Clock) begin if rising_edge(Clock) then Q <= D; end if; end process; end Behavioral; |
کد بالا توصیف یک فلیپفلاپ با استفاده از زبان VHDL میباشد، اینکه چرا کد مربوطه منجر به ساخت یک فلیپفلاپ در FPGA میشود، سیگنالها در محیط ترکیبی و ترتیبی تبدیل به چه چیزی خواهند شد و ربط سیگنال به حافظه چیست و کلی سوال دیگر را در قسمت سیزدهم بررسی خواهیم کرد، پس با ما همراه باشید.
بله امکانش هست پروسس کلا سکونشال اجرا میشه هر جفتش رو به ترتیب اجرا میکنه اگر هر دو شرط لبه پایین رونده و لبه بالا رونده در یک پروسس نوشته بشه ولی حالا اگه 2 تا پروسس جدا بنویسیم که بخواییم یکی با لبه بالارونده کار کنه یکی هم با لبه پایین رونده این هم امکان پذیره ولی موردی که هست اینه که برای این مدار بحث collision یا تداخل پیش میاد ولی میتونید جوری طراحی کنید مدارتون رو که دو واحد جدا داشته باشین و بعد این ایده رو اجرا کنید مشکلی هم نداره بخاطر اینکه به ای سی های بافر 2 طرفه یا بافر های قابلیت ذخیره نگاه کنید از دو بافر در حالت معکوس استفاده میشه خب همین مدار رو بخوایید با vhdl پیاده سازی کنید میشه با این ایده هم اجرا بشه که خودتون گفتین ولی به صرفه نیست چون باید یک واحد فیلیپ فلاپ دیگه استفاده کنید که بحث تداخل پیش میاد که گفتم بهتره که اینجوری نباشه ولی اگرم بود اشکالی پیش نمیاره برای فهم بهتر شبیه سازی کنید و در خروجی isim ببینید شرایط به چه شکل هست
با سلام . امکان این وجود دارد که کدمان هم حساس به لبه بالارونده باشد و هم حساس به لبه پایین رونده ؟ برای مثال در قسمت architecture دو تا پروسس بنویسیم که یکی حساس به لبه پایین رونده و دیگری هم حساس به لبه بالارونده باشد ؟
سلام نازنینم. بله این امکان حتی با یک پراسس هم وجود دارد ولی خب این راه اصولی نیست. و پیشنهاد میکنم تنها از همان لبهی بالا رونده استفاده کنید.
به چه دلیلی اصولی نیست ؟ بخاطر فلیپ فلاپ های درون FPGA ؟
در نظر بگیرید که هم برای لبهی بالا و هم لبهی پایین نیاز به edge detection هست و منابع بیشتری برای این کار نیاز هست و بحث سیم بندی که میتواند سرعت را کاهش دهد هم را در نظر بگیرید. از سوی دیگر به یک سری مباحث تئوری در رابطه با تاخیر در ترانزیستورهای سازنده و اینا مربوط میشه که در عمل هم خودشو نشون میده اما چون من خودم به حد کافی اشراف ندارم در این بحث ترجیح میدهم راهنمایی اشتباه نکنم.
با سلام خدمت شما دوست عزیز
یک توضیح تکمیلی به توضیحات ققنوس اضافه میکنم.
در FPGA فلیپ فلاپی که با هر دو لبه کلاک کار کنه نداریم . (البته در موارد استثنا در IO ها وجود داره ولی به طور کلی در CLB ها هر فلیپ فلاپ تنها با یک لبه کلاک کار میکنه)
خب حالا وقتی از عبارت rising_edge و falling_edge در یک پروسس یا چند پروسس استفاده میکنید. عملا از چند فلیپ پشت سرهم استفاده کردید. که اصلا کار خوبی نیست.
به لحاظ ملاحظات زمان بندی و سرعت هم همنطور که ققنوس گفته کلاً مشکل پیدا میکنید.
پس این کار را نکنید و سعی کنید کل مدارتون فقط با یک لبه کلاک کار کنه و ترجیحاً لبه بالارونده …
سلام محسن نازنین. بله دقیقا توضیحاتتون به جا بود. البته من به طور دقیق بررسی نکردم که بعضی فلیپفلاپها با هر دو لبه کار میکنن.
ولی خب به صورت کلی اگه ما با استفاده از کد چیزی را توصیف کنیم و اون چیز از قبل در نظر گرفته نشده باشه هنگام و پس از مراحل سنتز با توجه به target device اون را اگه ممکن باشه برای ما به وجود میاره.
خب چون ما توصیف کردیم اون هم با این پیش فرض که ما میدونیم داریم چکار میکنیم برای ما به وجودش میاره و نهایتا یه سری info تو گزارشات به ما بده. اما این کار غیر اصولی هستش و زمانی که منابع را الکی داریم زیاد میکنیم place and route سختتر میشه و نه تنها به سرعت بهتری نرسیدیم بلکه کلی از منابع را هم الکی هدر دادهایم.
اگه امکان داره در پیام رسان داخلی هم کانال بزنید
دوست عزیز ما را میتونید تو اینیستاگرام هم دنبال کنید
متاسفانه قرار دادم پیام و کنترل هر شبکه اجتماعی زمان بر هست و پیام رسانهای داخلی متاسفانه آنچنان فراگیر نیستند