وی‌اچ‌دی‌ال

**وی‌اچ‌دی‌ال** (*به انگلیسی VHDL*) یک زبان توصیف سخت‌افزار برای بیان مشخصات سخت‌افزار است.
زبان VHDL نخستین بار توسط وزارت دفاع آمریکا به منظور طراحی و توصیف مدارهای مجتمع سرعت بالا طراحی شد و مورد استفاده قرار گرفت. سپس در سال ۱۹۸۷ توسط انجمن IEEE (انجمن مهندسان برق و الکترونیک) در قالب استاندارد IEEE 1076-1987 ارائه گردید. پس از گذشت چند سال و انجام پاره‌ای از تصحیحات، استاندارد دوم این زبان تحت عنوان IEEE 1076-1993 در اختیار عموم قرار گرفت. به‌طور کلی می‌توان مزایای زیر را در استفاده از زبان VHDL عنوان نمود:
* با توجه به این که VHDL یک زبان استاندارد می‌باشد، کد نوشته توسط آن را می‌توان به روی سنتزکننده‌ها و تراشه‌های تولیدکنندگان مختلف پیاده‌سازی نمود و نیازی به تغییر کد وجود ندارد.
* شبیه‌سازها و کامپایلر‌های این زبان در دسترس و ارزان قیمت می‌باشند.
* با استفاده از این زبان می‌توان سیستم‌ها را به صورت ساختاری یا رفتاری مدل‌سازی نمود. توصیف رفتاری نشان دهنده عملکرد سیستم و چگونگی تولید خروجی‌ها بر اساس سیگنال‌های ورودی می‌باشد. با استفاده از این توصیف می‌توان عملکرد کلی سیستم را بیان کرد و از درگیر شدن با جزئیات بلوک‌های سازنده سیستم که در طرح‌های بزرگ به پیچیدگی توصیف سیستم منجر شود، اجتناب نمود. در مقابل مدل ساختاری نشان دهنده نحوه ارتباط بلوک‌های سازنده سیستم است و بیانگر جزئیات بیشتری از سخت‌افزار می‌باشد. به این ترتیب با استفاده از این زبان امکان توصیف سخت‌افزار از سطح گیت تا سیستم فراهم می‌شود.
* با استفاده از توصیف سخت‌افزاری می‌توان سیستم‌های پیچیده را توسط ارتباط بین بلوک‌های سازنده آن‌ها مدل‌سازی نمود؛ به این ترتیب پیاده‌سازی این سیستم‌ها توسط زبان VHDL ساده‌تر از زبان‌های برنامه‌نویسی از قبیل c می‌باشد.
* با بکارگیری کتابخانه‌ها و componentها در زبان VHDL، می‌توان از المان‌های موجود و نوشته شده در سایر طراحی‌ها استفاده نمود. در واقع عملکرد آن‌ها شبیه DLLها و توابع در زبان‌های برنامه‌نویسی نرم‌افزاری می‌باشد.
* سرعت طراحی و پیاده‌سازی سیستم‌های پیچیده توسط این زبان بسیار بیشتر از طراحی شماتیک است زیرا چگونگی اتصال گیت‌ها و بلوک‌ها، توسط نرم‌افزار سنتزکننده تعیین می‌شود. به این ترتیب می‌توان سیستم‌های پیچیده را در مدت زمان کوتاهی پیاده‌سازی کرده، تغییرات و اصطلاحات مورد نیاز را در برنامه اعمال نمود.
* استفاده از این زبان بستر مناسبی برای شبیه‌سازی سیستم مورد توصیف ایجاد می‌کند و پس از اطمینان از صحت عملکرد کد نوشته شده در محیط شبیه‌ساز، می‌توان توصیف سیستم را به روی تراشه مورد نظر پیاده کرد.

## مثال‌هایی از برنامه
### پیاده‌سازی گیت AND

```vhdl
-- (this is a VHDL comment)

-- import std_logic from the IEEE library
library IEEE;
use IEEE.std_logic_1164.all;

-- this is the entity
entity ANDGATE is
   port (
         IN1 : in std_logic;
         IN2 : in std_logic;
         OUT1: out std_logic);
end ANDGATE;

architecture RTL of ANDGATE is
begin

  OUT1 <= IN1 and IN2;

end RTL;
```

----

### پیاده‌سازی مالتی پلکسر

```vhdl
-- template 1:
X <= A when S = '1' else B;

-- template 2:
with S select
  X <= A when '1',
       B when others;

-- template 3:
process(A,B,S)
begin
  case S is
    when '1'    => X <= A;
    when others => X <= B;
  end case;
end process;

-- template 4:
process(A,B,S)
begin
  if S = '1' then
    X <= A;
  else
    X <= B;
  end if;
end process;

-- template 5 - 4:1 MUX, where S is a 2-bit std_logic_vector :
process(A,B,C,D,S)
begin
  case S is
    when "00"   => X <= A;
    when "01"   => X <= B;
    when "10"   => X <= C;
    when others => X <= D;
  end case;
end process;
```

----

### پیاده‌سازی [[فیلیپ فلاپ (الکترونیک)|فلیپ فلاپ]] نوع D

```vhdl
-- simplest DFF template (not recommended)
Q <= D when rising_edge(CLK);

-- recommended DFF template:
process(CLK)
begin
  -- use falling_edge(CLK) to sample at the falling edge instead
  if rising_edge(CLK) then
    Q <= D;
  end if;
end process;

-- alternative DFF template:
process
begin
  wait until CLK='1';
  Q <= D;
end process;

-- alternative template expands the ''rising_edge'' function above:
process(CLK)
begin
   if CLK = '1' and CLK'event then--use rising edge, use  "if CLK = '0' and CLK'event" instead for falling edge
      Q <= D;
   end if;
end process;
```

----

### پیاده‌سازی شمارنده

```vhdl
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;    -- for the unsigned type

entity counter_example is
generic ( WIDTH : integer := 32);
port (
  CLK, RESET, LOAD : in std_logic;
  DATA : in  unsigned(WIDTH-1 downto 0);
  Q    : out unsigned(WIDTH-1 downto 0));
end entity counter_example;

architecture counter_example_a of counter_example is
signal cnt : unsigned(WIDTH-1 downto 0);
begin
  process(RESET, CLK) is
  begin
    if RESET = '1' then
      cnt <= (others => '0');
    elsif rising_edge(CLK) then
      if LOAD = '1' then
        cnt <= DATA;
      else
        cnt <= cnt + 1;
      end if;
    end if;
  end process;

  Q <= cnt;

end architecture counter_example_a;
```


## پیوند مرتبط
* FPGA‌ها

## منابع

* آشنایی با تراشه‌های FPGA و زبان VHDL - مؤلف: کاوه فارغی - ناشر: کامپیوتر پایتخت - چاپ اول ۱۳۸۶
* ویکی‌پدیای انگلیسی
* خود آموز وی‌اچ‌دی‌ال

رده:استانداردهای آی‌ئی‌سی
رده:زبان‌های برنامه‌نویسی دامنه-مشخص
رده:زبان‌های برنامه‌نویسی ساخته‌شده در ۱۹۸۳ (میلادی)
رده:زبان‌های توصیف سخت‌افزار