طراحی ماشین حساب ساده با استفاده از FPGA و زبان Verilog

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

یادم هست که آن زمان استفاده از FPGA در سال های ابتدایی توسعه اش بود و اگر اشتباه نکنم از حدود سال های ۲۰۰۱ بود که این تکنولوژی به شدت گسترش پیدا کرد و من نیز در سال ۲۰۰۵ از طریق درسی که با مهندس فانی داشتم به دنیای بسیار زیبای FPGA قدم گذاشتم و تصمیم گرفتم در یکی از مهمترین مقاطع تحصیلی ام این افتخار را داشته باشم که به عنوان مهندس سخت افزار کامپیوتر وظیفه ام را به خودم ادا کنم و پروژه ای جذاب، به روز، مرتبط و بسیار مهیج را با موفقیت پشت سر بگذارم. اگر درست خاطم باشد آشنایی با این فناوری در درس برنامه نویسی ویژه گرایش سخت افزار کامپیوتر و همراه با یادگیری زبان VHDL بود.

در انجام این پروژه مهندس رضا فانی و مهندس علی عباسی کمک ها و راهنمایی های ارزنده ای به بنده کردند که جا دارد از ایشان تشکر کنم.

FPGA Xilinx Spartan XC2S150

اجرای پروژه با استفاده از کیت آموزشی FPGA که در آزمایشگاه سخت افزار دانشکده مهندسی دانشگاه شمال موجود بود انجام شد و خوشبختانه یکی از پیشرفته ترین کیت های FPGA یعنی سری Xilinx Spartan II مدل xc2s150 برای اجرای این پروژه در اختیار بنده قرار گرفت.

Armin Kamfiroozi FPGA Calculator Project

بخش نرم افزاری این پروژه نیاز به کدنویسی با زبان VHDL داشت که قبل تر توسط استاد تدریس شده بود اما برای انجام پروژه های بزگتر و پیچیده تر و همینطور استفاده بهتر از نرم افزار نیاز به زبان قدرتمند تری بود که به همین دلیل زبان Verilog را انتخاب کردیم.

همانگونه که در نمای شماتیک تا حدودی مشخص است در انجام این پروژه از ۱۱ ماژول استفاده گردید که عبارتند از:

  1. Key Controller: جدا کردن و تشخیص عدد و عملوند (اپرند)
  2. Key Finder: تشخیص کلیدها از صفحه کلید (اسکن صفحه کلید)
  3. BCD_to_DEC: تبدیل عدد ورودی BCD به دسیمال برای انجام عملیات محاسباتی روی آن
  4. Calculate: بخش محاسباتی و انجام عملیات ضرب، جمع، تفریق، تقسیم
  5. Result_disp: لچ کردن جوابها و آماده سازی برای ارسال به خروجی و تعیین اینکه مساوی یا CLR زده شده و یا عملگر بوده.
  6. MUX2_8bit: دو حالت نمایش روی صفحه داریم: نمایش کلیدهای فشرده شده و نمایش نتیجه. با مالتی پلکسر از هم تشخیص میدهیم که چه چیزی به LCD برود.
  7. Init_lcd: آماده سازی LCD و انجام تنظیمات آن و تعیین محتویات آن.
  8. LCD_driver: راه انداز LCD و ارسال اطلاعات به خروجی و تعیین تاخیرها و پالسهای فعالسازی و …
  9. Key_pulse: یک تک پالس برای شروع کار ایجاد میکند. بقیه پالسها توسط پایه ready خروجی از LCD که به فلیپ فلاپهای اول کار متصل میشود ایجاد میشود و به این معناست که هر وقت عملیات قبلی تمام شد، پالسی برای انجام عملیات جدید میفرستد.
  10. CLK_1MHZ: شکستن کلاک از 40 مگاهرتز به حدود چند صد کیلوهرتز
  11. فلیپ فلاپهای اول: ایجاد تاخیر در مدار