Перейти к содержанию
    

Задачка про бассейн с водой

Всем привет!

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

Есть регистр 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

Можно ли что-то покрутить со сдвигом при записи, уж больно жирный мультиплексор получается? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, Flip-fl0p сказал:

А че сделать то надо ?

Перелить из пустого в порожнее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если бы не параллельная запись, то схема бы обычное фифо напомнила. А так - фифо, но с одновременным доступом к нескольким ступеням .. без большого мультиплексора никак.

 

По коду - не понятно, как данные задвигаются - по идее должно быть, что запись слева, а чтение вправо (а ля фифо), но в коде как то по другому написано. И еще - запись блокирует чтение, надеюсь так и задумано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, Mad_kvmg said:

Всем привет!

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

Есть регистр 16 байт. С одной стороны из него производится чтение от 1 до 10 байт, с другой стороны запись от 1 до 8 байт.  

Накидал вот такой вариант 

Можно ли что-то покрутить со сдвигом при записи, уж больно жирный мультиплексор получается? 

Для начала укажите в коде везде разрядности , а также и объявления всех регистров. Потом может и вопрос отпадет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, Егоров said:

Перелить из пустого в порожнее

Вы ошиблись темой - по вам в пс. общении скучают. 

 

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

6 hours ago, Mad_kvmg said:

Можно ли что-то покрутить со сдвигом при записи, уж больно жирный мультиплексор получается? 

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

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет!

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

Ситуация осложняется еще тем, что данные закрыты кодами Rice, то есть, значение read_num формируется из бит регистра reg

Если все же пожертвовать тактом и запретить одновременное чтение и запись, то можно кое какую оптимизацию сделать путем

подсчета разности (16-reg_occ) при чтении, тогда к моменту записи разность можно брать уже с регистра. Но не сильно это помогло.

Mux'ы конечно наше все и без них никуда, но собственно обратился к коллективному разуму с расчетом на то, что может быть у меня

уже глаз замылился и не вижу как записать в "хвост" новую порцию данных без двойного сдвига, "облегчив" mux по входу. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам нужно сделать фактически фифо, иначе - блок двупортовой памяти с хитрым управлением. Для этого даже не обязательно использовать сдвиг. Как поднимается производительность фифо/памяти? Только за счет лэтенси - вводятся регистры по адресу (write/read в вашем случае) и входу/выходу данных. Управляя стадийностью по записи (posted write) и чтению (prefetched read) можно выжать частоту - но, повторюсь, ценой лэтенси. А можно сделать и наоборот - выжать лэтенси, добавив сквозные пути со схода на выход (режим записи и чтения по одному адресу) - лэтенси будет ноль, а частота площадь и потребление - в минимуме. Итого, Ваше решение находится где то между этими двумя крайностями =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если поднять тактовую частоту в 10 раз, то можно обойтись обычным FIFO и сдвиговыми регистрами :biggrin: Мультиплексоров не будет.

Каждый такт задвигаем в FIFO по обному байту. При чтении - собираем слово из байтов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

33 minutes ago, pavlovconst said:

Если поднять тактовую частоту в 10 раз, то можно обойтись обычным FIFO и сдвиговыми регистрами :biggrin: Мультиплексоров не будет.

Каждый такт задвигаем в FIFO по обному байту. При чтении - собираем слово из байтов.

Теоретически все можно :wink2:   А пот практически - когда входные/выходные данные идут по шине в 8-16 байт за такт на частоте  200-300 MHz это будет ой как нельзя :unknw:

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, Mad_kvmg сказал:

данные закрыты кодами Rice, то есть, значение read_num формируется из бит регистра reg

Т.е. про запись всё известно и она тупая молотилка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Plain said:

Т.е. про запись всё известно и она тупая молотилка?

Сторона записи всегда готова отдать 8 байт, кроме последнего слова, которое может быть от 1 до 8 байт. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Plain said:

Тогда при записи ничего перебирать не требуется, лишь при чтении.

Ну записать то надо в "хвост", а где этот "хвост" начинается величина переменная, зависящая от того сколько было прочитано :) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...