Моделирование записи ОЗУ в VHDL

Запись значения в ОЗУ — это небольшая часть моего проекта, все работает, но я не могу объяснить одну вещь, связанную с ОЗУ/цифровым таймингом.

Я напишу описание в отношении изображения, которое я добавил.

  • macc_out переходит в data_in ОЗУ
  • address_ram — адрес ячейки ОЗУ
  • out_temp - это вывод оперативной памяти
  • write_en_ram — это write_en ОЗУ

Насколько я имел представление об оперативной памяти, она пишет прямо по переднему фронту такта. Таким образом, данные, видимые на data_in по переднему фронту тактового сигнала, будут записаны в ОЗУ. Даже если data_in изменится на тех же тактах, что и write_gos, старые данные будут записаны. Первый случайТогда почему в моем случае оперативка пишет -36 а не -10.

второйТеперь я попытался изменить значение data_in на значение часов (0/1), и теперь оно работает так, как должно. Что происходит? ram_in — это data_in ОЗУ в данном случае.

macc_out == ram_in == data_in

«Насколько я имел представление об оперативной памяти, она пишет прямо по переднему фронту тактов»: это не универсально. Это зависит от того, что вы написали в своем коде, поэтому было бы очень полезно увидеть ваш реальный код.
Я не рядом с моим кодом в данный момент. Но все они являются комбинационными логическими заданиями. macc_out зависит от значения счетчика, write_en_ram зависит от состояния

Ответы (1)

Поскольку ваш тактовый сигнал не показан, я предполагаю, что это связано с изменением других сигналов.

Исходя из этого, первый, кажется, работает правильно, поскольку запись работает только на нарастающем фронте тактового сигнала и высоком логическом уровне сигнала *write_en*. Итак, вот почему вы видите, что данные записываются только в одном цикле после того, как сигнал разрешения становится высоким.

Что касается второй симки, кажется, что тактовый сигнал напрямую связан с сигналом *ram_in*. Это бы объяснило. Данные фиксируются по переднему фронту тактового сигнала. В этом случае единственными данными, которые когда-либо фиксируются, является 0. На нарастающем фронте *ram_io* всегда равен 0.