Jump to content
    

Little-endian в Big-endian на комбинаторной логике

Здравствуйте!

Подскажите пожалуйста, как на комбинаторике на верилоге преобразовать байт little ebdian в big endian

Спасибо!

Share this post


Link to post
Share on other sites

12 minutes ago, addi II said:

little ebdian в big endian

y[31:0]={ x[7:0], x[15:8], x[23:16], x[31:24]  }; // для 32 бит - так

Share this post


Link to post
Share on other sites

3 часа назад, _4afc_ сказал:

y[31:0]={ x[7:0], x[15:8], x[23:16], x[31:24]  }; // для 32 бит - так

Assign. Ну или в блоке always(*).  Но тогда провода на регистры придется заменить. Но это не страшно. Синтезатор все на провода заменит.

Share this post


Link to post
Share on other sites

Здравствуйте. Для вектора произвольного размера и опираясь только на синтаксис доступный именно в verilog 2005 года, существует еще следующее решение с использованием for-loop:

Если вы имеете в виду поменять endianness именно байта, то есть поменять порядок битов в байте, то:  

localparam WIDTH = 8;
reg [WIDTH-1:0] x;
reg [WIDTH-1:0] y;

integer i;

always@(*) begin
  for (i=0;i<WIDTH;i=i+1) begin
    y = x[(WIDTH-1)-i];
  end
end

Если вы имеете в виду поменять порядок байт в векторе, то:

localparam WIDTH = 32;
localparam BYTE_WIDTH = WIDTH / 8;
reg [WIDTH-1:0] x;
reg [WIDTH-1:0] y;

integer i;

always@(*) begin
  for (i=0;i<BYTE_WIDTH;i=i+1) begin
    y[i * 8 +: 8] = x[((BYTE_WIDTH-1)-i) * 8 +: 8];
  end
end

Share this post


Link to post
Share on other sites

Прошу проверить мои изыскания на этот счет

У меня есть шина адреса и шина данных 

 

я работаю с процом который выставляет данные и адрес в BigEndian

Моя прошивка ПЛИС работает с данными data [31:0] и адресами addr [20:1] как с LittleEndian

Так как работа по шине ведется на парметрах по скорости близкой к максимальной  нужно преобразование снчала с Big в Little при приеме и из little в Big при передачи сделать по возможности без сдвига на клок, то есть на комбинаторике

Тогда получается для приема и передачи данных  мне необходимо сделать следующее преобразование?

assign data_FPGA[31:0]={ data[7:0], data[15:8], data[23:16], data[31:24]  }; 

 

Тоже самое для адреса

assign addr_FPGA[31:0]={ addr[7:0], addr[15:8], addr[23:16], addr[31:24]  }; 

 

 

 

Заранее благодарен

 

 

Share this post


Link to post
Share on other sites

В 13.03.2025 в 20:06, addi II сказал:

У меня есть шина адреса и шина данных 

я работаю с процом который выставляет данные и адрес в BigEndian

Моя прошивка ПЛИС работает с данными data [31:0] и адресами addr [20:1] как с LittleEndian

Где Вы это прочитали.

Вы работаете с процом, который выставляет на внешнюю шину адреса 32х разрядные ДАННЫЕ (не числа).  Следовательно в ПЛИС вы автоматом организовываете 32 р регистры по записи, чтению, 32х разрядную память. Следовательно что записали, то и считаете.

Если посмотреть стандарт на верилог - вектор объявляется vect[msb_expr : lsb_expr]

Значит reg [31:0] это big_vector (31р. старший), reg [0:31] это little_vector (0р. старший). К байту ничего не привязано.

Я еще ни разу не видел, чтобы входной одномерный вектор объявлялся как little_vector.

Вот и говорите своему процу, что 31ый разряд шины данных - это старший разряд. При адресации 32х разрядными словами addr[20:2].

а в каком порядке  расположены 8 разрядные ячейки памяти проца, это его дело.

Если вы пишите addr[20:2] - вы уже игнорируете понятие байт, и даже понятие 16ти разрядного слова.

Т.е. при адресации addr[20:2] вы к базовому адресу прибавляете +1, как бы эквивалент при адресации addr[20:0] вы к базовому адресу прибавляете +4. И туда пишите читаете 32р данные

 

Share this post


Link to post
Share on other sites

3 hours ago, sazh said:

Вы работаете с процом, который выставляет на внешнюю шину адреса 32х разрядные ДАННЫЕ (не числа).

Данными могут быть и числа, например числа адреса или числа которые надо записать в регистр ...

3 hours ago, sazh said:

Если посмотреть стандарт на верилог - вектор объявляется vect[msb_expr : lsb_expr]

В том же стандарте говорится что  нет обязательного условия что  msb_expr >=  lsb_expr.  Может быть  vec[0:31] и даже  vec[3  -7]  ... 

3 hours ago, sazh said:

Я еще ни разу не видел, чтобы входной одномерный вектор объявлялся как little_vector

Не видел значит нет ... 
Например для сетевых приложений очень удобно работать с big-endian векторами  [0 :  N-1]

3 hours ago, sazh said:

а в каком порядке  расположены 8 разрядные ячейки памяти проца, это его дело.

Это его дело пока он живёт своей жизнью в памяти.  Как только  проц. лезет во внешний свет (например записывая регистр или отправляя в сеть) это уже дело (и головная боль) программиста/разработчика   

Share this post


Link to post
Share on other sites

10 часов назад, RobFPGA сказал:

 

Вы ко мне не равнодушны.

Он не в сеть лезет. Это программист пытается заняться схемотехникой.

И посадить FPGA  в адресное пространство АРМа.

Вот и зацените. Для него. А не для меня.

Тогда получается для приема и передачи данных  мне необходимо сделать следующее преобразование?

assign data_FPGA[31:0]={ data[7:0], data[15:8], data[23:16], data[31:24]  }; 

 

Тоже самое для адреса

assign addr_FPGA[31:0]={ addr[7:0], addr[15:8], addr[23:16], addr[31:24]  }; 

 

Share this post


Link to post
Share on other sites

2 hours ago, sazh said:

Он не в сеть лезет. 

Запись в регистры это тоже "внешний мир" 

2 hours ago, sazh said:

Это программист пытается заняться схемотехникой.

Все мы иногда пытаемся делать то в чем не совсем разбираемся, вы вот про стандарт шин в Verilog говорили ...  
 

2 hours ago, sazh said:

Вот и зацените.
assign data_FPGA[31:0]={ data[7:0], data[15:8], data[23:16], data[31:24]  }; 

Для того чтобы "заценить"  надо знать конкретный тип проца и структуру  дизайны.  А так это простейшее решение в лоб. 

Я бы как программист оформлял бы это через функции. И писанины меньше,  и понятнее в коде что делается, и как программисту привычнее ...   

function [31:0] swap_bytes_32(input [31:0] din) ;
  swap_bytes_32 = { din[7:0], din[15:8], din[23:16], din[31:24] };
endfunction 

assign data_FPGA = swap_bytes_32(data);

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...