Jump to content

    
DSIoffe

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

Recommended Posts

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites
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"
    );

Спасибо.

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
3 minutes ago, DSIoffe said:

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

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

Share this post


Link to post
Share on other sites
2 минуты назад, des00 сказал:

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

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

Share this post


Link to post
Share on other sites
3 minutes ago, DSIoffe said:

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

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

Share this post


Link to post
Share on other sites
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;

 

Share this post


Link to post
Share on other sites

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

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

Edited by Aleх

Share this post


Link to post
Share on other sites
41 минуту назад, Самурай сказал:

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

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

Share this post


Link to post
Share on other sites
Только что, DSIoffe сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
2 hours ago, DSIoffe said:

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

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

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

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

Edited by Strob

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.