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

В Квартусе есть корка FIFO вполне такая ничего. Но там единица - байт. А как мне сделать FIFO пакетов по 13 байт?

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


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

Эээ.. Что вы имели ввиду под словом "единица"?

В версии 18:

Разрядность данных - от 1 до 256.

Глубина - от 4 и до конца памяти (ну или триггеров).

Вообще, не плохо бы знать про какой камень идёт речь.

В приаттаченой картинке скриншот.

Если имеется ввиду разрядность 13*8=104 бита, возьмите ближайшее значение - 108.

fifo.jpg

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


Ссылка на сообщение
Поделиться на другие сайты
Эээ.. Что вы имели ввиду под словом "единица"?

В версии 18:

Разрядность данных - от 1 до 256.

Глубина - от 4 и до конца памяти (ну или триггеров).

Вообще, не плохо бы знать про какой камень идёт речь.

В приаттаченой картинке скриншот.

Если имеется ввиду разрядность 13*8=104 бита, возьмите ближайшее значение - 108.

 

это ФИФО байт. а мне нужно ФИФО объектов, скажем так. каждый объект 13 байт. объект вошел объект вышел.

 

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

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

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


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

Вместо того чтобы выбирать значения из списка можно это значение вписать руками. И будет Вам счастье :1111493779:

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


Ссылка на сообщение
Поделиться на другие сайты
Вместо того чтобы выбирать значения из списка можно это значение вписать руками. И будет Вам счастье :1111493779:

 

а как передать 13 байт на шину? они у меня в РАМ лежат.

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


Ссылка на сообщение
Поделиться на другие сайты
а как передать 13 байт на шину? они у меня в РАМ лежат.

А чем вариант FIFO не устраивает ?

Я не совсем понимаю Вашу задачу.

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


Ссылка на сообщение
Поделиться на другие сайты
А чем вариант FIFO не устраивает ?

Я не совсем понимаю Вашу задачу.

 

но данные надо ведь на шину загрузить. на вход. создал я data[0..103] но 13 байт лежат в РАМ. Как их загрузить из РАМ в data[0..103]?

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


Ссылка на сообщение
Поделиться на другие сайты
а как передать 13 байт на шину? они у меня в РАМ лежат.

 

Напишите свой контроллер поверх FIFO, который будет определять последовательное заполнение FIFO по 13 байт (пачкой) и выдавать их на выход непрерывной пачкой.

 

но данные надо ведь на шину загрузить. на вход. создал я data[0..103] но 13 байт лежат в РАМ. Как их загрузить из РАМ в data[0..103]?

 

В RAM эти 13 байт лежат один словом (word) шириной 104 бита или 13-тью байтными словами?

 

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

Если 13-тью словами, то нужен перевод из последовательного формата в параллельный (serdes).

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


Ссылка на сообщение
Поделиться на другие сайты
Напишите свой контроллер поверх FIFO, который будет определять последовательное заполнение FIFO по 13 байт (пачкой) и выдавать их на выход непрерывной пачкой.

 

 

 

В RAM эти 13 байт лежат один словом (word) шириной 104 бита или 13-тью байтными словами?

 

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

Если 13-тью словами, то нужен перевод из последовательного формата в параллельный (serdes).

 

у меня РАМ 8х1024 - 1 килобайт. так как это сделать практически?

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


Ссылка на сообщение
Поделиться на другие сайты
у меня РАМ 8х1024 - 1 килобайт. так как это сделать практически?

 

Выдайте из RAM 13 байт и запишите их в 13 байтных регистров, затем защелкните эти 13 регистров на шину шириной 104 бита с сигналом валидности.

Вообще, у производителя должны быть FIFO с настраиваемыми разными размерностями входных и выходных шин (вход - байтный, выход 13-ти байтный). По крайней мере, у Xilinx есть.

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


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

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

 

у меня РАМ 8х1024 - 1 килобайт. так как это сделать практически?
Если практически сначала нужно полностью и подробно описать то что у Вас есть и то что Вы хотите (целевую задачу).

Тогда глядишь и самому станет все понятно (а не только нам) :)

 

Удачи! Rob.

 

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


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

А как вам такое решение?

Я создал двухмерный массив

type packet_t is array (12 downto 0) of std_logic_vector(7 downto 0);
type packet_fifo_t is array (31 downto 0) of packet_t;

signal tx_mailbox_fifo : packet_fifo_t;

shared variable g_fifo_head_idx : integer range 0 to 255 := 0;
shared variable g_fifo_tail_idx : integer range 0 to 255 := 0;

В одном процесе я загружаю байты в очередную ячейку из РАМ

when ST_RAM_TO_TX_BUF_3 => 
    if (idx2 < 13) then
     tx_mailbox_fifo(g_fifo_head_idx)(idx2) <= slave_data_out2;
         idx2 := idx2 + 1;
    else
    --get ready the next fifo slot
    g_fifo_head_idx := g_fifo_head_idx + 1;
    if (g_fifo_head_idx > 31) then
        g_fifo_head_idx := 0;
     end if;
        RamState_b <= ST_RAMB_IDLE;     
   end if;

В другом слежу за индексом

TX_MAILBOX_FIFO_MANAGER: process (REG_CLK) 
begin 
    if (rising_edge(REG_CLK)) then
     
    --send previous message - g_fifo_head_idx incremeted by 1 in other process
        if (g_fifo_tail_idx < g_fifo_head_idx)    then      
        tx_buf_ready <= '1';         
        end if;
            
    if (update_tail_idx = '1') then
        tx_buf_ready <= '0';
        g_fifo_tail_idx := g_fifo_tail_idx + 1;
        if (g_fifo_tail_idx > 31) then 
        g_fifo_tail_idx := 0;
        end if;
    end if;
     
    end if;
end process TX_MAILBOX_FIFO_MANAGER;

И есть процесс посылки

when ST_TX_DATA =>  --send 13 byte of data
    if (tx_byte_idx < 13) then 
        MSPI_WR_DATA <= X"00" & tx_mailbox_fifo(g_fifo_tail_idx)(tx_byte_idx);
              
    MSPI_WR_START_TRIG <= '1'; --send a byte
                          
    tx_byte_idx := tx_byte_idx + 1;     
                          
    NextState <= ST_TX_DATA;
    McpState <= ST_WAIT_DONE;
    else
    MSPI_CS <= '1';            --chip select high 
      
        update_tail_idx <= '1'; 

    NextState <= ST_MCP_IDLE;
    McpState <= ST_REQ_TO_SEND0;
    end if;

 

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


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

И всё таки, что вы хотите сделать?

Есть какая-то RAM.

Есть какое-то Fifo.

Зачем их нужно скрещивать?

Ну хорошо, почему нельзя сделать Ram с разной разрядностью входа и выхода?

Ну а сделать FIFO с разной разрядностью входа и выхода в чём проблема?

 

 

fifo.jpg

 

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


Ссылка на сообщение
Поделиться на другие сайты
Ну а сделать FIFO с разной разрядностью входа и выхода в чём проблема?
Нельзя просто так взять и сделать асимметричное ФИФО. Для этого должны выполняться определённые соотношения между разрядностями входа и выхода. 13 байт сюда не очень хорошо вписывается.

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


Ссылка на сообщение
Поделиться на другие сайты
И всё таки, что вы хотите сделать?

Есть какая-то RAM.

Есть какое-то Fifo.

Зачем их нужно скрещивать?

Ну хорошо, почему нельзя сделать Ram с разной разрядностью входа и выхода?

Ну а сделать FIFO с разной разрядностью входа и выхода в чём проблема?

 

 

fifo.jpg

 

я пришел к тому же выводу - ФИФО наше все. сериально загонять байты по 13 штук и считывать тоже по 13.

единственно я не понимаю - я должен стробировать сигнал wrreq? иначе как ФИФО знает что нужно принять следующий байт?

и то же самое при чтении - нужно стробировать rdreq?

 

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти