آموزش FPGA قسمت پانزدهم: توصیف عناصر حافظه (بخش چهارم)

0
509
توصیف عناصر حافظه
توصیف عناصر حافظه

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

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

اجازه‌بدهید ابتدا کد جلسه قبل را دوباره بازنویسی کنیم تا درباره آن بهتر بتوانیم توضیح‌بدهیم.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity Flip_Flop is
Port ( 
D : in STD_LOGIC;
Clock : in STD_LOGIC;
Reset : 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;
if (Reset = '1') then
Q <= '0';
end if; 
end if;

end process;

end Behavioral

همانطور‌که از قسمت قبل می‌دانید، کد بالا توصیف ریست سنکرون است. اکنون قصد داریم که بررسی‌کنیم که ریست سنکرون با این نحوه کدنویسی به چه‌صورت در FPGA پیاده‌سازی می‌شود. به مدار زیر توجه‌کنید:

Reset in FPGA
Reset in FPGA

 

مدار پیاده‌سازی‌شده بسیارساده می‌باشد و یک فلیپ‌فلاپ می‌باشد که شما قبلا تقریبا همین مدار را دیده‌بودید اما الان یک چیز دیگر به‌نام ریست به همان فلیپ‌فلاپ اضافه‌شده‌است. عملکرد ریست را هم که از قسمت‌قبل می‌دانید و نیاز به هیچ توضیح اضافی نیست.

حال بیایید یک تغییر کوچک در کد بدهیم و ببینیم که چه اتفاقی در مداری که درون FPGA پیاده‌سازی می‌شود خواهد افتاد.

ما در کد بالا شرط زیر را نوشتیم:

if (Reset = '1')

اکنون قصد داریم فقط با یک تغییر کوچک همین یک خط کد را در کد اصلی به‌صورت‌زیر تغییر دهیم:

if (Reset = '0')

اگر توجه‌کنید فقط مقدار ۱ را با مقدار ۰ جایگزین کردیم، یعنی سیگنال ریست با مقدار ۰ مقایسه می‌شود و هرموقع که ریست برابر ۰ بود عمل موردنظر انجام می‌شود درصورتیکه قبلا به این صورت بود که سیگنال ریست با مقدار ۱ مقایسه می‌شد و هرموقع ریست برابر با ۱ بود عمل موردنظر انجام می‌شد.

نهایتا کد ما به‌صورت‌زیر تغییر می‌کند:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity Flip_Flop is
Port ( 
D : in STD_LOGIC;
Clock : in STD_LOGIC;
Reset : 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;
if (Reset = '0') then
Q <= '0';
end if; 
end if;

end process;

end Behavioral;

 

باید یکبار دیگر مدار پیاده‌سازی‌شده در FPGA را درون نرم‌افزار ISE باز کنیم تا ببینیم با یک تغییر کوچک در کد، چه تغییری در سخت‌افزار به‌وجود آمده‌است!

به مدار زیر توجه‌کنید:

Reset in FPGA
Reset in FPGA

 

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

ریست فلیپ‌فلاپ‌های، FPGAهای شرکت Xilinx با مقدار ۱ منطقی عمل می‌کند(ریست می‌شود)، حال اگر شما سیگنال ریست را در شرطی با مقدار ۰ منطقی مقایسه‌کنید، یک گیت قبل از ریست FPGA قرارخواهد‌گرفت تا این عمل به‌درستی صورت بپذیرد.

آیا مورد ذکرشده می‌تواند باعث به‌وجود‌آمدن مشکل خاص یا حادی شود؟ برای پاسخ به این سوال ابتدا شما را با توضیحاتی آشنا‌خواهیم‌کرد در‌نهایت یک‌سری نتایج‌کلی در این رابطه ارائه‌خواهیم‌داد.

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

وقتی سیگنال ریست را با مقدار ۰ مقایسه می‌کنیم دقیقا همین اتفاق رخ می‌دهد، و یک گیت نات که خود یک مدار ترکیبی می‌باشد قبل‌از ورودی ریست فلیپ‌فلاپ قرار می‌گیرد که همین تغییر کوچک باعث کاهش سرعت مدار خواهد شد.

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

شاید با خودتان فکر‌کنید که مگر یک گیت نات تا چه‌اندازه می‌تواند سرعت مدار را کاهش‌دهد که تا این حد مته به خشخاش می‌گذاریم و می‌گوییم که از انجام این کارها باید به‌شدت اجتناب ورزید؟

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

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

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

به‌طور‌کلی رعایت‌کردن موارد ذکرشده ۳مورد زیر را نتیجه‌خواهد‌داد:

  • سرعت بالاتر
  • صرفه‌جویی در استفاده‌از منابع درونی FPGA
  • قابلیت اطمینان بیشتر و بهینه‌گی مدار

اگرچه مدارات ترکیبی جز جدایی‌ناپذیر و لاینفک یک مدار دیجیتال هستند، اما تا حد‌امکان باید از استفاده‌از این مدارات در یک طراحی دیجیتال اجتناب ورزید.

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

 

منبع:‌سیسوگ

مطلب قبلیقسمت پنجم: ورود به محیط PCB آلتیوم دیزاینر
مطلب بعدیپروژه راه‌اندازی سنسور دمای DS18b20 با NodeMcu

پاسخ دهید

لطفا نظر خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید