मैं एक लूप के भीतर एक चर बढ़ाना चाहता हूं, जो मुझे इंगित करता है कि वेक्टर के भीतर एक सशर्त कथन कितनी बार सत्य होता है। यह जानकर कि वीएचडीएल में लूप के लिए समानांतर उदाहरण बनाता है, क्या यह संभव है कि ये "एक्सेस" एक चर हो? निम्नलिखित परिदृश्य को ध्यान में रखते हुए, जो अनुकरण में पूरी तरह से ठीक काम करता है, मुझे संदेह है कि यह वास्तविकता में भी काम करता है। क्या कोई स्पष्ट कर सकता है कि यह वास्तव में कैसे काम करता है?

variable_p : process(clk)
 variable var : integer;
begin
  if rising_edge(clk) then
    var := 0;
    for i in 0 to 7 loop
      if some_vector(i) = '1' then
        var := var + 1;
        other_vector(var) <= '1';
      end if;
    end loop;
  end if;

अपडेट करें

मैंने निम्नलिखित डिजाइन को संश्लेषित किया:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity var_p is
  Port (
    clk : in std_logic;
    some_vector : in std_logic_vector( 7 downto 0 );
    other_vector : out std_logic_vector( 7 downto 0 )
  );
end var_p;

architecture Behavioral of var_p is
begin
  var_p : process( clk )
    variable var : integer range 0 to 7;
  begin
    if rising_edge( clk ) then
      var := 0;
      for i in some_vector'range loop
        if some_vector(i) = '1' then
          var := var + 1;
          other_vector(var) <= '1';
        end if;
      end loop;
    end if;
  end process;
end Behavioral;

इसका परिणाम प्रत्येक other_vector तत्व के लिए एक LUT में होता है जो कई some_vector तत्व [1] को इनपुट के रूप में लेता है। इससे मैं यह निष्कर्ष निकालूंगा कि वास्तव में var प्रत्येक '1' के लिए some_vector में 'वृद्धि' हो जाता है। अब मैं यह भी बेहतर ढंग से समझता हूं कि एलयूटी कॉन्फ़िगरेशन को निर्धारित करने के लिए एक चर सिर्फ एक सहायक निर्माण है और कुछ भी संश्लेषित नहीं होता है। लेकिन अगर मैं यहां गलत हूं तो कृपया मुझे सुधारें, क्योंकि मैं अभी भी एक सौ प्रतिशत निश्चित नहीं हूं। यदि मेरे हाथ में बोर्ड आता है तो मैं अपने अवलोकनों को वास्तविकता में सत्यापित करने का प्रयास करूंगा।

[1] https://imgur.com/a/pBL0Diy

2
ARude 4 मई 2018, 19:35

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि मुझे अंततः अपना बेसिस 3 बोर्ड मिला, मैं डिजाइन को आजमा सकता था। वास्तव में संश्लेषित और कार्यान्वित डिजाइन वांछित के रूप में काम करता है:

other_vector में '1' संख्या some_vector में '1' की संख्या के ठीक समान है।

अपने परीक्षण में मैंने इनपुट वेक्टर को स्विच और आउटपुट वेक्टर को एल ई डी से जोड़ा (नीचे देखें)।

यह पुष्टि करता है कि लूप वर के प्रत्येक 'पुनरावृत्ति' में प्रत्येक तत्व के लिए वृद्धि की जाती है जो '1' है।

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity var_p is
  Port (
    CLK100MHZ : in std_logic;
    sw : in std_logic_vector( 15 downto 0 );
    LED : out std_logic_vector( 15 downto 0 )
  );
end var_p;

architecture Behavioral of var_p is
begin
  var_p : process( CLK100MHZ )
    variable var : integer range 0 to 15;
  begin
    if rising_edge( CLK100MHZ ) then
      var := 0;
      LED <= ( others => '0' );
      for i in SW'range loop
        if sw( i ) = '1' then
          var := var + 1;
          LED( var ) <= '1';
        end if;
      end loop;
    end if;
  end process;
end Behavioral;
1
ARude 5 मई 2018, 17:08