DSIoffe 2 10 декабря, 2021 Опубликовано 10 декабря, 2021 · Жалоба Здравствуйте все! У меня есть массив из std_logic_vector. Я его временами дописываю, так надо. Есть ли способ получить в коде его размер? Вроде функции SizeOf в Паскале. Заранее признателен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 10 декабря, 2021 Опубликовано 10 декабря, 2021 · Жалоба "Аттрибутами" играться нужно (обычно помогают 'length и 'range). Хоть бы привели объявление этого массива для определённости. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DSIoffe 2 10 декабря, 2021 Опубликовано 10 декабря, 2021 · Жалоба 1 час назад, Dr.Alex сказал: Хоть бы привели объявление этого массива для определённости. Легко. constant MemorySize : natural := 10; subtype InputType is std_logic_vector(8 downto 0); --hs_en & data_in type InputArray is array (0 to MemorySize - 1) of InputType; constant InputData : InputArray := ( '0' & X"00", '1' & X"00", '1' & X"00", '1' & X"00", '1' & X"00", '1' & X"00", '1' & X"B0", '1' & X"00", '1' & X"00", '1' & X"2H" ); Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 10 декабря, 2021 Опубликовано 10 декабря, 2021 · Жалоба 1) Я бы написал короче: constant MemorySize : natural := 10; type InputArray is array (0 to MemorySize - 1) of std_logic_vector (8 downto 0); constant InputData : InputArray := (X"000", X"100", X"100", X"100", X"100", X"100", X"1B0", X"100", X"100", X"12F" ); 2) Если constant MemorySize : natural := 10; объявить в пэкидже, то она будет видна везде, и уже не нужно будет никаких сайзофов. 3) InputData'length будет равно 10, а InputData'range будет равно строке "0 to 9". То есть можно использовать: signal test1 : integer range 0 to InputData'length; signal test2 : std_logic_vector (InputData'range) := "1010101010"; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DSIoffe 2 13 декабря, 2021 Опубликовано 13 декабря, 2021 · Жалоба Не то я спросил, прошу прощения. У меня массив векторов, который я по ходу дела дописываю. Каждый раз при увеличении размера приходится пересчитывать новые куски и править MemorySize. Это потому, что некий счётчик должен перебрать все векторы и остановиться на последнем, досчитав до MemorySize. Можно ли сделать так: я дописываю десяток-другой строк, а размер массива как-то определяется автоматически, и счётчик считает до этого определённого числа? Заранее признателен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 13 декабря, 2021 Опубликовано 13 декабря, 2021 · Жалоба 3 minutes ago, DSIoffe said: Можно ли сделать так: я дописываю десяток-другой строк, а размер массива как-то определяется автоматически, и счётчик считает до этого определённого числа? динамические массивы, не синтезируемы, все равно при задании таблицы нужно задать ее размер. И если 'length не устраивает, то что мешает сделать размер таблицы априори большем и поставить в данные метку последнего слова? Остальные данные занулить по others Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DSIoffe 2 13 декабря, 2021 Опубликовано 13 декабря, 2021 · Жалоба 2 минуты назад, des00 сказал: динамические массивы, не синтезируемы Понял, спасибо. Метку в данные я понимаю. Думал, найдётся другой способ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 13 декабря, 2021 Опубликовано 13 декабря, 2021 · Жалоба 3 minutes ago, DSIoffe said: Понял, спасибо. Метку в данные я понимаю. Думал, найдётся другой способ. если бы у вас был SV, то можно было бы сделать через enum, с задаваемыми значениями полей, там есть методы first/last/next/prev/num(), правда не факт что на сегодня что-то может это синтезировать корректно. Но в VHDL, насколько помню, ничего такого нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 13 декабря, 2021 Опубликовано 13 декабря, 2021 · Жалоба 1 час назад, DSIoffe сказал: Можно ли сделать так: я дописываю десяток-другой строк, а размер массива как-то определяется автоматически, и счётчик считает до этого определённого числа? Давно не брал в руки VHDL, но разве нельзя сделать вот как-то так? library ieee; use ieee.std_logic_1164.all; entity test_1 is port ( clk : in std_logic; abeg : in std_logic; aend : in std_logic; q : out std_logic_vector(7 downto 0) ); end entity; architecture rtl of test_1 is type test_type is array (positive range <>) of std_logic_vector (7 downto 0); constant test_array : test_type := (x"11", x"12", x"23", x"35"); begin process(clk) begin if(rising_edge(clk)) then if(aend = '1') then q <= test_array(test_array'right); elsif (abeg = '1') then q <= test_array(test_array'left); end if; end if; end process; end rtl; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Avex 1 13 декабря, 2021 Опубликовано 13 декабря, 2021 (изменено) · Жалоба Мне кажется, надо просто завести обычный текстовый файл с данными, куда новые поля дописываются по мере необходимости. А для верилога написать генератор на перле или тикле, который указанный файл парсит, измеряет разрядность и размер, и генерит соответствующий верилог. Геренатор просто вставить во флоу в месте сборки проекта. Изменено 13 декабря, 2021 пользователем Aleх Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DSIoffe 2 13 декабря, 2021 Опубликовано 13 декабря, 2021 · Жалоба 41 минуту назад, Самурай сказал: но разве нельзя сделать вот как-то так? Вроде тут читаются только первый и последний векторы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 13 декабря, 2021 Опубликовано 13 декабря, 2021 · Жалоба Только что, DSIoffe сказал: Вроде тут читаются только первый и последний векторы? Это просто пример использования unconstrained массивов и работы с атрибутами. И ничего более. Почему-то был уверен, что это очевидно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slkhome 0 13 декабря, 2021 Опубликовано 13 декабря, 2021 · Жалоба На сколько понял, Вашу задачу - я бы завел некоторое количество счетчиков, которые бы следили за фактичеким состоянием буфера. Что-то вроде как в FIFO. А сам массив завел сразу достаточно большим, с учетом максимально возможной загрузки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DSIoffe 2 14 декабря, 2021 Опубликовано 14 декабря, 2021 · Жалоба 10.12.2021 в 17:48, Dr.Alex сказал: X"000" Кстати, Modelsim на такую запись ругается: Length of expected is 9; length of actual is 12. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 14 декабря, 2021 Опубликовано 14 декабря, 2021 (изменено) · Жалоба 2 hours ago, DSIoffe said: Кстати, Modelsim на такую запись ругается: Length of expected is 9; length of actual is 12. Используйте 9х"000". Самурай правильно говорит, создаёте анконстрэйнд массив, инициализируете, затем атрибутом забираете его размер в константу memorysize Изменено 14 декабря, 2021 пользователем Strob Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться