Перейти к содержанию
    

SizeOf для массива в VHDL

Здравствуйте все!

У меня есть массив из std_logic_vector. Я его временами дописываю, так надо.

Есть ли способ получить в коде его размер? Вроде функции SizeOf в Паскале.

Заранее признателен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Аттрибутами" играться нужно (обычно помогают 'length и 'range).

Хоть бы привели объявление этого массива для определённости.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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"
    );

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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";

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не то я спросил, прошу прощения.

У меня массив векторов, который я по ходу дела дописываю. Каждый раз при увеличении размера приходится пересчитывать новые куски и править MemorySize. Это потому, что некий счётчик должен перебрать все векторы и остановиться на последнем, досчитав до MemorySize. Можно ли сделать так: я дописываю десяток-другой строк, а размер массива как-то определяется автоматически, и счётчик считает до этого определённого числа?

Заранее признателен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, DSIoffe said:

Можно ли сделать так: я дописываю десяток-другой строк, а размер массива как-то определяется автоматически, и счётчик считает до этого определённого числа?

динамические массивы, не синтезируемы, все равно при задании таблицы нужно задать ее размер. И если 'length не устраивает, то что мешает сделать размер таблицы априори большем и поставить в данные метку последнего слова? Остальные данные занулить по others

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, des00 сказал:

динамические массивы, не синтезируемы

Понял, спасибо. Метку в данные я понимаю. Думал, найдётся другой способ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, DSIoffe said:

Понял, спасибо. Метку в данные я понимаю. Думал, найдётся другой способ.

если бы у вас был SV, то можно было бы сделать через enum, с задаваемыми значениями полей, там есть методы first/last/next/prev/num(), правда не факт что на сегодня что-то может это синтезировать корректно. Но в VHDL, насколько помню, ничего такого нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется, надо просто завести обычный текстовый файл с данными, куда новые поля дописываются по мере необходимости. А для верилога написать генератор на перле или тикле, который указанный файл парсит, измеряет разрядность и размер, и генерит соответствующий верилог.

Геренатор просто вставить во флоу в месте сборки проекта.

Изменено пользователем Aleх

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

41 минуту назад, Самурай сказал:

но разве нельзя сделать вот как-то так?

Вроде тут читаются только первый и последний векторы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, DSIoffe сказал:

Вроде тут читаются только первый и последний векторы?

Это просто пример использования unconstrained массивов и работы с атрибутами. И ничего более. Почему-то был уверен, что это очевидно...  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На сколько понял, Вашу задачу - я бы завел некоторое количество счетчиков, которые бы следили за фактичеким состоянием буфера. Что-то вроде как в FIFO. А сам массив завел сразу достаточно большим, с учетом максимально возможной загрузки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10.12.2021 в 17:48, Dr.Alex сказал:

X"000"

Кстати, Modelsim на такую запись ругается:

Length of expected is 9; length of actual is 12.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, DSIoffe said:

Кстати, Modelsim на такую запись ругается:

Length of expected is 9; length of actual is 12.

Используйте 9х"000".

Самурай правильно говорит, создаёте анконстрэйнд массив, инициализируете, затем атрибутом забираете его размер в константу memorysize

Изменено пользователем Strob

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...