addi II 1 February 20 Posted February 20 · Report post Здравствуйте! Подскажите пожалуйста, как на комбинаторике на верилоге преобразовать байт little ebdian в big endian Спасибо! Quote Share this post Link to post Share on other sites More sharing options...
_4afc_ 36 February 20 Posted February 20 · Report post 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 бит - так Quote Share this post Link to post Share on other sites More sharing options...
looser 12 February 20 Posted February 20 · Report post 3 часа назад, _4afc_ сказал: y[31:0]={ x[7:0], x[15:8], x[23:16], x[31:24] }; // для 32 бит - так Assign. Ну или в блоке always(*). Но тогда провода на регистры придется заменить. Но это не страшно. Синтезатор все на провода заменит. Quote Share this post Link to post Share on other sites More sharing options...
Hence6349 4 February 20 Posted February 20 · Report post Здравствуйте. Для вектора произвольного размера и опираясь только на синтаксис доступный именно в 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 Quote Share this post Link to post Share on other sites More sharing options...
addi II 1 February 22 Posted February 22 · Report post Большое спасибо! Quote Share this post Link to post Share on other sites More sharing options...
addi II 1 March 13 Posted March 13 · Report post Прошу проверить мои изыскания на этот счет У меня есть шина адреса и шина данных я работаю с процом который выставляет данные и адрес в 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] }; Заранее благодарен Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 March 14 Posted March 14 · Report post В 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р данные Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 57 March 14 Posted March 14 · Report post 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 разрядные ячейки памяти проца, это его дело. Это его дело пока он живёт своей жизнью в памяти. Как только проц. лезет во внешний свет (например записывая регистр или отправляя в сеть) это уже дело (и головная боль) программиста/разработчика Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 March 15 Posted March 15 · Report post 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] }; Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 57 March 15 Posted March 15 · Report post 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); Quote Share this post Link to post Share on other sites More sharing options...
addi II 1 March 16 Posted March 16 · Report post в итоге я не совсем понял правильны ли мои преобразования Quote Share this post Link to post Share on other sites More sharing options...