VHDL Data Types in Hindi
अब तक, आपने Verilog और SystemVerilog में इस्तेमाल होने वाले विभिन्न डेटा प्रकार देखे हैं।
अब हम VHDL डेटा प्रकारों में और गहराई से जाएंगे और उन्हें विस्तार से समझेंगे।
1. Scalar Types: ये VHDL में बुनियादी निर्माण ब्लॉक्स हैं:
1.1 BIT → '0' या '1'
signal a : bit;
variable a : bit;
constant a : bit := '0';
1.2 BOOLEAN → TRUE या FALSE
signal a : boolean;
variable b : boolean := true;
1.3 INTEGER (पूर्णांक)((आप रेंज भी दे सकते हैं, जैसे INTEGER range 0 to 15))
signal a : integer range 0 to 15;
-- process में loop का उदाहरण
process
begin
for i in 0 to 15 loop
a <= i;
end loop;
end process;
1.4 REAL (दशमलव संख्या)( (सिर्फ सिमुलेशन/टेस्टबेंच में इस्तेमाल, synthesis के लिए नहीं))
signal a : real := 3.14;
1.5 CHARACTER(कोई भी character जैसे 'A', 'B', '9')
signal ch : character := 'A';
1.6 TIME(समय का प्रतिनिधित्व, जैसे 10 ns, 5 us, सिमुलेशन में इस्तेमाल)
signal t_delay : time := 10 ns;
constant clk_period : time := 20 ns;
1.7 STD_LOGIC
STD_LOGIC को भी VHDL में स्केलर प्रकार माना जाता है क्योंकि यह एक बिट रखता है।
BIT डेटा प्रकार की तरह, जिसमें केवल दो मान हो सकते हैं (0 और 1),
STD_LOGIC (standard logic) प्रकार में 9 विभिन्न मान हो सकते हैं।
हम अब इन 9 मानों को एक-एक करके समझेंगे और उनके उपयोग को जानेंगे
'0','1','Z','X','U','L','H','W','-'
यह वास्तविक हार्डवेयर डिजाइन के लिए अधिक व्यावहारिक बनाता है।
2. Composite Types (मूल्यों का संग्रह)
2.1 Array
इसे समान प्रकार के कई मानों को संग्रहित करने के लिए इस्तेमाल किया जाता है।
उदाहरण:
BIT_VECTOR(7 downto 0)
STD_LOGIC_VECTOR(15 downto 0)
Verilog/SystemVerilog में reg [7:0] के समान।
2.2 Record
VHDL में record एक कस्टम डेटा प्रकार है जो कई सिग्नल या फील्ड को एक सिंगल वेरिएबल में समूहित करने की अनुमति देता है।
यह programming languages में struct के समान है।
उद्देश्य:
Records का मुख्य लाभ यह है कि जब आपके पास संबंधित सिग्नल का एक सेट होता है—जैसे कि किसी register के कई फील्ड या किसी sensor से कई readings—तो आप उन्हें एक single signal में organize कर सकते हैं। इससे आपका design साफ-सुथरा और readable बनता है।
उदाहरण:
type REG is record
F1 : STD_LOGIC;
F2 : STD_LOGIC;
F3: STD_LOGIC_VECTOR(7 downto 0);
end record;
signal request : REG;
Now you can access and assign individual fields of the record:
request.F1 <= '1';
request.F2 <= '0';
request.F3(3) <= '1';
Request register में तीन fields हैं, जिनके डेटा प्रकार अलग हैं, और record की मदद से इन्हें एक single variable के माध्यम से access किया जाता है।
Record में Dummy Variable क्यों जरूरी है
यदि आप record बना रहे हैं और उस समय कोई functional signals उपलब्ध नहीं हैं या आप भविष्य में use के लिए fields reserve करना चाहते हैं, तो dummy field जोड़ना चाहिए।
यह सुनिश्चित करता है कि:
-
Record syntactically complete है, इसलिए compiler या synthesis tool warnings नहीं देगा।
-
बाद में वास्तविक fields आसानी से जोड़ सकते हैं बिना record structure बदले।
-
Bus width या module interface consistent रहता है।
संक्षेप में, जब आप record बनाते हैं, और कोई actual signal अभी मौजूद नहीं है, तो dummy field जोड़ना जरूरी है।
VHDL
-- Define a record type with a dummy field
type Block_Regs is record
Reg1 : STD_LOGIC_VECTOR(7 downto 0); -- actual register
Dummy : STD_LOGIC_VECTOR(7 downto 0); -- dummy field, no functional use yet
end record;
-- Declare a signal of this record type
signal block_data : Block_Regs;
-- Assign values
block_data.Reg1 <= "00001111";
block_data.Dummy <= (others => '0'); -- dummy initialized to zero
1. Syntactically complete: Record में कम से कम एक dummy field है, इसलिए VHDL tools खाली record के लिए शिकायत नहीं करेंगे।
2. Future expansion: बाद में, आप dummy field को वास्तविक signal से बदल सकते हैं या और fields जोड़ सकते हैं बिना existing design बदले।
उदाहरण:
VHDL
-- Later expansion
type Block_Regs is record
Reg1 : STD_LOGIC_VECTOR(7 downto 0);
Reg2 : STD_LOGIC_VECTOR(7 downto 0); -- new real register added
end record;
Dummy field placeholder की तरह काम करता है ताकि record भविष्य में updates के लिए तैयार रहे।
3. Access Types (Pointer की तरह)
VHDL में access types का विचार SystemVerilog में objects की तरह है, लेकिन कुछ सीमाओं के साथ।
कैसे समान हैं:
SystemVerilog में, आप objects बना सकते हैं और उनके references को store कर सकते हैं,
और उन्हें dynamically भी create कर सकते हैं।
VHDL में, access type pointer की तरह काम करता है: यह actual value को hold नहीं करता,
बल्कि किसी variable या record के address को hold करता है, और आप new का उपयोग करके
object को dynamically create कर सकते हैं।
इसका मतलब है कि access types आपको यह अनुमति देते हैं:
-
OOP की तरह dynamically memory allocate करना।
-
Large records या structures को copy किए बिना पास करना, जिससे resources बचते हैं।
-
Dynamic data structures जैसे linked lists, queues, या arrays बनाना जो बढ़ या घट सकते हैं।
प्रतिबंध:
VHDL पूरा OOP नहीं है। आप inheritance या polymorphism का उपयोग नहीं कर सकते जैसे SystemVerilog में। Access types मुख्यतः pointers और dynamic memory के लिए हैं।
Easy analogy:
-
SystemVerilog object = actual object
-
VHDL access type = उस object के लिए pointer
-
.all in VHDL = pointer को dereference करना, जैसे C++ में real object तक पहुँचना
तो मूल रूप से, VHDL में access types आपको कुछ object-जैसा व्यवहार देते हैं, लेकिन सरल और सिर्फ dynamic allocation और references पर केंद्रित।
उदाहरण:
VHDL
-- 1. Record type define करें
type Employee is record
id : INTEGER;
name : STRING(1 to 20);
end record;
-- 2. Record के लिए access type define करें
type Employee_Ptr is access Employee;
-- 3. Access type का signal (या variable) declare करें
signal emp_ref : Employee_Ptr;
begin
-- 4. 'new' का उपयोग करके memory dynamically allocate करें
emp_ref := new Employee;
-- 5. Access type के माध्यम से record fields को assign करें
emp_ref.all.id <= 101;
emp_ref.all.name <= "Mayank Nigam";
-- 6. अब emp_ref Employee record की ओर point करता है और इसका उपयोग किया जा सकता है
-- उदाहरण के लिए, values पढ़ना:
-- some_signal <= emp_ref.all.id;
Explanation:
-
Employee एक record type है जिसमें fields id और name हैं।
2. Employee_Ptr एक access type है जो Employee की ओर point करता है।
3. emp_ref एक Employee record के reference को hold करता है।
4. new का उपयोग करके, हम record के लिए dynamically memory allocate करते हैं।
5..all का उपयोग pointer के माध्यम से actual record fields को access करने के लिए किया जाता है।
System Verilog Analogy
System Verilog
Employee
emp =
new();
VHDL
emp_ref := new
Employee;
System Verilog
emp.id = 101;
VHDL
emp_ref.all.id <= 101;
System Verilog
emp.name = "Mayank";
VHDL
emp_ref.all.name <= "Mayank";
लेकिन VHDL में Inheritance और Polymorphism उपलब्ध नहीं हैं; केवल dynamic memory allocation संभव है।
Note: Hardware synthesis में शायद ही कभी इस्तेमाल होता है, लेकिन testbenches और simulations में उपयोगी है।
4. File Types
VHDL में, file एक तरीका है external files (जैसे text files) से data पढ़ने या लिखने का।
File handling ज्यादातर testbenches, simulations, या data logging के लिए इस्तेमाल होती है, क्योंकि synthesis tools आम तौर पर वास्तविक hardware में file operations को implement नहीं करते।
VHDL विभिन्न प्रकार की files प्रदान करता है ताकि अलग-अलग प्रकार के data को handle किया जा सके। ये मुख्यतः उस डेटा के प्रकार के आधार पर categorize की जाती हैं जो file में store होगी:
-
Text files (TEXT)
-
Lines of text को store करने के लिए इस्तेमाल होती हैं।
-
Testbenches में input vectors पढ़ने या output logs लिखने के लिए बहुत common हैं।
-
उदाहरण: input values की list पढ़ना या simulation results लिखना।
-
File of scalar type
-
एक file basic VHDL type जैसे BIT, BOOLEAN, INTEGER, या STD_LOGIC के values की series hold कर सकती है।
-
उदाहरण: file my_file : file of INTEGER;
-
-
File of composite type
-
आप records या arrays की file भी define कर सकते हैं।
-
उदाहरण: यदि आपके पास multiple fields वाला record है, तो आप कई ऐसे records को एक file में store कर सकते हैं।
Example: Testbench में text file लिखना
VHDL
library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;
entity tb_file_example is
end entity;
architecture sim of tb_file_example is
file my_file : text open write_mode is "output.txt";
variable line_buf : line;
begin
process
begin
write(line_buf, string'("Simulation started"));
writeline(my_file, line_buf);
write(line_buf, string'("Value of signal X = 1"));
writeline(my_file, line_buf);
wait;
end process;
end architecture;
यहाँ:
-
file my_file : text → एक text file define करता है।
-
write और writeline → file में data लिखने के लिए।
-
readline और read → file से data पढ़ने के लिए इस्तेमाल हो सकते हैं।
ज्यादातर testbenches के लिए।
5. User-Defined Types
VHDL में, आप अपने खुद के enumeration types बना सकते हैं।
उदाहरण:
type state_type is (IDLE, FETCH, DECODE, EXECUTE, WRITE_BACK);
signal state : state_type := IDLE;
यह Processors का Instruction cycle है जिसमें सभी States शामिल हैं

Common IEEE Standard Types (वास्तविक डिज़ाइन में सबसे अधिक प्रयोग किए जाने वाले)
STD_LOGIC Value
Meaning
Real Time Sense
-
STD_LOGIC → एक single-bit signal है, लेकिन BIT के unlike, यह 9 अलग-अलग values ले सकता है:
0, 1, Z, X, U, L, H, W, -
(इससे यह simulation और वास्तविक hardware design दोनों में बहुत उपयोगी बनता है।)
-
STD_LOGIC_VECTOR → कई STD_LOGIC bits का collection है।
Basically, यह कई bits वाले bus या wire का प्रतिनिधित्व करता है (उदाहरण के लिए, STD_LOGIC_VECTOR(7 downto 0) एक 8-bit bus है)।
यही कारण है कि लगभग सभी digital hardware designs VHDL में STD_LOGIC और STD_LOGIC_VECTOR का उपयोग करके लिखे जाते हैं। दोनों std_logic_1164 package में define किए गए हैं जो ieee Library में उपलब्ध है, इसलिए हम VHDL code में हमेशा package के साथ शुरुआत करते हैं।
STD_LOGIC Value और उसका अर्थ
'0'
Logic 0 / Strong 0
Digital GND 0 V
'1'
'Z'
'X'
'U'
'L'
Logic 1 / Strong 1
High Impedance / Tri-state
Unknown / Conflict
Uninitialized
Weak 0 / Pull-down
VDD 5 V
circuOpen it
0 या 1 नहीं कहा जा सकता
Value is not known at start
0 V to 0.8 V(TTL)
0 V to 1.5 V(CMOS)
'H'
'W'
'-'
Weak 1 / Pull-up
Weak Unknown
Don't Care
2 V to 5 V(TTL)
3.5 V to 5 V(CMOS)
0.8 V to 2.0 V(TTL)
1.5 V to 3.5 V(CMOS)
Synthesis में K-map के लिए उपयोग किया जाता है
Note: सभी values VDD/VCC के संदर्भ में हैं, यानी 5 V।
Strong 0 vs Weak 0 – एक Interview Question
-
Strong 0:
-
इसे ऐसे सोचें जैसे दरवाजा पूरी तरह से बंद और lock किया हुआ हो।
-
Output firmly 0 volts पर है, इसे ऊपर उठने का कोई मौका नहीं।
-
उदाहरण: एक transistor जो output को सीधे ground से जोड़ता है।
2. Weak 0:
-
इसे ऐसे सोचें जैसे दरवाजा हल्का दबा हुआ हो।
-
Output 0 की ओर जाने की कोशिश कर रहा है, लेकिन पूरी तरह solid नहीं है।
-
यह pull-down resistor या leakage currents जैसे कारणों से होता है।
-
अगर कोई stronger signal आए, तो यह आसानी से 0 को override कर सकता है।

Scenario: Weak 0 meets Strong 1
-
Imagine the weak 0 like a door lightly pressed closed.
-
Now, suppose a strong force comes along—like someone pushing the door open hard.
-
The door (weak 0) gives way, and now it swings fully open.
In electronics terms:
-
The pin was at weak 0 (trying to stay at 0 V but not solid).
-
A strong 1 signal comes in (like a strong voltage driving it high).
-
The weak 0 cannot resist, so the output becomes strong 1.
Shown in below figure.


Floating Pin, Weak 0, and Strong 1
-
जब किसी gate का input pin VDD या GND से connect नहीं होता, तो उसे floating pin कहते हैं।
→ इसका voltage undefined होता है (अनपेक्षित व्यवहार कर सकता है)।
-
अगर उस pin को resistor के माध्यम से GND से जोड़ दिया जाए, तो यह Weak 0 बन जाता है।
→ Resistor pin को 0 की ओर खींचता है, लेकिन यह बहुत strong नहीं होता।
-
अगर आप उसी pin को सीधे VDD (Strong 1) से जोड़ दें, तो यह Weak 0 को override कर देगा।
→ Pin को logic 1 (Strong 1) के रूप में पढ़ा जाएगा क्योंकि strong signal dominate करता है।
TTL Weak-0 Voltage < CMOS Weak-0 Voltage क्यों
इसके लिए Electronics की दुनिया में चलते हैं।
TTL technology में input stage BJTs से बनी होती है। इसलिए input impedance काफी कम होती है, और input pin सिर्फ voltage नहीं बल्कि current भी sink करता है। अगर आप weak source से input को logic-0 पर खींचने की कोशिश करें, तो TTL input खुद current draw करेगा और weak pull का विरोध करेगा। Proper logic-0 पाने के लिए input voltage बहुत कम रखना पड़ता है (लगभग 0.8 V से नीचे)। इतने low level पर TTL gate के अंदर transistor पूरी तरह off हो जाता है और logic clearly 0 के रूप में माना जाता है।
CMOS technology में input stage MOSFET gate होती है। MOSFET gate capacitor की तरह व्यवहार करता है और इसकी impedance बहुत high होती है (अक्सर megaohm range)। इसका मतलब लगभग कोई current input में नहीं जाता। इसलिए pull-down current की strength ज्यादा matter नहीं करती; सिर्फ voltage मायने रखता है। जब तक voltage defined threshold (लगभग 1.5 V) से नीचे है, CMOS input reliably logic-0 detect कर लेता है, भले source weak हो।
इसलिए TTL में weak-0 voltage कम होता है क्योंकि TTL inputs current-sensitive हैं, जबकि CMOS में weak-0 voltage ज्यादा होता है क्योंकि CMOS inputs voltage-sensitive हैं।Note: ये threshold voltages device के physical design के समय set किए जाते हैं।
Note: These threshold voltages are set during the physical design of the device
Tri-State Buffer (High Impedance State in VHDL)
Tri-state buffer एक special type का buffer है जिसमें एक extra control input होता है। यह control input decide करता है कि input का signal output तक pass हो या नहीं।
जब control active होता है, buffer normal की तरह काम करता है: अगर input 0 है, output 0; अगर input 1 है, output 1।
जब control inactive होता है, input output से disconnect हो जाता है। इस state में output open circuit जैसा व्यवहार करता है। इसे high-impedance state कहते हैं और VHDL/Verilog simulation में इसे symbol ‘Z’ से दर्शाया जाता है।
High-impedance state बहुत useful है क्योंकि यह multiple devices को same output line share करने देता है (जैसे buses में)। एक समय में सिर्फ एक device bus drive करता है, बाकी devices high-impedance में रहते हैं ताकि interference न हो।
.png)

STD_LOGIC Weak/Strong Values और Synthesis
VHDL में type STD_LOGIC कई अलग values allow करता है जैसे '0', '1', 'L', 'H', 'Z', और 'X'। ये extra values simulation में बहुत useful हैं क्योंकि ये weak signal, floating pin या unknown value जैसी situations को describe करने देती हैं।
लेकिन सवाल आता है: क्या ये signals synthesized और simulated दोनों होते हैं?
Simulation में, ये सभी values valid और meaningful हैं। Simulator weak 0, weak 1, unknown, high-impedance आदि दिखा सकता है।
लेकिन real hardware (FPGA या ASIC) में situation अलग होती है। सिर्फ कुछ values ही वास्तव में exist करती हैं। Real logic gate से weak zero या weak one नहीं आता। FPGA output driver या standard-cell gate हमेशा strong digital 0 या strong digital 1 drive करता है।
इसलिए synthesis में, tools आमतौर पर weak values ignore करते हैं। अगर आप code में 'L' लिखते हैं, synthesis tool इसे बस '0' मान लेगा। 'H' को '1' माना जाएगा।
Special case: 'Z' बहुत important है क्योंकि यह real hardware feature से संबंधित है: tri-state buffer। जब signal 'Z' assign होता है, synthesis tool logic generate करता है जो output को high-impedance state में डालता है, जैसे open circuit।
-
'L' = weak logic-0
-
'H' = weak logic-1
-
'Z' = high-impedance state
-
'X' = unknown state
निष्कर्ष:
-
Weak values ('L', 'H') केवल simulation modeling के लिए useful हैं।
-
'0', '1', और 'Z' वे values हैं जो synthesis के बाद hardware में सच में appear हो सकती हैं।
VHDL में STD_LOGIC में symbol '-' भी शामिल है, जिसे Don't Care कहते हैं। इसका मतलब है कि signal का actual value मायने नहीं रखता। '-' बताता है कि simulator 0 या 1 freely choose कर सकता है क्योंकि design में exact value irrelevant है। यह simulation और synthesis optimization में बहुत useful है।
STD_LOGIC का उपयोग करते समय सावधानी और महत्व
STD_LOGIC input सिर्फ 0 और 1 नहीं होती, इसमें 9 possible values होती हैं ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-')।
उदाहरण: एक input signal inp है और आप output decide करना चाहते हैं case statement से:
VHDL
case inp is
when '0' =>
outp <= '0';
when '1' =>
outp <= '1';
end case;
यहां आपने behavior सिर्फ '0' और '1' के लिए define किया। लेकिन अगर input 'Z', 'X', या कोई अन्य value हो, तो simulator या synthesis tool नहीं जान पाएगा कि क्या करना है, और output undefined हो जाएगा।
यह MUX की तरह सोचें: अगर 1-bit select line है और आप outputs सिर्फ 0और 1 के लिए define करते हैं, तो x, z ….आने पर output unknown होगा।
इसलिए VHDL में “others” clause use करते हैं:
VHDL
case inp is
when '0' =>
outp <= '0';
when '1' =>
outp <= '1';
when others =>
outp <= '0'; -- default value for all other STD_LOGIC values
end case;
इस तरह, MUX की तरह सभी possible select lines cover हो जाती हैं और design safe बनता है। Simulator warnings भी avoid होती हैं।
हम आगे lectures में Case statement के बारे में और पढ़ेंगे।
