Jump to content

    

FIFO на VHDL

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

Share this post


Link to post
Share on other sites

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

В версии 18:

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

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

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

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

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

fifo.jpg

Share this post


Link to post
Share on other sites
Эээ.. Что вы имели ввиду под словом "единица"?

В версии 18:

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

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

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

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

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

 

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

 

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

Edited by Jenya7

Share this post


Link to post
Share on other sites

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

Share this post


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

 

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

Share this post


Link to post
Share on other sites
а как передать 13 байт на шину? они у меня в РАМ лежат.

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

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

Share this post


Link to post
Share on other sites
А чем вариант FIFO не устраивает ?

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

 

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

Share this post


Link to post
Share on other sites
а как передать 13 байт на шину? они у меня в РАМ лежат.

 

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

 

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

 

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

 

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

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

Share this post


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

 

 

 

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

 

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

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

 

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

Share this post


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

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

 

Удачи! Rob.

 

Share this post


Link to post
Share on other sites

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

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

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;

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

 

 

fifo.jpg

 

Share this post


Link to post
Share on other sites
Ну а сделать FIFO с разной разрядностью входа и выхода в чём проблема?
Нельзя просто так взять и сделать асимметричное ФИФО. Для этого должны выполняться определённые соотношения между разрядностями входа и выхода. 13 байт сюда не очень хорошо вписывается.

Share this post


Link to post
Share on other sites
И всё таки, что вы хотите сделать?

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

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

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

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

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

 

 

fifo.jpg

 

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

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

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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now