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

Адресация BRAM

Здравствуйте, я новичек, прошу вашей помощи.

На Spartan6 создал ядро MicroBlaze и контроллер памяти BRAM, один порт которого смотрит в MicroBlaze, второй доступен в ПЛИС.

Из софт ядра я пишу данные в BRAM, а в ПЛИС соответственно мне представлен интерфейс для работы с памятью:

component microblaze is
    port (
      fpga_0_clk_1_sys_clk_pin : in std_logic;
      fpga_0_rst_1_sys_rst_pin : in std_logic;
      custom_bram_block_0_BRAM_Rst_B_pin : in std_logic;
      custom_bram_block_0_BRAM_Clk_B_pin : in std_logic;
      custom_bram_block_0_BRAM_EN_B_pin : in std_logic;
      custom_bram_block_0_BRAM_WEN_B_pin : in std_logic_vector(3 downto 0);
      custom_bram_block_0_BRAM_Addr_B_pin : in std_logic_vector(31 downto 0);
      custom_bram_block_0_BRAM_Din_B_pin : out std_logic_vector(31 downto 0);
      custom_bram_block_0_BRAM_Dout_B_pin : in std_logic_vector(31 downto 0)
    );
  end component;

 

Здесь шина адреса BRAM_Addr_B_pin является вектором и вопрос в том, как мне в этот вектор записывать различные адреса, ведь напрямую подставлять нельзя, возникает ошибка "Signal ... is connected to following multiple drivers"

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


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

Здравствуйте, я новичек, прошу вашей помощи.

На Spartan6 создал ядро MicroBlaze и контроллер памяти BRAM, один порт которого смотрит в MicroBlaze, второй доступен в ПЛИС.

Из софт ядра я пишу данные в BRAM, а в ПЛИС соответственно мне представлен интерфейс для работы с памятью:

component microblaze is
    port (
      fpga_0_clk_1_sys_clk_pin : in std_logic;
      fpga_0_rst_1_sys_rst_pin : in std_logic;
      custom_bram_block_0_BRAM_Rst_B_pin : in std_logic;
      custom_bram_block_0_BRAM_Clk_B_pin : in std_logic;
      custom_bram_block_0_BRAM_EN_B_pin : in std_logic;
      custom_bram_block_0_BRAM_WEN_B_pin : in std_logic_vector(3 downto 0);
      custom_bram_block_0_BRAM_Addr_B_pin : in std_logic_vector(31 downto 0);
      custom_bram_block_0_BRAM_Din_B_pin : out std_logic_vector(31 downto 0);
      custom_bram_block_0_BRAM_Dout_B_pin : in std_logic_vector(31 downto 0)
    );
  end component;

 

Здесь шина адреса BRAM_Addr_B_pin является вектором и вопрос в том, как мне в этот вектор записывать различные адреса, ведь напрямую подставлять нельзя, возникает ошибка "Signal ... is connected to following multiple drivers"

 

А какие following multiple drivers ? Могу только предположить, что система вывела адрес на внешний пин и вставила туда буфер ввода, который замыкается с вашим сигналом.

 

 

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


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

А какие following multiple drivers ? Могу только предположить, что система вывела адрес на внешний пин и вставила туда буфер ввода, который замыкается с вашим сигналом.

 

ну вот я например хочу читать сперва по одному адресу

BRAM_Addr <= x"81818010";

 

а потом по другому

BRAM_Addr <= x"818180120";

 

вот и получается multiple drivers.

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


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

ну вот я например хочу читать сперва по одному адресу

BRAM_Addr <= x"81818010";

 

а потом по другому

BRAM_Addr <= x"818180120";

 

вот и получается multiple drivers.

 

Покажите лучше код, так будет понятнее.

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


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

Покажите лучше код, так будет понятнее.

process (trigger)
    if trigger = '1' and trigger'event then
        BRAM_En <= '1';
        BRAM_WEN <= b"0000";
        
        BRAM_Addr <= x"81818010";
        noise_mask (31 downto 0) <= BRAM_Dout;

        BRAM_Addr <= x"81818014";
        noise_mask (63 downto 32) <= BRAM_Dout;
        
        BRAM_Addr <= x"81818018";
        noise_mask (95 downto 64) <= BRAM_Dout;
        
        BRAM_Addr <= x"8181800С";
        noise_mask (127 downto 96) <= BRAM_Dout;
    end if;
end process;

 

хочу по разным адресам из BRAM считать значения и записать их в вектор noise_mask, но вектору BRAM_Addr можно присваивать только один источник, о чем говорит синтезатор.

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


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

process (trigger)
    if trigger = '1' and trigger'event then
        BRAM_En <= '1';
        BRAM_WEN <= b"0000";
        
        BRAM_Addr <= x"81818010";
        noise_mask (31 downto 0) <= BRAM_Dout;

        BRAM_Addr <= x"81818014";
        noise_mask (63 downto 32) <= BRAM_Dout;
        
        BRAM_Addr <= x"81818018";
        noise_mask (95 downto 64) <= BRAM_Dout;
        
        BRAM_Addr <= x"8181800С";
        noise_mask (127 downto 96) <= BRAM_Dout;
    end if;
end process;

 

хочу по разным адресам из BRAM считать значения и записать их в вектор noise_mask, но вектору BRAM_Addr можно присваивать только один источник, о чем говорит синтезатор.

 

Код, мягко говоря, странный. Если одному и тому же сигналу в процессе присваиваются разные значения, то на выходе он будет иметь последнее из присвоенных, остальные проигнорируются, т.е то, что вы пытаетесь сделать таким образом не описывается. Но с другой стороны это не должно давать ошибку, возможно вы еще где-то используете этот сигнал?

 

По поводу того, как сделать то, что вы пытаетесь, сделайте либо стейт-машину, либо заведите в процессе счетчик от нуля до 3 и свяжите его с выставляемым адресом. Кроме того, лучше все сделать на каком-нибудь клоке, а не как у вас. На клоке выделить нужный фронт, по нему запустить счетчик, последовательно опросить адреса, затем через ЗАДЕРЖКУ памяти записать значения, выдать флаг готовности. Ну или как-то так.

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


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

Мне не понятна суть вопроса?

 

Я создавал контроллер BRAM и двухпортовую память на BRAM.

Один порт к Microblaze второй к ПЛИС.

Eclips создает файл заголовков в котором есть базовый адрес BRAM.

 

Создаете указатель на базовый адрес и обращаетесь по нему.

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


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

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

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

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

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

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

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

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

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

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