در قسمت هفدهم از آموزش FPGA با رجیسترها آشنا شدیم و از کاربردهای رجیسترها گفتیم، نهایتا هم با استفاده از زبان VHDL یک رجیستر را به صورت Generic توصیف کردیم، که شما میتوانستید تنها با تغییر یک عدد عرض بیت رجیستر خود را تغییردهید.
در قسمت گذشته ما از کنار هم قرار دادن فلیپفلاپها توانستیم رجیسترها را بسازیم، در این قسمت نیز قصد داریم همان فلیپفلاپها را کنار هم قرار دهیم و شیفت رجیسترها را بسازیم. اینکه فلیپفلاپها به چه نحوی کنار همدیگر قرار بگیرند، میتوانند تشکیل رجیستر یا شیفت رجیستر بدهند. با تعریف رجیستر و اینکه چگونه ساخته میشود از قبل آشنا هستید، برای تعریف و آشنایی هرچه بیستر با شیفت رجیسترها به ادامه توضیحات با دقت توجه کنید.
شیفت رجیستر
پس هم رجیسترها و هم شیفت رجیسترها، زنجیرهای از فلیپفلاپها هستند که کنار هم قرار گرفتهاند. حال اینکه این فلیپفلاپها به چه نحوی کنار همدیگر قرار بگیرند، میتوانند تشکیل رجیستر یا شیفت رجیستر را بدهند.
اگر با FPGA آشنایی ندارید اول مقاله FPGA چیست؟ را مطالعه نمایید.
نحوهی عملکرد شیفت رجیسترها
اگر یک شیفت رجیستر را آرایهای از بیتهای پشت سرهم در نظر بگیریم، به سه روش عمل شیفت میتواند انجام بگیرد، در مورد دو روش اول در این قسمت، و در مورد سومین روش در قسمتهای بعدی صحبت خواهیم کرد.
شیفت به راست
در این نوع از شیفت رجیسترها با هر کلاک، بیتی که در ورودی سمت چپ شیفت رجیستر قرار دارد، به داخل شیفت رجیستر وارد میشود. از سوی دیگر، آخرین بیت از سمت راست از شیفت رجیستر خارج خواهد شد یا بهتر است بگوییم که از بین خواهد رفت.
شیفت به چپ
در این نوع از شیفت رجیسترها با هر کلاک، بیتی که در ورودی سمت راست شیفت رجیستر قرار دارد، به داخل شیفت رجیستر وارد میشود. از سوی دیگر، آخرین بیت از سمت چپ از شیفت رجیستر خارج خواهد شد یا بهتر است بگوییم که از بین خواهد رفت.
انواع شیفت رجیسترها
ورودی سریال-خروجی سریال (SISO)
در این نوع از شیفت رجیسترها، دیتای ورودی به صورت سریال وارد شیفترجیستر میشود، یعنی با هر کلاک تنها یک بیت وارد شیفترجیستر خواهد شد. از سوی دیگر در خروجی در هر کلاک تنها یک بیت در دسترس خواهد بود. اینکه کدام بیت در دسترس باشد بستگی به این دارد که شیفترجیستر ما شیفت به راست میدهد یا شیفت به چپ.
ورودی سریال-خروجی موازی (SIPO)
در این نوع از شیفت رجیسترها، دیتای ورودی به صورت سریال وارد شیفترجیستر میشود، اما در خروجی تنها در یک کلاک میتوانیم به تمامی بیتها دسترسی داشته باشیم.
ورودی موازی-خروجی موازی (PIPO)
در این نوع از شیفت رجیسترها تنها در یک کلاک میتوان تمامی بیتهای شیفترجیستر را مقدار دهی کرد، در خروجی نیز میتوانیم تنها در یک کلاک به تمامی بیتها دسترسی داشته باشیم.
ورودی موازی-خروجی سریال (PISO)
در این نوع از شیفت رجیسترها تنها در یک کلاک میتوان تمامی بیتها را مقدار دهی کرد، اما در خروجی با هر کلاک تنها به یک بیت دسترسی خواهیم داشت.
برای اینکه این تعاریف را به خوبی درک کنید و از نحوهی عملکرد این نوع شیفت رجیسترها به خوبی آگاه شوید به تصویر زیر به خوبی توجه کنید.
همچنین میتوانید گیف زیر را که از این لینک دانلود شده است نیز مشاهده کنید.
در ادامه میخواهیم یک نوع از این شیفت رجیسترها را با استفاده از زبان 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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Shift_Register is Port ( Input : in STD_LOGIC; Clock : in STD_LOGIC; Output : out unsigned (7 downto 0) ); end Shift_Register; architecture Behavioral of Shift_Register is signal Middle : unsigned (7 downto 0) := (others =>'0'); begin Output <= Middle; process(clock) begin if rising_edge(clock) then Middle(7) <= Input; Middle(6) <= Middle(7); Middle(5) <= Middle(6); Middle(4) <= Middle(5); Middle(3) <= Middle(4); Middle(2) <= Middle(3); Middle(1) <= Middle(2); Middle(0) <= Middle(1); end if; end process; end Behavioral; |
اگر به جزئیات کد توجه کنید متوجه خواهید شد که شیفت رجیستر توصیف شده از نوع SIPO میباشد و همچنین شیفت به راست انجام میدهد.
با تغییرات کوچکی میخواهیم همین نوع شیفت رجیستر را این بار با شیفت به چپ پیادهسازی کنیم.
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 | library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Shift_Register is Port ( Input : in STD_LOGIC; Clock : in STD_LOGIC; Output : out unsigned (7 downto 0) ); end Shift_Register; architecture Behavioral of Shift_Register is signal Middle : unsigned (7 downto 0) := (others =>'0'); begin Output <= Middle; process(clock) begin if rising_edge(clock) then Middle(0) <= Input; Middle(1) <= Middle(0); Middle(2) <= Middle(1); Middle(3) <= Middle(2); Middle(4) <= Middle(3); Middle(5) <= Middle(4); Middle(6) <= Middle(5); Middle(7) <= Middle(6); end if; end process; end Behavioral; |
اکنون سوالی که شاید برایتان پیش بیاید این است که اگر بخواهیم عرض شیفترجیستر را افزایش بدهیم، باید با همین سختی پشت سرهم یک بیت را به بیت دیگر ارجاع بدهیم؟ خیر، راهحلهای سادهتری نیز وجود دارد که ما در قسمتهای بعدی این راهحلها را توضیح خواهیم داد، پس با ما همراه باشید.
سلام
آموزش هاتون خیلی آسونه.اگه ممکنه، یه کم پیشرفته تر کنید. در ضمن چند تا پروژه واقعی هم قرار بدین. تا کاربردی تر باشه
سلام. نمیدونم از کجا میگید آسون؟ یعنی شما همهی این موارد را بلد هستید؟
چون مورد داشتیم باهامون تماس گرفتن گفتن که آموزش هاتون خیلی پایهای هستن و و از بیس دارید اموزش میدید و چیزهایی ازشون یاد گرفتم. حالا این آقایی که این حرفو زده خودش تو یه شرکت مشغول کار fpga هستش و حتی پروژه های بیرون را هم انجام میده.
حالا در نظر بگیرید کسی که برای اولین بار اسم fpga به گوشش خورده باید چقدر از اینا را بلد باشه. ما اتفاقا این اموزش را بر مبنای این تولیذ کردیم برای اینکه افرادی که هیچی از این موجود نمیدونن هم بتونن راه بیفتن
به نظر خودم که مطالب پایهای هستن و نه آسون.
پروژه هم تو سایت چندتایی موجود هست سرچ کنید.
تازه با همین مطالب شما اگه خوب خونده باشید باید بتونید پروژه هایی مثل پروتکل سریال و امثالهم را از صفر خودتون بنویسید.
سلام
این آموزش هجدهم شما بود که شما بابتش زحمت کشیده بودید و از شما ممنونم. شما 20 آموزش قرار دادین و تا اینجا مخاطب ها، باید کامل آشنا شده باشن. اما تا اینجا مخاطب هنوز نمیتونه یه پروژه واقعی رو انجام بده.
به نظرم اگه آموزش ها کم کم پیشرفته تر و کاربردی تر بشه، خیلی بهتر میشه.
تا اینجا مطالب تون خوب بود و ازش استفاده کردم اما به نظرم نیاز به آموزش های کاربردی هست. شما که تا اینجا زحمت کشیدید. اگه ممکنه چند آموزش کاربردی هم قرار بدین.
من با میکرو زیاد کارکردم اما با fpga کار عملی نکردم.
سلام شاید چون زیاد باهاش کار نکردید متوجه نیستید که این موارد چقدر کاربردی هستند. یه پیشنهاد دارم براتون شما از همین امروز شروع کنید و با دقت هرچه تمام این بیست قسمت را بخوانید و بعد از آن سعی کنید که یک پروژه که به نظر خودتان واقعی و کاربردی هست را انجام بدهید ببینید همین بیست قسمت چقدر تو این پروژه به کارتون میاد. در واقع کل پروژه شما با همین چیزا پیادهسازی میشه و البته خلاقیت شما.
مثلا میتونید یک اینترفیس را انتخاب کنید یا پردازش یک سیگنال ساده ولی خب در ابتدای کار پردازش سیگنال را پیشنهاد نمیکنم چون باید کلا تکنیک های که مربوط به تئوری سیگنال ها و سیستم اعداد است را بدانید.
بیایید مثلا یک پروتکل مثل RS232 را انتخاب کنید و شروع به پیاده سازی کنید هر سوالی هم داشتید همینجا بپرسید من در خدمت شما هستم.
یکی از مواردی که فکر میکنم خیلی کاربردی باشه Delay هست.
برای درست کردن delay چی کار باید کرد؟
در مورد همون RS232 که فرمودید، برای دریافت هر بیت، باید یک تاخیر زمانی مشخص داشته باشیم. مخصوصا زمانی که ارتباط آسنکرون باشه.
خب برای این کار شما نیاز به یک تایمر دارید و تایمر هم چیزی نیست به جز کانتری که شما تیون میکنید. کانتر را نیز در همین مجموعه آموزشی گفتیم.
سلام
میشه در مورد قیدها و روش های بالا بردن سرعت عملکرد برنامه مون، هم توضیح بدید.
اگه میشه یه مثال هم بیارید.
ممنون.
سلام.
الان هاردوری دیزاین کردید که سرعتش از سرعت مورد انتظارتون کمتر؟ و نیاز دارید با استفاده از قیود یا روشهای دیگر سرعتش را افزایش دهید؟
سلام چرا نوشتههای شما قابلیت دانلود به صورت پی دی اف نداره؟
واقعا چه کاربردی میتونه داشته باشه
چون کاربردی براش متصور نبودیم به گذاشتنش هم فکر نکردیم
واقعا چه کاربردی میتونه داشته باشه ؟
ممنون از نظرتون
یکی از کاربردهاش اینه که اون متن هایی که لازم دارم رو به صورت آفلاین داشته باشم و بتونم راحت جابجا کنم. یک قابلیت دیگه پرینت گرفتن آسان هست.
اوهوم – اجازه بدید بررسی کنیم ببینیم از نظر فنی چقدر تغییر لازمه که اظافه کنیم این قابلیت رو
سلام دوست عزیز، از آموزش های خوبتون سپاس گذارم. می خواستم بدونم هر چند وقت یکبار آموزش مربوط به قسمت جدید رو قرار میدید؟
سلام علیرضا جان. قبلا هفتهای یا دو هفتهای یکبار بود، الان کمی بیشتر طول خواهد کشید.