लॉजिक डिज़ाइन पाठ्यक्रमों में हम सभी ने यह सीखा कि लॉजिक फ़ंक्शन को कम करना संभव है, उदाहरण के लिए कर्णघ मानचित्र या क्वीन-मैकक्लूस्की एल्गोरिथ्म का उपयोग करके । हमने यह भी सीखा कि " डोन्ट केयर" मूल्य न्यूनतम क्षमता को बढ़ाते हैं।
उदाहरण के लिए एक रजिस्टर फ़ाइल लें। write_address
और write_data
संकेत वास्तव में कोई फर्क नहीं है जब write_enable
संकेत है '0'
। इस प्रकार, उन्हें इन संकेतों को चलाने वाले तर्क में अधिक अनुकूलन की अनुमति देने के लिए "डोन्ट केयर" मान सौंपा जाना चाहिए (अर्थात रजिस्टर फाइल में ही नहीं)।
VHDL में ऐसे "डोन्ट केयर" मूल्यों को निर्दिष्ट करने का सही तरीका क्या है ताकि संभावित अनुकूलन के लिए संश्लेषण उपकरण को अधिक जगह मिल सके?
अब तक मुझे निम्नलिखित चीजें मिली हैं जो उपयुक्त हो सकती हैं। लेकिन मुझे वास्तव में यकीन नहीं है कि प्रत्येक दृष्टिकोण के पेशेवरों और विपक्ष क्या हैं:
- बस संकेत नहीं दे रहा है। ऐसा लगता है कि यह काम कर सकता है। हालाँकि मैंने पाया कि यह तब काम नहीं करता है जब आप कुछ
record
प्रकार के "कुछ भी नहीं करना चाहते हैं" को परिभाषित करना चाहते हैं , क्योंकि रिकॉर्ड स्थिरांक को पूरी तरह से निर्दिष्ट करने की आवश्यकता है (कम से कम मॉडलिम मुझे ऐसा बताता है)। std_logic_1164
पैकेज मूल्य को परिभाषित करता है'-' -- Don't care
के लिएstd_ulogic
। ऐसा लगता है कि यह एक स्पष्ट "परवाह नहीं" के लिए शब्दार्थ सही विकल्प है, लेकिन मैंने इसे कभी भी कहीं भी इस्तेमाल नहीं किया है (असंबंधित VHDL-2008case?
निर्माणों को छोड़कर )।- मॉडलिम
'X'
अपरिभाषित संकेतों को प्रदर्शित करने के लिए मूल्य का उपयोग करता है। हालांकि मुझे यकीन नहीं है कि अगर संश्लेषण उपकरण एक स्पष्ट-समझ को समझते हैं,'X'
तो "परवाह न करें"।
यहाँ स्पष्टीकरण के लिए एक ओवरसाइम्प्लिफ़ाइड कोड स्निपेट है, जहाँ मैंने आरंभिक संकेतों की देखभाल नहीं की है '-'
।
आप देख सकते हैं, संकेत control.reg_write_address
3 अलग मान हो सकते हैं: "----"
, instruction(11 downto 8);
और instruction(3 downto 0);
। अब मैं उम्मीद करता हूँ कि इसे 2-इनपुट मल्टीप्लेक्स के लिए संश्लेषित किया जाए अगर '-'
इसे "परवाह न करें" के रूप में व्याख्या की जाए। अगर मैंने (others => '0')
इसके बजाय सिग्नल को इनिशियलाइज़ किया था '-'
, तो टूल को इसके बजाय 3-इनपुट मल्टीप्लेक्स उत्पन्न करना होगा।
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package mytypes is
type control_signals_t is record
write_enable : std_logic;
write_address : std_ulogic_vector(3 downto 0);
read_address : std_ulogic_vector(3 downto 0);
end record;
-- All members of this constant must be fully specified.
-- So it's not possible to simply not assign a value.
constant CONTROL_NOP : control_signals_t := (
write_enable => '0',
write_address => (others => '-'),
read_address => (others => '-')
);
end package;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library cfx;
use cfx.mytypes.all;
entity control_unit is
port(
instruction : in std_ulogic_vector(15 downto 0);
write_data : out std_ulogic_vector(15 downto 0);
ctrl : out control_signals_t
);
end entity;
architecture rtl of control_unit is
begin
decode_instruction : process(instruction) is
begin
-- Set sensible default values that do nothing.
-- Especially all "write_enable" signals should be '0'.
-- Everything else is mostly irrelevant (don't care).
ctrl <= CONTROL_NOP;
write_data <= (others => '-');
if instruction(15 downto 12) = "1100" then
-- Load 8 bit of data into the register file
ctrl.write_enable <= '1';
write_data <= std_ulogic_vector(resize(signed(instruction(7 downto 0)), 16));
ctrl.write_address <= instruction(11 downto 8);
elsif instruction(15 downto 8) = "11111001" then
-- Load 4 bit of data into the register file
write_data <= std_ulogic_vector(resize(signed(instruction(7 downto 4)), 16));
ctrl.write_address <= instruction(3 downto 0);
elsif instruction(15 downto 8) = "10110101" then
-- Read from the register file. Don't use the write signals at all.
ctrl.read_address <= instruction(3 downto 0);
end if;
end process;
end architecture;
write_address
औरwrite_data
? आप किस अनुकूलन की उम्मीद करते हैं?