неблокирующее присваивание в verilog

По факту, похоже я недогоняю почему в следующем коде d поменяет значение на 30-й единице времени а не двадцатой:

initial begin

        c = 1'b1;

        d = 1'b0;

        #10 c <= 1'b0;

        d <= #20 c;

end


Т.е. получается два последних переноса выполняются последовательно, а не «конкурентно», как было сказано про неблокирующие присваивания.

Квантовые компьютеры. Кажется это уже было

Не могу сказать, что я понимаю архитектуру будущих квантовых компьютеров. Пожалуй все я я знаю это то что они будут использовать т.н. суперпозицию квантовых состояний (одновременное нахождение в нескольких состояниях) для параллельных вычислений и тем самым добивается (в теории) ускорения на порядки как минимум некоторых оптимизационных задач. И знаете что? А ведь такие задачи уже сейчас можно ускорить на порядки (практически мгновенно — со скоростью света), с помощью примитивного аналогового компьютера, который, к слову, был доступен еще до появления цифровых компьютеров. Хотите. например найти оптимальный путь на кaрте. Не проблема. C помощью обычный резисторов строите эквивалентную схему. Ответ через какую точку проходит оптимальный путь даст нам обычный вольтметр. Я часто замечал как компьютер призадумывается чтобы проложить оптимальный путь. А электрической схеме из резисторов требуется всего лишь время для прохождения света из одного конца в другой. Как свет и электричество решает эту задачу так быстро? Ответ: c помощью той же суперпозии всех возможных путей света. Выходит что обычная схема из резисторов это уже квантовый компьютер, причем доступный нам давным давно.

Интерференция в клеточном автомате. Причины неудачи

В очередной раз потерпел фиаско, пытаясь смоделировать интерференцию с помощью клеточного автомата. Но в этот раз стала понятна причина. Пытаясь понять почему, я построил дерево, показывающае вклад каждой ячейки в каждую через n шагов:

data Expr a = At !Index  | PlusMul [(a, Expr a)]

Cтрою его с помощью следующего шага:

step = do cur <- at

          left <- atLeft

          right <- atRight

          return $ PlusMul [((1/3), cur), ((1/3), left), ((1/3), right)]

step это контекстная функция (читалка) которая строится из примитивных читалок at, atLeft, atRight. Она принимает текущий контекст (тек позицию и ее значение,  значение соседей) и возвращает новое значение для текущей позиции. (Другими словами это т.н. reader монада). 

Применяя этот шаг ко всем ячейкам многократно, мы тем самым строим деревья. Например, чтобы применить два раза ко всем ячейкам я делаю это следующим образом:

initial `coBindZ` step `coBindZ` step 

(initial тут изначальный контект состоящих из ...,At -1 At 0, At 1,... а название coBind как бы должно нам намекать что контекст это комонада)

В принципе, этого можно было и не делать, так как, взглянув на структуру дерева и то как оно строится уже становится понятна причина неудачи. Дело в том что, несмотря на то что одни ячейки могут встречаться в дереве чаще других, любой отдельный путь до любой ячейки в дереве равнозначный и одинаковой длины.Если бы мы хотели чтобы какие-то пути с помощью фаз взаимогасились, то нам нужны были бы разные фазы. А здесь разнице фаз просто неоткуда взятся ввиду равнозначности всех путей.

Read more...Collapse )

Неожиданный выбор между IntMap, Map HashMap и Array в haskell

Долго мучался выбирая между различными реализациями словарей в плане производительности операции объединения с функцией. Хотел для каждого (key,value) плодить маленькие локальные мапы, с последующим объединением. Своего рода, моноид. Но затем, неожиданно решил, что используя обратное отображение - окружения (соседних элементов) в текущую ячейку, будет проще с производительностью. и выбрал комонаду ZipList a = MkZip [a] !Int [a] вместо словарей. Посмотрим, действительно ли это проще и производительнее. Фактически это функциональный аналог указателей с дешевыми инкрементами.  


шкала давления - ноль или один

Вот что меня сбивает с толку, так это шкала давления в барах. Когда пишут что выпускной клапан открывается при 1.3 бара, а впускной открывается при 0.10, значит ли это что на монометре я увижу не 1.3 бара, а 0.3 бара (минус атмосферное давление снаружи)?


barell shifter в logisim

Ранее я постил реализацию сдвига вправо на верилоге. Но нашел у себя в архиве более раннюю свою реализацию в logisim.
В отличии от реализации в прошлом посте, в этой реализации  есть сдвиг в обе стороны. Причем без дублирования логики сдвига.


'

замена MIPS на RISC-V в литературе

Классические книги по компьютерной архитектуре потихоньку заменяют MIPS на RISC-V:

1)

Computer Organization and Design RISC-V Edition: The Hardware Software Interface (The Morgan Kaufmann Series in Computer Architecture and Design) 1st Edition



2)
Computer Architecture: A Quantitative Approach ("The sixth edition of this classic textbook is fully revised with the latest developments in processor and system architecture. It now features examples from the RISC-V (RISC Five) instruction set architecture, a modern RISC instruction set developed and designed to be a free and openly adoptable standard")

"ардуино" нынче уже не тот

https://www.sifive.com/products/coreplex-risc-v-ip/u54-mc/

U54-MC Coreplex IP is the world’s first RISC-V based 64-bit quad-core application processor, supporting full-featured operating systems such as Linux. The U54-MC Coreplex’s high-performance and flexible memory system makes it ideal for applications such as AI, machine learning, networking, gateways, and smart IoT devices.

концепция итераторов

Попытался разобраться с Traversable в Хаскелле. Но понял что надо начать хотя бы с "Аппликативных функторов". Начал смотреть последних и набрел на следующую статью:

"The Essence of the Iterator Pattern",
Jeremy Gibbons and Bruno C. d. S.
Oliveira Oxford University Computing Laboratory


В общем, если вы думали что итераторы это просто. Обязательно почитайте эту статью. Взрыв мозга гарантирован.

условные переходы в mips

Если спросить у гугля про условные переходы в MIPS процессоре, то все ссылки ведут на образовательные сайты.
C армом будет иначе. Я конечно, понимаю что mips гораздо лучше подходит для образования чем arm, но где живет официальная документация?

А хотел я узнать есть ли переход по условию "меньше чем". Потому как, если судить по книге "Computer Organization and Design", разработчики архитектуры mips предпочитают иметь дело только с двумя сравнениями: "равно" и "не равно".
Потому что это условие можно вычислить на стадии декодирования и уменьшить тем самым цену неверного предсказания перехода. Все остально можно сделать комбинацией с инструкцией slt.