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

Проблема последовательной записи.

Есть кор с 16-битной РАМ. Я пишу туда данные последовательно. Данные передаю сериально по 8 бит.

Пакет такой

CONT_WRITE   ADR_MSB   ADR_LSB   DATA0_MSB   DATA0_LSB  ….  DATAn_MSB   DATAn_LSB

CONT_WRITE – команда последовательной записи в РАМ.

ADR_MSB ADR_LSB  - начальный адрес. (sspi_cont_addr <= ADR_MSB & ADR_LSB)

DATA0_MSB DATA0_LSB – данные из которых я составляю слово и выставляю на шину данных.

 

Ну и сам код

---------------------------CONTINIOUS WRITE-------------------------------------	
					 
when ST_CONT_WRITE_1 =>  --first address and data
    SITAL_1553_1_ADR <= sspi_cont_addr; 
	SITAL_1553_1_CS  <= '1';  
	SITAL_1553_1_WR  <= '1';  
	SITAL_1553_1_RD  <= '0';
					   
	st_count := 0;
	byte_idx := 0;
	
    --skip command and address
	if (bytes_counter = X"03") then
	    SitalState <= ST_CONT_WRITE_2;
	end if; 		
				
when ST_CONT_WRITE_2 =>	
    if (cs2 = '0') then 
        if (new_byte = '1') then
            --next data
            if (byte_idx = 2) then 
                byte_idx := 0;
                --next address
                sspi_cont_addr <= sspi_cont_addr + '1';
            end if;
									 
            SitalState <= ST_CONT_WRITE_3; 					
        end if;						
    else --end of message
	    SitalState <= ST_SITAL_IDLE; 
    end if;
						  
when ST_CONT_WRITE_3 =>	
    --set a word from bytes
    case byte_idx is
        when 0 =>
            sspi_cont_data(15 downto 8) <= sspi_data;
            SitalState <= ST_CONT_WRITE_2;	 
        when 1 => 
            sspi_cont_data(7 downto 0) <= sspi_data;
            reg_count := 0;
            --word is complete						 
            SITAL_1553_1_ADR <= sspi_cont_addr; 
            SITAL_1553_1_DIN <= sspi_cont_data;
									 
            SitalState <= ST_CONT_WRITE_4; 
        when others => 
    end case;	 
    byte_idx := byte_idx + 1;
						 				  
when ST_CONT_WRITE_4 =>
    reg_count := reg_count + 1;
	
    --set address and data
	SITAL_1553_1_ADR <= sspi_cont_addr;
	SITAL_1553_1_DIN <= sspi_cont_data;
	
    --expose the data on the bus for x ckocks
	if (reg_count = 8) then 
	    SitalState <= ST_CONT_WRITE_2;  
	end if; 	  

Данные прописываются, но иногда я вижу какое то слово прописалось не верно – скажем вместо 0х8000 я вижу 0х8100. Обычно какой нибудь бит в слове реверсируется.

Я посылаю 30 байт (15 слов) обычно прыгают слова 2 и 14, иногда другие. Не могу понять в чем проблема. Сигнал тап не ловит проблему. Куда копать?

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

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


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

Ну вы сразу описывайте: моделирование корректно работает? STA сходится, все констрейны описаны? Предупреждения при синтезе серьезные есть?

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


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

1 hour ago, dvlwork said:

Ну вы сразу описывайте: моделирование корректно работает? STA сходится, все констрейны описаны? Предупреждения при синтезе серьезные есть?

предупреждений куча. какие из них серьезные не знаю. констрейны - только это

#**************************************************************
# Set Maximum Delay
#**************************************************************
set_max_delay -rise_from [get_clocks MAX10_CLK2_50] -rise_to [get_clocks SSPI_CLK] 20ns

set_max_delay -rise_from [get_clocks SSPI_CLK] -rise_to [get_clocks MAX10_CLK2_50] 20ns

в SDC файле.

 

предупреждения в основоном двух типов

1. used implicit default value for signal ***  because signal was never assigned a value or an explicit default value.

2. object *** assigned a value but never read

не думаю что они серьезные.

 

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

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


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

я добавил для отладки

when ST_CONT_WRITE_4 =>
    reg_count := reg_count + 1;
	
    --set address and data
	SITAL_1553_1_ADR <= sspi_cont_addr;
	SITAL_1553_1_DIN <= sspi_cont_data;
	
    --added for test
    if (sspi_cont_addr = test_addr) then 
	test_data <= sspi_cont_data;
	end if;
                                                           
    --expose the data on the bus for x ckocks
	if (reg_count = 8) then 
	    SitalState <= ST_CONT_WRITE_2;  
	end if; 	 

и я вижу test_data никогда не прыгает. то есть перед записью слово всегда стабильно.

тогда по окончании записи я иду и считываю слово.

when ST_CONT_WRITE_2 =>	
    if (cs2 = '0') then 
     -------------------   						
    else --end of message
	    --SitalState <= ST_SITAL_IDLE; 
        SitalState <= ST_TEST_WRITE_1;                                     
    end if;


when ST_TEST_WRITE_1 =>
    --read from the address
    SITAL_1553_1_CS <= '1';   
    SITAL_1553_1_WR	<= '0';  
	SITAL_1553_1_RD <= '1'; 
						  
    SITAL_1553_1_ADR <= test_addr;  -- + X"000D";
    test_data1 <= SITAL_1553_1_DOUT;
						  
	st_count := 0;
						  
    SitalState <= ST_TEST_WRITE_2;
						  
when ST_TEST_WRITE_2 =>	  
    st_count := st_count + 1;
						  
	test_data1 <= SITAL_1553_1_DOUT;
						  
    if (st_count = 8) then 
        SitalState <= ST_SITAL_IDLE; 
	end if;

и я вижу что test_data1 прыгает. то есть проблема во время записи в РАМ. слово прописывается плохо.

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


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

23 hours ago, jenya7 said:

скажем вместо 0х8000 я вижу 0х8100. Обычно какой нибудь бит в слове реверсируется.

у меня так при записи в pcie бывает, когда какой то констрейн не опишу или slack в отчетах фигурирует. Постоянно 1 бит портится. Уже приучил себя, что если вдруг проблема видится железячной и нет слаков в Time Analyzer, полюбому что то в sdc не занес

51 minutes ago, jenya7 said:

констрейны - только это

клоки тоже важно описать.

52 minutes ago, jenya7 said:

предупреждения в основоном двух типов

в Time Analyzer красным не горит Unconstrained Path? если речь про квартус

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

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


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

1 hour ago, new123 said:

у меня так при записи в pcie бывает, когда какой то констрейн не опишу или slack в отчетах фигурирует. Постоянно 1 бит портится. Уже приучил себя, что если вдруг проблема видится железячной и нет слаков в Time Analyzer, полюбому что то в sdc не занес

клоки тоже важно описать.

в Time Analyzer красным не горит Unconstrained Path? если речь про квартус

 

есть красные предупреждения в Unconstrained Path  но это на сигналы которыми я  даже не пользуюсь.

в sdc  прописал

#**************************************************************
# Create Clock
#**************************************************************
create_clock -period "50.0 MHz" [get_ports MAX10_CLK2_50]
create_clock -period "10.0 MHz" [get_ports SSPI_CLK]
create_clock -period "100.0 MHz" [get_ports s_clk_100mhz]

#**************************************************************
# Set Maximum Delay
#**************************************************************
set_max_delay -rise_from [get_clocks MAX10_CLK2_50] -rise_to [get_clocks SSPI_CLK] 20ns

set_max_delay -rise_from [get_clocks SSPI_CLK] -rise_to [get_clocks MAX10_CLK2_50] 20ns

set_max_delay -rise_from [get_clocks s_clk_100mhz] -rise_to [get_clocks s_clk_100mhz] 20ns

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


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

55 minutes ago, jenya7 said:

сть красные предупреждения в Unconstrained Path  но это на сигналы которыми я  даже не пользуюсь.

как минимум, там должны были быть Unconstrained Clock, потому что вы их не описали в sdc. Хотя могу ошибаться. А неописанные клоки это очень важно. Fitter тогда раскладывает на свое усмотрение и потом оно, если повезет, заработает, но чаще будут сбои.

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


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

Какая длина провода соединяющая две платы? или Вы работаете в пределах одной ПЛИС?

под сериально это UART или SPI ?

 

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


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

1 hour ago, Maverick_ said:

Какая длина провода соединяющая две платы? или Вы работаете в пределах одной ПЛИС?

под сериально это UART или SPI ?

 

SPI. Растояние между контролером и ФПГА несколько сантиметров. Это две платы соединенные конектором. Но я установил что проблема именно в записи в РАМ. Выше я представил свои отладочные действия.

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

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


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

24 minutes ago, jenya7 said:

SPI. Растояние между контролером и ФПГА несколько сантиметров. Это две платы соединенные конектором. Но я установил что проблема именно в записи в РАМ. Выше я представил свои отладочные действия.

 

А можно не писать на этом форуме слова ФПГА и РАМ? 

 

Я вообще не понимаю о чём речь идёт и куда модератор смотрит...

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


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

1 hour ago, _4afc_ said:

А можно не писать на этом форуме слова ФПГА и РАМ? 

 

Я вообще не понимаю о чём речь идёт и куда модератор смотрит...

ФПГА =  FPGA

РАМ = RAM

вас легко сбить с толку. в этой области надо быть тертым перцем.

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

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


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

3 minutes ago, jenya7 said:

РАМ = RAM

Дело в том, что я постоянно лезу в ваш топик думая, что у вас проблемы с Pulse-amplitude modulation, вы как-то по-аккуратнее с жаргонизмами...

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


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

1 hour ago, _4afc_ said:

Дело в том, что я постоянно лезу в ваш топик думая, что у вас проблемы с Pulse-amplitude modulation, вы как-то по-аккуратнее с жаргонизмами...

ну тут тертые мущины. они меня понимают.  :)

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


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

кстати, а что за память? не внешняя случаем? тогда на нее все тайминги в sdc загонять надо.
или та которая на чипе

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


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

1 hour ago, new123 said:

кстати, а что за память? не внешняя случаем? тогда на нее все тайминги в sdc загонять надо.
или та которая на чипе

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

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


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

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

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

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

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

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

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

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

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

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