मेरे पास 'std_logic_vector' प्रकार का दो आयामी मैट्रिक्स है जिसमें से मुझे 'std_logic_vector' प्रकार की एक (एक आयामी) सरणी निकालने के लिए एक कॉलम या लाइन को टुकड़ा करने की आवश्यकता है। मुझे VHDL2008 मानक का उपयोग करने में यह समस्या है। मुझे पता है कि नेस्टेड एरे मेरी समस्या का समाधान करेंगे, हालांकि मैट्रिस का उपयोग करने वाला कोई समाधान मौजूद होने पर मैं उत्सुक हूं।
मैट्रिक्स को केवल एक इंडेक्स देने की कोशिश करने से मुझे एक सरणी नहीं मिलती है, लेकिन परिणामस्वरूप एक त्रुटि होती है कि प्रकार को हल नहीं किया जा सकता है।
मैट्रिक्स की परिभाषा:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
package package1 is
type MATRIX_TYPE is array (natural range <>, natural range <>) of std_logic_vector;
type VECTOR_TYPE is array (natural range <>) of std_logic_vector;
end package1;
उपघटक की इकाई:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
library WORK;
use WORK.PACKAGE1.ALL;
entity subcomponent is
port (
input_vector : in VECTOR_TYPE;
);
end subcomponent;
architecture arch of subcomponent is
begin
end architecture;
शीर्ष घटक जहां समस्या होती है:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
library WORK;
use WORK.PACKAGE1.ALL;
entity component1 is
end entity;
architecture arch of component1 is
constant subcomponents : integer := 10;
signal matrix : MATRIX_TYPE (0 to subcomponents - 1, 0 to 15) (31 downto 0);
begin
SUBCOMPONENT_ARRAY : for i in 0 to subcomponents - 1 generate
subcomponent_i : entity work.subcomponent(arch)
port map (
input_vector => matrix(i) --matrix(i) does not work!
);
end generate;
end architecture;
2 जवाब
मुझे लगता है कि ऐसा कुछ काम कर सकता है:
SUBCOMPONENT_ARRAY : for i in 0 to subcomponents - 1 generate
block_label : block
signal temp_vector : VECTOR_TYPE(0 to 15) (31 downto 0);
begin
SUBVECTOR_ARRAY : for j in 0 to 15 generate
temp_vector(j) <= matrix(i,j);
end generate;
subcomponent_i : entity work.subcomponent(arch)
port map (
input_vector => temp_vector
);
end block block_label;
end generate;
आप मैट्रिक्स तत्वों को एक-एक करके निकालते हैं और उन्हें एक टेम्पोरल वेक्टर को असाइन करते हैं, फिर टेम्पोरल वेक्टर को सबकंपोनेंट में पास करते हैं।
दुर्भाग्य से, आप VHDL में 2+ D सरणी को स्लाइस नहीं कर सकते। तो आपको या तो आसान स्लाइसिंग के लिए नेस्टेड 1D सरणियों के साथ रहना होगा, या आप जो चाहते हैं उसे करने के लिए एक स्लाइसिंग फ़ंक्शन बनाना होगा।
function slice_row(m : MATRIX_TYPE; row : integer) return VECTOR_TYPE is
variable r : VECTOR_TYPE(m'range(2))(m'element'range);
begin
for i in r'range loop
r(i) := m(row, i);
end loop;
return r;
end function;
संबंधित सवाल
नए सवाल
matrix
गणित में, एक मैट्रिक्स (बहुवचन matrices) संख्याओं, प्रतीकों या अभिव्यक्तियों का एक आयताकार सरणी है, जिसे पंक्तियों और स्तंभों में व्यवस्थित किया जाता है। एक मैट्रिक्स में व्यक्तिगत वस्तुओं को इसके तत्व या प्रविष्टियां कहा जाता है।