Plain 168 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба Начнём с начала. Буфер 16 байт, запись в него пачками по 8 байт — ну т.е. методом дедукции, писать строго только тогда, когда та его половина вся прочитана, а потому свободна. Или же, Вы умолчали, что пишущему без разницы, прочитано или нет,— он пишет, уничтожая данные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба 16 minutes ago, Plain said: Начнём с начала. Буфер 16 байт, запись в него пачками по 8 байт — ну т.е. методом дедукции, писать строго только тогда, когда та его половина вся прочитана, а потому свободна. Или же, Вы умолчали, что пишущему без разницы, прочитано или нет,— он пишет, уничтожая данные. Естественно пишем только тогда, когда есть место для записи. Глобальная задача этой схемы, чтобы данные всегда были готовы к чтению. Но достичь этого с таргетом 250МГц не удалось, пришлось уже пожертвовать тактом, опуская сигнал готовности чтения при записи новой порции данных, но даже при этом допущении это "больное" место в дизайне. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба Глубина буфера единица, они и не могли быть готовы, нужна ещё половина, т.е. всего 24 байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба Коды Rice, на одну запись в 8 байт может быть 8 чтений по одному байту, а может и все 8 байт будут прочитаны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба Т.е. эту фразу нам считать Вашим доказательством достаточности для буфера 16-ти байт? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба Приветствую! 3 hours ago, Plain said: Т.е. эту фразу нам считать Вашим доказательством достаточности для буфера 16-ти байт? Опять же теоретически - достаточно иметь буфер как минимум на ширину входного слова (при условии что максимальная ширина выходного слова не более 2x от входного). Увеличивая ширину буферного регистра можно вроде как бы уменьшить простои при потоковой записи/чтении. НО при этом возрастут накладные на mux (ширина ведь больше) и то - это имеет смысл если средняя скорость чтения равна скорости записи. Что в данном случае явно не будет. Практически - буферный регистр в 2х от входной ширины вполне достаточен. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 15 июня, 2020 Опубликовано 15 июня, 2020 · Жалоба Скорость чтения здесь всегда больше скорости записи, 10 > 8. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 15 июня, 2020 Опубликовано 15 июня, 2020 · Жалоба 1 hour ago, Plain said: Скорость чтения здесь всегда больше скорости записи, 10 > 8. Это не так. Ширина слова (скорость) чтения переменная величина от 1 до 10 байт, зависящая от входных данных. Для каждого набора входных данных это распределение будет свое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 15 июня, 2020 Опубликовано 15 июня, 2020 · Жалоба Определите худший случай, он всегда в единственном числе, иначе задачу не решите никогда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 июня, 2020 Опубликовано 15 июня, 2020 · Жалоба 14 hours ago, Plain said: Начнём с начала. Буфер 16 байт, запись в него пачками по 8 байт — ну т.е. методом дедукции, писать строго только тогда, когда та его половина вся прочитана, а потому свободна. Если эта парадигма верная, запись всегда 8 байт, а чтение произвольно от 1 до 10, то module pipa (input iclk, iwrite, iread, bit [3 : 0] iread_num, bit [7 : 0] idat [8], output bit [7 : 0] odat[10], bit oval, ofull, oempty); wire write = iwrite & !ofull; wire read = iread & !oempty; bit [4 : 0] cnt; // 24 used bit [7 : 0] buffer [24]; assign ofull = (cnt >= 16); assign oempty = (cnt < iread_num); always_ff @(posedge iclk) begin case ({write, read}) 2'b10 : cnt <= cnt + 8; 2'b01 : cnt <= cnt - iread_num; 2'b11 : cnt <= cnt + 8 - iread_num; endcase // if (write) begin for (int i = 0; i < 8; i++) buffer[i] <= idat[7-i]; // reverse order LSB first buffer[8 : 15] <= buffer[0 : 7]; buffer[16 : 23] <= buffer[8 : 15]; end // odat <= '{default : '1}; if (read) begin for (int i = 0; i < iread_num; i++) begin odat[i] <= buffer[cnt-1-i]; end end // oval <= read; end endmodule module tb; bit iclk, iwrite, iread; bit [3 : 0] iread_num; bit [7 : 0] idat [8]; bit [7 : 0] odat[10]; bit oval, ofull, oempty; pipa popa(.*); initial begin iclk <= 1'b0; #5ns forever #5ns iclk = !iclk; end initial begin int tmp, tmpr; // iwrite <= 1'b0; iread <= 1'b0; // tmp = 0; tmpr = 1; iread_num <= tmpr; fork repeat (9) begin @(posedge iclk iff !ofull); iwrite <= 1'b1; for (int i = 0; i < 8; i++) begin idat[i] <= tmp + i; end tmp += 8; @(posedge iclk); iwrite <= 1'b0; end // forever begin repeat (4) @(posedge iclk); @(posedge iclk iff !oempty) iread <= 1'b1; iread_num <= tmpr; @(posedge iclk); iread <= 1'b0; tmpr++; if (tmpr > 10) tmpr = 1; end join end endmodule от мультиплексоров вы конечно никуда не уйдете, да и от задержек, но по записи - обычный сдвиговый регистр) ЗЫ. маскирование выходных байт сделано для простоты наблюдения вейвформ. в итоговом коде можно убрать) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 15 июня, 2020 Опубликовано 15 июня, 2020 · Жалоба Приветствую! 17 minutes ago, des00 said: Если эта парадигма верная, запись всегда 8 байт, а чтение произвольно от 1 до 10, то Не совсем - запись пакетами произвольной дины по шине 8 байт - соответственно последнее слово в пакете может иметь 1..8 байт. Чтение от 1 до 10 байт за такт. Фактически это задача разбиение непрерывного потока байт (приходящих в виде пакетов произвольной длинны) на поток сообщений длинна которых (в общем случае произвольна) и определяется по неким признакам в этом потоке байт. Удачи! Rob. P.S. Так что задачка не о классическом бассейне с двумя трубами, а о том как эффективнее черпать воду из оного ведрами Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 июня, 2020 Опубликовано 15 июня, 2020 · Жалоба 23 minutes ago, RobFPGA said: Не совсем - запись пакетами произвольной дины по шине 8 байт - соответственно последнее слово в пакете может иметь 1..8 байт. Чтение от 1 до 10 байт за такт. если только последнее слово плавающего размера, то тоже работать будет. размеры пакетов согласованы, флаги будут корректно сформированны, в LSB слова тоже корректно отобразятся, нужно будет только сброс добавить между входным пакетами(ну или маркер первого слова в пакете, который установит счетчик в начальное положение). А вот если внутри пакета плавающий размер, тогда да, нужен будет произвольный сдвигатель) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 15 июня, 2020 Опубликовано 15 июня, 2020 · Жалоба 1 hour ago, des00 said: , но по записи - обычный сдвиговый регистр) спасибо, забрал в копилку такой подход, раньше не додумался =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 июня, 2020 Опубликовано 17 июня, 2020 · Жалоба On 6/15/2020 at 4:26 PM, new123 said: спасибо, забрал в копилку такой подход, раньше не додумался =) вообще в ЦОС делах сдвиговые регистры сила) Если задача последовательных вычислений, реализуется на сдвиговых регистрах, то экономим 1 такт на мультиплексировании (берем уже с регистра) и нет затыка по времянке (минимальное количество слоев логики в регистре). Да, есть перерасход регистров, но на современных архитектурах это не проблема) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 17 июня, 2020 Опубликовано 17 июня, 2020 · Жалоба 1 hour ago, des00 said: вообще в ЦОС делах сдвиговые регистры сила) я уже два дня хожу в ужасе, сколько кода мне нужно переделать, точнее заново отладить, с таким подходом =)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться