Mad_kvmg 0 13 июня, 2020 Опубликовано 13 июня, 2020 · Жалоба Всем привет! Такая вот задачка как в школе про бассейн с водой и двумя трубами, только другая. Есть регистр 16 байт. С одной стороны из него производится чтение от 1 до 10 байт, с другой стороны запись от 1 до 8 байт. Накидал вот такой вариант assign reg_occ_switch = (write) ? reg_occ + write_num : (read) ? reg_occ - read_num : reg_occ; always_ff @ (posedge clk) reg_occ <= reg_occ_switch; always_ff @ (posedge clk) begin if (write) begin reg <= {input_data,reg << (16-reg_occ)} >> (16-reg_occ) ; end else if (read) begin reg <= reg >> read_num; end end Можно ли что-то покрутить со сдвигом при записи, уж больно жирный мультиплексор получается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 13 июня, 2020 Опубликовано 13 июня, 2020 · Жалоба А че сделать то надо ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Егоров 0 13 июня, 2020 Опубликовано 13 июня, 2020 · Жалоба 14 минут назад, Flip-fl0p сказал: А че сделать то надо ? Перелить из пустого в порожнее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Avex 1 13 июня, 2020 Опубликовано 13 июня, 2020 · Жалоба Если бы не параллельная запись, то схема бы обычное фифо напомнила. А так - фифо, но с одновременным доступом к нескольким ступеням .. без большого мультиплексора никак. По коду - не понятно, как данные задвигаются - по идее должно быть, что запись слева, а чтение вправо (а ля фифо), но в коде как то по другому написано. И еще - запись блокирует чтение, надеюсь так и задумано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 3 13 июня, 2020 Опубликовано 13 июня, 2020 · Жалоба 5 hours ago, Mad_kvmg said: Всем привет! Такая вот задачка как в школе про бассейн с водой и двумя трубами, только другая. Есть регистр 16 байт. С одной стороны из него производится чтение от 1 до 10 байт, с другой стороны запись от 1 до 8 байт. Накидал вот такой вариант Можно ли что-то покрутить со сдвигом при записи, уж больно жирный мультиплексор получается? Для начала укажите в коде везде разрядности , а также и объявления всех регистров. Потом может и вопрос отпадет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 13 июня, 2020 Опубликовано 13 июня, 2020 · Жалоба 4 hours ago, Егоров said: Перелить из пустого в порожнее Вы ошиблись темой - по вам в пс. общении скучают. Приветствую! 6 hours ago, Mad_kvmg said: Можно ли что-то покрутить со сдвигом при записи, уж больно жирный мультиплексор получается? В любом случае у вас будет mux - либо при записи в регистр, либо при чтении из оного, либо и там и там но чуть меньше по размеру чем в первых двух случаях. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба Всем привет! Да запись блокирует чтение, в идеале, хотелось бы и читать и писать одновременно, но тогда с таймингом совсем печалька. Ситуация осложняется еще тем, что данные закрыты кодами Rice, то есть, значение read_num формируется из бит регистра reg. Если все же пожертвовать тактом и запретить одновременное чтение и запись, то можно кое какую оптимизацию сделать путем подсчета разности (16-reg_occ) при чтении, тогда к моменту записи разность можно брать уже с регистра. Но не сильно это помогло. Mux'ы конечно наше все и без них никуда, но собственно обратился к коллективному разуму с расчетом на то, что может быть у меня уже глаз замылился и не вижу как записать в "хвост" новую порцию данных без двойного сдвига, "облегчив" mux по входу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Avex 1 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба Вам нужно сделать фактически фифо, иначе - блок двупортовой памяти с хитрым управлением. Для этого даже не обязательно использовать сдвиг. Как поднимается производительность фифо/памяти? Только за счет лэтенси - вводятся регистры по адресу (write/read в вашем случае) и входу/выходу данных. Управляя стадийностью по записи (posted write) и чтению (prefetched read) можно выжать частоту - но, повторюсь, ценой лэтенси. А можно сделать и наоборот - выжать лэтенси, добавив сквозные пути со схода на выход (режим записи и чтения по одному адресу) - лэтенси будет ноль, а частота площадь и потребление - в минимуме. Итого, Ваше решение находится где то между этими двумя крайностями =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба Приветствую! 3 hours ago, Mad_kvmg said: уже глаз замылился и не вижу как записать в "хвост" новую порцию данных без двойного сдвига, "облегчив" mux по входу. Я же намекал разбиваете mux на 2 - по входу пишете линейно подряд в позицию по счетчику записанных байт сдвигая и заворачивая . По выходу также читаете подряд выбирая линейно по счетчику уже прочитанных байт. А какие частоты у вас и какая FPGA? Странно что проблемы у вас с времянкой для 16 байт. Да и код мне кажется немного неправильный - сдвигать вправо вы должны только на read_num. Ну а чтобы времянку улучшить можно уйти от вычитания для вычисления разницы между write_num и read_num а реализовать эту разницу в табличке. фактически у вас два этапа // запись wire [15:0] w_reg = (in_data << d_len) | (d_reg & ~(16'hFF << d_len)); // чтение wire [15:0] r_reg = (w_reg >> read_num); // или комбинация wire [15:0] wr_reg = (in_data << (d_len - read_num)) | ((d_reg >> read_num) & ~(16'hFF << (d_len - read_num))); ... d_reg <= r_reg; // d_reg <= wr_reg d_len <= d_len + write_num - read_num; ... Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pavlovconst 2 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба Если поднять тактовую частоту в 10 раз, то можно обойтись обычным FIFO и сдвиговыми регистрами Мультиплексоров не будет. Каждый такт задвигаем в FIFO по обному байту. При чтении - собираем слово из байтов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба Приветствую! 33 minutes ago, pavlovconst said: Если поднять тактовую частоту в 10 раз, то можно обойтись обычным FIFO и сдвиговыми регистрами Мультиплексоров не будет. Каждый такт задвигаем в FIFO по обному байту. При чтении - собираем слово из байтов. Теоретически все можно А пот практически - когда входные/выходные данные идут по шине в 8-16 байт за такт на частоте 200-300 MHz это будет ой как нельзя Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба 6 часов назад, Mad_kvmg сказал: данные закрыты кодами Rice, то есть, значение read_num формируется из бит регистра reg Т.е. про запись всё известно и она тупая молотилка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба 1 hour ago, Plain said: Т.е. про запись всё известно и она тупая молотилка? Сторона записи всегда готова отдать 8 байт, кроме последнего слова, которое может быть от 1 до 8 байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба Тогда при записи ничего перебирать не требуется, лишь при чтении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 14 июня, 2020 Опубликовано 14 июня, 2020 · Жалоба 1 hour ago, Plain said: Тогда при записи ничего перебирать не требуется, лишь при чтении. Ну записать то надо в "хвост", а где этот "хвост" начинается величина переменная, зависящая от того сколько было прочитано :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться