مرجع کامل دستورات توصیف سخت‌افزار (HDL) و مهندسی FPGA

مرجع جامع و دسته‌بندی‌شده کلیه ساختارهای سخت‌افزاری Verilog/SystemVerilog و قیدهای XDC برای طراحی و سنتز حرفه‌ای در FPGA.

۲۵ مهر ۱۴۰۵
۸ بازدید
1,747 words
media / fpgacodes
مرجع کامل دستورات توصیف سخت‌افزار (HDL) و مهندسی FPGA
تصویر شاخص آموزش
fpgacodes.md
متن آموزش

مرجع جامع کلیه دستورات و ساختارهای توصیف سخت‌افزار در FPGA

برخلاف پردازنده‌ها که دستورات را خط‌به‌خط اجرا می‌کنند، در FPGA کدها بیانگر سیم‌بندی فیزیکی گیت‌ها، لوت‌ها (LUT)، فلیپ‌فلاپ‌ها و بلاک‌های حافظه هستند. در این مرجع، کلیه ساختارهای زبانی Verilog / SystemVerilog (سنتزپذیر و شبیه‌سازی) به همراه دستورات قیدهای مکانی و زمانی XDC در Vivado بررسی شده‌اند.

۱. تعریف ماژول، پورت‌ها و سیگنال‌ها (Data Types & Hierarchy)

module ... endmodule

پایه‌ای‌ترین ساختار توصیف سخت‌افزار برای کپسوله‌سازی مدار و تعریف ورودی‌ها/خروجی‌ها؛ دربرگیرنده کل بدنه پردازشی مدار.

input / output / inout

جهت جریان سیگنال در پورت‌های ماژول: input برای دریافت داده، output برای ارسال به خارج و inout برای درگاه‌های دوسویه سه‌حالته (Tri-state Bus).

wire / reg / logic

• wire: سیم فیزیکی بدون حافظه برای اتصال خروجی بلاک‌های ترکیبی.
• reg: عنصری که داده را در فرایندهای رویه‌ای تا پالس بعدی در خود نگه می‌دارد.
• logic: نوع داده مدرن در SystemVerilog که جایگزین جامع هر دو حالت بالا بوده و مانع ابهامات نوع سیگنال می‌شود.

parameter / localparam

تعریف ثابت‌ها برای ماژولار ساختن کد (مانند تعیین عرض بیت داده یا ضرایب ثابت فیلترهای دیجیتال). parameter از بیرون ماژول قابل تغییر است، اما localparam تنها درون ماژول ثابت می‌ماند.

۲. بلوک‌های اجرایی و عملگرهای انتساب (Assignments)

assign

انتساب پیوسته (Continuous Assignment)؛ خروجی بلافاصله با تغییر هر یک از عملوندهای ورودی در گیت منطقی محاسبه می‌شود (مدار ترکیبی خالص).

always @(posedge clk or negedge rst_n)

اصلی‌ترین بلوک مدارهای ترتیبی سنکرون؛ کدهای داخل این بلوک بر روی لبه بالارونده کلاک سنکرون شده و فلیپ‌فلاپ‌های فیزیکی (Flip-Flops) را تشکیل می‌دهند.

always_ff / always_comb / always_latch

دستورات دقیق‌تر در SystemVerilog: به ترتیب ساخت اختصاصی فلیپ‌فلاپ، منطق تمام‌ترکیبی (تولید خودکار Sensitivity List و حذف خطر Latch ناخواسته)، و لچ شفاف.

<= (Non-Blocking Assignment)

انتساب غیرانسدادی؛ تمام متغیرها به‌طور کاملاً هم‌زمان در انتهای سیکل کلاک به‌روزرسانی می‌شوند. الزامی برای مدارهای ترتیبی و خطوط لوله (Pipeline) جهت جلوگیری از Race Condition.

= (Blocking Assignment)

انتساب انسدادی؛ مقادیر خط به خط ارزیابی شده و خط بعدی منتظر اتمام ارزیابی خط قبلی می‌ماند. مناسب صرفاً برای متغیرهای محاسباتی موقت درون مدارات ترکیبی.

۳. ساختارهای شرطی و شاخه‌بندی منطقی

  • if ... else if ... else: ایجاد منطق مقایسه اولویت‌دار (Priority Logic) که مستقیماً به گیت‌های متوالی یا انکودر اولویت مپ می‌شود.
  • case ... endcase: ساختار مستقیم انتخابی نظیر مالتی‌پلکسر (Mux) که تمام شاخه‌ها هم‌وزن ارزیابی می‌شوند؛ ایده‌آل برای طراحی ماشین‌های وضعیت (FSM).
  • casex / casez: حالت‌های پیشرفته case که در آن‌ها بیت‌های بی‌اهمیت (Don't Care با کاراکتر ? یا z) در شرط‌ها نادیده گرفته می‌شوند.
  • عملگر سه‌تایی (? :): عملگر خلاصه شرطی تک‌خطی ترکیبی، مانند assign out = sel ? in_b : in_a;.

۴. تولید سخت‌افزار پارامتریک و حلقه‌ها (Generate Blocks)

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

generate ... endgenerate: بلوک والد جهت تکرار فیزیکی ماژول‌ها یا گیت‌ها به تعداد دلخواه بر پایه پارامتر.
genvar: شمارنده متغیر ویژه که فقط در زمان سنتز سخت‌افزار حین حلقه فعال است و بعد از آن وجود فیزیکی ندارد.
for (درون generate یا always): جهت ساخت ساختارهای موازی منظم مانند ماتریس ضرب‌کننده‌ها، فیلترهای FIR چندکاناله یا آرایه شیفت‌رجیسترها.

۵. ماکروها، دستورات پیش‌پردازنده و شبیه‌سازی (Testbench)

دستورات کامپایلر (Directives):

• `timescale 1ns / 1ps: تنظیم مقیاس و دقت زمانی شبیه‌ساز.
• `define / `undef: ایجاد ثابت‌ها و جایگزین‌های متنی ماکرو.
• `ifdef / `else / `endif: سنتز و ارزیابی شرطی کد.
• `include: پیوست فایل‌های خارجی پیکربندی.

دستورات شبیه‌سازی (تست‌بنچ):

• initial: بلوک مقداردهی آغازین تنها برای شروع تست‌بنچ.
• #delay: ایجاد تاخیر نانوثانیه‌ای در سیگنال‌های تست.
• $display / $monitor: چاپ لاگ مقادیر روی ترمینال شبیه‌ساز.
• $readmemh / $readmemb: خواندن مستقیم فایل هگز یا باینری برای بارگذاری اولیه در BRAM.

۶. دستورات قیدهای فیزیکی و زمان‌بندی (Xilinx XDC / Vivado Constraints)

دستوراتی که در فایل .xdc نوشته شده و نحوه نگاشت سیگنال‌ها روی پایه‌های سخت‌افزاری چیپ (نظیر سری‌های Xilinx Artix-7) و محدودیت‌های فرکانسی را به موتور سنتز و جایابی دیکته می‌کنند:

create_clock -period 10.000 -name sys_clk [get_ports sys_clk]
تعریف فرکانس و پریود کلاک اصلی سیستم (مثلاً ۱۰۰ مگاهرتز).
set_property PACKAGE_PIN E3 [get_ports clk_in]
اتصال پورت ورودی یا خروجی مدار به پین فیزیکی پکیج چیپ.
set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}]
تعیین استاندارد الکتریکی پین ورودی/خروجی (نظیر ۳.۳ ولت، LVDS و...).
set_false_path -from [get_clocks clk_a] -to [get_clocks clk_b]
حذف مسیرهای ناهمگام (CDC) از گزارش تحلیل زمانی (Timing Analysis).
💡 نکته طلایی طراحی: در کدنویسی FPGA، همواره تفکیک دقیق بین منطق ترکیبی (برپایه LUTها) و منطق ترتیبی سنکرون (برپایه Flip-Flopها با انتساب غیراِنسدادی <=) مهم‌ترین اصل در حفظ پایداری سیگنال و گذراندن تست‌های تایمینگ است.

نظرات، سوالات یا پیشنهادات خود را در بخش زیر با ما در میان بگذارید

نظرات

هنوز نظری ثبت نشده است.