Jump to content

    

des00

Модераторы
  • Content Count

    8553
  • Joined

Community Reputation

0 Обычный

3 Followers

About des00

  • Rank
    Вечный ламер
  • Birthday 01/14/1980

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

34379 profile views
  1. Ну я же вам написал, используйте типизацию в глобальном пространстве имен, в чем проблема typedef enum { pipa_addr, popa_addr, pipa_popa_addr } addr_t; module pipa (input addr_t ipopa, output logic [2 : 0] opopa); assign opopa[0] = (ipopa == pipa_addr); assign opopa[1] = (ipopa == popa_addr); assign opopa[2] = (ipopa == pipa_popa_addr); endmodule А если потом у вас появятся дырки в адресном пространстве, сделаете вот так typedef enum bit [31 : 0] { pipa_addr = 32'h00_00, popa_addr = 32'h00_10, pipa_popa_addr = 32'h10_00 } addr_t; без изменения кода. Главное, в декларации enum в глобальном пространстве, чтобы у вас потом констант с именами равными полям enum не было
  2. ага и программные стм32 на плис, на которых запущены ардуинки)
  3. По хорошему, тип должен быть определен до использования, а не после. Да зачем вообще так делать? у вас типовой модуль, шина адреса, шина данных. Нужны уникальные константы, чтобы не назначить одинаковый адрес - ну дык глобальный тип и ссылайтесь на него как на константу, более того, никто не мешает присвоить в типе адрес и компилятор сам будет отслеживать его уникальность. А если вам просто нужна типизация - сделайте глобальный тип и положите его в глобальное простанство определений или в пакет
  4. первая ссылка с яндекса https://kit-e.ru/interface/jesd204/ может с этого начать ?
  5. мне показывали контроллер Ethernet 100Мбит нарисованный. грандиозность зашкаливала. ТЗ надо, может там проще все переписать)
  6. тема почищена. офтопик вынесен в отдельный топик в подфоруме общение. модератор
  7. точно, получится тот же floor(x+0.5) добавить бит к сумме и проверить 01 комбинацию старших двух бит. может быть будет чуть быстрее чем весь вектор ANDить
  8. экстраполировал предоставленный вариант в конвертор 16 в 8 бит. Так меньше диапазон перебираемых чисел. Ну и добавил к сравнению floor/floor с округлением отрицательных чисел к нулю/round(x) ~= floor(x+0.5) module tb (); initial begin int tmp; int err; logic signed [7 : 0] rslt1, rslt2, rslt3, rslt4; for (int i = -(2**15); i <= 2**15-1; i += 100) begin tmp = $signed(i[15 : 0]); rslt1 = conv_16to8(tmp); rslt2 = floor(tmp); rslt3 = round(tmp); rslt4 = floor2(tmp); if ((rslt1 != rslt2) || (rslt1 != rslt3) || (rslt1 != rslt4)) begin $display("error %0d = %0f", tmp, tmp*1.0/256); $display("conv %0d", rslt1); $display("floor %0d", rslt2); $display("round %0d", rslt3); $display("floor2 %0d", rslt4); err++; end end $display("errs = %0d", err); $stop; end function logic signed [7 : 0] conv_16to8 (input logic signed [15 : 0] indata); logic signed [7 : 0] outdata; // outdata = ((indata + (16'd1<<15)) >> 8) - (8'd1<<7); // return outdata; endfunction function logic signed [7 : 0] floor (input logic signed [15 : 0] indata); logic signed [7 : 0] outdata; // outdata = indata >>> 8; // return outdata; endfunction function logic signed [7 : 0] floor2 (input logic signed [15 : 0] indata); logic signed [7 : 0] outdata; // outdata = indata >>> 8; outdata += (indata < 0) ? 1 : 0; // return outdata; endfunction function logic signed [7 : 0] round (input logic signed [15 : 0] indata); logic signed [8 : 0] outdata; logic signed [16 : 0] tmp; // tmp = indata + 128; outdata = (tmp) >>> 8; if (outdata > 127) begin outdata = 127; end // return outdata[7 : 0]; endfunction endmodule можно сравнить "тяжесть" функции округления и качество результата. Вот несколько интересных точек # error -1368 = -5.343750 # conv -6 # floor -6 # round -5 # floor2 -5 # error -1268 = -4.953125 # conv -5 # floor -5 # round -5 # floor2 -4 # error 28032 = 109.500000 # conv 109 # floor 109 # round 110 # floor2 109 # error 28132 = 109.890625 # conv 109 # floor 109 # round 110 # floor2 109
  9. когда ковырялся в теме округления, то ИМХО главное принять решение что делать с округлением точки 0.5. Ваш код например округляет 1.5 к 1, а не 2.0. Поэтому и написал что надо определиться что именно нужно по ТЗ. Если просто нужно округление положительных и отрицательных чисел к нулю, то можно просто прибавить к результату знаковый разряд. Будет чуть меньше сложений. Но 0.5 округляться будет не корректно.
  10. Это floor, округление к нулю для положительных чисел и к минус бесконечности для отрицательных. Может привести к паразитному смещению, при накоплении.
  11. нет. у вас есть floor/ceil/round вот их в рукопашку и выбирайте исходя из задач PS. деление на 2^N современные синтезаторы распознают, некоторые распознают и честное деление, а некоторые даже округление правильное делают
  12. Зачем из крайности в крайность кидаться, все с опытом приходит, выработаете свой стиль и уровни разбиения. Но помните, код читают раза в 3-4 чаще чем пишут) ИМХО счетчик, как отдельный модуль, нужен довольно в редких случаях необходимости специального быстрого счетчика, оптимизированного под платформу (например DFFEAS на сыклонах), в остальном случае обычного кода более чем достаточно. Как разбиваю я, можете посмотреть тут желательно что нибудь из последнего, там уже стиль устаканился)
  13. потому что писать много, даже если вы используете инстанс без предварительной декларации, вот по вашему коду, инстанс 16 строк, да, все самодокументированное, красивое и все такое, но это блин банальный регистр + сумматор + немного логики для сброса/установки. на описание которого, по месту уйдет строк 5 и сразу видно что и как он делает, любому разработчику. А так, если кто от вас проект заберет, надо будет выучить ваш компонент наизусть, а то комментариев что же делает конкретный инстанс будет больше чем вся логика "банальный регистр + сумматор + немного логики для сброса/установки". Это сейчас он у вас просто счетчик, а потом туда еще пойдут генерики архитектуры: оптимально разложить под 7/6/5/4-series, под сыклоны/арии/стратиксы, под латтисы и т.д. В итоге зрим не в корень, а в шелуху. Все с этого начинают, пока не понимают что в проекте надо смотреть в корень, а не на листья)
  14. проходили, знаем, сначала все любят структурный дизайн и все по феншую, а спустя время по месту cnt <= clear ? '0 : (cnt + ena)
  15. да, но был мелким, жрущим и с медленным роутингом) Ну собственно вы сами ответили на свой вопрос), даже близких аналогов у сыклона 1 в нашем отечестве нет А еще про сыклон1, ЕМНП он стоит Out-of-Order, если уже не сняли