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

Qsys - вопрос по распределению адресного пространства

Добрый день всем. Вот решил немного "поковырять" Qsys, чтобы посмотреть что за зверь такой. Решил идти от простого - создание своих простеньких пользовательских компонентов (Master и Slave), дабы разобраться в спецификации интерфейса Avalon. Так вот создал я два компонента:

1. Slave - представляет собой память с интерфейсом:

 

entity ram is
    port 
    (
            clk              : in std_logic;
                reset           : in std_logic;
            rd               : in std_logic;
            wr               : in std_logic;
            address       : in std_logic_vector(7 downto 0);
            wrdata        : in std_logic_vector(31 downto 0);
            rddata         : out std_logic_vector(31 downto 0);
            waitrequest  : out std_logic
    );
end entity;

 

2. Master - представляет собой FSM, который будет записывать/вычитывать данные из подчиненного устройства по некоторому (неважно какому алгоритму). Интерфес Master`а:

 

entity master is     
    port
    (
        clk               : in std_logic;
        reset            : in std_logic;
        waitrequest  : in    std_logic;
        rddata          : in std_logic_vector(31 downto 0);
        rd                : out std_logic;
        wr                : out std_logic;
        address        : out std_logic_vector(7 downto 0);
        wrdata         : out std_logic_vector(31 downto 0);
                q_out           : out std_logic_vector(31 downto 0)   -- будет Conduit
    );    
end entity master;

 

Так вот вопрос самый первый. Почему при добавлении RAM (slave) Qsys определяет для него адресное пространство в пределах от 0x00000000 - 0x000003FF? Вроде как разрядность адреса (8 бит) не позволяет адресоваться в пределах заданного адресного пространства. Понимаю, что, возможно, ответ на вопрос лежит где-то в этом куске спецификации для сигнала address, но пока не могу понять:

 

For masters, the address signal represents a byte address. The

value of the address must be aligned to the data width. To write to

specific bytes within a data word, the master must use the

byteenable signal.

For slaves, the interconnect translates the byte address into a

word address in the slave’s address space so that each slave

access is for a word of data from the perspective of the slave. For

example, address= 0 selects the first word of the slave and

address 1 selects the second word of the slave.

 

Необходимо ли в моем проекте сигнал byteenable (вернее так: является ли он обязательным?).

Пока это первые вопросы. Хотелось бы получить на них ответ, а потом идти уже дальше.

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


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

Так вот вопрос самый первый. Почему при добавлении RAM (slave) Qsys определяет для него адресное пространство в пределах от 0x00000000 - 0x000003FF? Вроде как разрядность адреса (8 бит) не позволяет адресоваться в пределах заданного адресного пространства.

у вас 256 32-битных слов, как раз 1024 байта

Необходимо ли в моем проекте сигнал byteenable (вернее так: является ли он обязательным?).

нет, не обязательно.

 

а изучение шины лучше начинать со спецификаций, там про все сигналы и их (не)нужность сказано

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


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

у вас 256 32-битных слов, как раз 1024 байта

 

Да, спасибо, тут я немножко сам "протупил", запутался в разрядности шины адреса и забыл про разрядность хранимых данных.

 

нет, не обязательно.

 

а изучение шины лучше начинать со спецификаций, там про все сигналы и их (не)нужность сказано

 

Вроде как со спецификации и начал.

 

Столкнулся еще с одной проблемой - при задании разрядности шины данных и шины адреса (writedata, readdata, address) через параметры (в секции GENERIC) для пользовательского компонента. Например так:

 

entity ram is
    generic 
    (
        DATA_WIDTH : natural := 32;
        ADDR_WIDTH : natural := 8
    );
    port 
    (
                ................................................................
        address    : in std_logic_vector(ADDR_WIDTH-1 downto 0);
        wrdata    : in std_logic_vector(DATA_WIDTH-1 downto 0);
        rddata    : out std_logic_vector(DATA_WIDTH-1 downto 0);
        .................................................................
    );
end entity;

 

Получаю в QSys ошибку:

 

Error: avalon_slave_0: Signal rddata[-1] must be a multiple of the symbol width 8

Error: avalon_slave_0: Signal wrdata[-1] must be a multiple of the symbol width 8

 

Хотя на вкладке HDL-parametres параметры отображаются корректно...

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


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

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

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

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

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

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

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

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

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

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