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

Универсальная посылка по UART.

Сегодня я просто посылаю определённое количество байт из одного модуля.

UART_TX: process(CLK)
variable tx_idx : integer range 0 to 255 := 0;
variable del : integer range 0 to 255 := 0;
begin
	  
    if (rising_edge(CLK)) then
	 
        case UartTxState is
		      				
            when ST_IDLE =>
				
                tx_idx := 0;
                del := 0;
					 
                if (TX_GO = '1') then
                    tx_count <= tx_count + '1';
                    rx_count_ret <= rx_count;
                    UartTxState <= ST_TX_DATA;
                end if;
           
                when ST_TX_DATA =>
                    del := 0;
                    if (TX_RDY = '1') then 
                        case tx_idx is
                            when 0  => tx_data_buf <= X"AA";
                            when 1  => tx_data_buf <= X"77";
                            when 2  => tx_data_buf <= tx_count(7 downto 0);
                            when 3  => tx_data_buf <= tx_count(15 downto 8);
                            ---------------------------------------------
                            when 223  => tx_data_buf <= tx_chksum(7 downto 0);
                            when 224  => tx_data_buf <= tx_chksum(15 downto 8);
                            when others => UartTxState <= ST_IDLE;
                        end case;
                        UartTxState <= ST_TX_TRIG;

                when ST_TX_TRIG =>
                    if (TX_RDY = '1') then
                        TX_TRIG <= '1';
                        UartTxState <= ST_NEXT_1;
                    end if;	  
	 
                when ST_NEXT_1 =>	 
                    if (TX_RDY = '0') then
                        UartTxState <= ST_NEXT_2;
                    end if;
				
                when ST_NEXT_2 =>
                    TX_TRIG <= '0';
                    tx_idx := tx_idx + 1;
                    if (tx_idx > 224) then
                        UartTxState <= ST_IDLE;
                    else
                        UartTxState <= ST_TX_DATA;  
                    end if;
				
               when others => UartTxState <= ST_IDLE;

        end case;
		  
    end if;
	 
end process UART_TX;

А как сделать универсальную посылку? Чтоб можно было посылать из любого модуля любое количество байт.

 

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


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

Первый вариант - перед UART_TX поставить FIFO для того чтобы временно хранить отправляемые данные. А для записи в FIFO написать арбитр, который будет собирать с N модулей данные. Поскольку N модулей могут захотеть писать в UART одновременно - можно предложить второй вариант - в каждом из N модулей по небольшому FIFO, а затем самописный модуль-арбитр, который последовательно или по приоритету забирает данные из FIFOшек и скармливает блоку UART_TX 

Основная идея - UART_TX нужно переделать, чтобы он получал данные побайтно, потоком

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


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

On 11/13/2023 at 1:39 PM, pavlovconst said:

Первый вариант - перед UART_TX поставить FIFO для того чтобы временно хранить отправляемые данные. А для записи в FIFO написать арбитр, который будет собирать с N модулей данные. Поскольку N модулей могут захотеть писать в UART одновременно - можно предложить второй вариант - в каждом из N модулей по небольшому FIFO, а затем самописный модуль-арбитр, который последовательно или по приоритету забирает данные из FIFOшек и скармливает блоку UART_TX 

Основная идея - UART_TX нужно переделать, чтобы он получал данные побайтно, потоком

спасибо. FIFO пожалуй неплохое решение.

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


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

можно вместо фифо использовать блочную память для данных потом логикой вычитывать 

формируя таким образом пакет данных 

wave.do bram_tdp.vhd c.do package_formation.vhd package_formation_vhd_tst.vhd

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


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

On 11/13/2023 at 2:57 PM, Maverick_ said:

можно вместо фифо использовать блочную память для данных потом логикой вычитывать 

формируя таким образом пакет данных 

wave.do 2.94 kB · 0 downloads bram_tdp.vhd 4.35 kB · 0 downloads c.do 505 B · 0 downloads package_formation.vhd 7.75 kB · 1 download package_formation_vhd_tst.vhd 4.66 kB · 0 downloads

у меня уже total memory bits 64% занято. мне вобще то нужно было оставить 50% свободных.

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


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

память может бы и из регистров или на LUT RAM 

не обязательно использовать всегда BLOCKRAM

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


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

3 minutes ago, Maverick_ said:

память может бы и из регистров или на LUT RAM 

51 minutes ago, jenya7 said:

у меня уже total memory bits 64% занято. мне вобще то нужно было оставить 50% свободных.

Прежде чем решать "как делать" определитесь "что вы хотите".  Как вы предполагаете будет идти передача (побайтно или сразу бурст полным пакетом)? Каков максимальный размер пакета?  Что должны делать другие модули когда  передатчик занят (ждать, или накапливать данные в своем буферe)? и.т.д, и.т.п 
И после всего этого может стать понятно что можно вообще без памяти обойтись, а достаточно будет простого арбитра ...

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


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

On 11/13/2023 at 5:16 PM, RobFPGA said:

Прежде чем решать "как делать" определитесь "что вы хотите".  Как вы предполагаете будет идти передача (побайтно или сразу бурст полным пакетом)? Каков максимальный размер пакета?  Что должны делать другие модули когда  передатчик занят (ждать, или накапливать данные в своем буферe)? и.т.д, и.т.п 
И после всего этого может стать понятно что можно вообще без памяти обойтись, а достаточно будет простого арбитра ...

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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