vhdl
डी-फ्लिप-फ्लॉप (डीएफएफ) और कुंडी
खोज…
टिप्पणियों
डी-फ्लिप-फ्लॉप (डीएफएफ) और लैचेस मेमोरी एलिमेंट्स हैं। डीएफएफ अपने इनपुट को अपनी घड़ी के एक या दूसरे किनारे पर (दोनों नहीं) के नमूने देता है, जबकि एक कुंडी इसके सक्षम होने के एक स्तर पर पारदर्शी होती है और दूसरे पर याद रहती है। निम्नलिखित आंकड़ा अंतर दिखाता है:
VHDL में डीएफएफ या लैचिंग को बनाना आसान है लेकिन कुछ महत्वपूर्ण पहलू हैं जिन्हें ध्यान में रखा जाना चाहिए:
DFF और Latches के VHDL मॉडल के बीच अंतर।
एक संकेत के किनारों का वर्णन कैसे करें।
कैसे तुल्यकालिक या अतुल्यकालिक सेट या रीसेट का वर्णन करें।
डी-फ्लिप-फ्लॉप (DFF)
सभी उदाहरणों में:
-
clkघड़ी है, -
dइनपुट है, -
qउत्पादन है, -
srstएक सक्रिय उच्च तुल्यकालिक रीसेट है, -
srstnएक सक्रिय कम तुल्यकालिक रीसेट है, -
arstएक सक्रिय उच्च अतुल्यकालिक रीसेट है, -
arstnएक सक्रिय निम्न अतुल्यकालिक रीसेट है, -
ssetएक सक्रिय उच्च तुल्यकालिक सेट है, -
ssetnएक सक्रिय कम समकालिक सेट है, -
asetएक सक्रिय उच्च अतुल्यकालिक सेट है, -
asetnएक सक्रिय निम्न एसिंक्रोनस सेट है
सभी संकेत प्रकार के हैं ieee.std_logic_1164.std_ulogic । प्रयुक्त सिंटैक्स वह है जो सभी लॉजिक सिंथेसाइज़र के साथ सही संश्लेषण परिणामों की ओर जाता है। वैकल्पिक सिंटैक्स के बारे में चर्चा के लिए कृपया क्लॉक एज डिटेक्शन उदाहरण देखें।
उठती धार घड़ी
process(clk)
begin
if rising_edge(clk) then
q <= d;
end if;
end process;
गिरने की घड़ी
process(clk)
begin
if falling_edge(clk) then
q <= d;
end if;
end process;
बढ़त घड़ी, तुल्यकालिक सक्रिय उच्च रीसेट
process(clk)
begin
if rising_edge(clk) then
if srst = '1' then
q <= '0';
else
q <= d;
end if;
end if;
end process;
राइजिंग एज क्लॉक, अतुल्यकालिक सक्रिय उच्च रीसेट
process(clk, arst)
begin
if arst = '1' then
q <= '0';
elsif rising_edge(clk) then
q <= d;
end if;
end process;
गिरने की घड़ी, अतुल्यकालिक सक्रिय कम रीसेट, तुल्यकालिक सक्रिय उच्च सेट
process(clk, arstn)
begin
if arstn = '0' then
q <= '0';
elsif falling_edge(clk) then
if sset = '1' then
q <= '1';
else
q <= d;
end if;
end if;
end process;
राइजिंग एज क्लॉक, अतुल्यकालिक सक्रिय उच्च रीसेट, अतुल्यकालिक सक्रिय कम सेट
नोट: सेट में रीसेट से अधिक प्राथमिकता है
process(clk, arst, asetn)
begin
if asetn = '0' then
q <= '1';
elsif arst = '1' then
q <= '0';
elsif rising_edge(clk) then
q <= d;
end if;
end process;
सिटकनी
सभी उदाहरणों में:
-
enसक्षम संकेत है, -
dइनपुट है, -
qउत्पादन है, -
srstएक सक्रिय उच्च तुल्यकालिक रीसेट है, -
srstnएक सक्रिय कम तुल्यकालिक रीसेट है, -
arstएक सक्रिय उच्च अतुल्यकालिक रीसेट है, -
arstnएक सक्रिय निम्न अतुल्यकालिक रीसेट है, -
ssetएक सक्रिय उच्च तुल्यकालिक सेट है, -
ssetnएक सक्रिय कम समकालिक सेट है, -
asetएक सक्रिय उच्च अतुल्यकालिक सेट है, -
asetnएक सक्रिय निम्न एसिंक्रोनस सेट है
सभी संकेत प्रकार के हैं ieee.std_logic_1164.std_ulogic । प्रयुक्त सिंटैक्स वह है जो सभी लॉजिक सिंथेसाइज़र के साथ सही संश्लेषण परिणामों की ओर जाता है। वैकल्पिक सिंटैक्स के बारे में चर्चा के लिए कृपया क्लॉक एज डिटेक्शन उदाहरण देखें।
सक्रिय उच्च सक्षम
process(en, d)
begin
if en = '1' then
q <= d;
end if;
end process;
सक्रिय कम सक्षम
process(en, d)
begin
if en = '0' then
q <= d;
end if;
end process;
सक्रिय उच्च सक्षम, तुल्यकालिक सक्रिय उच्च रीसेट
process(en, d)
begin
if en = '1' then
if srst = '1' then
q <= '0';
else
q <= d;
end if;
end if;
end process;
सक्रिय उच्च सक्षम, अतुल्यकालिक सक्रिय उच्च रीसेट
process(en, d, arst)
begin
if arst = '1' then
q <= '0';
elsif en = '1' then
q <= d;
end if;
end process;
सक्रिय कम सक्षम, अतुल्यकालिक सक्रिय कम रीसेट, तुल्यकालिक सक्रिय उच्च सेट
process(en, d, arstn)
begin
if arstn = '0' then
q <= '0';
elsif en = '0' then
if sset = '1' then
q <= '1';
else
q <= d;
end if;
end if;
end process;
सक्रिय उच्च सक्षम, अतुल्यकालिक सक्रिय उच्च रीसेट, अतुल्यकालिक सक्रिय कम सेट
नोट: सेट में रीसेट से अधिक प्राथमिकता है
process(en, d, arst, asetn)
begin
if asetn = '0' then
q <= '1';
elsif arst = '1' then
q <= '0';
elsif en = '1' then
q <= d;
end if;
end process;
घड़ी की धार का पता लगाने
लघुकथा
Whith VHDL 2008 और अगर घड़ी का प्रकार bit , boolean , ieee.std_logic_1164.std_ulogic या ieee.std_logic_1164.std_logic , बढ़ती बढ़त के लिए एक घड़ी किनारे का पता लगाया जा सकता है
-
if rising_edge(clock) then -
if clock'event and clock = '1' then -- type bit, std_ulogic or std_logic -
if clock'event and clock then -- type boolean
और गिरने वाले किनारे के लिए
-
if falling_edge(clock) then -
if clock'event and clock = '0' then -- type bit, std_ulogic or std_logic -
if clock'event and not clock then -- type boolean
यह अनुकरण और संश्लेषण दोनों के लिए अपेक्षित व्यवहार करेगा।
नोट: प्रकार
std_ulogicसंकेत पर एक बढ़ती हुई बढ़त की परिभाषा सरल से थोड़ी अधिक जटिल हैif clock'event and clock = '1' then। उदाहरण के लिए, मानकrising_edgeफ़ंक्शन की एक अलग परिभाषा है। यहां तक कि अगर यह शायद संश्लेषण के लिए कोई फर्क नहीं पड़ेगा, तो यह अनुकरण के लिए एक बना सकता है।
rising_edge और falling_edge मानक कार्यों के उपयोग को दृढ़ता से प्रोत्साहित किया जाता है। VHDL के पिछले संस्करणों के साथ इन कार्यों के उपयोग को स्पष्ट रूप से मानक संकुल के उपयोग की घोषणा करने की आवश्यकता हो सकती है (जैसे ieee.numeric_bit प्रकार के लिए bit या उन्हें एक कस्टम पैकेज में परिभाषित करने के लिए) भी।
ध्यान दें: गैर-घड़ी संकेतों के किनारों का पता लगाने के लिए
rising_edgeऔरfalling_edgeमानक कार्यों का उपयोग न करें। कुछ सिंथेसाइज़र यह निष्कर्ष निकाल सकते हैं कि संकेत एक घड़ी है। संकेत: गैर-घड़ी सिग्नल पर बढ़त का पता लगाना अक्सर शिफ्ट रजिस्टर में सिग्नल का नमूना लेने और शिफ्ट रजिस्टर के विभिन्न चरणों में नमूना मूल्यों की तुलना करके किया जा सकता है।
लंबी कहानी है
डी-फ्लिप-फ्लॉप (डीएफएफ) मॉडलिंग करते समय एक घड़ी सिग्नल के किनारों का पता लगाने का सही ढंग से वर्णन आवश्यक है। एक धार, परिभाषा के अनुसार, एक विशेष मूल्य से दूसरे में एक संक्रमण है। उदाहरण के लिए, हम टाइप bit के एक संकेत के बढ़ते किनारे (मानक VHDL प्रगणित प्रकार को परिभाषित कर सकते हैं जो दो मान लेता है: '0' और '1' ) '0' से '1' तक संक्रमण के रूप में। टाइप boolean हम इसे false से true संक्रमण के रूप में परिभाषित कर सकते हैं।
अक्सर, अधिक जटिल प्रकार का उपयोग किया जाता है। उदाहरण के लिए, ieee.std_logic_1164.std_ulogic प्रकार, भी एक एनुमरेटेड प्रकार है, जैसे bit या boolean , लेकिन इसमें 2 के बजाय 9 मान हैं:
| मूल्य | अर्थ |
|---|---|
'U' | अप्रारंभीकृत |
'X' | मजबूरन अज्ञात |
'0' | मजबूरन निम्न स्तर |
'1' | उच्च स्तर पर मजबूर करना |
'Z' | कड़ा मुकाबला |
'W' | अनजान |
'L' | कमजोर स्तर |
'H' | ऊँचा स्तर |
'-' | परवाह मत करो |
इस तरह के एक बढ़ते किनारे को परिभाषित करना bit या boolean तुलना में थोड़ा अधिक जटिल है। मसलन, हम यह तय कर सकते हैं कि यह '0' से '1' तक '0' संक्रमण है। लेकिन हम यह भी तय कर सकते हैं कि यह '0' या 'L' से '1' या 'H' संक्रमण है।
नोट: यह इस दूसरी परिभाषा यह है कि के लिए मानक का उपयोग करता है है
rising_edge(signal s: std_ulogic)समारोह में परिभाषितieee.std_logic_1164।
किनारों का पता लगाने के विभिन्न तरीकों पर चर्चा करते समय, संकेत के प्रकार पर विचार करना महत्वपूर्ण है। मॉडलिंग लक्ष्य को ध्यान में रखना भी महत्वपूर्ण है: केवल सिमुलेशन या तर्क संश्लेषण? आइए इसे कुछ उदाहरणों पर स्पष्ट करते हैं:
राइजिंग एज डीएफएफ टाइप बिट के साथ
signal clock, d, q: bit;
...
P1: process(clock)
begin
if clock = '1' then
q <= d;
end if;
end process P1;
तकनीकी रूप से, शुद्ध सिमुलेशन शब्दार्थ बिंदु पर, P1 मॉडल एक बढ़ती बढ़त को DFF ट्रिगर करता है। वास्तव में, q <= d असाइनमेंट निष्पादित किया जाता है यदि और केवल यदि:
-
clockबदल गई (यह वही है जो संवेदनशीलता सूची व्यक्त करती है) और -
clockका वर्तमान मूल्य'1'।
जैसे कि clock टाइप बिट की होती है और टाइप बिट में केवल '0' और '1' मान होता है, यह ठीक उसी प्रकार है जिसे हमने टाइप बिट के संकेत के बढ़ते किनारे के रूप में परिभाषित किया है। जैसा कि हम उम्मीद करते हैं, कोई भी सिम्युलेटर इस मॉडल को संभाल लेगा।
नोट: तर्क सिंथेसाइज़र के लिए, चीजें थोड़ी अधिक जटिल हैं, जैसा कि हम बाद में देखेंगे।
असिंक्रोनस एक्टिव हाई रिसेट और टाइप बिट के साथ राइजिंग एज डीएफएफ
हमारे DFF में एक अतुल्यकालिक सक्रिय उच्च रीसेट जोड़ने के लिए, कुछ इस तरह की कोशिश कर सकता है:
signal clock, reset, d, q: bit;
...
P2_BOGUS: process(clock, reset)
begin
if reset = '1' then
q <= '0';
elsif clock = '1' then
q <= d;
end if;
end process P2_BOGUS;
लेकिन यह काम नहीं करता है । q <= d असाइनमेंट को निष्पादित करने के लिए शर्त होनी चाहिए: reset = '0' दौरान clock की बढ़ती बढ़त reset = '0' । लेकिन हमने जो मॉडलिंग की है वह है:
-
clockयाresetया दोनों बदल गए और -
reset = '0'और -
clock = '1'
जो समान नहीं है: यदि clock = '1' reset '1' से '0' , तो clock = '1' असाइनमेंट निष्पादित किया जाएगा, जबकि यह clock की बढ़ती बढ़त नहीं है।
वास्तव में, VHDL में एक सिग्नल विशेषता की मदद के बिना इसे मॉडल करने का कोई तरीका नहीं है:
P2_OK: process(clock, reset)
begin
if reset = '1' then
q <= '0';
elsif clock = '1' and clock'event then
q <= d;
end if;
end process P2_OK;
clock'event सिग्नल clock लिए लागू सिग्नल विशेषता event है। यह एक boolean रूप में मूल्यांकन करता है और यह true कि केवल और केवल अगर सिग्नल clock चरण के दौरान सिग्नल clock बदल गई जो कि वर्तमान निष्पादन चरण से पहले थी। इसके लिए धन्यवाद, P2_OK अब पूरी तरह से मॉडल करें जो हम सिमुलेशन (और संश्लेषण) में चाहते हैं।
संश्लेषण शब्दार्थ
कई लॉजिक सिंथेसाइज़र सिंटैक्टिक पैटर्न के आधार पर सिग्नल एज डिटेक्शन की पहचान करते हैं, न कि वीएचडीएल मॉडल के शब्दार्थों पर। दूसरे शब्दों में, वे मानते हैं कि वीएचडीएल कोड कैसा दिखता है, न कि यह किस तरह का व्यवहार करता है। पैटर्न वे सभी को पहचानते हैं:
if clock = '1' and clock'event then
इसलिए, प्रक्रिया P1 के उदाहरण में भी हमें इसका उपयोग करना चाहिए यदि हम चाहते हैं कि हमारा मॉडल सभी तर्क सिंथेसाइज़र द्वारा संश्लेषित किया जाए:
signal clock, d, q: bit;
...
P1_OK: process(clock)
begin
if clock = '1' and clock'event then
q <= d;
end if;
end process P1_OK;
and clock'event हालत का हिस्सा संवेदनशीलता की सूची के साथ पूरी तरह से बेमानी है, लेकिन के रूप में कुछ सिंथेसाइज़र यह जरूरत है ...
एसिंक्रोनस एक्टिव हाई रिसेट और टाइप std_ulogic साथ राइजिंग एज DFF
इस मामले में, घड़ी के बढ़ते किनारे और रीसेट स्थिति को व्यक्त करना जटिल हो सकता है। यदि हम एक ऊपर उठने वाली बढ़त की परिभाषा को बनाए रखते हैं जिसे हमने ऊपर प्रस्तावित किया था और यदि हम मानते हैं कि रीसेट सक्रिय है अगर यह '1' या 'H' , तो मॉडल बन जाता है:
library ieee;
use ieee.std_logic_1164.all;
...
signal clock, reset, d, q: std_ulogic;
...
P4: process(clock, reset)
begin
if reset = '1' or reset = 'H' then
q <= '0';
elsif clock'event and
(clock'last_value = '0' or clock'last_value = 'L') and
(clock = '1' or clock = 'H') then
q <= d;
end if;
end process P4;
नोट:
'last_valueएक और सिग्नल विशेषता है जो सिग्नल को अंतिम मूल्य परिवर्तन से पहले मूल्य देता है।
हेल्पर कार्य करता है
VHDL 2008 मानक सिग्नल किनारों का पता लगाने को आसान बनाने के लिए कई सहायक कार्य प्रदान करता है, खासकर बहु-मूल्यवान एन्यूमरेटेड प्रकार जैसे std_ulogic । std.standard पैकेज को परिभाषित करता है rising_edge और falling_edge प्रकार पर काम करता है bit और boolean और ieee.std_logic_1164 प्रकार पर पैकेज परिभाषित करता है उन्हें std_ulogic और std_logic ।
नोट: वीएचडीएल के पिछले संस्करणों के साथ इन कार्यों के उपयोग के लिए मानक पैकेज (जैसे कि बिट के लिए ieee.numeric_bit) या यहां तक कि उन्हें उपयोगकर्ता पैकेज में परिभाषित करने के लिए स्पष्ट रूप से उपयोग करने की आवश्यकता हो सकती है।
आइए हम पिछले उदाहरणों को फिर से देखें और सहायक कार्यों का उपयोग करें:
signal clock, d, q: bit;
...
P1_OK_NEW: process(clock)
begin
if rising_edge(clock) then
q <= d;
end if;
end process P1_OK_NEW;
signal clock, d, q: bit;
...
P2_OK_NEW: process(clock, reset)
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
end process P2_OK_NEW;
library ieee;
use ieee.std_logic_1164.all;
...
signal clock, reset, d, q: std_ulogic;
...
P4_NEW: process(clock, reset)
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
end process P4_NEW;
नोट: इस अंतिम उदाहरण में हमने रीसेट पर परीक्षण को सरल भी किया। फ्लोटिंग, उच्च प्रतिबाधा, रीसेट काफी दुर्लभ हैं और, ज्यादातर मामलों में, यह सरलीकृत संस्करण सिमुलेशन और संश्लेषण के लिए काम करता है।
