ساختار ارجاع شرطی;
در قسمت پنجم از آموزش FPGA یاد گرفتیم که چگونه میتوان یک ماژول را به ماژول دیگر اضافه کرد، و در نهایت توانستیم یک تمام جمعکنندهی چهار بیتی را با استفاده از این الگو، و چهار بار اضافه کردن یک ماژول، به ماژول اصلی پیادهسازی کنیم.
در این قسمت قصد داریم به شما آموزش بدهیم که چگونه وقتی با استفاده از کد، یک مدار را در زبان VHDL توصیف کردیم، از صحت عملکرد آن مطمئن باشیم. شاید راههای مختلفی برای انجام این کار به ذهنتان برسد اما دمدستترین راه و همچنین آسانترین راه، شبیهسازی مدار میباشد. شاید بهتر باشد برای اطمینان کامل از صحت مدار، کد نوشته شده را در FPGA پروگرام کنیم و در عمل نتیجه را مشاهده کنیم، اما اگر یک سری اصول را در شبیهسازی رعایت کنیم در اکثر اوقات نتیجهها، هم در شبیهسازی و هم در عمل یکسان خواهد بود. این موضوع فقط مختص به FPGA نمیباشد و در هر جای دیگری این موضوع برقرار میباشد. پس به حرف افرادی که میگویند شبیهسازی عملا بی فایده است و کارایی لازم را ندارد، توجهای نکنید، چون به احتمال زیاد این افراد اصول شبیهسازی را به درستی انجام نمیدهند و به شما نیز توصیه میکنند که از انجام این کار پرهیز کنید.
در این قسمت ما قصد داریم یک ALU را با استفاده از ساختار ارجاع شرطی زبان VHDL توصیف و سپس آموزش دهیم که چگونه این مدار را شبیهسازی کنیم.
شاید برخی از اصطلاحاتی که در بالا به کار بردیم برایتان ناآشنا باشد، نگران نباشید، در ادامه به طور مفصل در مورد هرکدام از این اصطلاحات صحبت خواهیم کرد.
ALU چیست؟
ALU یک مدار دیجیتال میباشد که میتواند عملیات جبری و منطقی را روی ورودیهای n بیتی محاسبه کند و نتیجه را در خروجی برگرداند. در بازار تراشههای مختلفی برای انجام این کار وجود دارند، اما ما نمیخواهیم از این تراشهها استفاده کنیم، بلکه قصد داریم عملکرد یکی از این تراشهها را با استفاده از کد VHDL توصیف کنیم و در نهایت کد موردنظر را شبیهسازی کنیم تا از عملکرد صحیح مدار توصیف شده، مطمئن شویم.
در اینگونه تراشهها معمولا دو ورودی و یک خروجی وجود دارد. و همچنین ورودی دیگری برای اینکه چه عملیاتی روی دو ورودی که در ابتدا بیان کردیم صورت بگیرد نیز وجود دارد.
در زیر، جدولی را مشاهده میکنید که بیان میکند با توجه به ارزش ورودی 3 بیتی S، چه عملیاتی روی دو ورودی A و B صورت بگیرد.
ما قصد داریم عملیات جدول بالا را مرحله به مرحله روی دو ورودی 4 بیتی اعمال کرده و سپس نتیجه این عملیات را به یک خروجی 4 بیتی ارجاع دهیم و نتیجه را مشاهده کنیم.
اما قبل از انجام این کار، نیاز است که با موضوع جدیدی به اسم ساختار ارجاع شرطی در زبان VHDL آشنا شویم.
ساختار ارجاع شرطی
همانطور که از اسم این ساختار مشخص است، زمانی از این ساختار استفاده میشود که نیاز باشد یک سری کارها با توجه به شروط خاصی انجام بگیرد. از ویژگیهای خوب این ساختار میتوان به اولویتدار بودن شرطها اشاره کرد، که اتفاقا در بعضی از مدارات دیجیتال، که قرار است کارها با اولویت خاصی انجام بگیرند، این ساختار میتواند مفید باشد.
در ادامه کدی خواهیم نوشت که شما با توجه به این کد، میتوانید با الگوی ساختار ارجاع شرطی آشنا شوید.
ابتدا یک فایل برای توصیف کد ALU ایجاد میکنیم، که در زیر میتوانید این کد را مشاهده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity ALU is Port ( A : in signed (3 downto 0); B : in signed (3 downto 0); S : in unsigned (2 downto 0); F : out signed (3 downto 0) ); end ALU; architecture Behavioral of ALU is signal B_A : signed (3 downto 0) := (others=>'0'); signal A_B : signed (3 downto 0) := (others=>'0'); signal AADDB : signed (3 downto 0) := (others=>'0'); signal AXORB : signed (3 downto 0) := (others=>'0'); signal AORB : signed (3 downto 0) := (others=>'0'); signal AANDB : signed (3 downto 0) := (others=>'0'); begin B_A <= B - A; A_B <= A - B; AADDB <= A + B; AXORB <= A xor B; AORB <= A or B; AANDB <= A and B; F <= "0000" when s="000" else B_A when s="100" else A_B when s="010" else AADDB when s="110" else AXORB when s="001" else AORB when s="101" else AANDB when s="011" else "1111"; end Behavioral; |
در ابتدا سه پورت A, B, F همه را به صورت چهار بیتی و از نوع علامتدار و همچنین پورت S را به صورت سه بیتی و از نوع بدون علامت تعریف میکنیم. سوالی که ممکن است برایتان پیش بیایید، این است که چه موقع پورتها را علامتدار و چه موقع بدون علامت تعریف میکنیم؟ توجه کنید از این به بعد پورتها یا سیگنالهایی که قرار است محاسبات ریاضی روی آنها صورت گیرد را از نوع علامتدار، و پورتها یا سیگنالهایی که قرار نیست محاسبات ریاضی روی آنها صورت گیرد و صرفا از آنها به عنوان شمارنده یا مشخص کردن حالتهای مختلف کاری، شبیه کاری که ما در این پروژه انجام دادیم استفاده میکنیم، را از نوع بدون علامت تعریف میکنیم.
قبل از begin مربوط به architecture سیگنالهای علامتداری برای انجام عملیات مختلفی که در جدول بالا مشاهده کردید تعریف میکنیم.
تا اینجای کد فقط پورتها و سیگنالهایی را تعریف کردیم که قرار است در کد موردنظر از آنها استفاده کنیم، و عملا تا اینجا ما هیچ تعریف یا توصیفی از ALU ارائه ندادیم. کل کد مربوط به توصیف ALU، بعد از begin مربوط به architecture میباشد که ساختار ارجاع شرطی نیز به طور کاملا واضحی در این کد مشهود میباشد.
حال زمان آن رسیده است که از عملکرد کد مربوطه مطمئن شویم، برای این کار باید یک فایل جداگانه برای شبیهسازی ایجاد کنیم، که به فایل Test Bench معروف است. برای ساختن این فایل در قسمت Hierarchy راست کلیک کرده و گزینه New Source را انتخاب میکنیم. پنجرهای که باز خواهد شد برای شما جدید نمیباشد، چون قبلا ما در همین پنجره یک فایل VHDL Module ایجاد کردیم. اما اکنون قصد داریم با نوعی فایل جدید به اسم VHDL Test Bench آشنا شویم که از این فایل برای شبیهسازی استفاده میکنیم.
شبیه تصویر بالا حواستان باشد گزینهی VHDL Test Bench را انتخاب کرده باشید، چون در غیر اینصورت ممکن است فایلی با نوعی دیگر برایتان ایجاد گردد.
پس از طی مراحل بالا، فایل Test Bench برای شما ساخته خواهد شد، اما شما این فایل را مشاهده نمیکنید!
برای رفع این مشکل همانند تصویر بالا، در بالای قسمت Hierarchy، گزینه View را روی حالت Simulation قرار دهید. سپس با دو بار کلیک کردن روی فایل ALU_tb، این فایل برایتان باز خواهد شد.
در این فایل به صورت پیشفرض نوع پورتها و سیگنالها از نوع std_logic_vector تعریف شده است. شما با توجه به فایل اصلی پروژه میتوانید نوع آنها را تغییر دهید. همچنین به صورت پیشفرض قسمتهایی برای کلاک در نظر گرفته شده است، اما چون مدار توصیف شده ما از نوع ترکیبی میباشد باید قسمتهای مربوط به کلاک را در کد حذف کنیم.
شما اگر قصد دارید این پروژه را خودتان انجام دهید و مرحله به مرحله پیش بروید فایل Test Bench مورد نظر را مانند کدی که در زیر خواهیم آورد ویرایش کنید.
قاعدتا برای اینکه شبیهسازی انجام شود، بایستی یک سری ورودی به مدار اعمال شود. برای این کار مانند کد زیر در قسمت insert stimulus here مقادیری را به پورتهای ورودی اعمال خواهیم کرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; ENTITY ALU_tb IS END ALU_tb; ARCHITECTURE behavior OF ALU_tb IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT ALU PORT( A : IN signed (3 downto 0); B : IN signed (3 downto 0); S : IN unsigned (2 downto 0); F : OUT signed (3 downto 0) ); END COMPONENT; --Inputs signal A : signed (3 downto 0) := (others => '0'); signal B : signed (3 downto 0) := (others => '0'); signal S : unsigned (2 downto 0) := (others => '0'); --Outputs signal F : signed (3 downto 0); -- No clocks detected in port list. Replace <clock> below with -- appropriate port name BEGIN -- Instantiate the Unit Under Test (UUT) uut: ALU PORT MAP ( A => A, B => B, S => S, F => F ); -- Clock process definitions -- Stimulus process stim_proc: process begin -- hold reset state for 100 ns. wait for 100 ns; -- insert stimulus here A <= "0011"; B <= "0100"; S <= "110"; wait; end process; END; |
اگر به کد بالا دقت کنید ما مقدار”0011″ به منزلهی 3 دهدهی را به ورودی A و مقدار “0100” به منزلهی 4 دهدهی را به ورودی B، و همچنین مقدار “110” را به ورودی S اعمال کردیم که با این مقدار، طبق جدول بالا، باید حالت A Plus B فعال شود و ارزش عددی A و B با همدیگر جمع شده و در خروجی F نمایش داده شود. پس ما باید در شبیهسازی مقدار “0111” یا همان 7 دهدهی را در خروجی مشاهده کنیم.
حال برای مشاهدهی نتایج شبیهسازی باید ابتدا فایل ALU_tb را انتخاب کرده و سپس مانند تصویر زیر، در قسمت Processes، با دو بار کلیک کردن روی گزینه Simulate Behavioral Model محیط شبیهسازی یا همان نرمافزار ISim باز خواهد شد.
کمی طول میکشد تا نرمافزار ISim باز شود. پس از اینکه نرمافزار باز شد، به طور خودکار به مدت یک میکرو ثانیه شبیهسازی انجام میشود.
خب همانطور که در تصویر بالا مشاهده میکنید مقدار خروجی “0111” میباشد، و برابر با مقدار مورد انتظار است. شاید شما بخواهید این اعداد را به صورت دهدهی نیز مشاهده نمائید، بدین منظور همهی ورودی-خروجیها را انتخاب کرده و سپس با راست کلیک کردن بر روی آنها از گزینه Radix حالت Signed Decimal را انتخاب نمائید.
شما میتوانید در پروژههای مختلف، مدارتان را طبق اصولی که در بالا بیان کردیم، از لحاظ رفتاری شبیهسازی کنید و از صحت عملکرد مدار خود مطمئن شوید.
در قسمت هفتم با ساختار ارجاع انتخابی آشنا خواهیم شد، و همچنین به مقایسه این ساختار با ساختار ارجاع شرطی میپردازیم. پس با سیسوگ همراه باشید.
سلام آقای کامین جلیلی
من متعجبم بعضی از دوستان یک طرفه پیش قاضی می روند اگر قرار باشد کسی از این کد ها استفاده نکند دیگران هم حق ندارند از سیستم عامل ویندوز و حتی جزوات دوران مدرسه استفاده کنند. این همه ریاکاری جای تعجب دارد
سلام دوست عزیز. حقیقتا این نوع تفکر بسته برای من هم کمی آزاردهنده است. شما فکر کنید شرکتی مثل گوگل اومده کتابخانه TensorFlow با اون همه عظمت رو در اختیار همگان قرار داده، بعد در سرزمین پارس افرادی هستند که به خاطر گفتن اینکه چجوری ای دی میکرو رو بخونیم دارن از ملت پول میگیرن یا اینکه شرکتا حاضر نیستن کدهای شرکت که در ابعاد کلان واقعا مسخره به نظر میان رو حتی در اختیار کارمندای خودشون که براشون زحمت میکشن قرار بدن. خلاصه بدجایی گیر افتادیم.
از کتابخانه TensorFlow گفتم به این نکته هم اشاره کنم که با فراگیر شدن هوش مصنوعی به احتمال زیاد مفهومی به اسم کپی اصلا وجود نخواهد داشت حتی در حوزه هنر و موسیقی. فکر کنید همه نتها، ترکیبها همه و همه و هر چیزی که فکر کنید با هوش مصنوعی تولید خواهد شد و هیچ انحصاری دیگه وجود نخواهد داشت.
سلام. چی شد بالاخره نتیجه مذاکرات با اقای ثقفی؟! واسه این میپرسم که مطمئن باشم ایشون راضی هستن. چون ایشون همین الان دارن از همین کلاس درامدزایی میکنن. ممنون میشم خبرشو بدید
سلام دوست عزیز
بله با ایشون هماهنگ شده و مشلی نیست میتونید از خود ایشون هم استعلام کنید 🙂
و لازم اضافه کنم ای کاش این میزان حساسیت رو هم در استفاده از نرم افزارهای دزدی و قفل شکسته داشتیم !
درود. طبق صحبتهای حضوری با استاد ثقفی قرار بر این شد که لینک دورشون را اینجا قرار بدیم که بقیه دوستان برای آموزشهای بیشتر اگه مایل بودن به اون دوره مراجعه کنن اما خب چون دوره ایشون دیگه حضوری برگزار نمیشه قرار شد لینک انلاینش برامون فرستاده بشه که هنوز بنا به دلایلی که گفتنش به شما از وظایف ما خارج است، فرستاده نشده. و ما هم از اینکه لینک یک دورهای که مورد تایید ما است را در سایت قرار بدیم هیچ ابایی نداریم. برای صحت این پیام میتونید از سایت فراداندیش اقدام کنید. در کل روحیه مطالبهگریتون را هم بسیار میپسندم دوست نازنینم.
سلام وتشکر از مطالب خوبتون
درود. سپاس از نظر مثبت شما.
با سلام
تشکر از مطالبی که در موردFPGA گذاشتید
سلام مسعود عزیز. خوشحالیم از اینکه این مطالب برای شما مفید واقع شده است.
سلام
ترجیحا این مطالب را از روی سایت دیگه کپی نکنید. اگرم میکنید، لینک بکنید.
دوست عزیز ممنون میشم مستند بفرمائید از کدوم سایت کپی شده تا همین الان منبعش قرار بگیره و از این که مجدد این اتفاق بیفته جلوگیری بشه؟
سلام،
متاسفانه شما عین مطالب دوره FPGA استاد ثقفی از آموزشگاه فراد اندیش رو با همون ترتیب و با اعتماد به نفسی بیشتر از مهندس ثقفی منتشر می کنید و حتی اشاره ای هم به این موضوع نمی کنید.
من در کلاس حضوری ایشون شرکت کردم و شما حتی کدها و مثال ها رو هم عوض نکردید و عینا تمام نکات کلاس رو به نام خودتون منتشر می کنید. این واقعا جای تاسف داره.
سلام دوست نازنینم
بله بنده قبلا شاگرد استاد ثقفی بود و FPGA را به صورت اصولی از ایشون یاد گرفتم و این یادگیری را هم مدیون ایشون هستم و صد البته به طبع همین مورد سبک کدنویسیم هم به این شیوست، مثلا همیشه پورتهای ورودی-خروجی را signed یا unsigned تعریف میکنم و …
چون موضوعش مطرح نشده بود عنوان نشده بود و با افتخار هم این مورد را اظهار میکنم
در مورد کدها هم لازمه بگم در کتابهای مرجع خیلی از این کدها یکسان هم هستند مثلا به کتاب پدرونی مراجعه کنید تا دقیقا همین کد ALU را ببینید و بنده موقع نگارش هم سعی کردم به خیلی از این کتابهای مرجع رجوع کنم
بازم ممنون بابت اظهار نظرتون امیدوارم پاسخ خودتون را گرفته باشید
سلام،
من هم شاگرد استاد ثقفی بودم و در کلاس ایشون شرکت کردم و همان فایل های صوتی کلاس را که شما به آن دسترسی دارید من هم دارم و بارها و بارها گوش دادم طوری که ملکه ذهنم شده.
منظور من از کامنت قبلی فقط کد ALU و حتی فقط این مقاله نبود. من تمام مقالات شما در مورد FPGA را دیدم. ترتیبت ارائه مطالب و مثال ها و حتی تیکه کلام های استاد هم در مقالات شما استفاده شده.
برای من واضح است که شما همان فایل های صوتی را مرجع کرده اید.
دلیل اینکه این کامنت را می نویسم این است که خودم را مدیون استاد ثقفی می دانم و طبق گفته خودشان که مطمئنم به شما هم گفتند میدانم که ایشان راضی به انتشار این مطالب به این صورت نیستند. شما ظریف ترین نکات کلاس ایشان را با افتخار به نام خودتان در این مقالات منتشر می کنید و حتی اشاره ای هم به منبع نمی کنید. گرچه اگر اشاره هم بکنید باز این بسیار کار نادرستیی است.
دوست عزیز ادوات پایه دیجیتال کد توصیفیشان تقریبا در همهی کتابها به یک گونه است و صورت دیگری ندارد شما برای توصیف رجیستر به جز اینکه در محیطی ترتیبی ارجاع را بنویسید راه دیگری ندارید. اگر شما راه دیگری سراغ دارید همینجا بفرمائید تا ما هم یاد بگیریم. ترتیب هم به این صورت است که اول مدارات ترکیبی سپس مدارات ترتیبی. اگر شما بتوانید کدهایی که ما در اینجا نوشتیم بیاورید که در کتابهای مرجع نباشد خوشحال خواهیم شد.
در ضمن ایشان راضی به این نیستند که شما دقیقا محتوای تولیدی توسط خودشان را به دیگران بدهید یا نشر دهید. به قول خودشان که میگفتند شما مجاز هستید که از دانشی که اینجا یاد میگیرید هم در پروژههایتان استفاده کنید و هم به دیگران آموزش بدهید، چون اگر حق استفاده نداشته باشی پس چرا پول میدهیم و یاد میگیریم.
پروفسور بهزاد رضوی اگه کتاباشو بخونی حس میکنی که سر کلاس دکتر شریف بختیار از دانشگاه شریف نشستی به این دلیل که بهزاد رضوی شاگرد ایشون بودن و بعدها سبکش شبیه ایشون شد و کتاباش را به این صورت نوشت و بقیه هم اتفاقا این انتقاد را بهش میکنن که به نظر من منطقی شاید نباشه. من هم شاگرد استاد ثقفی بودم و سبکش را چون دوست داشتم و اصولی بود انتخاب کردم و قصد تغییرش را نیز ندارم.
در نهایت بنده استاد ثقفی را کسی میدانم که FPGA را به ایران معرفی کرد و با افتخار شاگرد ایشان بودم و هستم.
متاسفانه عمده پاسخ شما سفسطه است. من بیش از این بحث را ادامه نمی دهم چون نفع و ضرری برای من ندارد و فقط به خاطر حضور در کلاس استاد ثقفی و دینی که به ایشان احساس می کردم این مطالب را نوشتم. شما خودتان منصفانه فکر کنید و ببینید آیا انتشار جزء به جزء مطالب یک کلاس خصوصی به سبک خود استاد کار درستی است یا نه.
دوست عزیز انتقاد شما کاملا به جا و منطقی هست و اتفاقا دوست دیگه ای هم چنین انتقادی را داشتند
پیرو این انتقاد و اینکه نویسنده این مطالب نیز از شاگردان جناب مهندس ثقفی هستند با ایشون مرتبط شدند و در مورد این مطالب صحبت کردند که ایشون از اینکه یکی از شاگرداش تونست این مطالب را تا این حد عمیق یاد بگیرند و یاد بدهند خوشحال بود، اما بحث نحوه ارائه و سایر موارد انشاله برای اینکه این قضیه برای همه واضح تر بشه با ایشان مفصلا صحبت میشود و در صفحه اصلی این آموزشها این مورد بصورت واضح اورده خواهد شد.
با توجه به این که امکان داره این موضوع برای برخی دوستان دیگه هم شائبه ایجاد کنه این مورد و نظر آقای مهندس ثقفی در صفحه اول اموزش FPGA منعکس خواهد شد و ما هم خوشحال میشیم و با افتخار هم خواهیم نوشت که این آموزشها خروجی یکی از شاگردهای استاد ثقفی بوده است.
بازم ممنون از نظر شما