**في إتش دي أل** أو **لغة توصيف العتاد للدارات المتكاملة ذات السرعات المرتفعة جداً** (بالإنجليزية: Very High Speed Integreted Circuit Hardware Description Language اختصاراً VHDL)‏ هي لغة برمجة قياسية صممت من قبل وزارة دفاع الولايات المتحدة حيث تستعمل في وصف، وتصميم، ومحاكاة دارات الدوائر الإلكترونية عالية السرعة. أصبحت منذ عام 1987 إحدى مقايس جمعية مهندسي الكهرباء والإلكترونيات وتمت مراجعتها في عام 1997.

تتيح هذه اللغة توصيف التوازي والترابط بالإضافة للتعبير المفصل والمباشر للزمن وتسمح أيضا بتوصيف الدارات التماثلية لكنها غالبا ما تستخدم في تصميم دارات مصفوفة البوابات المنطقية القابلة للبرمجة.

VHDLمقتبسة من لغة **Ada**  في المفهوم العام كالرموز والمصفوفات أحادية البعد وتركيب العبارات وبناءها وهي غير حساسة لحالة الأحرف وهناك الكثير من الميزات غير موجودة في لغة **Ada** كمجموعة من التعليمات البوليانية التي تتضمن  **NAND,NOR** مثلا وتمثيل العمليات الشائعة في البنية التعاودية مباشرة.
وتسمح **VHDL** بإدخال المصفوفات في اتجاهين تصاعدي وتنازلي لأن كلا الا صطلاحين يستخدم في الـ **HardWare** ،والنسخة المعدلة الأولى من الـ **VHDL** تتضمن مجال واسع من أنواع البيانات كالنوع العددي(الصحيح والحقيقي)والمنطقي(البولياني والبتي)والنوع الحرفي والوقت ومصفوفة من النوع البتي التي تسمى الشعاع البتي والمصفوفة من نوع المحارف التي تسمى الشعاع السلسلة.

لغة **VHDL** هي لغة متعددة وعامة تماماً وعلى الرغم من أنها تتطلب برنامج محاكاة لتشغيل كود البرنامج فإنه يمكنها أن تقرأ وتكتب ملفات على كمبيوتر مضيف، إن **VHDL** تسمح بتوصيف النظام المتزامن (الأجزاء المقدمة بواسطة سلوك عملها مع بعضها البعض بنفس الوقت)وهي غير محببة كثيراً من لغات أخرى كلغة الـ Basic**، pascal،** c أو لغات التجميع التي تسمع على مستوى شيفرة الآلة بشكل متعاقب تعليمة واحدة كل مرة لكل بنيان.
وعندما يترجم نموذج **VHDL** إلى بوابات وأسلاك التي تكون منظمة على جهاز منطقي قابل للبرمجة مثل مصفوفة البوابات المنطقية القابلة للبرمجة أو **CPLD**  والعتاد الفعلي يحدد من شيفرة **VHDL** المنفذة كما في بعض أشكال شريحة المعالج.

البداية
-------

في لغة **VHDL** كما في أي لغة برمجة عتادية أو برمجية كي تكون خبيراً فإن ذلك يتطلب دراسة وتمرين، وإذا كان المستخدم يرغب بتعلم تشفير**RTL**  كتصميم دارات عتادية عن طريق **VHDL** فإن حزم التصميم والتركيب الموجودة كافية للتعلم.إن معرض البوابات التخطيطية يظهر للمستخدم تصاميم مركبة كالمخططات القابلة للانقياد، والكثير من حزم التصميم **FPGA** تقدم طرق إدخال تصاميم بديلة مثل النسخ المؤقت لمخطط الحالة والرسوم التخطيطية.وهذه الحزم تزودنا بقالب بدء مفيد لتشفير الأنواع الأساسية من التعليمات التكرارية والدروس التي يتضمنها مفيدة ومساعدة.
تقريباً جميع نسخ المحاكاة وتصميمFPGA تدعم كلا **Verilog** و**VHDL** تسمح للمستخدم بتعلم كلا اللغتين.
بالإضافة إلى أن معظم التصاميم المستوردة نماذج من المكتبات وبعض التصاميم التي تتضمن عدة
**Architecture**.

البنية الأساسية
---------------

* **entity** (*كيان*)، يحدد واجهة الترابط (المداخل والمخارج) فقط من دون تحديد الوظيفة. وتتضمن
	+ تحديد اسم معين للكيان المراد صنعه
	+ تحديد أسماء المنافذ ports names
	+ تحديد احجام المنافذ من حيث عدد البتات في كل منفذ
	+ تحديد اتجاه المنفذ (كونه مدخل input أو مخرج output)
	+ تحديد نوع المنفذ (يحمل قيمة صفر وواحد فقط أو يحمل قيم أخرى مثل high impedance)
* **architecture** (*البنيان*)، يحدد وظيفة الكيان ويتالف من قسمين
	+ تصريحي (declarative) يظهر اولا في جملة المعمارية وقبل جملة begin يتم فيها التعريف عن المتغيرات الداخلية
	+ إيعازي (command)يتم فيها شرح كيفية ترابط المنافذ الداخلة لتكوين المنافذ الخارجة

طرق توصيف البنيان
-----------------

* توصيف بنيوي *structure*
	+ التوصيف على مستويات عليا
	+ يستخدم بشكل أساسي لدى المحاكاة
* توصيف سلوكي *behavior*
	+ مناسب لعمليات التركيب *synthesis*
	+ المصمم يتحكم ببنية تصميمه.

أمثلة
-----

### بوابة 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** فأجزاء كثيرة يمكن أن تبدو لنا اختيارية أو يمكن أن تكتب مرة واحدة فقط، بالإضافة إلى استخدام عناصر **std\_logic** الذي يمكن استبداله بالنوع **Bit** ونتجنب استيراد المكتبة في البداية، لكن استخدام **9 valued logic(U,X,0,1,Z,W,L)**  بدلاً من (0,1) يقدم محاكاة قوية جداً وأدوات تصحيح أخطاء غير موجودة في لغات **HDL** الأخرى.
في الأمثلة التالية سنرى كيف أن كود **VHDL** يكتب بشكل مدمج لكن المصممين عادة يتجنبون النماذج المدمجة ويستخدمون أسلوب تشفير ممل أكثر من أجل أن يكون قابل للقراءة والفائدة الأخرى لاستخدام هذا الأسلوب في التشفير هي برمجة الأدوات القابلة للبرمجة مثل**CPLD**.

### الناخب

```
entity mux1b4X1 is
 port(in1,in2,in3,in4,c1,c2:in Bit;out1:out Bit);
end mux1b4X1;

architecture struk\_mux1b4X1 of mux1b4X1 is
 signal c1\_n,c2\_n,intk11,intk12,intk13,intk14:Bit;
 
 component o\_not 
 port(in1:in Bit ;out1:out Bit);
 end component ;
 
 component o\_3and is
 port(in1,in2,in3:in Bit; out1:out Bit);
 end component ;
 
 component o\_4or is
 port(in1,in2,in3,in4:in Bit; out1:out Bit);
 end component ; 
 
begin
 KNc1:o\_not
 port map(in1=>c1,out1=>c1\_n);
 
 KNc2:o\_not
 port map(in1=>c2,out1=>c2\_n);
 
 Kand11:o\_3and
 port map(in1=>in1,in2=>c1\_n,in3=>c2\_n,out1=>intk11);
 
 Kand12:o\_3and
 port map(in1=>in2,in2=>c1,in3=>c2\_n,out1=>intk12);
 
 Kand13:o\_3and
 port map(in1=>in3,in2=>c1\_n,in3=>c2,out1=>intk13);
 
 Kand14:o\_3and
 port map(in1=>in4,in2=>c1,in3=>c2,out1=>intk14);
 
 Kor:o\_4or
 port map(in1=>intk11,in2=>intk12,in3=>intk13,in4=>intk14,out1=>out1);
 
end struk\_mux1b4X1;

```

بنية مضمم 4×1بنية مضمم 4×1
الصورة في الأعلى تبين بنية مضمم 4×1 وبالمقبال نشاهد الشيفرة المصدرية التي يصف هذه البنية ويستخدم طريقة التوصيف البنيوي حيث نلحظ في القسم التصريحي تعداد الأجزاء التي يتكون منها المضمم (*Multiplexer*) وفي القسم الإيعازي كيفية ارتباط تلك الأجزاء ببعضها.

أما الشيفرة المصدرية التالية فهي تصف البنية السابقة نفسها عن طريق التوصيف السلوكي.

```
entity mux1b4X1 is
 port(in1,in2,in3,in4,c1,c2:in Bit;out1:out Bit);
end mux1b4X1;

architecture sprav\_mux1b4X1 of mux1b4X1 is
begin
 process(in1,in2,in3,in4,c1,c2)
 begin
 if c1='0' and c2='0' then
 out1<=in1;
 elsif c1='1' and c2='0' then
 out1<=in2;
 elsif c1='0' and c2='1' then
 out1<=in3;
 elsif c1='1' and c2='1' then
 out1<=in4;
 end if;
 end process;
end sprav\_mux1b4X1;

```

### المغلاق

```
-- latch template 1:
Q <= D when Enable = '1' else Q;

-- latch template 2:
process(D,Enable)
begin
 if Enable = '1' then
 Q <= D;
 end if;
end process;

```

والمغلاق SR يستخدم إشارات التوضع والتصفير :

```
-- SR-latch template 1:
Q <= '1' when S = '1' else
 '0' when R = '1' else Q;

-- SR-latch template 2:
process(S,R)
begin
 if S = '1' then
 Q <= '1';
 elsif R = '1' then
 Q <= '0';
 end if;
end process;

```

والقالب المنطقي 2 يملك ضمنياً (else Q <= Q;) التي نستطيع اضافتها بصراحة إذا أردنا.

```
-- This one is a RS-latch (i.e. reset dominates)
process(S,R)
begin
 if R = '1' then
 Q <= '0';
 elsif S = '1' then
 Q <= '1';
 end if;
end process;

```

### قلاب المعطيات D-type flip-flops

وهو أساس من اجل كل المنطق المتواقت

```
-- 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 rising\_edge(CLK);
 Q <= D; 
end process;

```

وبعض القلابات أيضاً تملك إشارات تمكين... وإشارات توضع وتصفير غير متزامنة.

```
-- template for asynchronous reset with clock enable:
process(CLK, RESET)
begin
 if RESET = '1' then -- or '0' if RESET is active low...
 Q <= '0';
 elsif rising\_edge(CLK) then
 if Enable = '1' then -- or '0' if Enable is active low...
 Q <= D;
 end if;
 end if;
end process;

-- template for synchronous reset with clock enable:
process(CLK)
begin
 if rising\_edge(CLK) then
 if RESET = '1' then 
 Q <= '0';
 elsif Enable = '1' then -- or '0' if Enable is active low...
 Q <= D;
 end if;
 end if;
end process;

```

وخطأ المبتدئين الشائع أننا نملك دخل وضع وإعادة الوضع ولكن لا نستخدمها.

والمثالين التاليين غير متساويين... الأول عبارة عن القلاب D.. والثاني عبارة عن القلاب D مع تغذية عكسية بالناخب.

```
-- simple D-type flip-flop
process(CLK)
begin
 if rising\_edge(CLK) then 
 Q <= D; 
 end if;
end process;

-- BAD VHDL: this does NOT make the flip-flop a DFF without a reset!!
process(CLK, RESET)
begin
 if RESET = '1' then 
 -- do nothing. Q is not set here... 
 elsif rising\_edge(CLK) then 
 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
 Q <= cnt;

 process(RESET, CLK)
 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;
end architecture counter\_example\_a;

```

### سلسلة فيبوناسي

المثال التالي أكثر تعقيداً:

```
-- Fib.vhd
--
-- Fibonacci number sequence generator

library IEEE;
use IEEE.std\_logic\_1164.all;
use IEEE.numeric\_std.all;

entity Fibonacci is
port (
 Reset : in std\_logic;
 Clock : in std\_logic;
 Number : out unsigned(31 downto 0)
);
end entity Fibonacci;

architecture Rcingham of Fibonacci is

 signal Previous : natural;
 signal Current : natural;
 signal Next\_Fib : natural;

begin

 Adder:
 Next\_Fib <= Current + Previous;

 Registers:
 process (Clock, Reset) is
 begin
 if Reset = '1' then
 Previous <= 1;
 Current <= 1;
 elsif rising\_edge(Clock) then
 Previous <= Current;
 Current <= Next\_Fib;
 end if;
 end process Registers;

 Number <= to\_unsigned(Previous, 32);

end architecture Rcingham;

```

مراجع
-----

1. ↑  Department of Defense (1992). *Military Standard, Standard general requirements for electronic equipment*. مؤرشف من الأصل في 2019-12-11. اطلع عليه بتاريخ 2017-11-15.
2. ↑  *1076-2002 – IEEE Standard VHDL Language Reference Manual*. 2002. DOI:10.1109/IEEESTD.2002.93614. ISBN:0-7381-3247-0.
3. ↑  *1076-1987 – IEEE Standard VHDL Language Reference Manual*. 1988. DOI:10.1109/IEEESTD.1988.122645. ISBN:0-7381-4324-3.

وصلات خارجية
------------

* الموقع الرسمي
* VHDL Analysis and Standardization Group (VASG)

|  |  |
| --- | --- |
| مشاريع شقيقة | في كومنز صور وملفات عن: في إتش دي إل |



| * ع
* ن
* ت
معايير معهد مهندسي الكهرباء والإلكترونيات |
| --- |
| معايير حاليّة | 
* 488
* 730
* 754
	+ المُنقح
* 854
* 828
* 829
* 896
* 1003
* 1014
* 1016
* 1076
* 1149.1
* 1154
* 1164
* 1275
* 1278
* 1284
* 1355
* 1394
* 1451
* 1497
* 1516
* 1541
* 1547
* 1584
* 1588
* 1596
* 1603
* 1613
* 1666
* 1667
* 1675
* 1685
* 1800
* 1801
* 1815
* 1850
* 1900
* 1901
* 1902
* 1904
* 1905
* 2030
* 11073
* 12207
* 14764
* 16085
* 16326
* 29148
* 42010

 |
| سلاسل 802 | 

|  |  |
| --- | --- |
| 802 | 
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 12
* 13
* 14
* 15
* 16
* 17
* 18
* 19
* 20
* 21
* 22
* 23
* 24

 |
| 802.1 | 
* D
* p
* Q
* Qat
* Qay
* w
* X
* ab
* ad
* AE
* ag
* ah
* ak
* aq
* ax
* az

 |
| 802.11 | 
* a
* b
* c
* d
* e
* f
* g
* h
* i
* j
* k
* n
* p
* r
* s
* u
* v
* w
* y
* ac
* ad
* af
* ah
* ai
* ax
* ay

 |

* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 12
* 14
* 15
	+ 1
	+ 4
* 16
	+ واي ماكس
* 17
* .18
* 20
* 21
* 22
 |
| معايير مُقترحة | 
* 1363
* P1619
* P1699
* P1823
* P1906.1

 |
| معايير مُحالة للتقاعد | 
* 754-1985
* 830
* 1219
* 1233
* 1362
* 1364
* 1471

 |
| 
*انظر أيضاً*
جمعية معايير معهد مهندسي الكهرباء والإلكترونيات
تصنيف:معايير معهد مهندسي الكهرباء والإلكترونيات
 |


|  |  |
| --- | --- |
| ضبط استنادي: وطنية عدلها في ويكي بيانات | 
* المكتبة القومية الإسرائيلية (J9U)
* مكتبة الكونغرس (LCNAF)
* مكتبة لاتفيا الوطنية (LNB)
* قاعدة البيانات الوطنية التشيكية (NLCR AUT)

 |

* أيقونة بوابةبوابة إلكترونيات
* أيقونة بوابةبوابة تقانة المعلومات
* أيقونة بوابةبوابة علم الحاسوب
* أيقونة بوابةبوابة كهرباء