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

Есть проект в нем 5 модулей памяти (в нем выведены просто порты памятей наружу), мне необходимо читать и писать из/в них. Желательно c возможностью выбора памяти с которой работаю. Сделал genericmux.vhd который работает как мультиплексор и конвертирует так сказать шину avalon MM в сигналы управления памяти, т.е. сигналы портов памяти с возможностью писать и читать данные. Мультиплексор переключается перед началом передачи данных.

Поскажите в чем может быть ошибка в описании или tcl скрипте?

ЗЫ Здесь задумался про латентность, у меня данные не на следующем такте а через такт появляются...


 

genericmux.vhd genericmux_hw.tcl

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


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

а что-то не работает или как ? но вообще, судя по тому что вы описываете, вам нужно маленький shared bus описать, латентность и регистровые слои которого, по вашему выбору)

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


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

В том то и дело, что проверил не работает..

Да мне надо описать прослойку avalon MM - 5 портов памяти...

В tcl скрипте не подскажите где прописать латентность/задержку?

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


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

7 minutes ago, Maverick_ said:

В tcl скрипте не подскажите где прописать латентность/задержку?

чего не знаю, того не знаю) такие вещи я руками обычно пишу)

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


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

Так я руками написал модуль ...

Что еще нужно написать ? Помогите понять что не так

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


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

9 minutes ago, Maverick_ said:

Так я руками написал модуль ...

Что еще нужно написать ? Помогите понять что не так

 

1. Я бы для начала сделал его полностью асинхронным, чисто мультиплексоры.

2. Там где "case select_write is" с логикой проблемы. При переходе в case из одного состояния в другое будут храниться старые значения, а не устанавливаться 0. Может и еще где.

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


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

Приветствую!

29 minutes ago, Maverick_ said:

Что еще нужно написать ? Помогите понять что не так

Нам бы для начала  самим понять что вы понять хотите :scratch_one-s_head:

Это не то что вам надо ? Думаю вам тут надо  поставить реальное число  задержки при чтении.

set_interface_property avalon_slave_input readLatency 0

Удачи! Rob.

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


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


Простое любопытство

Кто-то сравнивал работу dma

В burst и обычном блочном режиме, когда читаешь или пишешь блоками данных???

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


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

On 6/13/2020 at 12:56 AM, Maverick_ said:

В burst и обычном блочном режиме, когда читаешь или пишешь блоками данных???

речь про альтеру? dma вроде и подразмивает пересылку блоками/кусками через контроллер dma

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

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


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

Допустим альтера. 

Бурст режим тоже подразумевает работу с блоками данных

Есть предложение что

В блочном вроде быстрее, но данных должно быть много. Если маленькие пакеты и не часто то лучше burst

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


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

Приветствую!

21 minutes ago, Maverick_ said:

Бурст режим тоже подразумевает работу с блоками данных

Вы как то путаете масло (сливочное) с маслом (машинным)  :unknw:.  Бурст - это режим передачи данных по адресуемой шине при котором на один цикл адреса передается несколько слов данных. К DMA как то напрямую не имеет отношения.  
Что вы подразумеваете под "блочным  режимом DMA"  можно только догадываться  - может вы имели ввиду  scatter-gather режим DMA? В противовес "обычному" однократно - программируемому?

 

Удачи! Rob.

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


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

Сделал прослойку (genericmux.vhd) между одним портом блочных памятей HDL  (пример описания блочной памяти bram_tpd.vhd) проекта и процессором на шине авалон MM

Пытаюсь читать и писать в них...

Во вложении скрин результата чтения и записи...

Такое ощущение что ему не хватает такта или где-то проблема с адресами... 

Помогите пожалуйста разобраться...

Числа я пишу по порядку...

 

 

как мысль:  Возможно в проблема, что не хватает сигнала chipselect?
если добавить в genericmux.vhd (new_component_0 в qsys) :

  wr_en_0 <= '1' when avs_s0_write ='1' and chipselect_s0 ='1' else '0';
  
 и тогда  для одного порта будет
 
   process(avs_s0_read, avs_s0_write)
 begin
--  if rst = '1' then
-- we_commands <= '0';
-- elsif(rising_edge(clk)) then
 if avs_s0_read = '1' then
     we_commands <= '0';
 elsif avs_s0_write = '1' and wr_en_0 = '1' then
    we_commands <= '1';
 else 
    we_commands <= '0';
 end if;
 addr_commands <= avs_s0_address;
 data_in_commands  <= avs_s0_writedata;
 avs_s0_readdata <= data_out_commands;
 --end if;
 end process;
 
 тогда интерфейс авалон порта будет иметь вид:
    avs_s0_read : in std_logic;
    avs_s0_write : in std_logic;
    chipselect_s0 : in std_logic;
    avs_s0_address : in std_logic_vector((ADDR_LENGTH-1) downto 0);
    avs_s0_writedata : in std_logic_vector((DATA_LENGTH-1) downto 0);
    avs_s0_readdata : out std_logic_vector((DATA_LENGTH-1) downto 0);
и так сделать для всех 7 портов...

 

genericmux_hw.tcl genericmux.vhd bram_tpd.vhd

c5a476a0-212f-4b07-934d-560ff7f0bb79.jpg

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


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

В асинхронном процессе в списке чувствительности должны быть указаны все входные сигналы, иначе вам синтезатор вместо комбинаторике сделает latch. У вас там как минимум не хватает wr_en_0.

 addr_commands <= avs_s0_address;
 data_in_commands  <= avs_s0_writedata;
 avs_s0_readdata <= data_out_commands;
 

надо вынести из процесса.

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


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

1 hour ago, andrew_b said:

В асинхронном процессе в списке чувствительности должны быть указаны все входные сигналы, иначе вам синтезатор вместо комбинаторике сделает latch. У вас там как минимум не хватает wr_en_0.


 addr_commands <= avs_s0_address;
 data_in_commands  <= avs_s0_writedata;
 avs_s0_readdata <= data_out_commands;
 

надо вынести из процесса.

Спасибо. Не знал, всегда думал что список чувствительности влияет только на симуляцию. Такое описание:

   process(avs_s0_read, avs_s0_write)
 begin
--  if rst = '1' then
-- we_commands <= '0';
-- elsif(rising_edge(clk)) then
 if avs_s0_read = '1' then
     we_commands <= '0';
 elsif avs_s0_write = '1' then
    we_commands <= '1';
 else 
    we_commands <= '0';
 end if;
 end process;

 addr_commands <= avs_s0_address;
 data_in_commands  <= avs_s0_writedata;
 avs_s0_readdata <= data_out_commands;

правильное ? все сигналы в списке чувствительности?

 

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


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

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

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

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

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

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

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

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

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

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