شیفت رجیستر (Shift Register) یک نوع مدار ترتیبی (Sequential Circuit) است که از مجموعهای از فلیپفلاپها تشکیل شده و میتواند دادههای دودویی (بیتها) را ذخیره و منتقل کند. عملکرد اصلی شیفت رجیستر، جابجایی (Shift) بیتهای داده به یک جهت مشخص (معمولاً به راست یا چپ) در هر پالس ساعت است. این جابجایی، امکان تبدیل دادههای سریال به موازی یا برعکس، و همچنین ایجاد تأخیر در سیگنالهای دیجیتال را فراهم میکند.
شیفت رجیسترها بر اساس نحوه ورود و خروج داده به چهار نوع اصلی تقسیم میشوند:
- Serial In, Serial Out (SISO): داده به صورت سریال وارد شده و به صورت سریال از خروجی خارج میشود.
- Serial In, Parallel Out (SIPO): داده به صورت سریال وارد شده و به صورت موازی از چندین خروجی خارج میشود.
- Parallel In, Serial Out (PISO): داده به صورت موازی وارد شده و به صورت سریال از خروجی خارج میشود.
- Parallel In, Parallel Out (PIPO): داده به صورت موازی وارد شده و به صورت موازی از خروجی خارج میشود.
در این بحث، تمرکز ما بر روی شیفت رجیستر SISO است.
شیفت رجیستر SISO: مفهوم و کاربردها
یک شیفت رجیستر Serial In, Serial Out (SISO) وظیفه دریافت بیتهای داده به صورت متوالی (یک بیت در هر پالس ساعت) و سپس خروج همان بیتها را به صورت متوالی (همچنان یک بیت در هر پالس ساعت) بر عهده دارد. در واقع، SISO یک خط تأخیر دیجیتال ایجاد میکند؛ اگر یک رجیستر N بیتی باشد، بیت ورودی پس از N پالس ساعت در خروجی ظاهر خواهد شد.
کاربردهای اصلی شیفت رجیسترهای SISO عبارتند از:
- ایجاد تأخیر (Delay Line): تأخیر دادن به سیگنالهای دیجیتال برای همگامسازی یا پردازش.
- بافرینگ سریال: ذخیرهسازی موقت دادههای سریال.
- مولدهای شبه تصادفی (Pseudo-Random Sequence Generators): با استفاده از فیدبک.
- ساخت شیفت رجیسترهای بزرگتر: با ترکیب چندین شیفت رجیستر کوچکتر.
اجزای اصلی یک شیفت رجیستر SISO، فلیپفلاپهای نوع D (D-Flip-Flops) هستند که به صورت آبشاری به هم متصل شدهاند.
اصول عملکرد شیفت رجیستر SISO
یک شیفت رجیستر SISO، به تعداد بیتهایی که قرار است ذخیره و منتقل کند، از فلیپفلاپهای نوع D تشکیل شده است. به عنوان مثال، یک شیفت رجیستر 4 بیتی SISO از چهار فلیپفلاپ D تشکیل شده است.
تصور کنید یک شیفت رجیستر 4 بیتی SISO داریم. ورودی سریال (Serial In یا Din) به ورودی D اولین فلیپفلاپ متصل میشود. خروجی Q اولین فلیپفلاپ به ورودی D فلیپفلاپ دوم، خروجی Q دومین فلیپفلاپ به ورودی D فلیپفلاپ سوم، و به همین ترتیب ادامه مییابد. خروجی Q آخرین فلیپفلاپ، خروجی سریال (Serial Out یا Dout) رجیستر خواهد بود. تمام فلیپفلاپها به یک سیگنال کلاک مشترک (CLK) متصل هستند.
مراحل عملکرد:
- لبه فعال کلاک (Active Clock Edge): هرگاه یک لبه فعال سیگنال کلاک (معمولاً لبه بالارونده) اتفاق میافتد:
- بیت موجود در ورودی
Dinدر فلیپفلاپ اول ذخیره میشود. - محتوای فلیپفلاپ اول به فلیپفلاپ دوم منتقل میشود.
- محتوای فلیپفلاپ دوم به فلیپفلاپ سوم منتقل میشود.
- … و همینطور تا آخرین فلیپفلاپ.
- محتوای آخرین فلیپفلاپ از طریق
Doutبه عنوان خروجی سریال ظاهر میشود.
این فرآیند به این معنی است که هر بیت ورودی، در هر سیکل ساعت، یک جایگاه به سمت خروجی حرکت میکند. اگر یک شیفت رجیستر N بیتی باشد، یک بیت داده ورودی دقیقاً N پالس ساعت طول میکشد تا از ورودی Din وارد شده و از خروجی Dout خارج شود.
پیادهسازی SISO در FPGA
طراحی شیفت رجیستر SISO در FPGA بسیار کارآمد و متداول است. FPGAها به طور طبیعی از تعداد زیادی فلیپفلاپ (که بخشی از Slice یا CLB هستند) تشکیل شدهاند و برای پیادهسازی مدارهای ترتیبی مانند شیفت رجیسترها بهینه شدهاند.
هنگام پیادهسازی یک شیفت رجیستر SISO در FPGA با استفاده از زبانهای توصیف سختافزار (مانند VHDL یا Verilog)، شما به صورت مستقیم فلیپفلاپها را “قرار نمیدهید”. در عوض، شما رفتار مورد انتظار مدار را توصیف میکنید. ابزارهای سنتز (Synthesis Tools) FPGA این توصیف رفتاری را به ساختارهای سختافزاری واقعی در FPGA نگاشت میکنند.
نحوه توصیف (Conceptual Description):
برای یک شیفت رجیستر N بیتی SISO، میتوانید تصور کنید که یک آرایه از فلیپفلاپها یا یک رجیستر N بیتی دارید. در هر لبه فعال کلاک:
- بیت ورودی جدید به موقعیت اول (یا آخر، بسته به جهت شیفت) رجیستر وارد میشود.
- تمام بیتهای موجود در رجیستر یک موقعیت به سمت خروجی شیفت داده میشوند.
- بیت در موقعیت خروجی، به عنوان خروجی سریال ظاهر میشود.
مثال مفهومی (بدون کد مستقیم):
فرض کنید میخواهیم یک شیفت رجیستر 8 بیتی SISO ایجاد کنیم. ما یک سیگنال 8 بیتی داخلی تعریف میکنیم که به عنوان فضای ذخیرهسازی شیفت رجیستر عمل میکند (مثلاً shift_reg). در هر لبه کلاک:
shift_reg[7] مقدار shift_reg[6] را میگیرد.
shift_reg[6] مقدار shift_reg[5] را میگیرد.
…
shift_reg[1] مقدار shift_reg[0] را میگیرد.
shift_reg[0] مقدار Din (ورودی سریال) را میگیرد.
و Dout (خروجی سریال) برابر با shift_reg[7] (یا shift_reg[0]، بسته به جهت شیفت) خواهد بود.
ابزارهای سنتز FPGA، این توصیف را به مجموعهای از فلیپفلاپهای D واقعی در FPGA نگاشت میکنند که به صورت متوالی به یکدیگر متصل شدهاند و توسط سیگنال کلاک مشترک کنترل میشوند. این فرآیند بسیار بهینه است و از منابع سختافزاری FPGA (مانند فلیپفلاپهای رجیستر) به بهترین شکل استفاده میکند.
کلیدواژه ها : طراحی شیفت رجیستر-شیفت رجیستر SISO-Serial In Serial Out-FPGA Design-Shift Register-D Flip-Flop-Sequential Circuit-Clocked Logic-Data Shifting-FPGA Implementation-VHDL-Verilog-SISO-Shift Register Design-FPGA Registers-Hardware Description Language-سنتز FPGA-فلیپفلاپ D-مدار ترتیبی-جابجایی داده-رجیستر شیفتی