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

Запись в РАМ.

У меня РАМ 16 бит адрес и 16 бит дата. А дату я получаю побайтно.

Поэтому мне нужно на каждые 2 байта собрать 16-бит даты и прописать в текущий адрес и подготовить следующий адрес.

when ST_CONT_WRITE_2 =>

if (reg_load = '1') then
    byte_idx := byte_idx + 1;
									 
    case byte_idx is
           when 1 => 
	    sspi_cont_data(15 downto 8) <= sspi_data;  
           when 2 => 
	    sspi_cont_data(7 downto 0) <= sspi_data;
	    byte_idx := 0;

	    SITAL_1553_1_ADR <= sspi_cont_addr;  --RAM address bus
	   SITAL_1553_1_DIN <= sspi_cont_data;   --RAM data bus

	   spi_cont_addr <= sspi_cont_addr + '1';  --next address
         when others => 
    end case;
end if;

Но я вижу удвоение адреса (spi_cont_addr) 0 2 4 .... вместо увеличения на 1.

Что я упускаю?

 

По моему я понял. reg_load должен длиться один такт.

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

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


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

2 часа назад, jenya7 сказал:

У меня РАМ 16 бит адрес и 16 бит дата. А дату я получаю побайтно.

Поэтому мне нужно на каждые 2 байта собрать 16-бит даты и прописать в текущий адрес и подготовить следующий адрес.


when ST_CONT_WRITE_2 =>

if (reg_load = '1') then
    byte_idx := byte_idx + 1;
									 
    case byte_idx is
           when 1 => 
	    sspi_cont_data(15 downto 8) <= sspi_data;  
           when 2 => 
	    sspi_cont_data(7 downto 0) <= sspi_data;
	    byte_idx := 0;

	    SITAL_1553_1_ADR <= sspi_cont_addr;  --RAM address bus
	   SITAL_1553_1_DIN <= sspi_cont_data;   --RAM data bus

	   spi_cont_addr <= sspi_cont_addr + '1';  --next address
         when others => 
    end case;
end if;

Но я вижу удвоение адреса (spi_cont_addr) 0 2 4 .... вместо увеличения на 1.

Что я упускаю?


По моему я понял. reg_load должен длиться один такт.

 

Не правильно поняли. Значение на которое каждый такт инкрементируется счетчик не зависит от длительности сигнала разрешения. Сигнал разрешения лишь говорит о том сколько времени (тактов) считать счетчику.

Попробуйте счетчик описывать отдельным компонентом. А автомат управляет счетчиком только формируя сигнал разрешения. Сразу найдете где проблема.

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


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

используете корку памяти с байтовым адресом и смотрите порты памяти в симуляторе? тогда там и будет +2) адрес байтовый используется для записи полуслова.

ЗЫ. код грязный. не понимаете зачем нужны переменные, не используйте. совет на будущее)

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


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

А я вот вижу:

spi_cont_addr <= sspi_cont_addr + '1';  --next address

а видимо должно быть:

 

Sspi_cont_addr <= sspi_cont_addr + '1';  --next address

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


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

20 minutes ago, Zwerg_nase said:

А я вот вижу:


spi_cont_addr <= sspi_cont_addr + '1';  --next address

а видимо должно быть:

 


Sspi_cont_addr <= sspi_cont_addr + '1';  --next address

ошибка copy-paste. в реальности конечно sspi_cont_addr.

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


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

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

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

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

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

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

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

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

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

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